Нет звука в приложении iOS, использующем RemoteIO AudioUnit при перезапуске iPad

У меня странная проблема, когда разработанное мной приложение для iOS работает нормально, когда я собираю и запускаю его из XCode на устройстве. Однако при перезапуске устройства и запуске приложения я не получаю звука вообще. Если я впоследствии отключу приложение и перезапущу его с устройства, я снова начну получать звук. Сначала я думал, что это проблема с обработчиком прерываний, но я больше не уверен. Любая помощь будет оценена!

Вот мой обработчик прерываний на всякий случай.

static void MyInterruptionListener (void *inUserData,
                                UInt32 inInterruptionState) {

printf ("Interrupted! inInterruptionState=%ld\n", inInterruptionState);
pediViewController *pediController = (__bridge pediViewController*)inUserData;
switch (inInterruptionState) {
    case kAudioSessionBeginInterruption:
        CheckError (AudioOutputUnitStop (pediController.effectState.rioUnit),
                    "Couldn't start RIO unit");
    case kAudioSessionEndInterruption:
        // TODO: doesn't work!
        CheckError(AudioSessionSetActive(true),
                   "Couldn't set audio session active");
        CheckError (AudioOutputUnitStart (pediController.effectState.rioUnit),
                    "Couldn't start RIO unit");
        break;
    default:
        break;
};

}

2 ответа

Решение

Проблема ушла при обновлении до iOS 6. Я провел некоторую интенсивную отладку, закомментировав каждую строку кода в звуковом обратном вызове и протестировав, перезапустив iPad и снова запустив приложение по 3 раза. Наконец, это было решено путем обновления iOS 6 на устройстве и запуска на нем. Я также получил огромный прирост производительности в этом!

Вы должны обрабатывать входящее и исходящее приложение, используя обратный вызов изменения маршрута аудио, а не обработчик прерываний.

Это то, что работало для меня в любом случае, когда у меня была проблема, подобная вашей (если я правильно понимаю вашу проблему).

Вот пример

AudioSessionAddPropertyListener (
                                     kAudioSessionProperty_AudioRouteChange,
                                     audioRouteChangeListenerCallback,
                                     (__bridge void*) self
                                     );

void audioRouteChangeListenerCallback (
                                       void                      *inUserData,
                                       AudioSessionPropertyID    inPropertyID,
                                       UInt32                    inPropertyValueSize,
                                       const void                *inPropertyValue
                                       ) {

    // Ensure that this callback was invoked because of an audio route change
    if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;


    AudioEngine *audioObject = (__bridge AudioEngine *) inUserData;

    // if application sound is not playing, there's nothing to do, so return.
    if (NO == audioObject.isPlaying) {

        NSLog (@"Audio route change while application audio is stopped.");
        return;

    } else {

        CFDictionaryRef routeChangeDictionary = inPropertyValue;

        CFNumberRef routeChangeReasonRef =
        CFDictionaryGetValue (
                              routeChangeDictionary,
                              CFSTR (kAudioSession_AudioRouteChangeKey_Reason)
                              );

        SInt32 routeChangeReason;

        CFNumberGetValue (
                          routeChangeReasonRef,
                          kCFNumberSInt32Type,
                          &routeChangeReason
                          );
             if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {

            NSLog (@"Audio output device was removed; stopping audio playback.");
            NSString *MixerHostAudioObjectPlaybackStateDidChangeNotification = @"MixerHostAudioObjectPlaybackStateDidChangeNotification";
            [[NSNotificationCenter defaultCenter] postNotificationName: MixerHostAudioObjectPlaybackStateDidChangeNotification object: audioObject]; 

        } else {

            NSLog (@"A route change occurred that does not require stopping application audio.");
        }
    }
}
Другие вопросы по тегам