iPhone SDK - OpenAL, звуковой движок в стиле 'Beat Box' - PullRequest
0 голосов
/ 10 июля 2009

Как можно создать звуковой движок в стиле «бит-бокса», в котором ряд звуков может быть поставлен в очередь раньше времени и во время воспроизведения. Эти звуки должны воспроизводиться без каких-либо пробелов или икоты.

Я изучил OpenAL и попытался использовать alSourceQueueBuffers () для создания источника с серией предварительно буферизованных клипов, но не достиг того, что искал.

Я загружаю свои аудиофайлы с помощью AudioFileOpenURL, а затем загружаю его в массив символов с помощью AudioFileReadBytes, создавая буфер с alGenBuffers и затем буферизуя с alBufferData.

Затем я создаю источник с alGenSources и держу ссылку на этот источник. Затем я вызываю alSourceQueueBuffers (sourceId, 1 и bufferId) несколько раз, когда bufferId - это параметр, передаваемый в мой метод queueClip и ссылающийся на несколько разных клипов.

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

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

Ответы [ 2 ]

3 голосов
/ 28 июля 2009

Вы опрашиваете источник, чтобы увидеть, когда он израсходовал буфер?

ALuint freeBuffer;
ALint processed;
alGetSourcei (myALSource, AL_BUFFERS_PROCESSED, &processed);
while (processed > 0) {
  // remove spent buffer
  alSourceUnqueueBuffers(myALSource, 1, &freeBuffer);
  // refill buffer with samples, if they're going to be different this time
  // ...
  // re-queue buffer on source
  alSourceQueueBuffers(myALSource, 1, &freeBuffer);
  // check again for more processed buffers
  alGetSourcei (myALSource, AL_BUFFERS_PROCESSED, &processed);
}

Вам нужно будет продолжать делать этот опрос, чтобы проверять использованные буферы ... Я использовал простой NSTimer.

0 голосов
/ 28 июля 2009

Я упустил более простой вариант. Установите свойство AL_LOOPING для вашего источника:

alSourcei (myALSource, AL_LOOPING, AL_TRUE);
...