c# - How to save an audio capture in a wav file using ASIO and Naudio? -
so far, wrote :
private asioout asiodriver; private bufferedwaveprovider buffer; string[] drivernames = asioout.getdrivernames(); asiodriver = new asioout(drivernames[1]); buffer = new bufferedwaveprovider(new waveformat(samplerate, 16, 2)); asiodriver.audioavailable += new eventhandler<asioaudioavailableeventargs>(asiodriver_audioavailable); asiodriver.initrecordandplayback(buffer, 2, samplerate); asiodriver.play(); private void asiodriver_audioavailable(object sender, asioaudioavailableeventargs e) { byte[] buf = new byte[e.samplesperbuffer * 4]; (int = 0; < e.inputbuffers.length; i++) { marshal.copy(e.inputbuffers[i], buf, 0, e.samplesperbuffer * 4); marshal.copy(buf, 0, e.outputbuffers[i], e.samplesperbuffer * 4); if (recorderon && == 1) { recorder.addinputtostream(buf); } } }
this part used capture , playback sound guitar asio. no problems far.
public void addinputtostream(byte[] buffer) { byte[] sample = new byte[buffer.length / 4]; if (wavewriter == null) wavewriter = new wavefilewriter(@"c:\temp\test0001.wav", new waveformat(44100, 16, 1)); (int = 0; < buffer.length; = + 4) { sample[i/4] = (byte)convert.tosingle(buffer[i] + buffer[i + 1] + buffer[i + 2] + buffer[i + 3]); } wavewriter.write(sample, 0, sample.length); }
the problem appears in method addinputtostream
, sound put in .wav file have lot of "audio parasites" in file. irritating. tried change i
variable when call method, not used convert.tosingle
same result.
i suspect problem waveformat
of wavewriter
don't know i'm missing. of have clue ?
you need create wavefilewriter , write samples out. pretty simple, took me while also. (note: didn't setup waveprovider, have part already).
class asiosample { private naudio.wave.asioout _audiodevice; public wavefilewriter asiowavefilewriter; public asiosample() { //this set 1 channel asiowavefilewriter = new wavefilewriter("sample.wav", new waveformat(48000, 1)); _audiodevice = new naudio.wave.asioout(2);//or whatever _audiodevice.initrecordandplayback(_waveprovider, 1, 48000); _audiodevice.audioavailable += new eventhandler<naudio.wave.asioaudioavailableeventargs>(onaudioavailable); _audiodevice.play(); } private unsafe void onaudioavailable(object sender, naudio.wave.asioaudioavailableeventargs e) { var floatsamples = new float[e.samplesperbuffer * e.inputbuffers.length]; e.getasinterleavedsamples(floatsamples); asiowavefilewriter.writesamples(floatsamples, 0, floatsamples.length); asiowavefilewriter.flush(); } }
Comments
Post a Comment