То, что вы, вероятно, хотите, это использовать AudioQueue.Это API, который находится немного в стеке аудио, но позволяет вам генерировать любой звук, который вы хотите.Я использовал его в приложении SC68 Player для генерации аудиопотока для эмулятора звукового чипа Atari ST, для воспроизведения старой музыки из игр и демонстраций сцен 80-х годов.
Основная идея:
- Создать фоновый поток, в котором вы создали CFRunLoop для получения обратных вызовов по требованию для заполнения буфера аудио-очередей.Используйте
AudioQueueNewOutput()
- Запуск / приостановка аудио-очереди из любого потока.Используйте
AudioQueueStart()
/ AudioQueueStart()
pause. - Реализация обратного вызова для заполнения аудио буфера.
Обратный вызов будет выглядеть примерно так:
static void AudioQueueCallback(void* inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer)
{
[soundGenerator fillNextFrameBuffer:inBuffer->mAudioData
size:inBuffer->mAudioDataBytesCapacity];
inBuffer->mAudioDataByteSize = inBuffer->mAudioDataBytesCapacity;
AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
}