初始化 AUGraph 后的 AVAudioSession 属性

AVAudioSession properties after Initializing AUGraph

为了开始通话,我们的 VOIP 应用设置了一个 AVAudioSession,然后构建、初始化并运行了一个 AUGraph。

在通话期间,我们允许用户使用以下代码在扬声器模式之间来回切换:

avSession = [AVAudioSession sharedInstance];
AVAudioSessionCategoryOptions categoryOptions = [avSession categoryOptions];
categoryOptions |= AVAudioSessionCategoryOptionDefaultToSpeaker;
NSLog(@"AudioService:setSpeaker:setProperty:DefaultToSpeaker=1 categoryOptions = %lx", (unsigned long)categoryOptions);
BOOL success = [avSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:categoryOptions error:&error];

效果很好。但是如果我们在 AUGraph 初始化之后尝试某些 AVAudioSession 查询,例如:

    AVAudioSessionDataSourceDescription *myInputDataSource = [avSession inputDataSource];

结果为空。 运行 在我们执行 AUGraphInitialize 之前的同一行代码给出了正确的非空结果。谁能解释这里发生了什么以及如何在使用 AUGraph 时正确访问 AVAudioSession properties/methods?

根据 developer 文档,这是预期的行为,如果无法切换源,inputDataSource 应该 return nil。所以 Apple 确实不会让任何不好的事情通过错误配置发生,但是 nil 源也可能给出错误的想法。希望这有帮助。

Discussion
The value of this property is nil if switching between multiple input
sources is not currently possible. This feature is supported only on
certain devices and peripherals–for example, on an iPhone equipped with
both front- and rear-facing microphones.