I have an application that playback audio. It takes encoded audio data over RTP and decode it to 16bit array. The decoded 16bit array is converted to 8 bit array (byte array) as this is required for some other functionality.
Even though audio playback is working it is breaking continuously and very hard to recognise audio output. If I listen carefully I can tell it is playing the correct audio.
I suspect this is due to the fact I convert 16 bit data stream into a byte array and use the write(byte[], int, int, AudioTrack.WRITE_NON_BLOCKING) of AudioTrack class for audio playback.
Therefore I converted the byte array back to a short array and used write(short[], int, int, AudioTrack.WRITE_NON_BLOCKING) method to see if it could resolve the problem.
However now there is no audio sound at all. In the debug output I can see the short array has data.
What could be the reason?
Here is the AUdioTrak initialization
            sampleRate      =AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC);
            minimumBufferSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
            audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                    AudioFormat.CHANNEL_OUT_STEREO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    minimumBufferSize,
                    AudioTrack.MODE_STREAM);
Here is the code converts short array to byte array
for (int i=0;i<internalBuffer.length;i++){
        bufferIndex = i*2;
        buffer[bufferIndex] = shortToByte(internalBuffer[i])[0];
        buffer[bufferIndex+1] = shortToByte(internalBuffer[i])[1];
    }
Here is the method that converts byte array to short array.
public short[] getShortAudioBuffer(byte[] b){
    short audioBuffer[] = null;
    int index = 0;
    int audioSize = 0;
    ByteBuffer byteBuffer = ByteBuffer.allocate(2);
    if ((b ==null) && (b.length<2)){
        return null;
    }else{
        audioSize = (b.length - (b.length%2));
        audioBuffer   = new short[audioSize/2];
    }
    if ((audioSize/2) < 2)
        return null;
    byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
    for(int i=0;i<audioSize/2;i++){
        index = i*2;
        byteBuffer.put(b[index]);
        byteBuffer.put(b[index+1]);
        audioBuffer[i] = byteBuffer.getShort(0);
        byteBuffer.clear();
        System.out.print(Integer.toHexString(audioBuffer[i]) + " ");
    }
    System.out.println();
    return audioBuffer;
}
Audio is decoded using opus library and the configuration is as follows;
opus_decoder_ctl(dec,OPUS_SET_APPLICATION(OPUS_APPLICATION_AUDIO));
    opus_decoder_ctl(dec,OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC));
    opus_decoder_ctl(dec,OPUS_SET_FORCE_CHANNELS(OPUS_AUTO));
    opus_decoder_ctl(dec,OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND));
    opus_decoder_ctl(dec,OPUS_SET_PACKET_LOSS_PERC(0));
    opus_decoder_ctl(dec,OPUS_SET_COMPLEXITY(10));     // highest complexity
    opus_decoder_ctl(dec,OPUS_SET_LSB_DEPTH(16)); // 16bit = two byte samples
    opus_decoder_ctl(dec,OPUS_SET_DTX(0));             // default - not using discontinuous transmission
    opus_decoder_ctl(dec,OPUS_SET_VBR(1));             // use variable bit rate
    opus_decoder_ctl(dec,OPUS_SET_VBR_CONSTRAINT(0));  // unconstrained
    opus_decoder_ctl(dec,OPUS_SET_INBAND_FEC(0));      // no forward error correction