Виновника здесь можно увидеть, проследив мою функцию на один шаг до этой строки:
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)
}