Я обыскал все связанные посты здесь и документы Apple, без ответов.По примеру кода Apple «aurioTouch» у меня есть такой обработчик:
static void rioInterruptionListener(void *inClientData, UInt32 inInterruption)
{
printf("Session interrupted! --- %s ---",
inInterruption == kAudioSessionBeginInterruption ?
"Begin Interruption" : "End Interruption");
AudioObjectImpl *THIS = (__bridge AudioObjectImpl *)inClientData;
if (inInterruption == kAudioSessionEndInterruption) {
// make sure we are again the active session
XThrowIfError(AudioSessionSetActive(true), "couldn't set audio session active");
XThrowIfError(AudioOutputUnitStart(THIS->rioUnit), "couldn't start unit");
THIS->inInterrupt = false;
}
if (inInterruption == kAudioSessionBeginInterruption) {
XThrowIfError(AudioOutputUnitStop(THIS->rioUnit), "couldn't stop unit");
THIS->unitIsRunning = false;
THIS->inInterrupt = true;
}
}
AudioObjectImpl является владельцем аудиоустройства.XThrowIfError (action, message) - это макрос для выполнения 'action', и если он перехватывает исключение, выведите 'message'.Это скопировано из примера кода aurioTouch.
Этот код сработал для прерывания входящего вызова, при отклонении вызова прерванный звук восстанавливается.Но он вылетал, когда я выбирал мелодию звонка в «Настройки | Общие | Звук | Звонок» .
Точка сбоя: ... AudioSessionSetActive (true) ..., почемуэто отличается для этих двух случаев?И как это может работать в обоих случаях?