2013-01-14 30 views
7

Sono molto nuovo in NAudio e sto provando a scrivere un piccolo programma che registra audio da un microfono e lo scrive in un file Wave. Quando chiamo la funzione recordStuff() nella funzione Main del mio programma, il programma non supera la costruzione sull'oggetto WaveIn e il programma muore con una InvalidOperationException con il messaggio "Usa WaveInEvent per registrare su un thread in background" . Qualcuno con la conoscenza di NAudio potrebbe forse dirmi cosa significa? Ho provato a chiamare la funzione recordStuff() nella sua stessa discussione, ma finisco con lo stesso risultato.NAudio InvalidOperationException durante la creazione di 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); 
     } 
    } 
} 

risposta

12

Il costruttore di default WaveIn utilizza i messaggi di Windows per le richiamate. Tuttavia, se si esegue un'app console o da un thread in background, questi messaggi Windows non verranno elaborati. La soluzione più semplice è utilizzare invece la classe WaveInEvent.

waveInStream = new WaveInEvent(); 

Un altro problema con il codice è che è necessario mantenere waveInStream viva fino a quando hai finito di registrare (cioè è necessario essere in grado di chiamare StopRecording ad un certo punto), così si dovrebbe fare waveInStream un campo della classe Recorder.

+0

Cosa sono i messaggi di Windows? –

Problemi correlati