0

クライアントのためにオーディオ プログラミングを行っていますが、理解できない問題に遭遇しました。

CoreAudio によって繰り返し呼び出されるレンダー コールバックがあります。このコールバック内には、次のものがあります。

// Get the audio sample data
AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData;

Float32 data;

// Loop over the samples
for (UInt32 frame = 0; frame < inNumberFrames; frame++) {

    // Convert from SInt16 to Float32 just to prove it's possible
    data = (Float32) outA[frame] / (Float32) 32768;

    // Convert back to SInt16 to show that everything works as expected
    outA[frame] = (SInt16) round(next * 32768);

}

これは期待どおりに機能し、予期しない丸め誤差がないことを示しています。

次にやりたいことは、小さな遅延を追加することです。クラスにグローバル変数を追加します。

つまり、@implementation 行の下

Float32 last = 0;

次に、この変数を使用して 1 フレームの遅延を取得します。

// Get the audio sample data
AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData;

Float32 data;
Float32 next;

// Loop over the samples
for (UInt32 frame = 0; frame < inNumberFrames; frame++) {

    // Convert from SInt16 to Float32 just to prove it's possible
    data = (Float32) outA[frame] / (Float32) 32768;

    next = last;
    last = data;


    // Convert back to SInt16 to show that everything works as expected
    outA[frame] = (SInt16) round(next * 32768);

}

今回は、信号に奇妙なオーディオの歪みがあります。

私は自分が間違っていることを見ることができません!アドバイスをいただければ幸いです。

4

1 に答える 1

2

あなたがやったことは、あなたのオーディオに意図しないフェイザー効果をもたらしたようです。

これは、オーディオの1チャンネルだけを遅延させているためです。その結果、左チャンネルが右チャンネルより1フレーム遅れていることになります。これにより、「奇妙なオーディオの歪み」の説明に適した、奇妙な周波数のキャンセル/増幅が発生します。

両方のチャンネルにエフェクトを適用してみてください。

AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData;
AudioSampleType *outB = (AudioSampleType *)ioData->mBuffers[1].mData;
// apply the same effect to outB as you did to outA

これは、ステレオオーディオを使用していることを前提としています(つまりioData->mNumberBuffers == 2

lastスタイルの問題として、レンダリングコールバックで変数のようなグローバルを使用することは(IMO)悪い考えです。を使用しinRefConて、適切なコンテキストで渡します(単一の変数として、または必要に応じて構造体として)。ただし、これは発生している問題とは関係がない可能性があります。

于 2012-10-31T03:47:25.027 に答える