Другой результат при обработке Audio Interrupt для аудиоустройства - PullRequest
2 голосов
/ 09 марта 2012

Я обыскал все связанные посты здесь и документы 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) ..., почемуэто отличается для этих двух случаев?И как это может работать в обоих случаях?

...