示例#1
0
        public WaveIn(int Device, WAVEFORMATEX Format, int BufferSize)
        {
            Log.Global.WriteLine(MessageType.Info, "Opening wave in device '{0}'.", Device);

            // Construct waveIn
            MmException.CheckThrow(Winmm.waveInOpen(out waveIn, Device, ref Format, IntPtr.Zero, IntPtr.Zero, WaveInOpenFlags.CALLBACK_NULL));

            // Create buffers.
            buffers = new List <InBuffer>();
            for (int i = 0; i < 4; ++i)
            {
                InBuffer b = new InBuffer(waveIn, Format, BufferSize);
                b.Record();
                buffers.Add(b);
            }

            MmException.CheckThrow(Winmm.waveInStart(waveIn));
        }
示例#2
0
        private void Proc()
        {
            Thread.CurrentThread.Name = "WaveAudio Stream";

            try
            {
                Log.Global.WriteLine(MessageType.Info, "Entering streaming thread");

                EventWaitHandle[] events = waveIn.Select(i => i.Callback).Concat(waveOut.Select(i => i.Callback)).ToArray();

                Audio.SampleBuffer[] input  = new Audio.SampleBuffer[waveIn.Length];
                Audio.SampleBuffer[] output = new Audio.SampleBuffer[waveOut.Length];
                while (!stop)
                {
                    // TODO: Why can't we use this?
                    //if (!WaitHandle.WaitAll(events, 100))
                    //    continue;

                    // Read from the inputs.
                    for (int i = 0; i < waveIn.Length; ++i)
                    {
                        InBuffer b = waveIn[i].GetBuffer();
                        if (b == null)
                        {
                            return;
                        }
                        using (Audio.RawLock l = new Audio.RawLock(b.Samples, false, true))
                            ConvertSamples(b.Data, format, l, l.Count);
                        b.Record();
                        input[i] = b.Samples;
                    }

                    // Get an available buffer from the outputs.
                    for (int i = 0; i < waveOut.Length; ++i)
                    {
                        OutBuffer b = waveOut[i].GetBuffer();
                        if (b == null)
                        {
                            return;
                        }
                        output[i] = b.Samples;
                    }

                    // Call the callback.
                    callback(buffer, input, output, format.nSamplesPerSec);

                    // Play the results.
                    for (int i = 0; i < output.Length; ++i)
                    {
                        OutBuffer b = (OutBuffer)output[i].Tag;
                        using (Audio.RawLock l = new Audio.RawLock(b.Samples, true, false))
                            ConvertSamples(l, b.Data, format, l.Count);
                        b.Play();
                    }
                }
            }
            catch (Exception Ex)
            {
                Log.Global.WriteLine(MessageType.Error, "Unhandled exception on streaming thread '{0}': {1}", Ex.GetType().FullName, Ex.ToString());
            }
            Log.Global.WriteLine(MessageType.Info, "Exiting streaming thread");
        }
示例#3
0
        private void Proc()
        {
            Thread.CurrentThread.Name = "WaveAudio Stream";

            try
            {
                Log.Global.WriteLine(MessageType.Info, "Entering streaming thread");

                Audio.SampleBuffer[] input  = new Audio.SampleBuffer[waveIn.Length];
                Audio.SampleBuffer[] output = new Audio.SampleBuffer[waveOut.Length];
                while (!stop)
                {
                    // Read from the inputs.
                    for (int i = 0; i < waveIn.Length; ++i)
                    {
                        InBuffer b = null;
                        do
                        {
                            b = waveIn[i].GetBuffer();
                        } while (b == null && !stop);
                        if (b != null)
                        {
                            ConvertSamples(b.Data, format, b.Samples.Raw, b.Samples.Count);
                            b.Record();
                            input[i] = b.Samples;
                        }
                    }

                    // Get an available buffer from the outputs.
                    for (int i = 0; i < waveOut.Length; ++i)
                    {
                        OutBuffer b = null;
                        do
                        {
                            b = waveOut[i].GetBuffer();
                        } while (b == null && !stop);
                        if (b != null)
                        {
                            output[i] = b.Samples;
                        }
                    }

                    if (!stop)
                    {
                        Debug.Assert(input.All(i => i != null));
                        Debug.Assert(output.All(i => i != null));

                        // Call the callback.
                        callback(buffer, input, output, format.nSamplesPerSec);

                        // Play the results.
                        for (int i = 0; i < output.Length; ++i)
                        {
                            OutBuffer b = (OutBuffer)output[i].Tag;
                            ConvertSamples(b.Samples.Raw, b.Data, format, b.Samples.Count);
                            b.Play();
                        }
                    }
                }
            }
            catch (Exception Ex)
            {
                Log.Global.WriteLine(MessageType.Error, "Unhandled exception on streaming thread '{0}': {1}", Ex.GetType().FullName, Ex.ToString());
            }
            Log.Global.WriteLine(MessageType.Info, "Exiting streaming thread");
        }