NAudio:WaveInEvent处理程序无法处理自己的线程

时间:2012-11-13 22:52:46

标签: c# naudio

我有一个名为AudioInput的类:

class AudioInput
{
    private WaveIn waveIn;
    public delegate void DataAvailableEventHandler(byte[] data, int size);
    private DataAvailableEventHandler dataAvailableProc;

    public AudioInput(DataAvailableEventHandler dataHandlerProc)
    {
        dataAvailableProc = dataHandlerProc;
    }
    private void initWaveInMic()
    {
        Console.WriteLine("initWaveInMic");
        waveIn = new WaveIn();
        waveIn.BufferMilliseconds = 50;
        waveIn.DeviceNumber = 0;
        waveIn.WaveFormat = new WaveFormat(8000, 1);
        waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(waveIn_DataAvailable);
        waveIn.StartRecording();
    }
    void waveIn_DataAvailable(object sender, WaveInEventArgs e)
    {
        Console.WriteLine("waveIn_DataAvailable e.buffer length: {0}", e.Buffer.Length);
        dataAvailableProc(e.Buffer, e.Buffer.Length);
    }
     public void startNAudio()
    {
        this.initWaveInMic();  //start mic wavein
    }
}

来自通话类:

public partial class AudioTest : Form
{
    Thread audioInputThread;
    AudioInput audioInput;

    private void audioInputCreateThread()
    {
        audioInput = new AudioInput(audioDataToSend);
        audioInput.startNAudio();
        Console.WriteLine("audioInputCreateThread at the end");
    }

    private void AudioTest_Load(object sender, EventArgs e)
    {
        // this will work
        //audioInputCreateThread();

        //this will not work
        audioInputThread = new Thread(audioInputCreateThread);
        audioInputThread.Start();
    }

    private void audioDataToSend(byte[] data, int size)
    {
        Console.WriteLine("audioDataToSend size: {0}", size);
    }
}

未调用AudioInput类中的waveIn_DataAvailable回调。有什么建议我做错了吗?

1 个答案:

答案 0 :(得分:1)

在此实例中应使用WaveInEvent类。它将创建自己的后台线程,如果可能的话,使用SyncContext将回调编组到GUI线程上。