我正在使用音频队列服务分析iPhone / iPod Touch上的传入音频。分析仪所需的行为归结为:当应用程序变为活动状态时,开始分析;当应用程序发送到后台时,停止分析。
我正在使用一种直接的方法,每当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)按下主页按钮并将应用程序发送到后台。应用程序消失后大约一秒钟,系统会记住它在步骤3中无法播放解锁声音并立即播放。全量。那真是太糟糕了。
这引出了两个问题:
问题1):当按下电源按钮时,我没有看到任何其他方法来阻止音频队列,而不是在applicationWillResignActive:中。我在这里缺少什么?我对锁定声音丢失感到满意,但我很高兴能够了解任何其他方法使声音可靠(或不合理)。
问题2):第4步中的延迟解锁声音令我头疼。一种防止这种情况的简单方法是延迟音频队列的启动,以便可以不受阻碍地播放解锁声音。但这似乎是一个黑客,如果有人能指出我更好的方向,我会成为一个更快乐的编码器。
谢谢/ Andreas