From b11160dc9e65d4ac70f73516195bfa14b55d8e89 Mon Sep 17 00:00:00 2001 From: bbcallen Date: Sat, 4 Jan 2014 18:38:09 +0800 Subject: [PATCH] ios: handle audio interruption --- .../IJKMediaPlayer.xcodeproj/project.pbxproj | 6 ++ .../IJKMediaPlayer/IJKAudioKit.h | 23 +++++ .../IJKMediaPlayer/IJKAudioKit.m | 91 +++++++++++++++++++ .../IJKMPMoviePlayerController.m | 20 +++- 4 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 ios/IJKMediaPlayer/IJKMediaPlayer/IJKAudioKit.h create mode 100644 ios/IJKMediaPlayer/IJKMediaPlayer/IJKAudioKit.m diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj b/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj index 4f2b52e5..2613c335 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj +++ b/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj @@ -42,6 +42,7 @@ E690403217EAFC6100CFD954 /* ijksdl_thread.c in Sources */ = {isa = PBXBuildFile; fileRef = E690400C17EAFC6100CFD954 /* ijksdl_thread.c */; }; E690403317EAFC6100CFD954 /* ijksdl_timer.c in Sources */ = {isa = PBXBuildFile; fileRef = E690400E17EAFC6100CFD954 /* ijksdl_timer.c */; }; E690403417EAFC6100CFD954 /* ijksdl_vout.c in Sources */ = {isa = PBXBuildFile; fileRef = E690401117EAFC6100CFD954 /* ijksdl_vout.c */; }; + E6EE92A3187810C5009EAB56 /* IJKAudioKit.m in Sources */ = {isa = PBXBuildFile; fileRef = E6EE92A2187810C5009EAB56 /* IJKAudioKit.m */; }; E6F727B817F2B1B10043623F /* IJKMediaModule.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F727B717F2B1B10043623F /* IJKMediaModule.m */; }; E6F727BB17F2D9D40043623F /* IJKFFMoviePlayerDef.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F727BA17F2D9D30043623F /* IJKFFMoviePlayerDef.m */; }; E6F727BC17F40C1C0043623F /* IJKMediaPlayer.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E66F8DC217EECB1E00354D80 /* IJKMediaPlayer.h */; }; @@ -225,6 +226,8 @@ E690403717EB079500CFD954 /* ijklog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ijklog.h; sourceTree = ""; }; E690403917EB079500CFD954 /* ijkutil_ios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ijkutil_ios.h; sourceTree = ""; }; E690403A17EB079500CFD954 /* loghelp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loghelp.h; sourceTree = ""; }; + E6EE92A1187810C5009EAB56 /* IJKAudioKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = IJKAudioKit.h; path = IJKMediaPlayer/IJKAudioKit.h; sourceTree = ""; }; + E6EE92A2187810C5009EAB56 /* IJKAudioKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = IJKAudioKit.m; path = IJKMediaPlayer/IJKAudioKit.m; sourceTree = ""; }; E6F727B617F2B1B10043623F /* IJKMediaModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = IJKMediaModule.h; path = IJKMediaPlayer/IJKMediaModule.h; sourceTree = ""; }; E6F727B717F2B1B10043623F /* IJKMediaModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = IJKMediaModule.m; path = IJKMediaPlayer/IJKMediaModule.m; sourceTree = ""; }; E6F727B917F2D9D30043623F /* IJKFFMoviePlayerDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IJKFFMoviePlayerDef.h; sourceTree = ""; }; @@ -615,6 +618,8 @@ E66F8DC217EECB1E00354D80 /* IJKMediaPlayer.h */, E6716E491807E5FC00B3FBC1 /* IJKMediaUtils.h */, E6716E4A1807E5FC00B3FBC1 /* IJKMediaUtils.m */, + E6EE92A1187810C5009EAB56 /* IJKAudioKit.h */, + E6EE92A2187810C5009EAB56 /* IJKAudioKit.m */, ); name = IJKMediaPlayer; sourceTree = ""; @@ -670,6 +675,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + E6EE92A3187810C5009EAB56 /* IJKAudioKit.m in Sources */, E690401F17EAFC6100CFD954 /* ff_cmdutils.c in Sources */, E690402017EAFC6100CFD954 /* ff_ffplay.c in Sources */, E690402717EAFC6100CFD954 /* image_convert.c in Sources */, diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKAudioKit.h b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKAudioKit.h new file mode 100644 index 00000000..fbbdb77a --- /dev/null +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKAudioKit.h @@ -0,0 +1,23 @@ +// +// IJKAudioKit.h +// IJKMediaPlayer +// +// Created by ZhangRui on 14-1-4. +// Copyright (c) 2014年 bilibili. All rights reserved. +// + +#import + +@protocol IJKAudioSessionDelegate + +- (void)ijkAudioBeginInterruption; +- (void)ijkAudioEndInterruption; + +@end + +@interface IJKAudioKit : NSObject + ++ (IJKAudioKit *)sharedInstance; +- (void)setupAudioSession:(id) delegate; + +@end diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKAudioKit.m b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKAudioKit.m new file mode 100644 index 00000000..520aa5a9 --- /dev/null +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKAudioKit.m @@ -0,0 +1,91 @@ +// +// IJKAudioKit.m +// IJKMediaPlayer +// +// Created by ZhangRui on 14-1-4. +// Copyright (c) 2014年 bilibili. All rights reserved. +// + +#import "IJKAudioKit.h" + +@implementation IJKAudioKit { + __weak id _delegate; + + BOOL _audioSessionInitialized; +} + ++ (IJKAudioKit *)sharedInstance +{ + static IJKAudioKit *sAudioKit = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sAudioKit = [[IJKAudioKit alloc] init]; + }); + return sAudioKit; +} + +- (void)setupAudioSession:(id) delegate +{ + _delegate = nil; + if (delegate == nil) { + return; + } + + OSStatus status = noErr; + if (!_audioSessionInitialized) { + status = AudioSessionInitialize(NULL, + kCFRunLoopCommonModes, + IjkAudioSessionInterruptionListener, + NULL); + if (status != noErr) { + NSLog(@"IJKAudioKit: AudioSessionInitialize failed (%d)", (int)status); + return; + } + _audioSessionInitialized = YES; + } + + /* Set audio session to mediaplayback */ + UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; + status = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); + if (status != noErr) { + NSLog(@"IJKAudioKit: AudioSessionSetProperty(kAudioSessionProperty_AudioCategory) failed (%d)", (int)status); + return; + } + + status = AudioSessionSetActive(true); + if (status != noErr) { + NSLog(@"IJKAudioKit: AudioSessionSetActive(true) failed (%d)", (int)status); + return; + } + + _delegate = delegate; + return ; +} + +static void IjkAudioSessionInterruptionListener(void *inClientData, UInt32 inInterruptionState) +{ + id delegate = [IJKAudioKit sharedInstance]->_delegate; + if (delegate == nil) + return; + + switch (inInterruptionState) { + case kAudioSessionBeginInterruption: { + NSLog(@"kAudioSessionBeginInterruption\n"); + dispatch_async(dispatch_get_main_queue(), ^{ + AudioSessionSetActive(false); + [delegate ijkAudioBeginInterruption]; + }); + break; + } + case kAudioSessionEndInterruption: { + NSLog(@"kAudioSessionEndInterruption\n"); + dispatch_async(dispatch_get_main_queue(), ^{ + AudioSessionSetActive(true); + [delegate ijkAudioEndInterruption]; + }); + break; + } + } +} + +@end diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKMPMoviePlayerController.m b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKMPMoviePlayerController.m index 14678cdf..d952f2f7 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKMPMoviePlayerController.m +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKMPMoviePlayerController.m @@ -21,6 +21,10 @@ */ #import "IJKMPMoviePlayerController.h" +#import "IJKAudioKit.h" + +@interface IJKMPMoviePlayerController() +@end @implementation IJKMPMoviePlayerController @@ -50,9 +54,11 @@ self.controlStyle = MPMovieControlStyleNone; self.scalingMode = MPMovieScalingModeAspectFit; self.shouldAutoplay = YES; - self.useApplicationAudioSession = NO; [self IJK_installMovieNotificationObservers]; + + self.useApplicationAudioSession = YES; + [[IJKAudioKit sharedInstance] setupAudioSession:self]; } return self; } @@ -132,4 +138,16 @@ [[NSNotificationCenter defaultCenter] postNotificationName:IJKMoviePlayerPlaybackStateDidChangeNotification object:notification.object userInfo:notification.userInfo]; } +#pragma mark IJKAudioSessionDelegate + +- (void)ijkAudioBeginInterruption +{ + [self pause]; +} + +- (void)ijkAudioEndInterruption +{ + [self pause]; +} + @end -- GitLab