fmod: как использовать FMOD_OUTPUTTYPE_WAVWRITER_NRT? - PullRequest
1 голос
/ 31 января 2012

это продолжение моего предыдущего вопроса: Рендеринг некоторых звуковых данных в одну новую звуковую информацию?

Я создаю программу, которая будет обрабатывать файл, содержащий звуковой банки временные смещения, чтобы отметить, когда звук должен быть воспроизведен, и сгенерировать из него волновой файл.

Так что я полагаю, что FMOD_OUTPUTTYPE_WAVWRITER идеально подходит для работы.

Для звукового банка представьте что-то вроде этогов файле:

0 kick.wav
1 hit.wav
2 flute.wav

, где число слева описывает идентификатор звука для имени звукового файла справа, а временные смещения:

1000 0
2000 1
3000 2

, где число наСлева сообщается программе, когда звук должен воспроизводиться в миллисекундах, а число справа - это идентификатор звука.

Поэтому, когда я запускаю программу, FMOD сгенерирует волновой файл, содержащий удар (изkick.wav) в первую секунду, удар во вторую секунду и флейта в третью секунду, и мне придется подождать не менее 3 секунд для завершения задания.

Однако если я хочу воспроизвести более длинную музыку, скажем, 5 минут, то мне нужно подождать не менее 5 минут, чтобы задача завершилась, поскольку я устанавливаю зависимость от системного таймера для воспроизведения звука с указаннойсмещение в файле и цикл while (true) для обновления FMOD :: System.Я думаю, что должен быть способ рендеринга быстрее, не дожидаясь, пока программа на самом деле воспроизведет звук в указанное время, так как я видел в такой программе DAW, как, например, Sony ACID, возможность рендеринга треков очень быстро.

Затем я немного посмотрю на ссылку API, там есть FMOD_OUTPUTTYPE_WAVWRITER_NRT, затем я подумал, что это может быть решением, поэтому я попытался сразу изменить устройство вывода, ничего не изменяя, и сгенерированный волновой файл звучит неправильно!Я слышу много повторяющихся звуков, длительных задержек и т. Д.

Итак, как правильно использовать версию не в реальном времени?Как правильно обновить систему fmod при использовании NRT в моем случае?

Я не смог найти четкого объяснения использования типа выхода NRT в самой документации fmod.

В любом случае, я использую C ++ в среде Windows.

Спасибо.

1 Ответ

1 голос
/ 02 февраля 2012

FMOD_OUTPUTTYPE_WAVEWRITER_NRT работает так, что он генерирует аудио каждый раз, когда вызывается System :: update.Количество данных, сгенерированных за «обновление», определяется параметром bufferlength System :: setDSPBufferSize.

Таким образом, чем быстрее вы вызываете System :: update, тем быстрее генерируются данные.Теперь важной частью вашей работы является преобразование числа вызовов «x» в System :: update во что-то, что вы можете сопоставить с вашей временной шкалой.

По умолчанию FMOD работает с частотой дискретизации 48000 выборок в секунду (настраивается через System :: setSoftwareFormat).Таким образом, если вы установите для параметра «bufferlength» значение 1024, при каждом вызове System :: update будут сгенерированы 1024 семпла (записанных в файл wav).Итак ... 1024/48000 = 0,021333 секунды ~ 21,3 миллисекунды данных генерируется за вызов.Теперь вы можете подсчитать, сколько раз вам нужно вызвать System :: update, чтобы добраться до ваших временных отметок.

...