私のコールバックは次のようになります。
static OSStatus renderInput(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
AudioSampleType *outBuffer = (AudioSampleType *)ioData->mBuffers[0].mData;
memset(outBuffer, 0, sizeof(AudioSampleType)*inNumberFrames*kNumChannels);
//copy a sine wave into outBuffer
double max_aust = pow(2.f, (float)(sizeof(AudioSampleType)*8.0 - 1.f)) - 1.0;
for(int i = 0; i < inNumberFrames; i++) {
SInt16 val = (SInt16) (gSine2_[(int)phase2_] * max_aust);
outBuffer[2*i] = outBuffer[2*i+1] = (AudioSampleType)val;
phase2_ += inc2_;
if(phase2_ > 1024) phase2_ -= 1024;
}
return noErr;
}
これは、正弦波を再生するだけの非常に基本的なレンダー コールバックです。シミュレーターでは実行されますが、デバイスでは実行されません。実際、デバイスからオーディオを取得できません。outBuffer をチェックするために printf を追加しても、outBuffer が正弦波のサンプルで満たされていることがわかります。
セッションタイプを Ambiet に設定していますが、playAndRecord と MediaPlayback も試しました。どちらにも運がありません。私の好みの framesPerBuffer は 1024 です (これは、シミュレーターとデバイスで得られるものです)。私のサンプルレートは 44100hz です。念のため48000も試しました。また、framesPerBuffer を変更してみました。
サンプルがデバイスのハードウェアに到達しない他の理由はありますか?
更新: ヘッドフォンをデバイスに接続すると、正弦波のような音が聞こえ、非常にひどくクリッピングしていることがわかりました。これにより、デバイスが符号付き整数ではなく浮動小数点を期待していた可能性があると思いましたが、値を -1 から 1 に変更すると、オーディオがまったくありません (エンジンは符号付き整数ではなく、符号付き整数を受け入れるように設定されているため、デバイスまたはシミュレーターは予想どおりです)。浮動小数点)。