Я занимаюсь разработкой кинематографического приложения для 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? Они хорошо играют в одном бассейне?