Skip to content Skip to sidebar Skip to footer

Record Voice In A Queue And Send It To The Server

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 to transmit to

Solution 1:

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<byte[]> qArray = new LinkedList<byte[]>();
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<ByteBuffer> instead of a Queue<byte[]>:

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.


Post a Comment for "Record Voice In A Queue And Send It To The Server"