これがiPhoneでどのように行われるかを誰かに教えてもらえますか? 約 12 のサウンドを同時に再生するゲームを作成しようとしていますが、AudioQueueServices の使用方法がわかりません。初期化、バッファの追加、再生、AudioQueueEnqueueBufferWithParameters を使用して同時再生を行う必要があることは理解していますが、それをコードに変換する方法がわかりません。これに関するコードを持っている人、または私に説明できる人は素晴らしいでしょう!
トーン グリッド/トーン ボードについて聞いたことがあるなら、まさに私がやろうとしていることです。Appstore にはすでにこれを行うアプリがいくつかあることは知っていますが、それがどのように行われるかはわかりません。
TLDR; 10 以上のサウンドを使用した AudioQueueServices の同時再生についてサポートが必要です。
例:
新しい再生
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;