Какой аудио API, доступный в iOS / Cocos2d, лучше всего подходит для сложного звукового микса? - PullRequest
3 голосов
/ 25 августа 2011

Я занимаюсь разработкой кинематографического приложения для iPad с использованием cocos2d, и мне нужен больший контроль, чем обеспечивает большинство аудио API высокого уровня. В рамках cocos2d и iOS SDK у меня есть доступ к CocosDension (который на самом деле представляет собой три API с немного отличающимися функциями) и CoreAudio (который также содержит несколько API различных уровней и функций). Я пытаюсь выяснить, какие API будут поддерживать нужные мне функции, и я мог бы использовать некоторую помощь.

  • Мое приложение нуждается в 4 звуковых дорожках, каждая с отдельной громкостью воспроизведения, которая может контролироваться пользователем:
    • Фоновая музыка
    • Ambient Sound
    • Повествование
    • Звуковые эффекты

Треки музыки и окружающего звука должны воспроизводить стереофонические петли с диска продолжительностью 1-4 минуты. Мне нужно иметь возможность предварительно загружать, запускать / останавливать, зацикливать, постепенно увеличивать / уменьшать громкость и регулировать громкость воспроизведения этих треков. Пауза не важна для этих двух треков, так как они будут продолжать играть в фоновом режиме, когда меню вверх.

Трек повествования должен воспроизводить по одному монофайлу за раз, длительностью 30-60 секунд, с панорамированием по центру. Дорожка эффектов должна воспроизводить несколько монофонических файлов продолжительностью 1-5 секунд, одновременно смешанных в стереофоническую звуковую сцену. Каждый воспроизводимый клип должен иметь возможность предварительно загружаться, запускаться / останавливаться, а также настраиваться его высота, усиление и панорамирование. Воспроизведение этих двух дорожек должно быть приостановлено / возобновлено.

Если я использую CocosDension :: SimpleAudioEngine , я считаю, что могу сделать ровно половину того, что хочу. То есть, если бы у меня были только треки с музыкой и эффектами, я мог бы регулировать их громкость отдельно и использовать соответствующие методы для воспроизведения фоновой музыки и эффектов со всеми необходимыми параметрами. То же самое верно, если бы у меня были только дорожки Ambient и Narration, заставляя меня задуматься, можно ли обойти одноэлементную архитектуру SimpleAudioEngine, чтобы у меня было два экземпляра, то есть две пары дорожек BG / FX.

Если бы можно было воспроизводить две фоновые звуковые дорожки одновременно, я мог бы пожертвовать возможностью отдельно регулировать громкость музыки / окружающего звука и объединять дорожку повествования с эффектами (контролируя ее громкость на уровне звукового клипа). Я действительно хотел бы, чтобы музыка и объемный звук регулировались пользователем с помощью отдельных ручек регулировки громкости. Есть ли способ сделать это в CocosDension?

Если я использую CoreAudio, Multichannel Mixer AudioUnit кажется идеальной вещью для достижения моих целей управления громкостью. Тем не менее, использование этого, кажется, требует, чтобы я установил очень много низкоуровневого буфера и кода пути аудиосигнала. Если я не ошибаюсь, для поддержки всех вещей, которые я получаю бесплатно в CocosDension (32 одновременных воспроизведения с панорамированием, высотой звука и регулировкой усиления + фоновой музыкой), мне нужно построить график обработки звука, например:

[Custom Audio Rendering Code ]   [Multichannel Mixer Unit]---->[Output Unit]
 | musicRenderCallback()----|---->| bus 0: "Music"      |
 | ambientRenderCallback()--|---->| bus 1: "Ambient"    |
 | narrationRenderCallback()|---->| bus 2: "Narration"  |
 +~~~~~~~~~~~~~~~~~~~~~~~~~~+     | bus 3: "Effects"    |<----+
 |                                +---------------------+     |
 |                                                            |
 +~~~~~~~~~~~~~~~~~~~~~~~~~~+    [Multichannel Mixer Unit]----+
 | effectsRenderCallback0()-|---->| bus 0: "Effects0"   |
 | effectsRenderCallback1()-|---->| bus 1: "Effects1"   |
 | ...                      |     | ...                 |
 | effectsRenderCallback31()|---->| bus 31: "Effects31" |
 +~~~~~~~~~~~~~~~~~~~~~~~~~~+     +---------------------+
 | audioQueueBuffers[35]    |
 +--------------------------+

Это кажется довольно сложным с точки зрения реализации. Есть ли более простой способ сделать это, возможно, смешивая API-интерфейсы CocosDenshion и CoreAudio? Они хорошо играют в одном бассейне?

1 Ответ

3 голосов
/ 29 сентября 2011

К сожалению, ответ определенно низкий уровень CoreAudio.MultichannelMixer был разработан именно для такой работы.Сложность в действительности зависит только от самой старой версии iOS, которую вы хотите поддерживать, поскольку в последних версиях стало намного проще, так как Apple добавляет новые AudioUnits, которые выполняют некоторые задачи, которые вам потребовалось бы реализовать ранее.Если вам требуется поддержка версий iOS, в которых нет встроенного проигрывателя файлов AudioUnits, есть несколько сторонних примеров кода с открытым исходным кодом, которые оборачивают ExtFileReader и функцию обратного вызова рендеринга для вас, так что эффективно работает как устройство чтения файлов AudioUnit.Это значительно упростит вашу задачу реализации графа, так как, если я не ошибаюсь, вам не нужно будет реализовывать какие-либо обратные вызовы рендеринга самостоятельно.

...