ddf / Minim

A Java audio library, designed to be used with Processing.
http://code.compartmental.net/tools/minim
GNU Lesser General Public License v3.0
668 stars 136 forks source link

recorder.save() breaks after 6 files #105

Closed mbmosher closed 4 years ago

mbmosher commented 4 years ago

With a one line mod to the RecordAudioInput to allow for recording multiple audio files, an error is thrown: ==== JavaSound Minim Error ==== ==== Couldn't open the line: line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian not supported.

The code producing the error is: `import ddf.minim.*;

Minim minim; AudioInput in; AudioRecorder recorder;

void setup() { size(512, 200, P3D);

minim = new Minim(this);

in = minim.getLineIn(); // create a recorder that will record from the input to the filename specified // the file will be located in the sketch's root folder. recorder = minim.createRecorder(in, "myrecording - "+new java.util.Date()+".wav");

textFont(createFont("Arial", 12)); }

void draw() { background(0); stroke(255); // draw the waveforms // the values returned by left.get() and right.get() will be between -1 and 1, // so we need to scale them up to see the waveform for(int i = 0; i < in.bufferSize() - 1; i++) { line(i, 50 + in.left.get(i)50, i+1, 50 + in.left.get(i+1)50); line(i, 150 + in.right.get(i)50, i+1, 150 + in.right.get(i+1)50); }

if ( recorder.isRecording() ) { text("Currently recording...", 5, 15); } else { text("Not recording.", 5, 15); } }

void keyReleased() { if ( key == 'r' ) { // to indicate that you want to start or stop capturing audio data, you must call // beginRecord() and endRecord() on the AudioRecorder object. You can start and stop // as many times as you like, the audio data will be appended to the end of the buffer // (in the case of buffered recording) or to the end of the file (in the case of streamed recording). if ( recorder.isRecording() ) { recorder.endRecord(); } else { recorder = minim.createRecorder(in, "myrecording - "+new java.util.Date()+".wav"); recorder.beginRecord(); } } if ( key == 's' ) { // we've filled the file out buffer, // now write it to the file we specified in createRecorder // in the case of buffered recording, if the buffer is large, // this will appear to freeze the sketch for sometime // in the case of streamed recording, // it will not freeze as the data is already in the file and all that is being done // is closing the file. // the method returns the recorded audio as an AudioRecording, // see the example AudioRecorder >> RecordAndPlayback for more about that recorder.save(); println("Done saving."); } }`

The only difference between this and the example code is the line: recorder = minim.createRecorder(in, "myrecording - "+new java.util.Date()+".wav"); placed before: recorder.beginRecord();

I'm using Processing 3.5.3 on a Raspberry Pi.

ddf commented 4 years ago

Yes, if you aren't going to do anything with the return value of save() it must have close() called on it or else Minim will keep the stream returned cached and Javasound will eventually run out. Try changing recorder.save(); to recorder.save().close();

ddf commented 4 years ago

I updated the example a little while back to use the return value (and not allow multiple saves). But have not yet put together a new release (and am not sure when I will be able to do so).

https://github.com/ddf/Minim/blob/master/examples/Advanced/RecordAndPlayback/RecordAndPlayback.pde

mbmosher commented 4 years ago

Amazing, that does it. I had tried recorder.close(), which isn't a thing. Thank you so much.