androidaudioencodingpcmaudiotrack

Why Can't I Play Raw Audio Bytes Using AudioTrack's Static Mode?


I have an Android app where there is some raw audio bytes stored in a variable.

If I use an AudioTrack to play this audio data, it only works if I use AudioTrack.MODE_STREAM:

byte[] recordedAudioAsBytes;

public void playButtonPressed(View v) {

        // this verifies that audio data exists as expected
        for (int i=0; i<recordedAudioAsBytes.length; i++) {
            Log.i("ABC", "byte[" + i + "] = " + recordedAudioAsBytes[i]);
        }

        // STREAM MODE ACTUALLY WORKS!!
        /*
        AudioTrack player = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLERATE, CHANNELS,
                ENCODING, MY_CHOSEN_BUFFER_SIZE, AudioTrack.MODE_STREAM);
        player.play();
        player.write(recordedAudioAsBytes, 0, recordedAudioAsBytes.length);
         */


        // STATIC MODE DOES NOT WORK

        AudioTrack player = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLERATE, PLAYBACK_CHANNELS,
                ENCODING, MY_CHOSEN_BUFFER_SIZE, AudioTrack.MODE_STATIC);
        player.write(recordedAudioAsBytes, 0, recordedAudioAsBytes.length);
        player.play();
    }

If I use AudioTrack.MODE_STATIC, the output is glitchy -- it just makes a nasty pop and sounds very short with hardly anything audible.

So why is that? Does STATIC_MODE require that the audio data have a header?

That's all I can think of.

If you'd like to see all the code, check this question.


Solution

  • It seems to me that you are using the same MY_CHOSEN_BUFFER_SIZE for 'streaming' and 'static' mode!? This might explain why it sounds short...

    In order to use Audiotracks 'static-mode' you have to use the size of your Byte-Array (bigger will also work) as buffersize. The Audio will be treated as one big chunk of data.

    See: AudioTrack.Builder

    setBufferSizeInBytes()... "If using the AudioTrack in static mode (see AudioTrack#MODE_STATIC), this is the maximum size of the sound that will be played by this instance."