AVAudioSession endInterruption () возвращает NSOSStatusErrorDomain - PullRequest
2 голосов
/ 22 февраля 2011

Я пытаюсь решить проблему AVAudioSession много часов назад и не добился успеха !!

Я нашел много парней, которые говорили о проблемах с endInterruption, но никто из них не говорил об этой ошибке:

Unable to reactivate the audio session after the interruption ended: Error Domain=NSOSStatusErrorDomain Code=560161140 "The operation couldn’t be completed. (OSStatus error 560161140.)"

Я попытался преобразовать этот код в ASCII, чтобы проверить результаты аудиокода, но с этим номером ничего не связано.

Мой код для инициации сеанса:

- (void) setupAudioSession {

mySession = [AVAudioSession sharedInstance];
[mySession setDelegate: self];

NSError *audioSessionError = nil;
[mySession setCategory: AVAudioSessionCategoryPlayback error: &audioSessionError];

if (audioSessionError != nil) {
    NSLog (@"Error setting audio session category: %@", [audioSessionError description]);
    return;
}

// Activate the audio session
[mySession setActive: YES error: &audioSessionError];

if (audioSessionError != nil) {
    NSLog (@"Error activating audio session during initial setup: %@", [audioSessionError description]);
    return;
}

// Prepare audio file to play
NSBundle *mainBundle = [NSBundle mainBundle];
NSURL *bgSoundURL = [NSURL fileURLWithPath:[mainBundle pathForResource:@"bg_sound" ofType:@"aif"]];

bgPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:bgSoundURL error:&audioSessionError];
if (!bgPlayer) {
    NSLog(@"No bgPlayer: %@", [audioSessionError description]);  
}

[bgPlayer setNumberOfLoops:-1];
[bgPlayer prepareToPlay];

}

И код метода endInterruption:

- (void) endInterruptionWithFlags: (NSUInteger) flags {

if (flags & AVAudioSessionInterruptionFlags_ShouldResume) {

    NSError *endInterruptionError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &endInterruptionError];
    if (endInterruptionError != nil) {

        NSLog (@"Unable to reactivate the audio session after the interruption ended: %@", [endInterruptionError description]);
        return;

    } else {

        NSLog (@"Audio session reactivated after interruption.");

        if (interruptedWhilePlaying) {

            self.interruptedWhilePlaying = NO;

            // Resume playback by sending a notification to the controller object, which
            //    in turn invokes the playOrStop: toggle method.
            NSString *MixerHostAudioObjectPlaybackStateDidChangeNotification = @"MixerHostAudioObjectPlaybackStateDidChangeNotification";
            [[NSNotificationCenter defaultCenter] postNotificationName: MixerHostAudioObjectPlaybackStateDidChangeNotification object: self]; 

        }
    }
}

}

Большая часть этого кода была извлечена из примера Apple Mixer Host Sample.И странно, что образец отлично работает!

Ребята, вы можете понять, что не так?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 24 февраля 2011

Я решил проблему, изменив способ создания своего аудиокода.Вместо использования AVAudioSession и его методов делегата я переключаюсь на стиль C. для работы со звуком.

Я реализовал функцию:

void interruptionListenerCallback (void *inUserData, UInt32 interruptionState) {}

И она была инициализирована с помощью:

AudioSessionInitialize (NULL, NULL, interruptionListenerCallback, self);

в моем методе инициализации - (id).

Надеюсь, он вам тоже поможет.Best.

2 голосов
/ 09 августа 2011

"Если этот метод делегата получает константу AVAudioSessionInterruptionFlags_ShouldResume в своем параметре flags, аудиосеанс сразу готов к использованию."

Вы неправильно обработали обратный вызов.Когда вы получаете AVAudioSessionInterruptionFlags_ShouldResume, ваш аудио сеанс уже готов к использованию.Вам нужно вызвать setActive, когда вы получите РАЗНЫЙ флаг.

Надеюсь, это поможет ...

1 голос
/ 22 июня 2012

Используя @Trinca, ответьте на то, что я сделал в проекте "ARC'ed":

AudioSessionInitialize (NULL, NULL, interruptionListenerCallback, (__bridge void *)(self.player));

Были ли self.player ваш экземпляр проигрывателя, который вы передаете в функцию обратного вызова.

Затем выполните обратный вызов:

void interruptionListenerCallback (void *inUserData, UInt32 interruptionState) {
   NSLog(@"itnerp state %li",interruptionState);
   NSLog(@"inUserData %@",inUserData);
   AVAudioPlayer *pl = (__bridge AVAudioPlayer*)inUserData;
   switch (interruptionState) {
    case 0:
        [pl play];
    break;

    case 1:
        [pl pause];
    break;
   }

}

УДАЧИ

Шани

0 голосов
/ 06 января 2013

используйте audiosession.setmode, если это voip

...