vlc/vlc-3.0 | branch: master | Felix Paul Kühne <fe...@feepk.net> | Mon May 28 19:36:38 2018 +0200| [0ed65ca0833aea3b5e950da290c469942543bec7] | committer: Felix Paul Kühne
iOS audio unit: improve session handling for parallel playback instances Previously, playback was terminated once the first audio track stopped instead of the last (cherry picked from commit 5a59782d4506183c944a8f027fd0d94767e65f7b) > http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=0ed65ca0833aea3b5e950da290c469942543bec7 --- modules/audio_output/audiounit_ios.m | 57 ++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/modules/audio_output/audiounit_ios.m b/modules/audio_output/audiounit_ios.m index 0649d30417..d17f5eaad8 100644 --- a/modules/audio_output/audiounit_ios.m +++ b/modules/audio_output/audiounit_ios.m @@ -72,6 +72,53 @@ static const struct { AU_DEV_ENCODED }, /* This can also be forced with the --spdif option */ }; +@interface SessionManager : NSObject +{ + NSMutableSet *_registeredInstances; +} ++ (SessionManager *)sharedInstance; +- (void)addAoutInstance:(AoutWrapper *)wrapperInstance; +- (NSInteger)removeAoutInstance:(AoutWrapper *)wrapperInstance; +@end + +@implementation SessionManager ++ (SessionManager *)sharedInstance +{ + static SessionManager *sharedInstance = nil; + static dispatch_once_t pred; + + dispatch_once(&pred, ^{ + sharedInstance = [SessionManager new]; + }); + + return sharedInstance; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + _registeredInstances = [[NSMutableSet alloc] init]; + } + return self; +} + +- (void)addAoutInstance:(AoutWrapper *)wrapperInstance +{ + @synchronized(_registeredInstances) { + [_registeredInstances addObject:wrapperInstance]; + } +} + +- (NSInteger)removeAoutInstance:(AoutWrapper *)wrapperInstance +{ + @synchronized(_registeredInstances) { + [_registeredInstances removeObject:wrapperInstance]; + return _registeredInstances.count; + } +} +@end + /***************************************************************************** * aout_sys_t: private audio output method descriptor ***************************************************************************** @@ -294,9 +341,15 @@ avas_SetActive(audio_output_t *p_aout, bool active, NSUInteger options) ret = [instance setCategory:AVAudioSessionCategoryPlayback error:&error]; ret = ret && [instance setMode:AVAudioSessionModeMoviePlayback error:&error]; ret = ret && [instance setActive:YES withOptions:options error:&error]; + [[SessionManager sharedInstance] addAoutInstance: p_sys->aoutWrapper]; + } else { + NSInteger numberOfRegisteredInstances = [[SessionManager sharedInstance] removeAoutInstance: p_sys->aoutWrapper]; + if (numberOfRegisteredInstances == 0) { + ret = [instance setActive:NO withOptions:options error:&error]; + } else { + ret = true; + } } - else - ret = [instance setActive:NO withOptions:options error:&error]; if (!ret) { _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits