내 앱이 조회 테이블에서 오디오를 합성합니다. 오디오를 성공적으로 재생하지만 재생을 중지하려고 할 때 충돌이 발생합니다. 오디오 재생은 다시 시작하지 않고 종료해야하므로 중단을 처리하기위한 요구 사항이 기본입니다. Responding to Interruptions 섹션을 포함하여 Apple의 오디오 세션 프로그래밍 가이드를 다시 읽었습니다. 그러나 방법을 handleAudioSessionInterruption
분명히 뭔가를 놓치고있어 그래서 인터럽트를 등록하지 않는 것.왜이 오디오 세션이 중단을 인식하지 못합니까?
편집 내 대답을 참조하십시오. 내가 이것에 관해 작업을 시작했을 때 나는 개선에 대한 어떤 제안도 환영하기 때문에 NSNotificationCenter
에 대해서는 아무것도 알지 못했다.
두 가지 방법으로 포어 그라운드에서 재생할 오디오 세션을 설정할 수 있습니다.
- (void)setUpAudio
{
if (_playQueue == NULL)
{
if ([self setUpAudioSession] == TRUE)
{
[self setUpPlayQueue];
[self setUpPlayQueueBuffers];
}
}
}
- (BOOL)setUpAudioSession
{
BOOL success = NO;
NSError *audioSessionError = nil;
AVAudioSession *session = [AVAudioSession sharedInstance];
// Set up notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleAudioSessionInterruption:)
name:AVAudioSessionInterruptionNotification
object:session];
// Set category
success = [session setCategory:AVAudioSessionCategoryPlayback
error:&audioSessionError];
if (!success)
{
NSLog(@"%@ Error setting category: %@",
NSStringFromSelector(_cmd), [audioSessionError localizedDescription]);
// Exit early
return success;
}
// Set mode
success = [session setMode:AVAudioSessionModeDefault
error:&audioSessionError];
if (!success)
{
NSLog(@"%@ Error setting mode: %@",
NSStringFromSelector(_cmd), [audioSessionError localizedDescription]);
// Exit early
return success;
}
// Set some preferred values
NSTimeInterval bufferDuration = .005; // I would prefer a 5ms buffer duration
success = [session setPreferredIOBufferDuration:bufferDuration
error:&audioSessionError];
if (audioSessionError)
{
NSLog(@"Error %ld, %@ %i", (long)audioSessionError.code, audioSessionError.localizedDescription, success);
}
double sampleRate = _audioFormat.mSampleRate; // I would prefer a sample rate of 44.1kHz
success = [session setPreferredSampleRate:sampleRate
error:&audioSessionError];
if (audioSessionError)
{
NSLog(@"Error %ld, %@ %i", (long)audioSessionError.code, audioSessionError.localizedDescription, success);
}
success = [session setActive:YES
error:&audioSessionError];
if (!success)
{
NSLog(@"%@ Error activating %@",
NSStringFromSelector(_cmd), [audioSessionError localizedDescription]);
}
// Get current values
sampleRate = session.sampleRate;
bufferDuration = session.IOBufferDuration;
NSLog(@"Sample Rate:%0.0fHz I/O Buffer Duration:%f", sampleRate, bufferDuration);
return success;
}
그리고 여기에 중단 단추를 눌렀을 때 중단을 처리하는 방법이 있습니다. 그러나 그것은 응답하지 않습니다.
편집 올바른 방법은 block,
하지 selector.
내 대답을 참조해야합니다.
- (void)handleAudioSessionInterruption:(NSNotification*)notification
{
if (_playQueue)
{
NSNumber *interruptionType = [[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey];
NSNumber *interruptionOption = [[notification userInfo] objectForKey:AVAudioSessionInterruptionOptionKey];
NSLog(@"in-app Audio playback will be stopped by %@ %lu", notification.name, (unsigned long)interruptionType.unsignedIntegerValue);
switch (interruptionType.unsignedIntegerValue)
{
case AVAudioSessionInterruptionTypeBegan:
{
if (interruptionOption.unsignedIntegerValue == AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation)
{
NSLog(@"notify other apps that audio is now available");
}
}
break;
default:
break;
}
}
}