CoreAudio由于缺乏文档资料,一直是个谜。最近我又碰到了一些石头:
在我的程序中,我来回调用RemoteIO和VoiceProcessingIO(VPIO(,并在两者之间更改AVAudiosession。我试图用以下代码关闭VPIO上的AGC:
if (ASBD.componentSubType == kAudioUnitSubType_VoiceProcessingIO) {
UInt32 turnOff = 0;
status = AudioUnitSetProperty(_myAudioUnit,
kAUVoiceIOProperty_VoiceProcessingEnableAGC,
kAudioUnitScope_Global,
0,
&turnOff,
sizeof(turnOff));
NSAssert1(status == noErr, @"Error setting AGC status: %d", (int)status);
}
我仍然不确定这个代码是在VPIO的麦克风侧还是扬声器侧禁用AGC,但无论如何,让我们继续。以下是重现问题的顺序:
创建一个具有PlayAndRecord音频会话类别的RemoteIO输出音频单元,使用它并销毁该单元;
将音频会话切换到"仅播放"类别;
再次将音频会话切换到PlayAndRecord,并创建另一个VPIO,使用它并销毁它;
将音频会话切换到"回放",然后切换到"播放和录制"类别;
在这些步骤之后,无论以后创建什么RemoteIO/VPIO,都将承受这种放大的麦克风信号(就好像总是应用巨大的AGC一样(,在手动终止应用程序并重新启动之前,都无法返回。
也许是我的特定序列触发了这一点,不知道是否有人以前见过这个,也许知道正确的解决方法?
在配置应用程序的音频会话时,请尝试设置模式AVAudioSessionModeMeasurement或AVAudioSsession.mode.measurement。