public static AudioClip CreateAudioClipFromSfx(string clipName, GTAAudioStream audio_stream, int offsetInBytes, int sizeInBytes, int frequency) { AudioClip ret = null; audio_stream.Position = offsetInBytes; byte[] int_pcm = new byte[sizeInBytes]; if (audio_stream.Read(int_pcm, 0, int_pcm.Length) == int_pcm.Length) { float[] float_pcm = new float[int_pcm.Length / sizeof(short)]; for (int i = 0; i < float_pcm.Length; i++) { float_pcm[i] = Mathf.Clamp(((short)(int_pcm[i * sizeof(short)] | (int_pcm[(i * sizeof(short)) + 1] << 8)) / 32767.5f), -1.0f, 1.0f); } ret = AudioClip.Create(clipName, float_pcm.Length, 1, frequency, false); ret.SetData(float_pcm, 0); // Debug.LogFormat("loaded sfx: name {0}, offset {1}, size {2}, length {3}, bitrate Kb/s {4}, stream size {5}, freq {6}", // clipName, offsetInBytes, sizeInBytes, ret.length, // FreqToKbs (frequency), audio_stream.Length, frequency); } return(ret); }
public static AudioClip CreateAudioClipFromSfx(string sfxFileName, int bankIndex, int audioIndex, SfxBankAudioData?sfxBankAudioData) { if (null == s_gtaAudioFiles || bankIndex < 0 || audioIndex < 0) { return(null); } AudioClip ret = null; string clipName = sfxFileName + "." + bankIndex + "." + audioIndex; try { using (GTAAudioStream audio_stream = s_gtaAudioFiles.OpenSFXAudioStreamByName(sfxFileName, (uint)bankIndex, (uint)audioIndex)) { if (audio_stream != null) { // this audio stream holds all sounds from this bank int freq = sfxBankAudioData.HasValue ? Mathf.RoundToInt(KbsToFreq(sfxBankAudioData.Value.bitrateKbs)) : audio_stream.SampleRate; int offsetInBytes = sfxBankAudioData.HasValue ? sfxBankAudioData.Value.offsetInBytes : 0; int sizeInBytes = sfxBankAudioData.HasValue ? sfxBankAudioData.Value.sizeInBytes : (int)audio_stream.Length; ret = CreateAudioClipFromSfx(clipName, audio_stream, offsetInBytes, sizeInBytes, freq); } } } catch (System.Exception e) { Debug.LogError(e); } return(ret); }
public static AudioClip CreateAudioClipFromSfx(string sfxFileName, int bankIndex, int audioIndex) { if (null == s_gtaAudioFiles || bankIndex < 0 || audioIndex < 0) { return(null); } AudioClip ret = null; string clipName = sfxFileName + "." + bankIndex + "." + audioIndex; try { using (GTAAudioStream audio_stream = s_gtaAudioFiles.OpenSFXAudioStreamByName(sfxFileName, (uint)bankIndex, (uint)audioIndex)) { if (audio_stream != null) { ret = CreateAudioClipFromSfx(clipName, audio_stream); } } } catch (System.Exception e) { Debug.LogError(e); } return(ret); }
/// <summary> /// Main entry point /// </summary> /// <param name="args">Command line arguments</param> static void Main(string[] args) { try { string path = null; if (args.Length > 0) { path = args[0]; } else { Console.Write("Please specify a path to dump the audio files from (press return to exit): "); path = Console.ReadLine(); } if (path != null) { if (path.Trim().Length > 0) { string sfx_directory = Path.Combine(Environment.CurrentDirectory, "sfx"); byte[] buffer = new byte[4096]; if (!(Directory.Exists(sfx_directory))) { Directory.CreateDirectory(sfx_directory); } using (GTAAudioFiles gta_audio_files = GTAAudio.OpenRead(path)) { if (gta_audio_files != null) { GTAAudioSFXFile[] sfx_audio_files = gta_audio_files.SFXAudioFiles; foreach (GTAAudioSFXFile sfx_audio_file in sfx_audio_files) { if (sfx_audio_file != null) { string sfx_sfx_directory = Path.Combine(sfx_directory, sfx_audio_file.Name); try { if (!(Directory.Exists(sfx_sfx_directory))) { Directory.CreateDirectory(sfx_sfx_directory); } for (int i = 0, j; i < sfx_audio_file.NumBanks; i++) { try { GTAAudioBankData bank_data = sfx_audio_file.GetBankData((uint)i); string sfx_bank_directory = Path.Combine(sfx_sfx_directory, i.ToString()); if (!(Directory.Exists(sfx_bank_directory))) { Directory.CreateDirectory(sfx_bank_directory); } for (j = 0; j < bank_data.NumAudioClips; j++) { using (Stream audio_stream = sfx_audio_file.Open((uint)i, (uint)j)) { if (audio_stream is GTAAudioStream) { GTAAudioStream gta_audio_stream = (GTAAudioStream)audio_stream; string audio_file_path = Path.Combine(sfx_bank_directory, sfx_audio_file.Name + "." + i + "." + j + ".wav"); if (File.Exists(audio_file_path)) { File.Delete(audio_file_path); } using (FileStream file_stream = File.Open(audio_file_path, FileMode.Create)) { using (BinaryWriter writer = new BinaryWriter(file_stream)) { int len; long audio_stream_length = audio_stream.Length; writer.Write(Encoding.ASCII.GetBytes("RIFF")); writer.Write(0); writer.Write(Encoding.ASCII.GetBytes("WAVEfmt ")); writer.Write(16); writer.Write((short)1); writer.Write((short)1); writer.Write((int)(gta_audio_stream.SampleRate)); writer.Write(gta_audio_stream.SampleRate * 2); writer.Write((short)2); writer.Write((short)16); writer.Write(Encoding.ASCII.GetBytes("data")); writer.Write((int)audio_stream_length); while ((len = Math.Min((int)(audio_stream_length - audio_stream.Position), buffer.Length)) > 0) { if (audio_stream.Read(buffer, 0, len) == len) { file_stream.Write(buffer, 0, len); } else { break; } } file_stream.Seek(4L, SeekOrigin.Begin); writer.Write((int)(file_stream.Length - 8)); } } } } } } catch (Exception e) { Console.Error.WriteLine(e); } } } catch (Exception e) { Console.Error.WriteLine(e); } } } } else { Console.Error.WriteLine("Can't open audio directory \"" + path + "\"."); Environment.ExitCode = 3; } } } else { Environment.ExitCode = 2; } } else { Environment.ExitCode = 1; } } catch (Exception e) { Console.Error.WriteLine(e); Environment.ExitCode = -1; } }