public void LoadBNK(Stream instream) { instream.Position = 0; using (BinaryReader br = new BinaryReader(instream)) { while (instream.Position < instream.Length) { this.ProgressMutex.WaitOne(); loadPercent = (float)((100 * instream.Position) / instream.Length); this.ProgressMutex.ReleaseMutex(); //Find all sections uint section_tag = br.ReadUInt32(); //long offset = fs.Position+4; object section = new object(); if (section_tag == BKHD_tag) { section = new BKHD(br); } else if (section_tag == DIDX_tag) { section = new DIDX(br); } else if (section_tag == DATA_tag) { section = new DATA(br); } else if (section_tag == STID_tag) { section = new STID(br); } else if (section_tag == HIRC_tag) { section = new HIRC(br); } else { section = new Unknown(br); } //Console.WriteLine(section); sections.Add(section); } } /* foreach(KeyValuePair<byte, HashSet<object>> kvp in StaticStorage.parameters) { Console.WriteLine(kvp.Key); foreach(object val in kvp.Value) Console.WriteLine("\t"+val); } */ //organize DATA section and compile a list of sound files DIDX didx_section = sections.FirstOrDefault(e => e is DIDX) as DIDX; DATA data_section = sections.FirstOrDefault(e => e is DATA) as DATA; HIRC hirc_section = sections.FirstOrDefault(e => e is HIRC) as HIRC; Dictionary<uint, UInt32> fileOffsets = new Dictionary<uint, uint>(); if (didx_section != null && data_section != null) { foreach (var obj in didx_section.objects) data_section.files.Add(obj.id, data_section.remaining_data.Skip((int)obj.data_offset).Take((int)obj.data_length).ToArray()); fileOffsets = data_section.GenerateFileData(); } if (hirc_section != null) { for (int x = 0; x < hirc_section.objects.Count; x++) { object section = hirc_section.objects[x]; SoundFile sf = new SoundFile(); if (section is HIRC_SoundSFX) { sf.id = (section as HIRC_SoundSFX).soundid; sf.streamed = ((section as HIRC_SoundSFX).soundincluded == 0 ? false : true); sf.length_object = section; } else if (section is HIRC_MusicTrack) { sf.id = (section as HIRC_MusicTrack).soundID; sf.streamed = ((section as HIRC_MusicTrack).streamed == 0 ? false : true); sf.length_object = section; sf.loop_object = hirc_section.objects[x + 1]; if ((sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParameters_count > 0) { sf.effects = "Additional parameters:\r\n"; for (int y = 0; y < (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParameters_count; y++) { byte type = (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersType[y]; if (type == 0x00) sf.effects += "General Settings: Voice: Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x02) sf.effects += "General Settings: Voice: Pitch - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x03) sf.effects += "General Settings: Voice: Low-pass filter - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x05) sf.effects += "Advanced Settings: Playback Priority: Priority - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x06) sf.effects += "Advanced Settings: Playback Priority: Offset priority - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x07) sf.effects += "Loop count (0 = infinite) - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x08) sf.effects += " Motion: Audio to Motion Settings: Motion Volume Offset - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x0B) sf.effects += "Positioning: 2D: Panner X-coordinate - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x0C) sf.effects += "Positioning: 2D: Panner Y-coordinate - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x0D) sf.effects += "Positioning: Center % - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x12) sf.effects += "General Settings: User-Defined Auxiliary Sends: Bus #0 Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x13) sf.effects += "General Settings: User-Defined Auxiliary Sends: Bus #1 Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x14) sf.effects += "General Settings: User-Defined Auxiliary Sends: Bus #2 Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x15) sf.effects += "General Settings: User-Defined Auxiliary Sends: Bus #3 Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x16) sf.effects += "General Settings: Game-Defined Auxiliary Sends: Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x17) sf.effects += "General Settings: Output Bus: Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else if (type == 0x18) sf.effects += "General Settings: Output Bus: Low-pass filter - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; else sf.effects += "Unknown - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; sf.effects += "\r\n"; } } else sf.effects = "This sound does not have any additional parameters."; x++; } else continue; if (!StaticStorage.soundfiles.ContainsKey(sf.id)) StaticStorage.soundfiles.Add(sf.id, sf); } } foreach (var sf in StaticStorage.soundfiles.Values) { if (fileOffsets.ContainsKey(sf.id)) sf.data_offset = fileOffsets[sf.id]; else sf.data_offset = 0; } isLoaded = true; }
public void LoadBNK(Stream instream) { instream.Position = 0; using (BinaryReader br = new BinaryReader(instream)) { while (instream.Position < instream.Length) { this.ProgressMutex.WaitOne(); loadPercent = (float)((100 * instream.Position) / instream.Length); this.ProgressMutex.ReleaseMutex(); //Find all sections uint section_tag = br.ReadUInt32(); //long offset = fs.Position+4; object section = new object(); if (section_tag == BKHD_tag) { section = new BKHD(br); } else if (section_tag == DIDX_tag) { section = new DIDX(br); } else if (section_tag == DATA_tag) { section = new DATA(br); } else if (section_tag == STID_tag) { section = new STID(br); } else if (section_tag == HIRC_tag) { section = new HIRC(br); } else { section = new Unknown(br); } //Console.WriteLine(section); sections.Add(section); } } /* * foreach(KeyValuePair<byte, HashSet<object>> kvp in StaticStorage.parameters) * { * Console.WriteLine(kvp.Key); * foreach(object val in kvp.Value) * Console.WriteLine("\t"+val); * } */ //organize DATA section and compile a list of sound files DIDX didx_section = sections.FirstOrDefault(e => e is DIDX) as DIDX; DATA data_section = sections.FirstOrDefault(e => e is DATA) as DATA; HIRC hirc_section = sections.FirstOrDefault(e => e is HIRC) as HIRC; Dictionary <uint, UInt32> fileOffsets = new Dictionary <uint, uint>(); if (didx_section != null && data_section != null) { foreach (var obj in didx_section.objects) { data_section.files.Add(obj.id, data_section.remaining_data.Skip((int)obj.data_offset).Take((int)obj.data_length).ToArray()); } fileOffsets = data_section.GenerateFileData(); } if (hirc_section != null) { for (int x = 0; x < hirc_section.objects.Count; x++) { object section = hirc_section.objects[x]; SoundFile sf = new SoundFile(); if (section is HIRC_SoundSFX) { sf.id = (section as HIRC_SoundSFX).soundid; sf.streamed = ((section as HIRC_SoundSFX).soundincluded == 0 ? false : true); sf.length_object = section; } else if (section is HIRC_MusicTrack) { sf.id = (section as HIRC_MusicTrack).soundID; sf.streamed = ((section as HIRC_MusicTrack).streamed == 0 ? false : true); sf.length_object = section; sf.loop_object = hirc_section.objects[x + 1]; if ((sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParameters_count > 0) { sf.effects = "Additional parameters:\r\n"; for (int y = 0; y < (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParameters_count; y++) { byte type = (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersType[y]; if (type == 0x00) { sf.effects += "General Settings: Voice: Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x02) { sf.effects += "General Settings: Voice: Pitch - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x03) { sf.effects += "General Settings: Voice: Low-pass filter - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x05) { sf.effects += "Advanced Settings: Playback Priority: Priority - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x06) { sf.effects += "Advanced Settings: Playback Priority: Offset priority - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x07) { sf.effects += "Loop count (0 = infinite) - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x08) { sf.effects += " Motion: Audio to Motion Settings: Motion Volume Offset - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x0B) { sf.effects += "Positioning: 2D: Panner X-coordinate - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x0C) { sf.effects += "Positioning: 2D: Panner Y-coordinate - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x0D) { sf.effects += "Positioning: Center % - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x12) { sf.effects += "General Settings: User-Defined Auxiliary Sends: Bus #0 Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x13) { sf.effects += "General Settings: User-Defined Auxiliary Sends: Bus #1 Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x14) { sf.effects += "General Settings: User-Defined Auxiliary Sends: Bus #2 Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x15) { sf.effects += "General Settings: User-Defined Auxiliary Sends: Bus #3 Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x16) { sf.effects += "General Settings: Game-Defined Auxiliary Sends: Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x17) { sf.effects += "General Settings: Output Bus: Volume - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else if (type == 0x18) { sf.effects += "General Settings: Output Bus: Low-pass filter - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } else { sf.effects += "Unknown - " + (sf.loop_object as HIRC_MusicSegment).soundstructure.additionalParametersValue[y]; } sf.effects += "\r\n"; } } else { sf.effects = "This sound does not have any additional parameters."; } x++; } else { continue; } if (!StaticStorage.soundfiles.ContainsKey(sf.id)) { StaticStorage.soundfiles.Add(sf.id, sf); } } } foreach (var sf in StaticStorage.soundfiles.Values) { if (fileOffsets.ContainsKey(sf.id)) { sf.data_offset = fileOffsets[sf.id]; } else { sf.data_offset = 0; } } isLoaded = true; }