2013-01-14 17 views
7

Jestem nowym użytkownikiem NAudio i próbuję napisać mały program, który rejestruje dźwięk z mikrofonu i zapisuje go w pliku Wave. Kiedy wywołuję funkcję recordStuff() w funkcji głównej mojego programu, program nie przechodzi poza konstrukcję obiektu WaveIn, a program umiera z wyjątkiem InvalidOperationException, który ma komunikat "Użyj WaveInEvent do nagrania na wątku tła" . Czy ktoś z wiedzą o NAudio może mi powiedzieć, co to oznacza? Próbowałem wywoływać funkcję recordStuff() w jej wątku, ale kończę z tym samym wynikiem.Naudio InvalidOperationException podczas konstruowania WaveIn

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); 
     } 
    } 
} 

Odpowiedz

12

Domyślny konstruktor WaveIn wykorzystuje komunikaty systemu Windows do wywołań zwrotnych. Jeśli jednak używasz aplikacji konsolowej lub wątku tła, te wiadomości systemu Windows nie zostaną przetworzone. Najprostszym rozwiązaniem jest użycie klasy WaveInEvent.

waveInStream = new WaveInEvent(); 

Innym problemem z kodem jest, że trzeba zachować waveInStream żyje dopiero po zakończeniu nagrywania (czyli trzeba być w stanie wywołać StopRecording w pewnym momencie), więc należy dokonać waveInStream polu z klasy Recorder.

+0

Co to są wiadomości systemu Windows? –