I am developing voice application.
I need a buffer queue of some sort so that i record continuosly in a thread , place the buffers full of bytes into the queue and
When you place a byte[] into the queue, you need to then create a new buffer. Otherwise the next recording will overwrite the same buffer. Just move the initialization of bData
into the loop:
Queue qArray = new LinkedList();
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
while (isRecording) {
bData = new byte[BufferElements];
recorder.read(bData, 0, BufferElements);
qArray.add(bData);
if (AudioRecord.ERROR_INVALID_OPERATION != 0) {
SendAudio();
}
}
}
}, "AudioRecorder Thread");
recordingThread.start();
You should also add logic to limit the size of the queue. If the queue overflows, you will still lose data, but at least you won't crash with an out-of-memory error.
EDIT Here's a modified version of the recording loop that does proper error checking. It uses a Queue
instead of a Queue
:
public void run() {
bData = ByteBuffer.allocate(BufferElements);
while (isRecording && !isInterrupted()) {
int result = recorder.read(bData, 0, BufferElements);
if (result > 0) {
qArray.add(bData);
SendAudio();
bData = ByteBuffer.allocate(BufferElements);
} else if (result == AudioRecord.ERROR_INVALID_OPERATION) {
Log.e("Recording", "Invalid operation error");
break;
} else if (result == AudioRecord.ERROR_BAD_VALUE) {
Log.e("Recording", "Bad value error");
break;
} else if (result == AudioRecord.ERROR) {
Log.e("Recording", "Unknown error");
break;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
break;
}
}
}
Of course, somewhere you'll need to call recorder.startRecording()
or you won't get any data.