Обновление буфера OpenAL в режиме реального времени - PullRequest
4 голосов
/ 29 сентября 2011

Я работаю в iOS и у меня запущен простой проект OpenAL.

Разница для большинства openAL проектов, которые я видел, заключается в том, что я не загружаю звуковой файл. Вместо этого я загружаю массив необработанных данных в alBufferData. Используя пару уравнений, я могу загрузить данные для получения белого шума, синусоидальных и пульсовых волн. И все работает хорошо.

Моя проблема в том, что мне нужен способ изменить эти данные, пока звук воспроизводится в режиме реального времени.

Есть ли способ изменить эти данные без необходимости создания нового буфера (я попробовал подход создания нового буфера с новыми данными, а затем использовать его вместо этого, но его далеко не достаточно быстро).

Любая помощь или предложения о других способах достижения этой цели будут высоко оценены.

Спасибо

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Я не делал этого на iOS, но с openAL на ПК вы должны объединить несколько буферов. Каждый буфер будет иметь данные за небольшой промежуток времени. Периодически проверяйте, готов ли воспроизводящий буфер, и если да, добавляйте его в свободный список для повторного использования. Если вы хотите изменить звук, запишите новый сигнал в свободный буфер и добавьте его в цепочку. Вы выбираете размер буфера, чтобы сбалансировать задержку и требуемую частоту обновления - меньшие буферы позволяют быстрее реагировать на изменения, но их нужно генерировать чаще.

На этой странице предполагается, что частота обновления составляет полсекунды. Способность работать быстрее зависит от сложности ваших вычислений, а также от накладных расходов ОС.

1 голос
/ 25 октября 2011

Изменение данных во время воспроизведения не поддерживается в OpenAL.

Тем не менее, вы все равно можете попробовать его и посмотреть, получите ли вы приемлемые значения по умолчанию (хотя вы будете бороться с механизмом воспроизведения OpenAL и любой задержкой).ауты в вашем приложении могут сойти с него, так что делайте это на свой страх и риск).

Существует расширенная версия ALBufferData от Apple, которая говорит OpenAL использовать данные, которые вы предоставляете напрямую, а не делать свои локальныекопия.Вы устанавливаете его так:

typedef ALvoid AL_APIENTRY (*alBufferDataStaticProcPtr) (const ALint bid,
                                                         ALenum format,
                                                         const ALvoid* data,
                                                         ALsizei size,
                                                         ALsizei freq);

static alBufferDataStaticProcPtr alBufferDataStatic = NULL;

alBufferDataStatic = (alBufferDataStaticProcPtr) alcGetProcAddress(NULL, (const ALCchar*) "alBufferDataStatic");

Вызовите alBufferDataStatic () так, как вы бы вызвали alBufferData ():

alBufferDataStatic(bufferId, format, data, size, frequency);

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

Однако этот подход рискован, посколькуэто зависит от времени, которое вы не полностью контролируете.Для обеспечения 100% безопасности вам необходимо использовать аудиоустройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...