【问题标题】:Core Audio: Bizarre problem with pass-through using render callbackCore Audio:使用渲染回调传递的奇怪问题
【发布时间】:2010-11-10 22:22:59
【问题描述】:

我正在使用 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++;在下一行,行为是相同的。虽然也许编译器仍然可以检测到变量实际上未被使用。

【问题讨论】:

  • AudioBuffer buf0 = ioData->mBuffers[0]; // 足以导致失败

标签: callback core-audio render pass-through


【解决方案1】:

问题是第一次触发此回调时,来自麦克风的数据请求失败。

我应该做的是检查返回值,如果不成功则返回(即退出回调)

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

还是比较离奇的,不过没必要深究。

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 2014-02-20
    • 2012-08-25
    • 1970-01-01
    • 2021-08-16
    • 2011-07-30
    • 2023-01-02
    • 2016-04-22
    • 2015-10-19
    相关资源
    最近更新 更多