private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { int n = listBox1.SelectedIndex; if (n == -1) { return; } rtb1.Text = ""; rtb1.Visible = true; hb1.Visible = false; int index = ObjectIndexes[n]; PCCObject.ExportEntry ex = pcc.Exports[index]; if (ex.ClassName == "WwiseStream") { w = new WwiseStream(pcc, index); string s = "#" + index + " WwiseStream : " + ex.ObjectName + "\n\n"; s += "Filename : \"" + w.FileName + "\"\n"; s += "Data size: " + w.DataSize + " bytes\n"; s += "Data offset: 0x" + w.DataOffset.ToString("X8") + "\n"; s += "ID: 0x" + w.Id.ToString("X8") + " = " + w.Id + "\n"; rtb1.Text = s; } if (ex.ClassName == "WwiseBank") { rtb1.Visible = false; hb1.Visible = true; wb = new WwiseBank(pcc, index); hb1.ByteProvider = new DynamicByteProvider(wb.getBinary()); } }
public override void handleUpdate(List <PackageUpdate> updates) { IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import && x.change != PackageChange.ImportAdd && x.change != PackageChange.Names); List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList(); if (updatedExports.Contains(bank.MyIndex)) { int index = bank.MyIndex; //loaded sequence is no longer a sequence if (pcc.getExport(index).ClassName != "WwiseBank") { bank = null; listBox2.Items.Clear(); rtb1.Text = ""; hb1.ByteProvider = new DynamicByteProvider(new List <byte>()); hb2.ByteProvider = new DynamicByteProvider(new List <byte>()); } RefreshSelected(); updatedExports.Remove(index); } if (updatedExports.Intersect(objects).Count() > 0) { ListRefresh(); } foreach (var i in updatedExports) { if (pcc.getExport(i).ClassName.Contains("WwiseBank")) { ListRefresh(); break; } } }
private void ExtractBankToWav(SoundplorerExport spExport, string location = null) { if (spExport != null && spExport.Export.ClassName == "WwiseBank") { WwiseBank wb = new WwiseBank(spExport.Export); var embeddedWEMFiles = wb.GetWEMFilesMetadata(); if (embeddedWEMFiles.Count > 0) { if (location == null) { var dlg = new CommonOpenFileDialog("Select output folder") { IsFolderPicker = true }; if (dlg.ShowDialog() != CommonFileDialogResult.Ok) { return; } location = dlg.FileName; } var data = wb.GetChunk("DATA"); if (embeddedWEMFiles.Count > 0) { foreach (var singleWemMetadata in embeddedWEMFiles) { byte[] wemData = new byte[singleWemMetadata.Item3]; //copy WEM data to buffer. Add 0x8 to skip DATA and DATASIZE header for this block. Buffer.BlockCopy(data, singleWemMetadata.Item2 + 0x8, wemData, 0, singleWemMetadata.Item3); //check for RIFF header as some don't seem to have it and are not playable. string wemHeader = "" + (char)wemData[0] + (char)wemData[1] + (char)wemData[2] + (char)wemData[3]; string wemName = spExport.Export.ObjectName + "_0x" + singleWemMetadata.Item1.ToString("X8"); if (wemHeader == "RIFF") { EmbeddedWEMFile wem = new EmbeddedWEMFile(wemData, wemName, spExport.Export.FileRef.Game); //will correct truncated stuff Stream waveStream = soundPanel.getPCMStream(forcedWemFile: wem); if (waveStream != null && waveStream.Length > 0) { string outputname = wemName + ".wav"; string outpath = System.IO.Path.Combine(location, outputname); using (var fileStream = File.Create(outpath)) { waveStream.Seek(0, SeekOrigin.Begin); waveStream.CopyTo(fileStream); } } } } } } } }
public Wwise_File_Extract_V2(string Bank_File) { if (!File.Exists(Bank_File)) { IsClear = true; return; } Selected_BNK_File = Bank_File; WB = new WwiseBank(Bank_File); LL.Add((LoLSoundBank)WB); LOL = new LoLSoundBankManager(LL); WEML = LOL.GetAudioFiles(); }
public void RefreshSelected() { int n = listBox1.SelectedIndex; if (n == -1) { return; } int index = objects[n]; bank = new WwiseBank(pcc, index); hb1.ByteProvider = new DynamicByteProvider(bank.getBinary()); rtb1.Text = bank.GetQuickScan(); ListRefresh2(); }
/// <summary> /// Rewrites the soundbank export with new data from the ogg. /// </summary> /// <param name="oggPath"></param> private void ReplaceWEMAudioFromWwiseOgg(string oggPath, EmbeddedWEMFile wem) { WwiseBank w = new WwiseBank(CurrentLoadedExport); if (oggPath == null) { OpenFileDialog d = new OpenFileDialog(); d.Filter = "Wwise Encoded Ogg|*.ogg"; bool?res = d.ShowDialog(); if (res.HasValue && res.Value) { oggPath = d.FileName; } else { return; } } MemoryStream convertedStream = null; using (var fileStream = new FileStream(oggPath, FileMode.Open)) { convertedStream = WwiseStream.ConvertWwiseOggToME3Ogg(fileStream); } //Update the EmbeddedWEMFile. As this is an object it will be updated in the references. if (wem.HasBeenFixed) { wem.OriginalWemData = convertedStream.ToArray(); } else { wem.WemData = convertedStream.ToArray(); } w.UpdateDataChunk(AllWems); //updates this export's data. File.Delete(oggPath); MessageBox.Show("Done"); }
public void LoadData() { if (Export.ClassName == "WwiseStream") { WwiseStream w = new WwiseStream(Export); string afcPath = w.getPathToAFC(); if (afcPath == "") { SubText = "Could not find AFC"; } else { TimeSpan?time = w.GetSoundLength(); if (time != null) { //here backslash must be present to tell that parser colon is //not the part of format, it just a character that we want in output SubText = time.Value.ToString(@"mm\:ss\:fff"); } else { SubText = "Error getting length, may be unsupported"; } } NeedsLoading = false; Icon = FontAwesomeIcon.VolumeUp; } if (Export.ClassName == "WwiseBank") { WwiseBank wb = new WwiseBank(Export); var embeddedWEMFiles = wb.GetWEMFilesMetadata(); SubText = embeddedWEMFiles.Count() + " embedded WEM" + (embeddedWEMFiles.Count() != 1 ? "s" : ""); NeedsLoading = false; Icon = FontAwesomeIcon.University; } }
// parameter is allowed class type for visibility public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return(WwiseBank.GetHircObjType((byte)value)); }
public override void LoadExport(IExportEntry exportEntry) { ExportInformationList.Clear(); AllWems.Clear(); //Check if we need to first gather wwiseevents for wem IDing //Uncomment when HIRC stuff is implemented, if ever... /*if (exportEntry.FileRef != CurrentPackage) * { * //update * WemIdsToWwwiseEventIdMapping.Clear(); * List<IExportEntry> wwiseEventExports = exportEntry.FileRef.Exports.Where(x => x.ClassName == "WwiseEvent").ToList(); * foreach (IExportEntry wwiseEvent in wwiseEventExports) * { * StructProperty relationships = wwiseEvent.GetProperty<StructProperty>("Relationships"); * IntProperty id = wwiseEvent.GetProperty<IntProperty>("Id"); * FloatProperty DurationMilliseconds = wwiseEvent.GetProperty<FloatProperty>("DurationMilliseconds"); * * if (relationships != null) * { * ObjectProperty bank = relationships.GetProp<ObjectProperty>("Bank"); * if (bank != null && bank.Value > 0) * { * //export in this file * List<Tuple<string, int, double>> bankWemInfosList; * Tuple<string, int, double> newData = new Tuple<string, int, double>(wwiseEvent.ObjectName, id.Value, DurationMilliseconds.Value); * if (WemIdsToWwwiseEventIdMapping.TryGetValue(exportEntry.FileRef.Exports[bank.Value - 1], out bankWemInfosList)) * { * bankWemInfosList.Add(newData); * } * else * { * WemIdsToWwwiseEventIdMapping[exportEntry.FileRef.Exports[bank.Value - 1]] = new List<Tuple<string, int, double>>(); * WemIdsToWwwiseEventIdMapping[exportEntry.FileRef.Exports[bank.Value - 1]].Add(newData); * } * } * } * } * * } * CurrentPackage = exportEntry.FileRef;*/ ExportInformationList.Add("#" + exportEntry.Index + " " + exportEntry.ClassName + " : " + exportEntry.ObjectName); if (exportEntry.ClassName == "WwiseStream") { WwiseStream w = new WwiseStream(exportEntry); ExportInformationList.Add("Filename : " + (w.FileName ?? "Stored in this PCC")); ExportInformationList.Add("Data size: " + w.DataSize + " bytes"); ExportInformationList.Add("Data offset: 0x" + w.DataOffset.ToString("X8")); string wemId = "ID: 0x" + w.Id.ToString("X8"); if (Properties.Settings.Default.SoundplorerReverseIDDisplayEndianness) { wemId += $" | 0x{ReverseBytes((uint)w.Id).ToString("X8")} (Reversed)"; } ExportInformationList.Add(wemId); CurrentLoadedExport = exportEntry; } if (exportEntry.ClassName == "WwiseBank") { WwiseBank wb = new WwiseBank(exportEntry); var embeddedWEMFiles = wb.GetWEMFilesMetadata(); var data = wb.GetChunk("DATA"); int i = 0; if (embeddedWEMFiles.Count > 0) { foreach (var singleWemMetadata in embeddedWEMFiles) { byte[] wemData = new byte[singleWemMetadata.Item3]; //copy WEM data to buffer. Add 0x8 to skip DATA and DATASIZE header for this block. Buffer.BlockCopy(data, singleWemMetadata.Item2 + 0x8, wemData, 0, singleWemMetadata.Item3); //check for RIFF header as some don't seem to have it and are not playable. string wemHeader = "" + (char)wemData[0] + (char)wemData[1] + (char)wemData[2] + (char)wemData[3]; string wemId = singleWemMetadata.Item1.ToString("X8"); if (Properties.Settings.Default.SoundplorerReverseIDDisplayEndianness) { wemId = ReverseBytes(singleWemMetadata.Item1).ToString("X8") + " (Reversed)"; } string wemName = "Embedded WEM 0x" + wemId;// + "(" + singleWemMetadata.Item1 + ")"; /* //HIRC lookup, if I ever get around to supporting HIRC * List<Tuple<string, int, double>> wemInfo; * if (WemIdsToWwwiseEventIdMapping.TryGetValue(exportEntry, out wemInfo)) * { * var info = wemInfo.FirstOrDefault(x => x.Item2 == singleWemMetadata.Item1); //item2 in x = ID, singleWemMetadata.Item1 = ID * if (info != null) * { * //have info * wemName = info.Item1; * } * }*/ EmbeddedWEMFile wem = new EmbeddedWEMFile(wemData, i + ": " + wemName, exportEntry.FileRef.Game, singleWemMetadata.Item1); if (wemHeader == "RIFF") { ExportInformationList.Add(wem); } else { ExportInformationList.Add(i + ": " + wemName + " - No RIFF header"); } AllWems.Add(wem); i++; } } else { ExportInformationList.Add("This soundbank has no embedded WEM files"); } CurrentLoadedExport = exportEntry; } }