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++を設定した場合; 次の行では、動作は同じです。コンパイラは変数が事実上未使用であることを検出できるかもしれませんが。