Может кто-нибудь показать мне, как это делается для iPhone?Я пытаюсь сделать так, чтобы игра воспроизводила около 12 звуков одновременно, и я не могу понять, как использовать AudioQueueServices.Я понимаю, что вы должны инициализировать, добавлять буферы, воспроизводить их и использовать AudioQueueEnqueueBufferWithParameters для одновременного воспроизведения, но я не знаю, как превратить это в код.Любой, у кого есть код или кто-то, кто мог бы объяснить мне это, был бы потрясающим!
Если вы слышали о Tone Grid / Tone Board, это именно то, что я пытаюсь сделать.Я знаю, что в Appstore уже есть несколько приложений, которые делают это, но я не знаю, как это делается.
TLDR;Нужна помощь с одновременным воспроизведением AudioQueueServices с 10+ звуками.
Пример:
Новое воспроизведение
if (isPlaying == NO) {
err = AudioQueueNewOutput (&streamFormat, AudioEngineOutputBufferCallback, self, nil, nil, 0, &outputQueue);
if (err != noErr) NSLog(@"AudioQueueNewOutput() error: %d", err);
Буферизация очереди
outputBuffersToRewrite = 3;
bufferByteSize = (sampleRate > 16000)? 2176 : 512; // 40.5 Hz : 31.25 Hz
for (i=0; i<3; i++) {
err = AudioQueueAllocateBuffer (outputQueue, bufferByteSize, &buffer);
if (err == noErr) {
[self generateTone: buffer];
err = AudioQueueEnqueueBuffer (outputQueue, buffer, 0, nil);
if (err != noErr) NSLog(@"AudioQueueEnqueueBuffer() error: %d", err);
} else {
NSLog(@"AudioQueueAllocateBuffer() error: %d", err);
return;
}
}
Запуск воспроизведения
isPlaying = YES;
err = AudioQueueStart(outputQueue, nil);
if (err != noErr) { NSLog(@"AudioQueueStart() error: %d", err); isPlaying= NO; return; }
} else {
NSLog (@"Error: audio is already playing back.");
Настройка полей формата потока
BOOL isHighSampleRate = (sampleRate > 16000);
int bufferByteSize;
AudioQueueBufferRef buffer;
AudioStreamBasicDescription streamFormat;
streamFormat.mSampleRate = sampleRate;
streamFormat.mFormatID = kAudioFormatLinearPCM;
streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
streamFormat.mBitsPerChannel = 16;
streamFormat.mChannelsPerFrame = 1;
streamFormat.mBytesPerPacket = 2 * streamFormat.mChannelsPerFrame;
streamFormat.mBytesPerFrame = 2 * streamFormat.mChannelsPerFrame;
streamFormat.mFramesPerPacket = 1;
streamFormat.mReserved = 0;