/// <summary> /// Decodes audio data. /// </summary> /// <returns>Returns a decoded IAudioData buffer or null if no more buffer available.</returns> public IAudioData Decode() { if (m_Disposed) { throw new ObjectDisposedException(LogSourceName); } BufferFrame(); // end of file ? -> yes exit if (m_DecodeFifoBuffer.Length == 0) { return(null); } var outBuffer = new FifoBuffer(); bool l_Loop = true; while (l_Loop) { M123.RESULT result; result = M123.SafeNativeMethods.mpg123_decode(m_DecoderHandle, m_DecodeFifoBuffer, outBuffer, 8192); switch (result) { case M123.RESULT.NEED_MORE: if (outBuffer.Length > 0) { l_Loop = false; break; } BufferFrame(); if (m_DecodeFifoBuffer.Length == 0) { return(null); } break; case M123.RESULT.NEW_FORMAT: UpdateFormat(); break; default: M123.CheckResult(result); throw new InvalidOperationException(); } } if (outBuffer.Length > 0) { var resultData = new AudioData(m_CurrentConfig.SamplingRate, m_CurrentConfig.Format, m_CurrentConfig.ChannelSetup, m_CurrentTimeStamp, 0, -1, outBuffer.ToArray()); m_CurrentTimeStamp += resultData.Duration; return(resultData); } return(null); }
/// <summary>Starts the decoding process.</summary> /// <param name="source">The source.</param> /// <exception cref="InvalidOperationException">Source: Decoding already started!.</exception> public void BeginDecode(IFrameSource source) { if (disposed) { throw new ObjectDisposedException(LogSourceName); } if (initialized) { throw new InvalidOperationException(string.Format("Source {0}: Decoding already started!", SourceName)); } if (SourceName != null) { SourceName = source.Name; } initialized = true; M123.Initialize(); m_Source = source; // open new decoder handle M123.RESULT result; m_DecoderHandle = M123.SafeNativeMethods.mpg123_new(null, out result); M123.CheckResult(result); // reset formats M123.CheckResult(M123.SafeNativeMethods.mpg123_format_none(m_DecoderHandle)); // allow all mp3 native samplerates var mode = useFloatingPoint ? M123.ENC.FLOAT_32 : M123.ENC.SIGNED_16; foreach (var sampleRate in M123.SafeNativeMethods.mpg123_rates()) { M123.CheckResult(M123.SafeNativeMethods.mpg123_format(m_DecoderHandle, new IntPtr(sampleRate), M123.CHANNELCOUNT.STEREO, mode)); } // open feed result = M123.SafeNativeMethods.mpg123_open_feed(m_DecoderHandle); M123.CheckResult(result); m_DecodeFifoBuffer = new FifoBuffer(); }