我正在使用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 ++;在下一行,行为是一样的。虽然编译器仍然可以检测到变量实际上是未使用的。
答案 0 :(得分:0)
问题是来自麦克风的数据请求在第一次此回调触发时失败。
我应该做的是检查返回值,如果不成功则返回它(即退出回调)
可能发生的事情是我访问了无效数据
它仍然相当奇怪,但不需要进入它。