不使用时停用iOS音频会话?

时间:2014-01-07 00:20:10

标签: ios objective-c core-audio remoteio

我有一个iOS应用程序,用于记录指定时间段的音频片段,对该音频执行分析,返回结果,然后基本上处于非活动状态,直到用户想要再次录制。

应用程序的音频配置类似于aurioTouch2,并使用RemoteI / O音频设备和音频会话服务。该应用程序当前在初始启动期间设置AudioSessionSetActive(true),然后启动远程I / O.音频会话和音频单元在应用程序的整个生命周期内保持运行。

所以这是我的问题 - 因为应用程序实际上只使用麦克风相对较短(15-60秒)的时间,我应该在没有被主动使用时通过AudioSessionSetActive(false)停用音频会话吗?

我已尝试仅在录制过程中同时运行音频单元和音频会话 - 在录制时启动,并在录制完成后停止 - 虽然它在模拟器上按预期工作但在运行时崩溃在物理设备上。这是错误:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFArray objectAtIndex:]: index (0) beyond bounds (0)'
*** First throw call stack:
(0x2e4baf4b 0x3884a6af 0x2e4bae8d 0x2e4054b3 0xb2e67 0xb420d 0x2ddd5ee5 0x2ddd5b1f 0x2ddd6283 0x2ddd6163 0x2ddd6045 0x2ddd5fc7 0x2ddd57a5 0x2e4859df 0x2e48597b 0x2e48414f 0x2e3eec27 0x2e3eea0b 0x330cd283 0x30c92049 0xa1d6f 0x38d52ab7)
libc++abi.dylib: terminating with uncaught exception of type NSException

以下是我开始/停止录制的方式:

- (void)startRecording
{
    CheckError(AudioSessionSetActive(true), "Couldn't set audio session active\n");

    if (![self unitIsRunning]) {
        CheckError(AudioOutputUnitStart([self audioUnit]), "Couldn't start unit");
        [self setUnitIsRunning:YES];
    }


}

- (void)stopRecording
{
    if ([self unitIsRunning]) {
        CheckError(AudioOutputUnitStop([self audioUnit]), "Couldn't stop unit");
        [self setUnitIsRunning:NO];
    }

    // if I comment out the following line, and keep the audio session running
    // throughout the lifetime of the app, everything works fine
    CheckError(AudioSessionSetActive(false), "Couldn't set audio session inactive\n");
}

显然,我已经省去了设备运行时发生的音频渲染回调,以及为了简洁而在初始启动时完成的音频会话/音频设备的配置,但同样,这非常接近完成的工作在aurioTouch2中。该错误似乎是由于设置音频会话无效,但我似乎无法弄清楚原因。

即使应用程序实际上没有做任何事情,我也很难发现Apple是否建议运行相同的音频会话。会话应该在应用程序的生命周期内还是在需要使用的基础上保留?有什么想法吗?

0 个答案:

没有答案