OpenAL в Mac OS X: настройка AL_SAMPLE_OFFSET ничего не делает - PullRequest
0 голосов
/ 25 октября 2010

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

Мы выполняем «резюме», выполняяalSourcei(this->sourceId, AL_SAMPLE_OFFSET, this->sampleOffset); со смещением выборки, которое мы получили с помощью alGetSourcei().Мы пытались использовать AL_SEC_OFFSET, AL_BYTE_OFFSET и AL_SAMPLE_OFFSET - безрезультатно.Мы прочитали, что источник звука должен находиться в «начальном» состоянии;воссоздание источника и присоединение буфера, а затем попытка пропустить также не помогли.

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

Поскольку у нас ограниченный график работы, каков наилучший способ пропустить часть простого источника звука в OpenAL в OS X?Исходный код доступен в нашем репозитории Sourceforge .

1 Ответ

3 голосов
/ 08 июля 2011

Недавно я столкнулся с той же проблемой в нашем игровом движке на OS X (10.6.8). При возобновлении воспроизведения статического буфера с заданным смещением выборки мы выполнили следующие шаги в следующем порядке:

alSourceQueueBuffers(mSourceId, 1, mBufferId);
alSourcei(mSourceId, AL_SAMPLE_OFFSET, mSampleOffset);
alSourcePlay(mSourceId);

Источник был остановлен до этого, и все буферы были отменены. В соответствии со спецификацией AL 1.1, должно быть возможно либо

  1. указать смещение буфера, когда источник находится в остановленном состоянии; здесь предполагается, что смещение будет применено к следующему вызову alSourcePlay (), или
  2. укажите смещение для уже воспроизводимого источника, что должно привести к немедленному переходу к желаемой позиции.

(см. Раздел 4.3.2 официальных спецификаций на http://connect.creativelabs.com/openal/Documentation/OpenAL%201.1%20Specification.htm)

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

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