2013-01-14 7 views
7

私はNAudioの新機能で、マイクからのオーディオを録音してWaveファイルに書き込む小さなプログラムを作成しようとしています。私のプログラムのMain関数でrecordStuff()関数を呼び出すと、プログラムはWaveInオブジェクト上の構造体を越えず、プログラムは "WaveInEventを使用してバックグラウンドスレッドに記録する"というメッセージを持つInvalidOperationExceptionで終了します。 NAudioの知識を持っている人なら、これがどういう意味か教えてくれますか?私はそれ自身のスレッドでrecordStuff()関数を呼び出すことを試みたが、私は同じ結果で終わる。NAudio WaveInを構築するときにInvalidOperationExceptionが発生する

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using NAudio.Wave; 

namespace SimpleWave 
{ 
    class Recorder 
    { 
     public Recorder() 
     { 
      writer = new WaveFileWriter("C:\\Users\\Paul\\Desktop\\yeah.wav", new NAudio.Wave.WaveFormat(44100, 1)); 
     } 

     public static List<byte> buff = new List<byte>(); 
     public static WaveFileWriter writer; 

     public void recordStuff() 
     { 
      // WaveIn Streams for recording 
      WaveIn waveInStream; 

      waveInStream = new WaveIn(); 
      waveInStream.DeviceNumber = 0; 
      waveInStream.WaveFormat = new WaveFormat(44100, 2); 
      writer = new WaveFileWriter(@"C:\Users\Paul\Desktop\this.wav", waveInStream.WaveFormat); 

      waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable); 
      waveInStream.StartRecording(); 
     } 

     public void waveInStream_DataAvailable(object sender, WaveInEventArgs e) 
     { 
      writer.Write(e.Buffer, 0, e.BytesRecorded); 
     } 
    } 
} 

答えて

12

デフォルトWaveInコンストラクタは、コールバックのWindowsメッセージを使用しています。ただし、コンソールアプリケーションやバックグラウンドスレッドを実行している場合、これらのWindowsメッセージは処理されません。最も簡単な解決策は、代わりにWaveInEventクラスを使用することです。

waveInStream = new WaveInEvent(); 

あなたのコードのもう一つの問題は、(つまり、あなたはいくつかの点でStopRecordingを呼び出すことができるようにする必要があります)あなたは記録が終了するまで生きwaveInStreamを維持する必要があるということですので、あなたはwaveInStreamフィールドを作成する必要がありますRecorderクラスの

+0

Windowsメッセージとは何ですか? –

関連する問題