2014-11-21 1 views
0

Я играю звук с помощью AudioTrack в своем APP, но я хочу воспроизводить звук в специальном громкоговорителе/​​ухе - левый динамик или правый динамик или оба динамика.Воспроизведение звука в левом или правом громкоговорителе с помощью android 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(); 

Не могли бы вы рассказать мне, что может быть возможным решением в этом случае или любым другим альтернативным решением?

Спасибо за ваше драгоценное время.

+0

И каков ваш вопрос? Вы не знаете, как воспроизводить звук только в левом или правом динамике? Или что? –

+0

Да, как воспроизводить звук только в левом или правом динамике? – user3603789

ответ

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; 
} 
+0

Можете ли вы, пожалуйста, доработать его более подробно. Я новичок в разработке Android, и я также пробовал ваше указанное решение, но все же я столкнулся с проблемой. – user3603789

+0

Большое спасибо за вашу помощь и большое спасибо за ваше драгоценное время. Это работает в моем случае. – user3603789