录制RemoteIO和VPIO之间的音量降低切换

时间:2012-12-10 12:49:50

标签: ios core-audio remoteio

在我的应用程序中,我需要在这两个不同的AudioUnit之间切换。 每当我从VPIO切换到RemoteIO时,我的录音音量就会下降。相当大幅下降。 尽管播放音量没有变化。有人经历过这个吗?

这是我执行切换的代码,由路由更改触发。 (我不太确定我是否正确地做了改变,所以我也在这里问。)

如何解决录音音量下降的问题?

谢谢,感谢我能得到的任何帮助。

码头。

- (void)switchInputBoxTo : (OSType) inputBoxSubType
{
OSStatus result;

if (!remoteIONode) return; // NULL check

// Get info about current output node
AudioComponentDescription outputACD;
AudioUnit currentOutputUnit;

AUGraphNodeInfo(theGraph, remoteIONode, &outputACD, &currentOutputUnit);

if (outputACD.componentSubType != inputBoxSubType)
{
    AUGraphStop(theGraph);
    AUGraphUninitialize(theGraph); 
    result = AUGraphDisconnectNodeInput(theGraph, remoteIONode, 0);
    NSCAssert (result == noErr, @"Unable to disconnect the nodes in the audio processing graph. Error code: %d '%.4s'", (int) result, (const char *)&result);
    AUGraphRemoveNode(theGraph, remoteIONode);
    // Re-init as other type

    outputACD.componentSubType = inputBoxSubType;
    // Add the RemoteIO unit node to the graph
    result = AUGraphAddNode (theGraph, &outputACD, &remoteIONode);
    NSCAssert (result == noErr, @"Unable to add the replacement IO unit to the audio processing graph. Error code: %d '%.4s'", (int) result, (const char *)&result);

    result = AUGraphConnectNodeInput(theGraph, mixerNode, 0, remoteIONode, 0);
    // Obtain a reference to the I/O unit from its node
    result = AUGraphNodeInfo (theGraph, remoteIONode, 0, &_remoteIOUnit);
    NSCAssert (result == noErr, @"Unable to obtain a reference to the I/O unit. Error code: %d '%.4s'", (int) result, (const char *)&result);

    //result = AudioUnitUninitialize(_remoteIOUnit);

    [self setupRemoteIOTest]; // reinit all that remoteIO/voiceProcessing stuff
    [self configureAndStartAudioProcessingGraph:theGraph];
}  
}

4 个答案:

答案 0 :(得分:6)

我使用了我的苹果开发者支持。 以下是支持部门的说法:

  

语音I / O的存在将导致输入/输出的处理方式截然不同。我们不希望这些单位具有相同的增益水平,但是水平不应该像您所指出的那样大幅度下降。

     

也就是说,Core Audio工程表明您的结果可能与创建语音块的时间有关,它也影响RIO实例。经过进一步的讨论,Core Audio工程人员认为,既然你说级别差异非常大,那么如果你可以在某些录音中提出错误以突出你在语音I / O之间听到的级别差异会更好。远程I / O以及您的测试代码,因此我们可以尝试在内部重现并查看这确实是一个错误。最好包括上面概述的单元IO单元测试的结果以及进一步的比较结果。

     

没有控制此增益级别的API,所有内容都由操作系统在内部设置,具体取决于音频会话类别(例如,VPIO预计将与PlayAndRecord一起使用)以及已设置的IO设备。通常不会同时实例化两者。

结论?我认为这是一个错误。 :/

答案 1 :(得分:2)

如果您没有正确处理音频设备,有一些关于低音量问题的讨论。基本上,第一个音频组件保留在内存中,任何连续播放都将被置于您或其他应用程序之下,导致音量下降。

<强>解决方案: 音频单元是AudioComponentInstance,必须使用AudioComponentInstanceDispose()释放。

答案 2 :(得分:2)

当我从语音处理io(PlayAndRecord)到远程IO(SoloAmbient)时更改音频会话类别时,我取得了成功。确保在更改之前暂停音频会话。你还必须取消初始化你的音频图。

答案 3 :(得分:0)

来自我与 Apple AVAudioSession 工程师的一次谈话。

VPIO - 正在对音频样本添加音频处理,这也会产生回声消除,从而导致音频电平下降

RemoteIO - 不会进行任何音频处理,因此音量会保持在高水平。

如果您在使用 RemoteIO 选项时寻找回声消除,您应该在渲染回调中创建自己的音频处理