Question

I understand stream buffer is useful for IO in general.

I'd like to ask how buffer should be used in realtime voIP applications, such as stream in (Android) MediaRecorder output -> LocalSocket ->UDP / RTP

To me, it looks like there's no space for buffer any stream.

Am I correct? or Do I miss something important?

How about device resource efficiency(CPU & Buttery) when not to use buffer in this case?

pseudocode

//UNIX type localSocket Server to receive stream from mediaRecorder
server = new LocalServerSocket(SOCKET_ADDRESS);

// local socket between mediaRecorder and localSocket Server
 sender = new LocalSocket();
 sender.connect(new LocalSocketAddress(SOCKET_ADDRESS));
//mediaRecorder
 mRecorder = new MediaRecorder(); 
 //.....................
 //sender.getFileDescriptor() is set as the vitual Outputfile
 mRecorder.setOutputFile(sender.getFileDescriptor());
 mRecorder.prepare();
 mRecorder.start();

//localSocket Server accept the stream to receiver
receiver = server.accept();

int val;
byte[] buf;
DatagramPacket packet;
ds = new DatagramSocket(localPort);

while (localServerLoop)
{ 
    //receiver stream is read to (int)val
    val = receiver.getInputStream().read();  
    //======localServer to remoteUDP======================     
    // (int)val to (byte)buf
    buf = toBytes(val);
    //  byte  to packet
    packet = new DatagramPacket(buf, buf.length,
            InetAddress.getByName(remoteHost), remotePort);
    //send to remoteHost
    ds.send(packet);
    //=========================
}
Was it helpful?

Solution

You are reading a single byte from the stream, so there is nothing to buffer really. Use one of the read() methods that take a byte array, that will be your buffer. You can also wrap with BufferedInputStream, etc. You might want to read up on how stream work in Java in general, this is not Android specific.

See http://developer.android.com/reference/java/io/InputStream.html#read(byte[])

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top