How to play left and right channel separately with AudioTrack?

10,009

AudioTrack has the same method as SoundPool. It call

AudioTrack.setStereoVolume();

If you want to play left/right channel at the same time with different data. You should handle data to meet this target. If you select stereo mode with 16Bit PCM, the data is one byte for left and one byte for right. For example:

left channel want to play: 12, 23, 34, 45

right channel want to play: 54, 43, 32, 21 at the same time with left channel.

data should be generated as: {12, 54, 23, 43, 34, 32, 45, 21}

Then, use AudioTrack.write(data). It will perfectly meet you target.

Share:
10,009
Admin
Author by

Admin

Updated on June 04, 2022

Comments

  • Admin
    Admin almost 2 years

    First, I need to generate 2 sine wave tones on the fly which are of same frequency, but opposite phases and play those back separately into right and left channel in stereo mode on Android. The playback needs to be perfectly in sync so that the sines of left and right channel are "mirrored" (when left channel has, say sample value of 120 the right channel should have -120).

    The thing is that I have not found any evidence how this kind of setup would work. Is there a possibility to feed 2 separate tones/samplebuffers to AudioTrack to be played back in left and right channel separately and simultaneously? If not, any other solutions to achieve the end result are much appreciated.

    I guess one option would be to use pre-generated stereo wave files and stream those with AudioTrack, but this seems too inflexible for the solution in the works. At the same time, if AudioTrack is able to play back these pre-recorded audio files in "real" stereo mode I would expect the same to be possible with generated sounds as well.

  • Admin
    Admin over 12 years
    OK I understand what you mean, but SoundPool unfortunately does not help me much as I need to generate the sounds in my code and use AudioTrack and MODE_STREAM in order to feed the playing buffer on the fly. AudioTrack supports CHANNEL_OUT_MONO and CHANNEL_OUT_STEREO configurations, but I have not found an option to actually feed different code-generated sounds to left and right channel.
  • the_moon
    the_moon about 10 years
    Is this correct? Do I have to put one element of each channel interchanged along the output buffer?
  • VMMF
    VMMF about 8 years
    I'm trying to do single channel for mono audio but I've found it is now done by public int setVolume (float gain) Added in API level 21 Sets the specified output gain value on all channels of this track. This API is preferred over setStereoVolume(float, float), as it more gracefully scales down to mono, and up to multi-channel content beyond stereo. So how would I controll it now?