/// <summary> /// Releases all resource used by the <see cref="T:Pronome.Mixer"/> object. /// </summary> /// <remarks>Call <see cref="Dispose"/> when you are finished using the <see cref="T:Pronome.Mixer"/>. The /// <see cref="Dispose"/> method leaves the <see cref="T:Pronome.Mixer"/> in an unusable state. After calling /// <see cref="Dispose"/>, you must release all references to the <see cref="T:Pronome.Mixer"/> so the garbage /// collector can reclaim the memory that the <see cref="T:Pronome.Mixer"/> was occupying.</remarks> public void Dispose() { Graph.Dispose(); MixerNode.Dispose(); _converter.Dispose(); Metronome.Instance.TempoChanged -= TempoChanged; }
/// <summary> /// Renders the given number of seconds to the given wav file /// </summary> /// <param name="fileName">File name.</param> /// <param name="seconds">Seconds.</param> public void RenderToFile(string fileName, double seconds) { long samples = (long)(seconds * Metronome.SampleRate); var inputStream = MixerNode.GetAudioFormat(AudioUnitScopeType.Output); var outputStream = AudioStreamBasicDescription.CreateLinearPCM(44100, 2); AudioConverter converter = AudioConverter.Create(inputStream, outputStream); var file = ExtAudioFile.CreateWithUrl( new Foundation.NSUrl(fileName, false), AudioFileType.WAVE, outputStream, AudioFileFlags.EraseFlags, out ExtAudioFileError e ); long samplesRead = 0; // initialize the buffers var buffers = new AudioBuffers(2); buffers[0] = new AudioBuffer() { DataByteSize = BufferSize * 4, NumberChannels = 1, Data = Marshal.AllocHGlobal(sizeof(float) * BufferSize) }; buffers[1] = new AudioBuffer() { DataByteSize = BufferSize * 4, NumberChannels = 1, Data = Marshal.AllocHGlobal(sizeof(float) * BufferSize) }; var convBuffers = new AudioBuffers(1); convBuffers[0] = new AudioBuffer() { DataByteSize = BufferSize * 4, NumberChannels = 2, Data = Marshal.AllocHGlobal(sizeof(float) * BufferSize) }; while (samples > 0) { int numSamples = (int)(Math.Min(BufferSize, samples)); // get samples from the mixer Render((uint)numSamples, buffers, samplesRead); // conver to the file's format converter.ConvertComplexBuffer(numSamples, buffers, convBuffers); // write samples to the file var error = file.Write((uint)numSamples, convBuffers); if (error != ExtAudioFileError.OK) { throw new ApplicationException(); } samples -= BufferSize; samplesRead += numSamples; } buffers.Dispose(); convBuffers.Dispose(); converter.Dispose(); file.Dispose(); }