我正在使用音频队列服务分析 iPhone/iPod Touch 上的传入音频。分析器的期望行为归结为:当应用程序激活时,开始分析;当App被发送到后台时,停止分析。
我正在使用一种直接的方法,只要 App 状态发生变化,就使用 AppDelegate 来启动和停止分析器。
这是一些代码:
- (void)applicationWillResignActive:(UIApplication *)application {
AudioQueueFlush(_aqRef);
AudioQueueStop(_aqRef, true);
AudioQueueDispose(_aqRef, true);
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
AudioQueueNewInput(&_formatDescription, _renderCallback, NULL, NULL, NULL, 0, &_aqRef);
AudioQueueAllocateBuffer(_aqRef, _aqBufferSize, &_aqBufferRef);
AudioQueueEnqueueBuffer(_aqRef, _aqBufferRef, 0, NULL);
AudioQueueStart(_aqRef, NULL);
}
所有变量都已初始化并正在工作 - 将其视为给定并经过测试。我知道,队列和缓冲区不应该每次都被处理和分配,但现在没有什么不同,而且这种方式更完整。
这是发生的事情:
步骤 1)启动应用程序,音频队列开始,Bob 是你的叔叔。
步骤 2)按下电源按钮,应用程序暂停。但是您听不到锁定声音,因为音频队列似乎仍然阻止了系统声音。但是,有时它确实会出现,主要是在应用程序首次启动之后,但这并不可靠。第一个故障。
步骤 3)按下主页按钮并解锁手机。同样,您不会听到解锁手机的系统声音,因为音频队列已经接管。不过,您可能会听到一小段解锁声音。有时。也不靠谱。第二个故障。
步骤 4)按主页按钮并将应用程序发送到后台。App消失约一秒后,系统记得无法播放第3步的解锁声音,立即播放。全音量。这真的很糟糕。
这让我想到了两个问题:
问题 1):当按下电源按钮时,我看不到任何其他方法可以比 applicationWillResignActive: 更早地停止音频队列。我在这里缺少什么吗?我对缺少锁定声音感到满意,但我很高兴了解任何其他方法可以使其可靠地发声(或不发声)。
问题2):第4步的延迟解锁声音让我很头疼。防止这种情况的一种简单方法是延迟音频队列的启动,以便可以畅通无阻地播放解锁声音。但这似乎是一种 hack,如果有人可以为我指出一个更好的方向,我会成为一个更快乐的编码员。
谢谢/安德烈亚斯