2013-02-12 2 views
2

Я пытаюсь генерировать 5 секунд синусоидальной звуковой волны с частотой 1000. Я написал следующий кодДлительность генерируемого звука синусоиды

int sampleRate = 44100; 
int freqOfTone = 1000; 
AudioTrack track; 
// 5 seconds 
short samples = new short[sampleRate*5]; 
track = new AudioTrack(AudioManager.STREAM_MUSIC, 
     sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
             AudioFormat.ENCODING_PCM_16BIT, samples.length, 
             AudioTrack.MODE_STATIC); 

double angle = 0; 
double increment = (2 * Math.PI * freqOfTone/sampleRate); // angular increment 

for (int i = 0; i < samples.length-1; i++) { 
      samples[i] = (short) (Math.sin(angle) * Short.MAX_VALUE); 
      angle += increment; 
    } 
track.write(samples, 0, samples.length); // write data to audio hardware 
track.play(); 

звук длина волны составляет всего 2,5 секунды, и я думаю, это должно быть 5 секунд. Зачем?

ответ

0

Есть track.play(); синхронный или асинхронный? Если последнее, вы можете завершить программу и закрыть ее, прежде чем она получит шанс закончить. Вы можете попробовать «нажать любую клавишу» или другую паузу в конце для подтверждения.

+0

Я использую статический режим, а не режим потока. Кроме того, я попробовал это внутри кнопки, и у меня все еще такая же проблема. Если я поместил образцы 10 * sampleRate, я получаю 5 секунд. Поэтому он всегда делится на 2. – yasserbn

0

Это похоже на правильное поведение, потому что вы указали ENCODING_PCM_16BIT, если вы измените его на ENCODING_PCM_8BIT, вы получите 5 секунд игры.

+0

Но я сохраняю образцы в 16-разрядном регистре (короткие) не в 8-битном (байте). Во всяком случае, мне нужно остановиться на Encoding_PCM_16BIT, как я могу получить 5 секунд? – yasserbn

+0

Вы уже знаете ответ, умножьте 'sampleRate' на 10 вместо 5 – iTech

+0

В этом вопрос; Почему мне следует умножить на 2. Кроме того, когда я сделал это (sampleRate * 10), частота звука будет 2000 Гц вместо 1000 Гц. Мне нужно, чтобы он был 5 сек с 1000 Гц. – yasserbn

3

См. Ссылку.

5-й аргумент конструктора AudioTrack - «bufferSizeInBytes».

+1

Это ответ, измените пятый аргумент от 'samples.length' до' samples.length * Short.SIZE/Byte.SIZE'. –

Смежные вопросы