I don't know whether you have solved your problem or not, I have some problem. The best I could do is to grab UDP packets in a thread into ArrayBlockingQueue(ABQ), and play them in another thread taking one by one from ABQ. But this time playing suffers(not all devices, some devices are cool with double thread) and size of ABQ grows which means delay increases. So I check the size and drop some packets systematically(simply not writing into AudioTrack) in order to decrease delay, but it is your call if you are okay with delay.
One more thing, I am increasing priority of threads as such:
private class Player extends Thread {
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO );
....
}
}
which gives better speed.
The solution is still blocking in a manner but, UDP packets wont be blocked by player until ABQ size increases as its capacity.