#import "OpusPlugin.h" #import "OpusBridge.h" @interface OpusPlugin () @property (nonatomic, strong) OpusBridge *opusBridge; @end @implementation OpusPlugin + (void)registerWithRegistrar:(NSObject*)registrar { FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"com.yunqiinnovation.opus" binaryMessenger:[registrar messenger]]; OpusPlugin* instance = [[OpusPlugin alloc] init]; [registrar addMethodCallDelegate:instance channel:channel]; } - (instancetype)init { self = [super init]; if (self) { _opusBridge = [[OpusBridge alloc] init]; } return self; } - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { if ([@"createEncoder" isEqualToString:call.method]) { NSDictionary *args = call.arguments; NSNumber *sampleRateValue = args[@"sampleRate"] ?: @48000; NSNumber *channelsValue = args[@"channels"] ?: @2; NSNumber *applicationValue = args[@"application"] ?: @2048; NSNumber *complexityValue = args[@"complexity"] ?: @10; NSNumber *frameSizeValue = args[@"frameSize"] ?: @960; BOOL success = [self.opusBridge createEncoderWithSampleRate:sampleRateValue.intValue channels:channelsValue.intValue application:applicationValue.intValue complexity:complexityValue.intValue frameSize:frameSizeValue.intValue]; result(@(success)); } else if ([@"createDecoder" isEqualToString:call.method]) { NSDictionary *args = call.arguments; NSNumber *sampleRateValue = args[@"sampleRate"] ?: @48000; NSNumber *channelsValue = args[@"channels"] ?: @2; BOOL success = [self.opusBridge createDecoderWithSampleRate:sampleRateValue.intValue channels:channelsValue.intValue]; result(@(success)); } else if ([@"encodeData" isEqualToString:call.method]) { NSDictionary *args = call.arguments; FlutterStandardTypedData *inputData = args[@"input"]; if (!inputData) { result([FlutterError errorWithCode:@"INVALID_INPUT" message:@"Input data is null" details:nil]); return; } NSData *pcmData = inputData.data; NSData *encodedData = [self.opusBridge encodePCMData:pcmData]; if (encodedData) { result([FlutterStandardTypedData typedDataWithBytes:encodedData]); } else { result([FlutterError errorWithCode:@"ENCODE_FAIL" message:@"Failed to encode data" details:nil]); } } else if ([@"decodeData" isEqualToString:call.method]) { NSDictionary *args = call.arguments; FlutterStandardTypedData *inputData = args[@"input"]; NSNumber *frameSizeValue = args[@"frameSize"] ?: @960; if (!inputData) { result([FlutterError errorWithCode:@"INVALID_INPUT" message:@"Input data is null" details:nil]); return; } NSData *opusData = inputData.data; NSData *pcmData = [self.opusBridge decodeOpusData:opusData frameSize:frameSizeValue.intValue]; if (pcmData) { result([FlutterStandardTypedData typedDataWithBytes:pcmData]); } else { result([FlutterError errorWithCode:@"DECODE_FAIL" message:@"Failed to decode data" details:nil]); } } else if ([@"disposeEncoder" isEqualToString:call.method]) { [self.opusBridge disposeEncoder]; result(nil); } else if ([@"disposeDecoder" isEqualToString:call.method]) { [self.opusBridge disposeDecoder]; result(nil); } else { result(FlutterMethodNotImplemented); } } @end