使用Android AudioTrack在左或右扬声器中播放声音

时间:2014-11-21 07:57:12

标签: android audiotrack

我在我的APP中使用AudioTrack播放声音但我想在特定扬声器/耳朵中播放声音,意味着左扬声器或右扬声器或两个扬声器。

以下代码我正在播放声音。

private AudioTrack generateTone(double freqHz, int durationMs)
{
    int count = (int)(44100.0 * 2.0 * (durationMs / 1000.0)) & ~1;
    short[] samples = new short[count];
    for(int i = 0; i < count; i += 2){
        short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF);
        samples[i + 0] = sample;
        samples[i + 1] = sample;
    }
    AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
        AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,
        count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);

    track.write(samples, 0, count);
    return track;
}

使用以下代码我调用此函数播放声音。

AudioTrack soundAtSpecificFrequency =   generateTone(500, 6000);
soundAtSpecificFrequency.play();

以下代码停止播放声音。

soundAtSpecificFrequency.pause();

您能否告诉我在这种情况下可能的解决方案或任何其他替代解决方案?

感谢您宝贵的时间。

1 个答案:

答案 0 :(得分:1)

AudioTrack使用原始PCM样本播放声音。 PCM样本按以下顺序播放(第一个样本由左扬声器播放,第二个样本由右扬声器播放):

LRLRLRLRLR

因此,您必须修改传递给AudioTrack的样本数组。

This也可以提供帮助。

在您的情况下,请执行以下操作:

// only play sound on left
for(int i = 0; i < count; i += 2){
    short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF);
    samples[i + 0] = sample;
    samples[i + 1] = 0;
}
// only play sound on right
for(int i = 0; i < count; i += 2){
    short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF);
    samples[i + 0] = 0;
    samples[i + 1] = sample;
}