/// <summary> /// Decompress a single frame of MP3 /// </summary> public int DecompressFrame(Mp3Frame frame, byte[] dest, int destOffset) { // 1. copy into our DMO's input buffer inputMediaBuffer.LoadData(frame.RawData, frame.FrameLength); if (reposition) { mp3Decoder.MediaObject.Flush(); reposition = false; } // 2. Give the input buffer to the DMO to process mp3Decoder.MediaObject.ProcessInput(0, inputMediaBuffer, DmoInputDataBufferFlags.None, 0, 0); outputBuffer.MediaBuffer.SetLength(0); outputBuffer.StatusFlags = DmoOutputDataBufferFlags.None; // 3. Now ask the DMO for some output data mp3Decoder.MediaObject.ProcessOutput(DmoProcessOutputFlags.None, 1, new[] { outputBuffer }); if (outputBuffer.Length == 0) { NAudioLogger.Instance.LogWarning("ResamplerDmoStream.Read: No output data available"); return(0); } // 5. Now get the data out of the output buffer outputBuffer.RetrieveData(dest, destOffset); Debug.Assert(!outputBuffer.MoreDataAvailable, "have not implemented more data available yet"); return(outputBuffer.Length); }
/// <summary> /// Reads data from input stream /// </summary> /// <param name="buffer">buffer</param> /// <param name="offset">offset into buffer</param> /// <param name="count">Bytes required</param> /// <returns>Number of bytes read</returns> public override int Read(byte[] buffer, int offset, int count) { int outputBytesProvided = 0; while (outputBytesProvided < count) { if (resampler.MediaObject.IsAcceptingData(0)) { // 1. Read from the input stream int inputBytesRequired = (int)OutputToInputPosition(count - outputBytesProvided); byte[] inputByteArray = new byte[inputBytesRequired]; int inputBytesRead = inputStream.Read(inputByteArray, 0, inputBytesRequired); if (inputBytesRead == 0) { Debug.WriteLine("ResamplerDmoStream.Read: No input data available"); break; } // 2. copy into our DMO's input buffer inputMediaBuffer.LoadData(inputByteArray, inputBytesRead); // 3. Give the input buffer to the DMO to process resampler.MediaObject.ProcessInput(0, inputMediaBuffer, DmoInputDataBufferFlags.None, 0, 0); outputBuffer.MediaBuffer.SetLength(0); outputBuffer.StatusFlags = DmoOutputDataBufferFlags.None; // 4. Now ask the DMO for some output data resampler.MediaObject.ProcessOutput(DmoProcessOutputFlags.None, 1, new DmoOutputDataBuffer[] { outputBuffer }); if (outputBuffer.Length == 0) { Debug.WriteLine("ResamplerDmoStream.Read: No output data available"); break; } // 5. Now get the data out of the output buffer outputBuffer.RetrieveData(buffer, offset + outputBytesProvided); outputBytesProvided += outputBuffer.Length; Debug.Assert(!outputBuffer.MoreDataAvailable, "have not implemented more data available yet"); } else { Debug.Assert(false, "have not implemented not accepting logic yet"); } } position += outputBytesProvided; return(outputBytesProvided); }