Iphone AVAudioSession endInterruption()返回NSOSStatusErrorDomain

Iphone AVAudioSession endInterruption()返回NSOSStatusErrorDomain,iphone,ios4,avaudiosession,Iphone,Ios4,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 560161

我从几个小时前就开始尝试解决一个音频问题,但没有成功

我发现很多人都在谈论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];
}

以及中断方法的代码:

- (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主机样本中提取的。 奇怪的是,这个样本很好用

你们能找出问题所在吗


谢谢。

我通过改变音频代码的设计方式解决了这个问题。 我没有使用AVAudioSession及其委托方法,而是改为C风格来处理音频

我实现了以下功能:

void interruptionListenerCallback (void *inUserData, UInt32 interruptionState) {}
它被初始化为:

AudioSessionInitialize (NULL, NULL, interruptionListenerCallback, self);
在我的-(id)init方法中

希望它也能帮助你。 最好的

如果此委托方法在其flags参数中接收到AVAudioSessionInterruptionFlags_ShouldResume常量,则音频会话将立即准备好使用

您没有正确处理回调。当您收到音频会话中断标志\u ShouldResume时,您的音频会话已准备好使用。当您获得不同的标志时,需要调用setActive


希望对你有帮助

使用@Trinca回答我在“ARC'ed”项目中所做的:

WARE 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;
   }

}
祝你好运


如果是voip,则使用audiosession.setmode

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;
   }

}