/// <summary> /// WaveStream to resample using the DMO Resampler /// </summary> /// <param name="inputProvider">Input Stream</param> /// <param name="outputFormat">Desired Output Format</param> public ResamplerDmoStream(IWaveProvider inputProvider, WaveFormat outputFormat) { this.inputProvider = inputProvider; this.inputStream = inputProvider as WaveStream; this.outputFormat = outputFormat; this.resampler = new Resampler(); if (!resampler.MediaObject.SupportsInputWaveFormat(0, inputProvider.WaveFormat)) { throw new ArgumentException("Unsupported Input Stream format", "inputStream"); } resampler.MediaObject.SetInputWaveFormat(0, inputProvider.WaveFormat); if (!resampler.MediaObject.SupportsOutputWaveFormat(0, outputFormat)) { throw new ArgumentException("Unsupported Output Stream format", "outputStream"); } resampler.MediaObject.SetOutputWaveFormat(0, outputFormat); if (inputStream != null) { position = InputToOutputPosition(inputStream.Position); } this.inputMediaBuffer = new MediaBuffer(inputProvider.WaveFormat.AverageBytesPerSecond); this.outputBuffer = new DmoOutputDataBuffer(outputFormat.AverageBytesPerSecond); }
/// <summary> /// Initializes a new instance of the DMO MP3 Frame decompressor /// </summary> /// <param name="sourceFormat"></param> public DmoMp3FrameDecompressor(WaveFormat sourceFormat) { this.mp3Decoder = new WindowsMediaMp3Decoder(); if (!mp3Decoder.MediaObject.SupportsInputWaveFormat(0, sourceFormat)) { throw new ArgumentException("Unsupported input format"); } mp3Decoder.MediaObject.SetInputWaveFormat(0, sourceFormat); pcmFormat = new WaveFormat(sourceFormat.SampleRate, sourceFormat.Channels); // 16 bit if (!mp3Decoder.MediaObject.SupportsOutputWaveFormat(0, pcmFormat)) { throw new ArgumentException(String.Format("Unsupported output format {0}", pcmFormat)); } mp3Decoder.MediaObject.SetOutputWaveFormat(0, pcmFormat); // a second is more than enough to decompress a frame at a time inputMediaBuffer = new MediaBuffer(sourceFormat.AverageBytesPerSecond); outputBuffer = new DmoOutputDataBuffer(pcmFormat.AverageBytesPerSecond); }
public void ResamplerCanCallProcessOutput() { Resampler resampler = new Resampler(); WaveFormat inputFormat = WaveFormat.CreateIeeeFloatWaveFormat(44100, 2); WaveFormat outputFormat = WaveFormat.CreateIeeeFloatWaveFormat(48000, 2); resampler.MediaObject.SetInputWaveFormat(0, inputFormat); resampler.MediaObject.SetOutputWaveFormat(0, outputFormat); resampler.MediaObject.AllocateStreamingResources(); using (MediaBuffer inputBuffer = new MediaBuffer(inputFormat.AverageBytesPerSecond)) { inputBuffer.Length = inputFormat.AverageBytesPerSecond / 10; Debug.WriteLine(String.Format("Input Length {0}", inputBuffer.Length)); resampler.MediaObject.ProcessInput(0, inputBuffer, DmoInputDataBufferFlags.None, 0, 0); Debug.WriteLine(String.Format("Input Length {0}", inputBuffer.Length)); Debug.WriteLine(String.Format("Input Lookahead {0}", resampler.MediaObject.GetInputSizeInfo(0).MaxLookahead)); //Debug.WriteLine(String.Format("Input Max Latency {0}", resampler.MediaObject.GetInputMaxLatency(0))); using (DmoOutputDataBuffer outputBuffer = new DmoOutputDataBuffer(outputFormat.AverageBytesPerSecond)) { // one buffer for each output stream resampler.MediaObject.ProcessOutput(DmoProcessOutputFlags.None, 1, new DmoOutputDataBuffer[] { outputBuffer }); Debug.WriteLine(String.Format("Converted length: {0}", outputBuffer.Length)); Debug.WriteLine(String.Format("Converted flags: {0}", outputBuffer.StatusFlags)); //Assert.AreEqual((int)(inputBuffer.Length * 48000.0 / inputFormat.SampleRate), outputBuffer.Length, "Converted buffer length"); } using (DmoOutputDataBuffer outputBuffer = new DmoOutputDataBuffer(48000 * 2 * 4)) { // one buffer for each output stream resampler.MediaObject.ProcessOutput(DmoProcessOutputFlags.None, 1, new DmoOutputDataBuffer[] { outputBuffer }); Debug.WriteLine(String.Format("Converted length: {0}", outputBuffer.Length)); Debug.WriteLine(String.Format("Converted flags: {0}", outputBuffer.StatusFlags)); //Assert.AreEqual((int)(inputBuffer.Length * 48000.0 / inputFormat.SampleRate), outputBuffer.Length, "Converted buffer length"); } } resampler.MediaObject.FreeStreamingResources(); }
/// <summary> /// Process Output /// </summary> /// <param name="flags">Flags</param> /// <param name="outputBufferCount">Output buffer count</param> /// <param name="outputBuffers">Output buffers</param> public void ProcessOutput(DmoProcessOutputFlags flags, int outputBufferCount, DmoOutputDataBuffer[] outputBuffers) { int reserved; Marshal.ThrowExceptionForHR(mediaObject.ProcessOutput(flags, outputBufferCount, outputBuffers, out reserved)); }