我正在尝试解决几个小时前的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中提取的。 这个样本工作得很好很奇怪!
你们能弄清楚出了什么问题吗?
感谢。
答案 0 :(得分:3)
我解决了改变设计音频代码方式的问题。 我没有使用AVAudioSession及其委托方法,而是使用C风格来处理音频。
我实现了这个功能:
void interruptionListenerCallback (void *inUserData, UInt32 interruptionState) {}
它初始化为:
AudioSessionInitialize (NULL, NULL, interruptionListenerCallback, self);
在我的 - (id)init方法中。
希望它也能帮到你。 最好的。
答案 1 :(得分:2)
“如果此委托方法在其flags参数中收到AVAudioSessionInterruptionFlags_ShouldResume常量,则音频会话立即可以使用。”
您没有正确处理回调。当您收到AVAudioSessionInterruptionFlags_ShouldResume时,您的音频会话已准备好使用。当你得到一个不同的标志时,你需要调用setActive。
希望它有所帮助...
答案 2 :(得分:1)
使用@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;
}
}
好运
沙尼
答案 3 :(得分:0)
如果是voip
,请使用audiosession.setmode