Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AudioSessionSetActive fails after interruption

I was trying to figure out what actually happens for weeks and I have no idea why I cannot continue playback after interruption, so probably you guys know an answer. AudioSessionSetActive(TRUE) always returns '!cat' which is kAudioSessionIncompatibleCategory while re-activation if my app plays in background and I am in different app. Although it works fine and continues playback if I caught interruption while being in my app.

Original code actually has all AudioSession and AudioQueue calls wrapped in macros which prints OSStatus if it means error, but I removed it for better readability. Also, [self pause] just toggles pause, so basically it calls AudioQueueStart(audioQueue, NULL) on upause but it doesn't work ofcourse if AudioSession fails.

Audio Session initialization code:

AudioSessionInitialize(NULL, NULL, _audioSessionInterruptionListener, self);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, _audioSessionPropertyListener, self);
AudioSessionSetActive(TRUE);

Interruption handler code:

- (void)handleInterruptionChangeToState:(AudioQueuePropertyID)inInterruptionState 
{
    if(inInterruptionState == kAudioSessionBeginInterruption)
    {

        NSLog(@"+Interruption"); 

        if(self.state == NX_STATE_PLAY) 
        {
            [self pause];
            AudioSessionSetActive(FALSE);

            isPausedByInterruption = YES;
        }
    }
    else if(inInterruptionState == kAudioSessionEndInterruption) 
    {
        if(isPausedByInterruption) 
        {
            AudioSessionSetActive(TRUE);
            [self pause];

            isPausedByInterruption = FALSE;
        }

        NSLog(@"-Interruption");
    }
}

This streamer source code can be found here https://bitbucket.org/and/amaudiostreamer/src/122de41fe6c0/AMAudioStreamer/AMAudioStreamer/Classes/NxAudioStreamer.m if it's gonna help somehow to resolve an issue..

like image 954
Rob Zombie Avatar asked Oct 27 '11 21:10

Rob Zombie


2 Answers

If you are using the AudioQueue API you need to do some extra steps that depends on some factor. I've never done that, so I will leave the explanation to the expert :
there is a video on that topic in the Apple Developer website that cover that exact problem. WWDC 2010 session 412 Audio Development for iPhone OS part 1 around the 45th minutes you've got a pretty good explanation on that matter.

like image 142
Vincent Bernier Avatar answered Nov 04 '22 19:11

Vincent Bernier


I had a problem, when Alarm comes during app run, user just presses device power button making it go sleep. Then, after resume from sleep my AudioSessionSetActive fails with something like "this audiosession type can't be used". I tried to add set audiosession property before AudioSessionSetActive(true) in Interruptionlistener, but no luck. Finally I added

retry(~1000 times :) 

ftw)

AudioSessionSetActive(true), 

and it solved my problem.

like image 45
NoAngel Avatar answered Nov 04 '22 20:11

NoAngel