[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| [jetty-users] Issue flushing response buffer with audio streaming	servlet | 
Hi,
I'm using Jetty 7.6.3 embedded on Android
I have a servlet serving realtime audio  PCM data to a client playing 
this audio.
The PCM audio is read from a fifo input stream  and copied to the 
response's OutputStream.
The fifo is populated with PCM data by another independent subsystem.
Everything is working fine when there is audio in the fifo, but not when 
it becomes empty.
When it becomes empty (no realtime audio available), the Servlet must 
detect this condition and start
sending silent audio chunks in the response's OutputStream. That's a 
requirement I can't change for the client to maintain the connection
to the Servlet (otherwise it disconnects on no data).
Detecting that there is no audio available can take some time: typically 
if no data is available from the fifo for 1s,
the Servlet start writing silent audio chunks to the reponse.
The problem is that when writing the first silence chunk, there is some 
unflushed buffering that get in the way, resulting in an audio glitch on 
the playing client which could be described as:
audio playing.... |   1s silence | 200ms-500ms small unwanted audio 
segment | silence....
            |
            |
            ----  > That's the problem
To make things clearer, in pusedo code the reponse data writing loop 
looks like this:
while(true) {
    if(isNoAudioDetected()) {
        // if we get here, no data has been written to reponse during 1s
         while(noAudioAvailable()) {
                // problem: first call to this will flush old audio 
data written 1s before by   response.write(data), resulting in the 
unwanted audio segment  above
                response.write(silent_chunk);
        }
     }
    data = read(fifo);
    response.getOutPutStream().write(data);
    // response.flushBuffer();    <= doesn't fix the problem
   // response.getOutPutStream().flush();  <= doesn't fix the problem 
either
}
Of course I tought that a call to flushBuffer() just after writing audio 
data would fix the problem.
Yet it doesn't seem to have no effect. I've tried various things to no 
avail.
Could it possibly be a bug in Jetty ?
Is there a way to discard (not flush) response data not yet written to 
the socket ?
I even thought it could be the client socket buffering getting in the 
way, but even hacking SocketConnector to setup a socket with minimal 
buffer size with Socket.setReceiveBufferSize()
did nothing (this size is 512K on Android, the minimum is 32K).