public static byte[] GetWav(AudioClipData clipData, out uint length, WavModificationOptions options) { var data = ConvertAndWrite(clipData.samples, out length, out var samples, options); WriteHeader(data, clipData.frequency, clipData.channels, length, samples); return(data); }
public static void Save(string filename, AudioClip clip, WavModificationOptions optionsParam = null) { AudioClipData data = new AudioClipData(); data.samples = new float[clip.samples * clip.channels]; clip.GetData(data.samples, 0); data.frequency = (uint)clip.frequency; data.channels = (ushort)clip.channels; Save(filename, data, optionsParam); }
public static void Save(string filename, AudioClipData clipData, WavModificationOptions optionsParam = null) { WavModificationOptions options = optionsParam != null ? optionsParam : new WavModificationOptions(); if (!filename.ToLower().EndsWith(".wav")) { filename += ".wav"; } var filepath = Path.Combine(Application.persistentDataPath, filename); // Make sure directory exists if user is saving to sub dir. Directory.CreateDirectory(Path.GetDirectoryName(filepath)); using (var fileStream = new FileStream(filepath, FileMode.Create)) using (var writer = new BinaryWriter(fileStream)) { var wav = GetWav(clipData, out var length, options); writer.Write(wav, 0, (int)length); } }
private static byte[] ConvertAndWrite(float[] samples, out uint length, out uint samplesAfterTrimming, WavModificationOptions options) { var sampleCount = samples.Length; var start = 0; var end = sampleCount - 1; if (options.trimSamples > 0) { start = (int)options.trimSamples; } if (options.silenceSamples > 0) { sampleCount += (int)options.silenceSamples; } var buffer = new byte[(sampleCount * 2) + HeaderSize]; var p = HeaderSize; //Write out silence samples if (options.silenceSamples > 0) { for (uint i = 0; i < options.silenceSamples; ++i) { buffer[p++] = 0; buffer[p++] = 0; } } for (var i = start; i <= end; i++) { var value = (short)(samples[i] * RescaleFactor); buffer[p++] = (byte)(value >> 0); buffer[p++] = (byte)(value >> 8); } length = p; samplesAfterTrimming = (uint)(end - start + 1) + options.silenceSamples; return(buffer); }