private void Converter(TextBox control, ConverterType converterType) { InputAudioFiles = null; txtOgg2FixHdr.Text = String.Empty; txtWwiseConvert.Text = String.Empty; txtWwise2Ogg.Text = String.Empty; txtAudio2Wem.Text = String.Empty; using (var fd = new OpenFileDialog()) { fd.Multiselect = true; fd.Filter = "Wwise 2010.3.3 OGG files (*.ogg)|*.ogg"; if (converterType == ConverterType.Revorb || converterType == ConverterType.WEM) { fd.Filter += "|Wwise 2013 WEM files (*.wem)|*.wem"; } else if (converterType == ConverterType.Ogg2Wem) { fd.Filter = "Vobis Ogg or Wave files (*.ogg, *.wav)|*.ogg; *.wav"; } fd.ShowDialog(); if (!fd.FileNames.Any()) { return; } InputAudioFiles = fd.FileNames; Dictionary <string, string> errorFiles = new Dictionary <string, string>(); List <string> successFiles = new List <string>(); foreach (var file in InputAudioFiles) { try { var extension = Path.GetExtension(file); var outputFileName = Path.Combine(Path.GetDirectoryName(file), String.Format("{0}_fixed{1}", Path.GetFileNameWithoutExtension(file), ".ogg")); switch (converterType) { case ConverterType.HeaderFix: txtOgg2FixHdr.Text = file; using (FileStream fl = File.Create(outputFileName)) OggFile.ConvertOgg(file).CopyTo(fl); break; case ConverterType.Revorb: txtWwise2Ogg.Text = file; OggFile.Revorb(file, outputFileName, Path.GetDirectoryName(Application.ExecutablePath), (extension == ".ogg") ? OggFile.WwiseVersion.Wwise2010 : OggFile.WwiseVersion.Wwise2013); break; case ConverterType.WEM: txtWwiseConvert.Text = file; outputFileName = Path.ChangeExtension(outputFileName, Path.GetExtension(file)); OggFile.ConvertAudioPlatform(file, outputFileName); break; case ConverterType.Ogg2Wem: txtAudio2Wem.Text = file; OggFile.Convert2Wem(file, (int)audioQualityBox.Value, (long)Convert.ToDouble(lblChorusTime.Text) * 1000); break; } successFiles.Add(file); } catch (Exception ex) { errorFiles.Add(file, ex.Message); } } if (errorFiles.Count <= 0 && successFiles.Count > 0) { MessageBox.Show("Conversion complete!", MESSAGEBOX_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Information); } else if (errorFiles.Count > 0 && successFiles.Count > 0) { StringBuilder alertMessage = new StringBuilder( "Conversion complete with errors." + Environment.NewLine + Environment.NewLine); alertMessage.AppendLine( "Files converted with success:" + Environment.NewLine); foreach (var sFile in successFiles) { alertMessage.AppendLine(String.Format("File: {0}", sFile)); } alertMessage.AppendLine("Files converted with error:" + Environment.NewLine); foreach (var eFile in errorFiles) { alertMessage.AppendLine(String.Format("File: {0}; error: {1}", eFile.Key, eFile.Value)); } MessageBox.Show(alertMessage.ToString(), MESSAGEBOX_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { StringBuilder alertMessage = new StringBuilder( "Conversion complete with errors." + Environment.NewLine); alertMessage.AppendLine( "Files converted with error: " + Environment.NewLine); foreach (var eFile in errorFiles) { alertMessage.AppendLine(String.Format("File: {0}, error: {1}", eFile.Key, eFile.Value)); } MessageBox.Show(alertMessage.ToString(), MESSAGEBOX_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
/// <summary> /// Convert wem archive entries to ogg files /// </summary> /// <param name="wems"></param> /// <param name="audioOggPath"></param> /// <param name="previewOggPath"></param> /// <returns></returns> public bool ConvertWemEntries(List <Entry> wems, string audioOggPath, string previewOggPath = "") { // TODO: Debug this untested revised code before first use bool result = false; if (wems.Count > 1) { wems.Sort((e1, e2) => { if (e1.Length < e2.Length) { return(1); } if (e1.Length > e2.Length) { return(-1); } return(0); }); } if (wems.Count > 0) { var top = wems[0]; // wem audio with internal TOC path var tempAudioPath = Path.Combine(Path.GetTempPath(), top.Name); top.Data.Position = 0; using (var fs = File.Create(tempAudioPath)) { top.Data.CopyTo(fs); try { OggFile.Revorb(tempAudioPath, audioOggPath, Path.GetExtension(tempAudioPath).GetWwiseVersion()); result = true; } catch { result = false; } } } if (!String.IsNullOrEmpty(previewOggPath) && result && wems.Count > 0) { var bottom = wems.Last(); var tempAudioPath = Path.Combine(Path.GetTempPath(), bottom.Name); bottom.Data.Position = 0; using (var fs = File.Create(tempAudioPath)) { bottom.Data.CopyTo(fs); try { OggFile.Revorb(tempAudioPath, previewOggPath, Path.GetExtension(tempAudioPath).GetWwiseVersion()); result = true; } catch { result = false; } } } return(result); }
private void Converter(TextBox control, ConverterType converterType) { InputAudioFiles = null; using (var fd = new OpenFileDialog()) { fd.Multiselect = true; fd.Filter = "Wwise 2010.3.3 OGG files (*.ogg)|*.ogg"; if (converterType == ConverterType.Revorb) { fd.Filter += "|Wwise 2013 WEM files (*.wem)|*.wem"; } else if (converterType == ConverterType.WEM) { fd.Filter += "|Wwise 2013 WEM files (*.wem)|*.wem"; //fd.Multiselect = false; } fd.ShowDialog(); if (fd.FileNames.Count() <= 0) { MessageBox.Show("The selected directory has no valid file inside!", MESSAGEBOX_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } string path = Path.GetDirectoryName(fd.FileName); switch (converterType) { case ConverterType.HeaderFix: inputOggTextBox.Text = path; break; case ConverterType.Revorb: inputAudioRocksmithTextBox.Text = path; break; case ConverterType.WEM: InputWemConversionTextbox.Text = path; break; } InputAudioFiles = fd.FileNames; Dictionary <string, string> errorFiles = new Dictionary <string, string>(); List <string> successFiles = new List <string>(); foreach (var file in InputAudioFiles) { try { var extension = Path.GetExtension(file); var outputFileName = Path.Combine(Path.GetDirectoryName(file), String.Format("{0}_fixed{1}", Path.GetFileNameWithoutExtension(file), ".ogg")); switch (converterType) { case ConverterType.HeaderFix: using (FileStream fl = File.Create(outputFileName)) { OggFile.ConvertOgg(file).CopyTo(fl); } break; case ConverterType.Revorb: OggFile.Revorb(file, outputFileName, Path.GetDirectoryName(Application.ExecutablePath), (extension == ".ogg") ? OggFile.WwiseVersion.Wwise2010 : OggFile.WwiseVersion.Wwise2013); break; case ConverterType.WEM: outputFileName = Path.ChangeExtension(outputFileName, Path.GetExtension(file)); OggFile.ConvertAudioPlatform(file, outputFileName); break; } successFiles.Add(file); } catch (Exception ex) { errorFiles.Add(file, ex.Message); } } if (errorFiles.Count <= 0 && successFiles.Count > 0) { MessageBox.Show("Conversion complete!", MESSAGEBOX_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Information); } else if (errorFiles.Count > 0 && successFiles.Count > 0) { StringBuilder alertMessage = new StringBuilder( "Conversion complete with errors." + Environment.NewLine + Environment.NewLine); alertMessage.AppendLine( "Files converted with success:" + Environment.NewLine); foreach (var sFile in successFiles) { alertMessage.AppendLine(String.Format("File: {0}", sFile)); } alertMessage.AppendLine("Files converted with error:" + Environment.NewLine); foreach (var eFile in errorFiles) { alertMessage.AppendLine(String.Format("File: {0}; error: {1}", eFile.Key, eFile.Value)); } MessageBox.Show(alertMessage.ToString(), MESSAGEBOX_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { StringBuilder alertMessage = new StringBuilder( "Conversion complete with errors." + Environment.NewLine); alertMessage.AppendLine( "Files converted with error: " + Environment.NewLine); foreach (var eFile in errorFiles) { alertMessage.AppendLine(String.Format("File: {0}, error: {1}", eFile.Key, eFile.Value)); } MessageBox.Show(alertMessage.ToString(), MESSAGEBOX_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
/// <summary> /// Unpack the specified File, returns unpacked dir. /// </summary> /// <param name="sourceFileName">Source file path.</param> /// <param name="savePath">Save path.</param> /// <param name="decodeAudio">If set to <c>true</c> decode audio.</param> /// <param name="extractSongXml">If set to <c>true</c> extract song xml from sng.</param> /// <param name="overwriteSongXml">If set to <c>true</c> overwrite existing song xml with produced.</param> /// <param name="predefinedPlatform">Predefined source platform.</param> public static string Unpack(string sourceFileName, string savePath, bool decodeAudio = false, bool extractSongXml = false, bool overwriteSongXml = true, Platform predefinedPlatform = null) { Platform platform = sourceFileName.GetPlatform(); if (predefinedPlatform != null && predefinedPlatform.platform != GamePlatform.None && predefinedPlatform.version != GameVersion.None) { platform = predefinedPlatform; } var fnameWithoutExt = Path.GetFileNameWithoutExtension(sourceFileName); var unpackedDir = Path.Combine(savePath, String.Format("{0}_{1}", fnameWithoutExt, platform.platform)); if (Directory.Exists(unpackedDir)) { DirectoryExtension.SafeDelete(unpackedDir); } var useCryptography = platform.version == GameVersion.RS2012; // Cryptography way is used only for PC in Rocksmith 1 switch (platform.platform) { case GamePlatform.Pc: case GamePlatform.Mac: if (platform.version == GameVersion.RS2014) { using (var inputStream = File.OpenRead(sourceFileName)) ExtractPSARC(sourceFileName, savePath, inputStream, platform); } else { using (var inputFileStream = File.OpenRead(sourceFileName)) using (var inputStream = new MemoryStream()) { if (useCryptography) { RijndaelEncryptor.DecryptFile(inputFileStream, inputStream, RijndaelEncryptor.DLCKey); } else { inputFileStream.CopyTo(inputStream); } ExtractPSARC(sourceFileName, savePath, inputStream, platform); } } break; case GamePlatform.XBox360: UnpackXBox360Package(sourceFileName, savePath, platform); break; case GamePlatform.PS3: UnpackPS3Package(sourceFileName, savePath, platform); break; case GamePlatform.None: throw new InvalidOperationException("Platform not found :("); } if (platform.platform == GamePlatform.PS3) { fnameWithoutExt = fnameWithoutExt.Substring(0, fnameWithoutExt.LastIndexOf(".")); } // DECODE AUDIO if (decodeAudio) { var audioFiles = Directory.EnumerateFiles(unpackedDir, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".ogg") || s.EndsWith(".wem")); foreach (var file in audioFiles) { var outputAudioFileName = Path.Combine(Path.GetDirectoryName(file), String.Format("{0}_fixed{1}", Path.GetFileNameWithoutExtension(file), ".ogg")); OggFile.Revorb(file, outputAudioFileName, Path.GetDirectoryName(Application.ExecutablePath), Path.GetExtension(file).GetWwiseVersion()); } } // EXTRACT XML FROM SNG if (extractSongXml && platform.version == GameVersion.RS2014) { var sngFiles = Directory.EnumerateFiles(unpackedDir, "*.sng", SearchOption.AllDirectories); foreach (var sngFile in sngFiles) { var xmlOutput = Path.Combine(Path.GetDirectoryName(sngFile), String.Format("{0}.xml", Path.GetFileNameWithoutExtension(sngFile))); xmlOutput = xmlOutput.Replace(String.Format("bin{0}{1}", Path.DirectorySeparatorChar, platform.GetPathName()[1].ToLower()), "arr"); if (File.Exists(xmlOutput) && !overwriteSongXml) { continue; } var arrType = ArrangementType.Guitar; if (Path.GetFileName(xmlOutput).ToLower().Contains("vocal")) { arrType = ArrangementType.Vocal; } Attributes2014 att = null; if (arrType != ArrangementType.Vocal) { var jsonFiles = Directory.EnumerateFiles(unpackedDir, String.Format("{0}.json", Path.GetFileNameWithoutExtension(sngFile)), SearchOption.AllDirectories).FirstOrDefault(); if (jsonFiles.Any() && !String.IsNullOrEmpty(jsonFiles)) { att = Manifest2014 <Attributes2014> .LoadFromFile(jsonFiles).Entries.ToArray()[0].Value.ToArray()[0].Value; } } var sngContent = Sng2014File.LoadFromFile(sngFile, platform); using (var outputStream = new FileStream(xmlOutput, FileMode.Create, FileAccess.ReadWrite)) { dynamic xmlContent = null; if (arrType == ArrangementType.Vocal) { xmlContent = new Vocals(sngContent); } else { xmlContent = new Song2014(sngContent, att); } xmlContent.Serialize(outputStream); } } } return(unpackedDir); }
/// <summary> /// Unpack the specified File, returns unpacked dir. /// </summary> /// <param name="sourceFileName">Source file path.</param> /// <param name="savePath">Save path.</param> /// <param name="decodeAudio">If set to <c>true</c> decode audio.</param> /// <param name="overwriteSongXml">If set to <c>true</c> overwrite existing song (EOF) xml with SNG data</param> /// <param name="predefinedPlatform">Predefined source platform.</param> public static string Unpack(string sourceFileName, string savePath, bool decodeAudio = false, bool overwriteSongXml = false, Platform predefinedPlatform = null) { Platform platform = sourceFileName.GetPlatform(); if (predefinedPlatform != null && predefinedPlatform.platform != GamePlatform.None && predefinedPlatform.version != GameVersion.None) { platform = predefinedPlatform; } var fnameWithoutExt = Path.GetFileNameWithoutExtension(sourceFileName); if (platform.platform == GamePlatform.PS3) { fnameWithoutExt = fnameWithoutExt.Substring(0, fnameWithoutExt.LastIndexOf(".")); } var unpackedDir = Path.Combine(savePath, String.Format("{0}_{1}", fnameWithoutExt, platform.platform)); if (Directory.Exists(unpackedDir)) { DirectoryExtension.SafeDelete(unpackedDir); } var useCryptography = platform.version == GameVersion.RS2012; // Cryptography way is used only for PC in Rocksmith 1 switch (platform.platform) { case GamePlatform.Pc: case GamePlatform.Mac: if (platform.version == GameVersion.RS2014) { using (var inputStream = File.OpenRead(sourceFileName)) ExtractPSARC(sourceFileName, savePath, inputStream, platform); } else { using (var inputFileStream = File.OpenRead(sourceFileName)) using (var inputStream = new MemoryStream()) { if (useCryptography) { RijndaelEncryptor.DecryptFile(inputFileStream, inputStream, RijndaelEncryptor.DLCKey); } else { inputFileStream.CopyTo(inputStream); } ExtractPSARC(sourceFileName, savePath, inputStream, platform); } } break; case GamePlatform.XBox360: UnpackXBox360Package(sourceFileName, savePath, platform); break; case GamePlatform.PS3: UnpackPS3Package(sourceFileName, savePath, platform); break; case GamePlatform.None: throw new InvalidOperationException("Platform not found :("); } // DECODE AUDIO if (decodeAudio) { GlobalExtension.ShowProgress("Decoding Audio ...", 50); var audioFiles = Directory.EnumerateFiles(unpackedDir, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".ogg") || s.EndsWith(".wem")); foreach (var file in audioFiles) { var outputAudioFileName = Path.Combine(Path.GetDirectoryName(file), String.Format("{0}_fixed{1}", Path.GetFileNameWithoutExtension(file), ".ogg")); OggFile.Revorb(file, outputAudioFileName, Path.GetDirectoryName(Application.ExecutablePath), Path.GetExtension(file).GetWwiseVersion()); } //GlobalExtension.HideProgress(); } // for debugging //overwriteSongXml = false; // Extract XML from SNG and check it against the EOF XML (correct bass tuning from older toolkit/EOF xml files) if (platform.version == GameVersion.RS2014) { var sngFiles = Directory.EnumerateFiles(unpackedDir, "*.sng", SearchOption.AllDirectories).ToList(); var step = Math.Round(1.0 / (sngFiles.Count + 2) * 100, 3); double progress = 0; GlobalExtension.ShowProgress("Extracting XML from SNG ..."); foreach (var sngFile in sngFiles) { var xmlEofFile = Path.Combine(Path.GetDirectoryName(sngFile), String.Format("{0}.xml", Path.GetFileNameWithoutExtension(sngFile))); xmlEofFile = xmlEofFile.Replace(String.Format("bin{0}{1}", Path.DirectorySeparatorChar, platform.GetPathName()[1].ToLower()), "arr"); var xmlSngFile = xmlEofFile.Replace(".xml", ".sng.xml"); var arrType = ArrangementType.Guitar; if (Path.GetFileName(xmlSngFile).ToLower().Contains("vocal")) { arrType = ArrangementType.Vocal; } Attributes2014 att = null; if (arrType != ArrangementType.Vocal) { var jsonFiles = Directory.EnumerateFiles(unpackedDir, String.Format("{0}.json", Path.GetFileNameWithoutExtension(sngFile)), SearchOption.AllDirectories).FirstOrDefault(); if (!String.IsNullOrEmpty(jsonFiles) && jsonFiles.Any()) { att = Manifest2014 <Attributes2014> .LoadFromFile(jsonFiles).Entries.ToArray()[0].Value.ToArray()[0].Value; } } var sngContent = Sng2014File.LoadFromFile(sngFile, platform); using (var outputStream = new FileStream(xmlSngFile, FileMode.Create, FileAccess.ReadWrite)) { dynamic xmlContent = null; if (arrType == ArrangementType.Vocal) { xmlContent = new Vocals(sngContent); } else { xmlContent = new Song2014(sngContent, att); } xmlContent.Serialize(outputStream); } // correct old toolkit/EOF xml (tuning) issues ... sync with SNG data if (File.Exists(xmlEofFile) && !overwriteSongXml && arrType != ArrangementType.Vocal) { var eofSong = Song2014.LoadFromFile(xmlEofFile); var sngSong = Song2014.LoadFromFile(xmlSngFile); if (eofSong.Tuning != sngSong.Tuning) { eofSong.Tuning = sngSong.Tuning; var xmlComments = Song2014.ReadXmlComments(xmlEofFile); using (var stream = File.Open(xmlEofFile, FileMode.Create)) eofSong.Serialize(stream, true); Song2014.WriteXmlComments(xmlEofFile, xmlComments, customComment: "Synced with SNG file"); } File.Delete(xmlSngFile); } else { if (arrType != ArrangementType.Vocal) { Song2014.WriteXmlComments(xmlSngFile, customComment: "Generated from SNG file"); } File.Copy(xmlSngFile, xmlEofFile, true); File.Delete(xmlSngFile); } progress += step; GlobalExtension.UpdateProgress.Value = (int)progress; } //GlobalExtension.HideProgress(); } return(unpackedDir); }