2

これが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;
4

3 に答える 3

1

単一のオーディオストリームを扱っていることを忘れないでください。そのため、結合されたストリームを自分で作成するか、複数のストリームをフィードできるミキサーユニットを使用することができます。Appleの「AudioMixer(MixerHost)」サンプルコードを参照してください。

于 2012-08-09T01:50:10.320 に答える
1

AudioQueue は複数のサウンドを同時に再生できません。エンキューされたバッファからオーディオ データ値を 1 つずつ送信するだけです。したがって、同時に再生したいすべてのサウンドを単一のサウンドに構成する必要があります。どうやってそれを行うことができますか?データが圧縮されていなければ、それほど難しくありません。たとえば、2 つの異なるサウンドがあります。それらのそれぞれは、-1 から 1 までの float 値の配列として記述できます。サウンドがファイルに保存されるか、または audioQueue にエンキューされるとき、それらは適切な形式で表現されなければなりません。あなたの場合 (kAudioFormatLinearPCM, streamFormat.mBitsPerChannel = 16) は 2 バイトの整数であり、各値は -32767 から 32767 までの short int として表されます。したがって、2 つのサウンドのそれぞれは short の配列であり、バッファーをキューに入れるときにそれを埋めます。この配列の値 (サウンドがファイルからではなく、動的に生成された場合、この配列は存在しません。ただし、値は 1 つずつ計算されます)。そして、この 2 つのオーディオ ファイルの「合計」を作成するには、2 つのサウンド配列からの対応する値の平均として、それぞれの新しい配列値を構築する必要があります。
つまり、resultSound[i​​] = sound1[i]/2 + sound2[i]/2;
そして、どんな数の音でも同じです。たとえば、純粋なハーモニック サウンドを生成するには、次のようにバッファを埋めます。

buffer[i] = sin(i * 2 * M_PI * frequency / sampleRate) * 32767;

周波数の異なる 2 つのハーモニック サウンドをミックスするには、次のようにします。

buffer[i] = sin(i * 2 * M_PI * frequency1 / sampleRate) + sin(i * 2 * M_PI * frequency2 / sampleRate) * 0.5 * 32767;
于 2011-09-14T09:01:16.597 に答える
1

AudioQueue は同時にサウンドを再生できます。

りんご より:

複数のサウンドを同時に再生するにはどうすればよいですか?

Audio Queue Services (AudioToolbox/AudioQueue.h) のインターフェイスを使用します。再生するサウンドごとに Audio Queue オブジェクトを 1 つ作成します。次に、AudioQueueEnqueueBufferWithParameters 関数を使用して、各オーディオ キューの最初のオーディオ バッファーの同時開始時間を指定します。

オーディオ データ形式に応じて、iPhone OS での同時サウンドには次の制限が適用されます。

AAC、MP3、および ALAC (Apple Lossless) オーディオ: 複数の AAC、MP3、および ALAC 形式のサウンドを同時に再生できます。これらの形式の複数のサウンドを再生するには、デコードに CPU リソースが必要です。

リニア PCM および IMA/ADPCM (IMA4 オーディオ): CPU リソースを気にすることなく、複数のリニア PCM または IMA4 フォーマットのサウンドを同時に再生できます。

于 2011-10-27T20:37:40.230 に答える