0

RemoteIOオーディオユニットを使用して、出力バスの入力スコープ(スピーカーなど)にレンダーコールバックをアタッチすることにより、オーディオパススルーを実装しています。

すべてが泳いで動作します...

OSStatus RenderTone(
                    void *                      inRefCon, 
                    AudioUnitRenderActionFlags  * ioActionFlags, 
                    const AudioTimeStamp        * inTimeStamp, 
                    UInt32                      inBusNumber, 
                    UInt32                      inNumberFrames, 
                    AudioBufferList             * ioData)

{   
    SoundEngine * soundEngine = (SoundEngine *) inRefCon;

    // grab data from the MIC (ie fill up ioData)
    AudioUnit thisUnit = soundEngine->remoteIOUnit->audioUnit;
    OSStatus err = AudioUnitRender(thisUnit, 
                                   ioActionFlags, 
                                   inTimeStamp, 
                                   1, 
                                   inNumberFrames, 
                                   ioData);
    if (result)
    {
        printf("Error pulling mic data");
    }

    assert(ioData->mNumberBuffers > 0);

    // only need the first buffer
    const int channel = 0;
    Float32 * buff = (Float32 *) ioData->mBuffers[channel].mData;
}

その最後の行を追加するまで。

    Float32 * buff = (Float32 *) ioData->mBuffers[channel].mData;

この行を配置すると、エラーは発生せず、単に沈黙します。それがないと、マイクの前で指をクリックして、ヘッドセットで聞くことができます。

編集:AudioBuffer buf0 = ioData-> mBuffers [0]; //失敗を引き起こすのに十分

何が起こっている?

コンパイラが未使用の変数を最適化することによって引き起こされるエラーではありません。buff++を設定した場合; 次の行では、動作は同じです。コンパイラは変数が事実上未使用であることを検出できるかもしれませんが。

4

1 に答える 1

0

問題は、このコールバックが最初に発生したときに、マイクからのデータの要求が失敗したことでした。

そして、私がすべきだったのは、戻り値を調べて、成功しなかった場合はそれを返す(つまり、コールバックを終了する)ことでした。

おそらく起こっていたのは、私が無効なデータにアクセスしていたことでした

それはまだかなり奇妙ですが、それに入る必要はありません。

于 2010-11-11T08:49:20.467 に答える