2010-11-10 61 views
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 ++;在下一行,行为是一样的。尽管编译器可能仍然可以检测到该变量实际上未被使用。

+0

AudioBuffer buf0 = ioData-> mBuffers [0]; //足以导致失败 – 2010-11-11 05:56:06

回答

0

问题是用于从麦克风是失败的第一次这个回调火灾数据的请求。

什么我应该做的事情是检查返回值,并返回它(即退出回调),如果它是不是成功

了可能发生的事情是,我访问无效数据

它仍然相当怪异,但不需要进入它。