我的回调如下所示:
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;
}
这是一个超级基本的渲染回调,应该只播放一个正弦波。它在模拟器上,它不在设备上。事实上,我无法从设备中获得任何音频。即使我添加了一个 printf 来检查 outBuffer,它也表明 outBuffer 充满了正弦波的样本。
我将会话类型设置为 Ambiet,但我也尝试过 playAndRecord 和 MediaPlayback。也没有运气。我首选的 framesPerBuffer 是 1024(这是我在模拟器和设备上得到的)。我的采样率为 44100hz。为了以防万一,我也尝试了48000。我也试过改变framePerBuffer。
还有其他原因导致样本无法到达设备上的硬件吗?
更新:我刚刚发现,如果我将耳机插入设备,我会听到听起来像正弦波的声音,而且削波非常可怕。这让我认为设备可能需要浮点而不是带符号的 int,但是当我将值更改为 -1 到 1 时,就没有音频(设备或模拟器,正如预期的那样,因为引擎设置为接受带符号的 int,而不是浮点)。