2010-11-10 78 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

問題是用於從麥克風是失敗的第一次這個回調火災數據的請求。

什麼我應該做的事情是檢查返回值,並返回它(即退出回調),如果它是不是成功

了可能發生的事情是,我訪問無效數據

它仍然相當怪異,但不需要進入它。