Beispiel #1
0
        public static RiffStream OpenRead(Stream underlyingStream)
        {
            RiffStream stm = new RiffStream();

            stm._accessMode = FileAccess.Read;
            stm._baseStream = underlyingStream;
            stm.LoadHeader();
            if (stm.Format.FormatTag != FormatTag.PCM) // need conversion
            {
                stm.Detach();
                underlyingStream.Seek(0, SeekOrigin.Begin);
                stm = ACMStream.OpenRead(underlyingStream);
            }
            return(stm);
        }
Beispiel #2
0
        /// <summary>
        /// Plays waveform contained in the given stream. Stream is exepcted to contain full riff header
        /// </summary>
        /// <param name="playStream">Stream with the waveform</param>
        public void Play(Stream playStream)
        {
            Monitor.Enter(m_syncRoot);
            try
            {
                if (m_playing)
                {
                    return;
                }

                if (playStream == null)
                {
                    throw new Exception("No valid WAV file has been opened");
                }

#if !NDOC
                if (m_qBuffers == null)
                {
                    m_qBuffers = new Queue <WaveHeader>(MaxBuffers);
                }
                if (m_HandleMap == null)
                {
                    m_HandleMap = new System.Collections.Hashtable(MaxBuffers);
                }

                // create a window to catch waveOutxxx messages
                SoundMessageWindow mw = new SoundMessageWindow();

                // wire in events
                mw.WaveOpenMessage  += new WaveOpenHandler(mw_WaveOpenMessage);
                mw.WaveCloseMessage += new WaveCloseHandler(mw_WaveCloseMessage);
                mw.WaveDoneMessage  += new WaveDoneHandler(mw_WaveDoneMessage);

                // add it to the global array
                m_mwArray.Add(mw);
                int i = m_mwArray.Count - 1;
                if (playStream is ACMStream)
                {
                    m_streamArray.Add(playStream as ACMStream);
                }
                else if (playStream is RiffStream)
                {
                    m_streamArray.Add(playStream as RiffStream);
                }
                else
                {
                    m_streamArray.Add(ACMStream.OpenRead(playStream));
                }
                m_format = (m_streamArray[m_streamArray.Count - 1] as RiffStream).Format;

                // open the waveOut device and register the callback
                CheckWaveError(NativeMethods.waveOutOpen(out m_hWaveOut, m_deviceID, m_format.GetBytes(), m_mwArray[i].Hwnd, 0, CALLBACK_WINDOW));

                // see if we need to adjust playback rate
                if ((PlaybackRate < 0.9f) || (PlaybackRate > 1.1f))
                {
                    SetPlaybackRate(PlaybackRate);
                }

                RefillPlayBuffers();

                while (m_qBuffers.Count > 0)
                {
                    Monitor.Enter(m_qBuffers);
                    WaveHeader hdr = m_qBuffers.Dequeue();
                    Monitor.Exit(m_qBuffers);

                    // play the file
                    ThreadPool.QueueUserWorkItem(BufferWriteThreadProc, hdr);

                    m_playing = true;

                    if (m_qBuffers.Count <= 1)
                    {
                        RefillPlayBuffers();
                    }
                }
#endif
            }
            finally
            {
                Monitor.Exit(m_syncRoot);
            }
        }