指定された期間オーディオのセグメントを録音し、そのオーディオの分析を実行し、結果を返し、ユーザーが再度録音するまで基本的に非アクティブになる 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 が同じオーディオ セッションを実行することを推奨しているかどうかを見つけるのに苦労しました。アプリケーションの存続期間中、または必要に応じてセッションを維持する必要がありますか? 何かご意見は?