c# - naudio record sound from microphone then save -


i'm having issues naudio , saving sound recordings. code have works point saves wav file, when open up, windows media player returns error: "windows media player encountered problem while playing file"

i have 2 buttons, "record" button, turns stop button after it's pressed. , have "save" button when clicked, saves recording sample.wav.

naudio.wave.wavein sourcestream = null; naudio.wave.directsoundout waveout = null; naudio.wave.wavefilewriter wavewriter = null;  private void recordbutton_click(object sender, eventargs e) {     int devicenumber = sourcelist.selecteditems[0].index;      sourcestream = new naudio.wave.wavein();     sourcestream.devicenumber = devicenumber;     sourcestream.waveformat = new naudio.wave.waveformat(44100, naudio.wave.wavein.getcapabilities(devicenumber).channels);      naudio.wave.waveinprovider wavein = new naudio.wave.waveinprovider(sourcestream);      waveout = new naudio.wave.directsoundout();     waveout.init(wavein);      sourcestream.startrecording();     waveout.play();      recordbutton.visible = false;     stoprecord.visible = true; }  private void saveresponse_click(object sender, eventargs e) {     int devicenumber = sourcelist.selecteditems[0].index;      string savelocation = "c:\\wav\\sample.wav";      sourcestream = new naudio.wave.wavein();     sourcestream.devicenumber = devicenumber;     sourcestream.waveformat = new naudio.wave.waveformat(44100, naudio.wave.wavein.getcapabilities(devicenumber).channels);      sourcestream.dataavailable += new eventhandler<naudio.wave.waveineventargs>(sourcestream_dataavailable);     wavewriter = new naudio.wave.wavefilewriter(savelocation, sourcestream.waveformat);      sourcestream.startrecording();      messagebox.show("recording saved."); }  private void sourcestream_dataavailable(object sender, naudio.wave.waveineventargs e) {     if (wavewriter == null) return;      wavewriter.writedata(e.buffer, 0, e.bytesrecorded);     wavewriter.flush(); } private void stoprecord_click(object sender, eventargs e) {     if (waveout != null)     {         waveout.stop();         waveout.dispose();         waveout = null;     }     if (sourcestream != null)     {         sourcestream.stoprecording();         sourcestream.dispose();         sourcestream = null;     }     if (wavewriter != null)     {         wavewriter.dispose();         wavewriter = null;     }      recordbutton.visible = true;     stoprecord.visible = false;     saveresponse.enabled = true; } 

your recordbutton_click code isn't recording, it's piping data wavein waveout, play data coming source (microphone) directly output (speakers). doesn't retain data later use, pipes 1 other. if want subsequently save data disk, need buffer yourself.

the saveresponse_click on other hand starting direct recording of data microphone wave file on disk. if click save response button, wait bit, click stop button, should recorded wave file.

if want record directly disk, fine. if want record memory, optionally write disk, need save data comes in. perhaps use memory stream hold data while recording, write wavefilewriter when comes time save file.


here's code used testing direct recording wave file on disk:

public wavein wavesource = null; public wavefilewriter wavefile = null;  private void startbtn_click(object sender, eventargs e) {     startbtn.enabled = false;     stopbtn.enabled = true;      wavesource = new wavein();     wavesource.waveformat = new waveformat(44100, 1);      wavesource.dataavailable += new eventhandler<waveineventargs>(wavesource_dataavailable);     wavesource.recordingstopped += new eventhandler<stoppedeventargs>(wavesource_recordingstopped);      wavefile = new wavefilewriter(@"c:\temp\test0001.wav", wavesource.waveformat);      wavesource.startrecording(); }  private void stopbtn_click(object sender, eventargs e) {     stopbtn.enabled = false;      wavesource.stoprecording(); }  void wavesource_dataavailable(object sender, waveineventargs e) {     if (wavefile != null)     {         wavefile.write(e.buffer, 0, e.bytesrecorded);         wavefile.flush();     } }  void wavesource_recordingstopped(object sender, stoppedeventargs e) {     if (wavesource != null)     {         wavesource.dispose();         wavesource = null;     }      if (wavefile != null)     {         wavefile.dispose();         wavefile = null;     }      startbtn.enabled = true; } 

Comments

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

css - Firefox for ubuntu renders wrong colors -