Use a single decoded audio buffer for direct submit audio renderers

This commit is contained in:
Cameron Gutman 2014-03-16 18:13:42 -04:00
parent 239dffcbdf
commit a39f4c5eab

View File

@ -13,6 +13,7 @@ public class AudioDepacketizer {
new LinkedBlockingQueue<ByteBufferDescriptor>(DU_LIMIT); new LinkedBlockingQueue<ByteBufferDescriptor>(DU_LIMIT);
private AudioRenderer directSubmitRenderer; private AudioRenderer directSubmitRenderer;
private byte[] directSubmitData;
// Sequencing state // Sequencing state
private short lastSequenceNumber; private short lastSequenceNumber;
@ -20,20 +21,32 @@ public class AudioDepacketizer {
public AudioDepacketizer(AudioRenderer directSubmitRenderer) public AudioDepacketizer(AudioRenderer directSubmitRenderer)
{ {
this.directSubmitRenderer = directSubmitRenderer; this.directSubmitRenderer = directSubmitRenderer;
if (directSubmitRenderer != null) {
this.directSubmitData = new byte[OpusDecoder.getMaxOutputShorts()*2];
}
} }
private void decodeData(byte[] data, int off, int len) private void decodeData(byte[] data, int off, int len)
{ {
// Submit this data to the decoder // Submit this data to the decoder
byte[] pcmData = new byte[OpusDecoder.getMaxOutputShorts()*2]; int decodeLen;
int decodeLen = OpusDecoder.decode(data, off, len, pcmData); byte[] pcmData;
if (directSubmitData != null) {
pcmData = null;
decodeLen = OpusDecoder.decode(data, off, len, directSubmitData);
}
else {
pcmData = new byte[OpusDecoder.getMaxOutputShorts()*2];
decodeLen = OpusDecoder.decode(data, off, len, pcmData);
}
if (decodeLen > 0) { if (decodeLen > 0) {
// Return value of decode is frames (shorts) decoded per channel // Return value of decode is frames (shorts) decoded per channel
decodeLen *= 2*OpusDecoder.getChannelCount(); decodeLen *= 2*OpusDecoder.getChannelCount();
if (directSubmitRenderer != null) { if (directSubmitRenderer != null) {
directSubmitRenderer.playDecodedAudio(pcmData, 0, decodeLen); directSubmitRenderer.playDecodedAudio(directSubmitData, 0, decodeLen);
} }
else if (!decodedUnits.offer(new ByteBufferDescriptor(pcmData, 0, decodeLen))) { else if (!decodedUnits.offer(new ByteBufferDescriptor(pcmData, 0, decodeLen))) {
LimeLog.warning("Audio player too slow! Forced to drop decoded samples"); LimeLog.warning("Audio player too slow! Forced to drop decoded samples");