From 13e257e80e9fe88f3c68da755c4bc048f6494ce6 Mon Sep 17 00:00:00 2001 From: Ryan Heise Date: Sun, 27 Sep 2020 01:53:20 +1000 Subject: [PATCH] iOS/macOS implementation of platform interface. --- just_audio/darwin/Classes/AudioPlayer.m | 94 ++++++++----------- .../darwin/Classes/ClippingAudioSource.m | 4 +- just_audio/darwin/Classes/JustAudioPlugin.m | 54 ++++------- 3 files changed, 59 insertions(+), 93 deletions(-) diff --git a/just_audio/darwin/Classes/AudioPlayer.m b/just_audio/darwin/Classes/AudioPlayer.m index c53ad79..a3151cd 100644 --- a/just_audio/darwin/Classes/AudioPlayer.m +++ b/just_audio/darwin/Classes/AudioPlayer.m @@ -84,64 +84,48 @@ } - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { - NSArray* args = (NSArray*)call.arguments; + NSDictionary *request = (NSDictionary *)call.arguments; if ([@"load" isEqualToString:call.method]) { - [self load:args[0] result:result]; + [self load:request[@"audioSource"] result:result]; } else if ([@"play" isEqualToString:call.method]) { [self play:result]; } else if ([@"pause" isEqualToString:call.method]) { [self pause]; - result(nil); + result(@{}); } else if ([@"setVolume" isEqualToString:call.method]) { - [self setVolume:(float)[args[0] doubleValue]]; - result(nil); + [self setVolume:(float)[request[@"volume"] doubleValue]]; + result(@{}); } else if ([@"setSpeed" isEqualToString:call.method]) { - [self setSpeed:(float)[args[0] doubleValue]]; - result(nil); + [self setSpeed:(float)[request[@"speed"] doubleValue]]; + result(@{}); } else if ([@"setLoopMode" isEqualToString:call.method]) { - [self setLoopMode:[args[0] intValue]]; - result(nil); - } else if ([@"setShuffleModeEnabled" isEqualToString:call.method]) { - [self setShuffleModeEnabled:(BOOL)[args[0] boolValue]]; - result(nil); + [self setLoopMode:[request[@"loopMode"] intValue]]; + result(@{}); + } else if ([@"setShuffleMode" isEqualToString:call.method]) { + [self setShuffleModeEnabled:(BOOL)([request[@"shuffleMode"] intValue] == 1)]; + result(@{}); } else if ([@"setAutomaticallyWaitsToMinimizeStalling" isEqualToString:call.method]) { - [self setAutomaticallyWaitsToMinimizeStalling:(BOOL)[args[0] boolValue]]; - result(nil); + [self setAutomaticallyWaitsToMinimizeStalling:(BOOL)[request[@"enabled"] boolValue]]; + result(@{}); } else if ([@"seek" isEqualToString:call.method]) { - CMTime position = args[0] == [NSNull null] ? kCMTimePositiveInfinity : CMTimeMake([args[0] intValue], 1000); - [self seek:position index:args[1] completionHandler:^(BOOL finished) { - result(nil); + CMTime position = request[@"position"] == [NSNull null] ? kCMTimePositiveInfinity : CMTimeMake([request[@"position"] longLongValue], 1000000); + [self seek:position index:request[@"index"] completionHandler:^(BOOL finished) { + result(@{}); }]; - result(nil); } else if ([@"dispose" isEqualToString:call.method]) { [self dispose]; - result(nil); - } else if ([@"concatenating.add" isEqualToString:call.method]) { - [self concatenatingAdd:(NSString*)args[0] source:(NSDictionary*)args[1]]; - result(nil); - } else if ([@"concatenating.insert" isEqualToString:call.method]) { - [self concatenatingInsert:(NSString*)args[0] index:[args[1] intValue] source:(NSDictionary*)args[2]]; - result(nil); - } else if ([@"concatenating.addAll" isEqualToString:call.method]) { - [self concatenatingAddAll:(NSString*)args[0] sources:(NSArray*)args[1]]; - result(nil); - } else if ([@"concatenating.insertAll" isEqualToString:call.method]) { - [self concatenatingInsertAll:(NSString*)args[0] index:[args[1] intValue] sources:(NSArray*)args[2]]; - result(nil); - } else if ([@"concatenating.removeAt" isEqualToString:call.method]) { - [self concatenatingRemoveAt:(NSString*)args[0] index:[args[1] intValue]]; - result(nil); - } else if ([@"concatenating.removeRange" isEqualToString:call.method]) { - [self concatenatingRemoveRange:(NSString*)args[0] start:[args[1] intValue] end:[args[2] intValue]]; - result(nil); - } else if ([@"concatenating.move" isEqualToString:call.method]) { - [self concatenatingMove:(NSString*)args[0] currentIndex:[args[1] intValue] newIndex:[args[2] intValue]]; - result(nil); - } else if ([@"concatenating.clear" isEqualToString:call.method]) { - [self concatenatingClear:(NSString*)args[0]]; - result(nil); + result(@{}); + } else if ([@"concatenatingInsertAll" isEqualToString:call.method]) { + [self concatenatingInsertAll:(NSString *)request[@"id"] index:[request[@"index"] intValue] sources:(NSArray *)request[@"children"]]; + result(@{}); + } else if ([@"concatenatingRemoveRange" isEqualToString:call.method]) { + [self concatenatingRemoveRange:(NSString *)request[@"id"] start:[request[@"startIndex"] intValue] end:[request[@"endIndex"] intValue]]; + result(@{}); + } else if ([@"concatenatingMove" isEqualToString:call.method]) { + [self concatenatingMove:(NSString *)request[@"id"] currentIndex:[request[@"currentIndex"] intValue] newIndex:[request[@"newIndex"] intValue]]; + result(@{}); } else if ([@"setAndroidAudioAttributes" isEqualToString:call.method]) { - result(nil); + result(@{}); } else { result(FlutterMethodNotImplemented); } @@ -318,13 +302,13 @@ if (!_eventSink) return; _eventSink(@{ @"processingState": @(_processingState), - @"updatePosition": @(_updatePosition), + @"updatePosition": @((long long)1000 * _updatePosition), @"updateTime": @(_updateTime), // TODO: buffer position - @"bufferedPosition": @(_updatePosition), + @"bufferedPosition": @((long long)1000 * _updatePosition), // TODO: Icy Metadata @"icyMetadata": [NSNull null], - @"duration": @([self getDuration]), + @"duration": @((long long)1000 * [self getDuration]), @"currentIndex": @(_index), }); } @@ -411,17 +395,17 @@ return [[UriAudioSource alloc] initWithId:data[@"id"] uri:data[@"uri"]]; } else if ([@"concatenating" isEqualToString:type]) { return [[ConcatenatingAudioSource alloc] initWithId:data[@"id"] - audioSources:[self decodeAudioSources:data[@"audioSources"]]]; + audioSources:[self decodeAudioSources:data[@"children"]]]; } else if ([@"clipping" isEqualToString:type]) { return [[ClippingAudioSource alloc] initWithId:data[@"id"] - audioSource:[self decodeAudioSource:data[@"audioSource"]] + audioSource:[self decodeAudioSource:data[@"child"]] start:data[@"start"] end:data[@"end"]]; } else if ([@"looping" isEqualToString:type]) { NSMutableArray *childSources = [NSMutableArray new]; int count = [data[@"count"] intValue]; for (int i = 0; i < count; i++) { - [childSources addObject:[self decodeAudioSource:data[@"audioSource"]]]; + [childSources addObject:[self decodeAudioSource:data[@"child"]]]; } return [[LoopingAudioSource alloc] initWithId:data[@"id"] audioSources:childSources]; } else { @@ -583,7 +567,7 @@ } if (_player.currentItem.status == AVPlayerItemStatusReadyToPlay) { - _loadResult(@([self getDuration])); + _loadResult(@{@"duration": @((long long)1000 * [self getDuration])}); _loadResult = nil; } else { // We send result after the playerItem is ready in observeValueForKeyPath. @@ -724,7 +708,7 @@ } [self broadcastPlaybackEvent]; if (_loadResult) { - _loadResult(@([self getDuration])); + _loadResult(@{@"duration": @((long long)1000 * [self getDuration])}); _loadResult = nil; } break; @@ -911,7 +895,7 @@ if (result) { if (_playResult) { NSLog(@"INTERRUPTING PLAY"); - _playResult(nil); + _playResult(@{}); } _playResult = result; } @@ -939,7 +923,7 @@ [self broadcastPlaybackEvent]; if (_playResult) { NSLog(@"PLAY FINISHED DUE TO PAUSE"); - _playResult(nil); + _playResult(@{}); _playResult = nil; } } @@ -950,7 +934,7 @@ [self broadcastPlaybackEvent]; if (_playResult) { NSLog(@"PLAY FINISHED DUE TO COMPLETE"); - _playResult(nil); + _playResult(@{}); _playResult = nil; } } diff --git a/just_audio/darwin/Classes/ClippingAudioSource.m b/just_audio/darwin/Classes/ClippingAudioSource.m index 2f3b174..8f0cac8 100644 --- a/just_audio/darwin/Classes/ClippingAudioSource.m +++ b/just_audio/darwin/Classes/ClippingAudioSource.m @@ -14,8 +14,8 @@ self = [super initWithId:sid]; NSAssert(self, @"super init cannot be nil"); _audioSource = audioSource; - _start = start == [NSNull null] ? kCMTimeZero : CMTimeMake([start intValue], 1000); - _end = end == [NSNull null] ? kCMTimeInvalid : CMTimeMake([end intValue], 1000); + _start = start == [NSNull null] ? kCMTimeZero : CMTimeMake([start longLongValue], 1000000); + _end = end == [NSNull null] ? kCMTimeInvalid : CMTimeMake([end longLongValue], 1000000); return self; } diff --git a/just_audio/darwin/Classes/JustAudioPlugin.m b/just_audio/darwin/Classes/JustAudioPlugin.m index 982a260..d38418f 100644 --- a/just_audio/darwin/Classes/JustAudioPlugin.m +++ b/just_audio/darwin/Classes/JustAudioPlugin.m @@ -4,52 +4,34 @@ #include @implementation JustAudioPlugin { - NSObject* _registrar; - BOOL _configuredSession; + NSObject* _registrar; + BOOL _configuredSession; } + (void)registerWithRegistrar:(NSObject*)registrar { - FlutterMethodChannel* channel = [FlutterMethodChannel - methodChannelWithName:@"com.ryanheise.just_audio.methods" + FlutterMethodChannel* channel = [FlutterMethodChannel + methodChannelWithName:@"com.ryanheise.just_audio.methods" binaryMessenger:[registrar messenger]]; - JustAudioPlugin* instance = [[JustAudioPlugin alloc] initWithRegistrar:registrar]; - [registrar addMethodCallDelegate:instance channel:channel]; + JustAudioPlugin* instance = [[JustAudioPlugin alloc] initWithRegistrar:registrar]; + [registrar addMethodCallDelegate:instance channel:channel]; } - (instancetype)initWithRegistrar:(NSObject *)registrar { - self = [super init]; - NSAssert(self, @"super init cannot be nil"); - _registrar = registrar; - return self; + self = [super init]; + NSAssert(self, @"super init cannot be nil"); + _registrar = registrar; + return self; } - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { - if ([@"init" isEqualToString:call.method]) { - NSArray* args = (NSArray*)call.arguments; - NSString* playerId = args[0]; - /*AudioPlayer* player =*/ [[AudioPlayer alloc] initWithRegistrar:_registrar playerId:playerId configuredSession:_configuredSession]; - result(nil); - } else if ([@"setIosCategory" isEqualToString:call.method]) { -#if TARGET_OS_IPHONE - NSNumber* categoryIndex = (NSNumber*)call.arguments; - AVAudioSessionCategory category = nil; - switch (categoryIndex.integerValue) { - case 0: category = AVAudioSessionCategoryAmbient; break; - case 1: category = AVAudioSessionCategorySoloAmbient; break; - case 2: category = AVAudioSessionCategoryPlayback; break; - case 3: category = AVAudioSessionCategoryRecord; break; - case 4: category = AVAudioSessionCategoryPlayAndRecord; break; - case 5: category = AVAudioSessionCategoryMultiRoute; break; - } - if (category) { - _configuredSession = YES; - } - [[AVAudioSession sharedInstance] setCategory:category error:nil]; -#endif - result(nil); - } else { - result(FlutterMethodNotImplemented); - } + if ([@"init" isEqualToString:call.method]) { + NSDictionary *request = (NSDictionary *)call.arguments; + NSString *playerId = request[@"id"]; + /*AudioPlayer* player =*/ [[AudioPlayer alloc] initWithRegistrar:_registrar playerId:playerId configuredSession:_configuredSession]; + result(nil); + } else { + result(FlutterMethodNotImplemented); + } } @end