Во время телефонного звонка или сеанса Facetime при попытке использования SpeechRecognizer происходит сбой приложения - PullRequest
0 голосов
/ 06 июня 2019

Сценарий, описанный в заголовке, приведет к следующей ошибке:

Завершение приложения из-за необработанного исключения 'com.apple.coreaudio.avfaudio', причина: 'обязательное условие - false: IsFormatSampleRateAndChannelCountValid (формат)

После этого меня выгнали в делегат приложения, и мне не оказали большую помощь в том, что пошло не так.

Я знаком с необходимостью правильно завершить аудиосессию, нов моей конкретной ситуации это может произойти при запуске сеанса, в частности здесь:

node.installTap(onBus: bus, bufferSize: 1024, format: recordingFormat) { buffer, _ in
    request.append(buffer)
}

1 Ответ

0 голосов
/ 06 июня 2019

Виновника здесь можно увидеть, проследив мою функцию на один шаг до этой строки:

let recordingFormat = node.outputFormat(forBus: bus)

Поскольку микрофон назначен другому приложению (в моем случае, Facetime), он не может получить к нему доступ для функции, опубликованной в вопросе, где происходит сбой.

Я обнаружил, что, контролируя частоту дискретизации, я могу определить, есть ли у меня эксклюзивный доступ к ней или нет.

if recordingFormat.sampleRate == 0.0 {
    throw(MyAwesomeError.audioInUse)
}

Когда значение равно 0,0, оно используется. Когда значение равно 44100,0, тогда я в бизнесе.

Установив вышеуказанную проверку непосредственно перед функцией node.installTap(...), я могу безопасно избежать сбоя и затем использовать свой существующий код обработки ошибок, чтобы уведомить пользователя о ситуации.

Собрав все воедино, это выглядит так:

let recordingFormat = node.outputFormat(forBus: bus)
if recordingFormat.sampleRate == 0.0 {
    throw(MyAwesomeError.audioInUse)
}
node.installTap(onBus: bus, bufferSize: 1024, format: recordingFormat) { buffer, _ in
    request.append(buffer)
}
...