как установить скорость воспроизведения для сгенерированных тонов Android - PullRequest
1 голос
/ 23 февраля 2011

Я использую класс AudioTrack и сгенерировал собственные мелодии в своем приложении для Android. Однако я хочу иметь возможность контролировать скорость воспроизведения и не могу понять, как это сделать.

Я вижу метод setLoopPoints, но, похоже, он не делает то, что я хочу (если кто-то использовал его и может объяснить мне этот метод, это было бы здорово, документация по API мне не очень помогает).

Что я хочу сделать:

Когда точка (здесь, касание экрана) приближается к цели на экране, я хочу увеличить скорость генерируемых тонов. Например, дальше я бы, скажем, воспроизводил тон 1 раз в 1 секунду, но очень близко к цели, 5 раз в 1 секунду. Я изо всех сил пытаюсь найти лучший способ сделать это со звуками Android (сгенерированные тоны или даже файлы .wav, сохраненные в моем res / raw).

Любая помощь будет высоко ценится!

Шани

1 Ответ

3 голосов
/ 23 февраля 2011

Вы хотите использовать метод setPlaybackRate для этого:

http://developer.android.com/reference/android/media/AudioTrack.html

в сочетании с setLoopPoints. Тем не менее, я полагаю, что, возможно, существует предел того, насколько вы можете ускорить «естественную» скорость воспроизведения файла, и этот предел, вероятно, составляет 48 кГц (хотя я не уверен, и это может зависеть от устройства).

Итак, если у вас есть файл, который был записан, скажем, с частотой 8000 Гц, чтобы получить желаемый эффект, вы должны установить счетчик циклов на 4 (чтобы он воспроизводился 5 раз подряд) и установить скорость воспроизведения. до 40 000 (5 * 8000).

Поскольку существует (возможно) верхний предел скорости воспроизведения, лучше всего вместо этого записать исходный звук на высокой частоте и замедлить воспроизведение по мере необходимости для достижения желаемого эффекта.

Обновление: setLoopPoints позволяет вам указать два произвольных местоположения в файле, так что, когда воспроизведение достигнет конца повторного воспроизведения, звуковой движок вернется к начальному повторному назначению. Чтобы зациклить весь файл, вы должны установить начальную петлю, равную 0, а конечную петлю - на последний кадр в файле (размер каждого кадра зависит от формата файла - поэтому стереофайл, использующий 2 байта на семпл, будет иметь размер кадра 4, поэтому последний кадр - это просто размер аудиоданных в байтах, деленный на 4).

Чтобы получить 5 последовательных воспроизведений вашего файла, вы должны установить количество циклов равным 4 (loopcount, равное 0, означает, что файл воспроизводится один раз; -1 означает, что он будет зацикливаться вечно).

Обновление 2: просто прочитайте документы еще немного - верхний предел для setPlaybackRate задокументирован как удвоенная скорость, возвращаемая getNativeOutputSampleRate, что для большинства устройств составляет, вероятно, 44 100 или 48 000 Гц. Это означает, что стандартный WAV-файл качества CD можно воспроизводить только с удвоенной скоростью. Файл с частотой 22 050 Гц может воспроизводиться со скоростью, в 4 раза превышающей его обычную скорость и т. Д.

...