1

私は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 コールバックが呼び出されません。私が間違っていた提案はありますか?

4

1 に答える 1

1

WaveInEventクラスはこのインスタンスで使用する必要があります。独自のバックグラウンド スレッドを作成し、可能な場合は SyncContext を使用してコールバックを GUI スレッドにマーシャリングします。

于 2012-11-14T06:50:53.717 に答える