OpenAL: как воспроизводить несколько звуков одновременно и микшировать их?

#c #openal

#c #openal

Вопрос:

Я уже использовал SDL_mixer раньше, и он выполняет эту работу правильно: когда я воспроизводю один звук с помощью одного вызова функции 10 раз подряд, все звуки смешиваются вместе. Но в OpenAL, когда я воспроизводлю звук с помощью alSourcePlay (), он воспроизводит только один звук без смешивания с предыдущими звуками.

Итак, как я могу воспроизводить более 1 звука одновременно?

Ответ №1:

Вам нужен один источник для каждого звука.

Буфер содержит необработанные звуковые сэмплы и может передавать один или несколько источников (одновременно). Слушатель определяет, где находится ваше «ухо» (всегда есть только одно!). Источник — это единственный экземпляр звука, которому заданы местоположение в пространстве, громкость, буфер для извлечения сэмплов и так далее.

Итак, для одновременного воспроизведения 2 звуков вам нужны 2 источника.

Комментарии:

1. ах … это усложнит ситуацию, но я думаю, что смогу это сделать, спасибо, я приму ответ, когда успешно протестирую его. кстати, что вы имеете в виду под «существует только один!» ? разве для стерео не нужны два уха? итак, если бы я повернул голову в игре, звук был бы слышен по-другому. или openal каким-то образом выполняет этот трюк?

2. Возможно, «голова» — лучшее слово вместо «уха». Конечно, вы слышите стерео или даже объемный звук, если ваша звуковая карта поддерживает это. Слушатель находится там, где находится ваша голова в виртуальном пространстве (и есть только один). Концепция, лежащая в основе источников и буферов, на самом деле совсем не сложна. Источники — это именно то, о чем говорит название … источники звука где-то в виртуальном пространстве. Буферы предоставляют только данные.

3. еще один вопрос… должен ли я удалять исходный код после завершения воспроизведения? atm я сохраняю звуки текущего кадра в вектор, а затем в конце цикла рендеринга просматриваю их и делаю это для каждого: alGenSources(1, source); alSourcef(source[0], ...); alSourcePlay(source[0]); итак, мне нужен другой цикл, который проверяет, прекратилось ли воспроизведение звука, и если да, то я вызываю alDeleteSources () для тех звуков, которые закончили воспроизведение?

4. Вы можете удалить источники, которые закончили воспроизведение (проверьте alGetSourcei с помощью AL_SOURCE_STATE), но это необязательно. Ничто не мешает вам воспроизвести источник снова (с тем же или другим звуком / громкостью / положением).

5. спасибо, я думаю, что теперь я начинаю понимать OpenAL, в принципе, мне нужно сначала выделить 256 массивов источников с помощью alGenSources () (потому что это предел, который Windows может воспроизводить одновременно), а затем никогда больше не прикасаться к этой функции. если я воспроизводю новый звук, я просто изменяю данные массива источников. (не стесняйтесь указывать, если здесь что-то не так!)