Разница в FMOD между Sound.readData и Sound.lock? - PullRequest
0 голосов
/ 17 сентября 2010

Я пытаюсь разобрать разницу между Sound.readData и Sound.lock в библиотеке FMOD (я программирую на C # / C ++, но я приму ответ на любом языке!). Конечная цель - создать представление формы волны, что, как я понимаю, не может быть сделано (легко) с Channel.getWaveData.

Мне удалось получить подходы Sound.readData и Sound.lock для возврата одних и тех же данных с помощью createStream и createSound соответственно (не уверен, что это действительные, например, декодированные, данные). Я хотел бы использовать потоковый подход, если это возможно, чтобы минимизировать использование памяти, но я не совсем уверен, что именно я читаю сейчас, и документация не совсем ясна.

Ответы [ 2 ]

1 голос
/ 20 сентября 2010

По сути, разница между ними заключается в том, к чему вы обращаетесь.

С помощью Sound :: lock вы блокируете буфер семплов звука, поэтому при загрузке с createSound он распаковывает файл в PCM и помещает его в буфер семплов. Вы используете эту функцию для прямого доступа к этому буферу (вы блокируете ту его часть, которую хотите). Если вы находитесь на консоли, эти данные могут быть в сжатом формате. В качестве дополнительного примечания идея «блокировки» звука возникает для DirectSound API, где вы «блокируете» буфер для предотвращения доступа к нему во время чтения или записи в него, когда вы закончите, вы разблокируете доступ к аудиосистема.

Sound :: readData - более постепенный способ извлечения (потоковой передачи) данных PCM из звука, здесь вы фактически декодируете сжатые данные в PCM при каждом вызове readData. Вы делаете это небольшими блоками и всегда получаете окончательно декодированные данные PCM. Этот подход более гибкий и эффективный для памяти.

Например, вы можете загрузить 10 МБ MP3 в виде потока и затем декодировать его в PCM, используя Sound :: readData в виде фрагментов. В противном случае вам потребуется загрузить его в качестве образца (который декодирует его в PCM во время createSound), а затем заблокировать большой буфер для получения PCM.

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

0 голосов
/ 19 сентября 2010

После дополнительных исследований я почти уверен, что между ними нет существенной разницы.Я, вероятно, собираюсь в конечном итоге использовать readData, поскольку это кажется немного проще, более гибкимКроме того, блокировка - запутанное имя для этого метода:).

...