No Description

RCTAgora.m 97KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154
  1. //
  2. // RCTAgora.m
  3. // RCTAgora
  4. //
  5. // Created by 邓博 on 2017/6/13.
  6. // Copyright © 2017年 Syan. All rights reserved.
  7. //
  8. #import "RCTAgora.h"
  9. #import <React/RCTEventDispatcher.h>
  10. #import <React/RCTBridge.h>
  11. #import <React/RCTUIManager.h>
  12. #import <React/RCTView.h>
  13. #import "AgoraConst.h"
  14. @interface RCTAgora ()
  15. @property (strong, nonatomic) AgoraRtcEngineKit *rtcEngine;
  16. @end
  17. @implementation RCTAgora {
  18. RCTResponseSenderBlock _block;
  19. bool hasListeners;
  20. }
  21. +(BOOL)requiresMainQueueSetup {
  22. return YES;
  23. }
  24. RCT_EXPORT_MODULE();
  25. - (NSError *) makeNSError:(NSDictionary *)options {
  26. NSError *error = [NSError errorWithDomain:RCTAgoraErrorDomain
  27. code:[options[@"code"] integerValue]
  28. userInfo:options[@"message"]];
  29. return error;
  30. }
  31. - (AgoraImage *) makeAgoraImage:(NSDictionary *)options {
  32. AgoraImage *img = [AgoraImage new];
  33. img.url = [NSURL URLWithString:[options[@"url"] stringValue]];
  34. img.rect = CGRectMake((CGFloat)[options[@"x"] floatValue],
  35. (CGFloat)[options[@"y"] floatValue],
  36. (CGFloat)[options[@"width"] floatValue],
  37. (CGFloat)[options[@"height"] floatValue]);
  38. return img;
  39. }
  40. - (NSDictionary *)constantsToExport {
  41. return @{
  42. @"FPS1": @(AgoraVideoFrameRateFps1),
  43. @"FPS7": @(AgoraVideoFrameRateFps7),
  44. @"FPS10": @(AgoraVideoFrameRateFps10),
  45. @"FPS15": @(AgoraVideoFrameRateFps15),
  46. @"FPS24": @(AgoraVideoFrameRateFps24),
  47. @"FPS30": @(AgoraVideoFrameRateFps30),
  48. @"FPS60": @(AgoraVideoFrameRateFps60),
  49. @"Adaptative": @(AgoraVideoOutputOrientationModeAdaptative),
  50. @"FixedLandscape": @(AgoraVideoOutputOrientationModeFixedLandscape),
  51. @"FixedPortrait": @(AgoraVideoOutputOrientationModeFixedPortrait),
  52. @"Host": @(AgoraClientRoleBroadcaster),
  53. @"Audience": @(AgoraClientRoleAudience),
  54. @"UserOfflineReasonQuit": @(AgoraUserOfflineReasonQuit),
  55. @"UserOfflineReasonDropped": @(AgoraUserOfflineReasonDropped),
  56. @"UserOfflineReasonBecomeAudience": @(AgoraUserOfflineReasonBecomeAudience),
  57. @"CodecTypeBaseLine": @(AgoraVideoCodecProfileTypeBaseLine),
  58. @"CodecTypeMain": @(AgoraVideoCodecProfileTypeMain),
  59. @"CodecTypeHigh": @(AgoraVideoCodecProfileTypeHigh),
  60. @"AudioSampleRateType32000": @(AgoraAudioSampleRateType32000),
  61. @"AudioSampleRateType44100": @(AgoraAudioSampleRateType44100),
  62. @"AudioSampleRateType48000": @(AgoraAudioSampleRateType48000),
  63. @"QualityLow": @(AgoraAudioRecordingQualityLow),
  64. @"QualityMedium": @(AgoraAudioRecordingQualityMedium),
  65. @"QualityHigh": @(AgoraAudioRecordingQualityHigh),
  66. @"Disconnected": @(AgoraConnectionStateDisconnected),
  67. @"Connecting": @(AgoraConnectionStateConnecting),
  68. @"Connected": @(AgoraConnectionStateConnected),
  69. @"Reconnecting": @(AgoraConnectionStateReconnecting),
  70. @"ConnectionFailed": @(AgoraConnectionStateFailed),
  71. @"ConnectionChangedConnecting": @(AgoraConnectionChangedConnecting),
  72. @"ConnectionChangedJoinSuccess": @(AgoraConnectionChangedJoinSuccess),
  73. @"ConnectionChangedInterrupted": @(AgoraConnectionChangedInterrupted),
  74. @"ConnectionChangedBannedByServer": @(AgoraConnectionChangedBannedByServer),
  75. @"ConnectionChangedJoinFailed": @(AgoraConnectionChangedJoinFailed),
  76. @"ConnectionChangedLeaveChannel": @(AgoraConnectionChangedLeaveChannel),
  77. @"AudioOutputRoutingDefault": @(AgoraAudioOutputRoutingDefault),
  78. @"AudioOutputRoutingHeadset": @(AgoraAudioOutputRoutingHeadset),
  79. @"AudioOutputRoutingEarpiece": @(AgoraAudioOutputRoutingEarpiece),
  80. @"AudioOutputRoutingHeadsetNoMic": @(AgoraAudioOutputRoutingHeadsetNoMic),
  81. @"AudioOutputRoutingSpeakerphone": @(AgoraAudioOutputRoutingSpeakerphone),
  82. @"AudioOutputRoutingLoudspeaker": @(AgoraAudioOutputRoutingLoudspeaker),
  83. @"AudioOutputRoutingHeadsetBluetooth": @(AgoraAudioOutputRoutingHeadsetBluetooth),
  84. @"NetworkQualityUnknown": @(AgoraNetworkQualityUnknown),
  85. @"NetworkQualityExcellent": @(AgoraNetworkQualityExcellent),
  86. @"NetworkQualityGood": @(AgoraNetworkQualityGood),
  87. @"NetworkQualityPoor": @(AgoraNetworkQualityPoor),
  88. @"NetworkQualityBad": @(AgoraNetworkQualityBad),
  89. @"NetworkQualityVBad": @(AgoraNetworkQualityVBad),
  90. @"NetworkQualityDown": @(AgoraNetworkQualityDown),
  91. @"ErrorCodeNoError": @(AgoraErrorCodeNoError),
  92. @"ErrorCodeFailed": @(AgoraErrorCodeFailed),
  93. @"ErrorCodeInvalidArgument": @(AgoraErrorCodeInvalidArgument),
  94. @"ErrorCodeTimedOut": @(AgoraErrorCodeTimedOut),
  95. @"ErrorCodeAlreadyInUse": @(AgoraErrorCodeAlreadyInUse),
  96. @"ErrorCodeAbort": @(AgoraErrorCodeAbort),
  97. @"ErrorCodeResourceLimited": @(AgoraErrorCodeResourceLimited),
  98. @"AudioProfileDefault": @(AgoraAudioProfileDefault),
  99. @"AudioProfileSpeechStandard": @(AgoraAudioProfileSpeechStandard),
  100. @"AudioProfileMusicStandard": @(AgoraAudioProfileMusicStandard),
  101. @"AudioProfileMusicStandardStereo": @(AgoraAudioProfileMusicStandardStereo),
  102. @"AudioProfileMusicHighQuality": @(AgoraAudioProfileMusicHighQuality),
  103. @"AudioProfileMusicHighQualityStereo": @(AgoraAudioProfileMusicHighQualityStereo),
  104. @"AudioScenarioDefault": @(AgoraAudioScenarioDefault),
  105. @"AudioScenarioChatRoomEntertainment": @(AgoraAudioScenarioChatRoomEntertainment),
  106. @"AudioScenarioEducation": @(AgoraAudioScenarioEducation),
  107. @"AudioScenarioGameStreaming": @(AgoraAudioScenarioGameStreaming),
  108. @"AudioScenarioShowRoom": @(AgoraAudioScenarioShowRoom),
  109. @"AudioScenarioChatRoomGaming": @(AgoraAudioScenarioChatRoomGaming),
  110. @"AudioEqualizationBand31": @(AgoraAudioEqualizationBand31),
  111. @"AudioEqualizationBand62": @(AgoraAudioEqualizationBand62),
  112. @"AudioEqualizationBand125": @(AgoraAudioEqualizationBand125),
  113. @"AudioEqualizationBand250": @(AgoraAudioEqualizationBand250),
  114. @"AudioEqualizationBand500": @(AgoraAudioEqualizationBand500),
  115. @"AudioEqualizationBand1K": @(AgoraAudioEqualizationBand1K),
  116. @"AudioEqualizationBand2K": @(AgoraAudioEqualizationBand2K),
  117. @"AudioEqualizationBand4K": @(AgoraAudioEqualizationBand4K),
  118. @"AudioEqualizationBand8K": @(AgoraAudioEqualizationBand8K),
  119. @"AudioEqualizationBand16K": @(AgoraAudioEqualizationBand16K),
  120. @"AudioRawFrameOperationModeReadOnly": @(AgoraAudioRawFrameOperationModeReadOnly),
  121. @"AudioRawFrameOperationModeWriteOnly": @(AgoraAudioRawFrameOperationModeWriteOnly),
  122. @"AudioRawFrameOperationModeReadWrite": @(AgoraAudioRawFrameOperationModeReadWrite),
  123. @"VideoStreamTypeHigh": @(AgoraVideoStreamTypeHigh),
  124. @"VideoStreamTypeLow": @(AgoraVideoStreamTypeLow),
  125. @"AgoraVideoMirrorModeAuto": @(AgoraVideoMirrorModeAuto),
  126. @"AgoraVideoMirrorModeEnabled": @(AgoraVideoMirrorModeEnabled),
  127. @"AgoraVideoMirrorModeDisabled": @(AgoraVideoMirrorModeDisabled),
  128. @"AgoraChannelProfileCommunication": @(AgoraChannelProfileCommunication),
  129. @"AgoraChannelProfileLiveBroadcasting": @(AgoraChannelProfileLiveBroadcasting),
  130. @"AgoraChannelProfileGame": @(AgoraChannelProfileGame)
  131. };
  132. }
  133. // init
  134. RCT_EXPORT_METHOD(init:(NSDictionary *)options) {
  135. [self startObserving];
  136. NSLog(@"startObserving events");
  137. [AgoraConst share].appid = options[@"appid"];
  138. self.rtcEngine = [AgoraRtcEngineKit sharedEngineWithAppId:options[@"appid"] delegate:self];
  139. [AgoraConst share].rtcEngine = self.rtcEngine;
  140. //channel mode
  141. [self.rtcEngine setChannelProfile:[options[@"channelProfile"] integerValue]];
  142. //enable dual stream
  143. [self.rtcEngine enableDualStreamMode:YES];
  144. [self.rtcEngine enableVideo];
  145. if (options[@"secret"] != nil) {
  146. [self.rtcEngine setEncryptionSecret:[options[@"secret"] stringValue]];
  147. if (options[@"secretMode"] != nil) {
  148. [self.rtcEngine setEncryptionMode:[options[@"secretMode"] stringValue]];
  149. }
  150. }
  151. AgoraVideoEncoderConfiguration *video_encoder_config = [[AgoraVideoEncoderConfiguration new] initWithWidth:[options[@"videoEncoderConfig"][@"width"] integerValue] height:[options[@"videoEncoderConfig"][@"height"] integerValue] frameRate:(AgoraVideoFrameRate)[options[@"videoEncoderConfig"][@"frameRate"] integerValue] bitrate:[options[@"videoEncoderConfig"][@"bitrate"] integerValue] orientationMode: (AgoraVideoOutputOrientationMode)[options[@"videoEncoderConfig"][@"orientationMode"] integerValue]];
  152. [self.rtcEngine setVideoEncoderConfiguration:video_encoder_config];
  153. [self.rtcEngine setClientRole:(AgoraClientRole)[options[@"clientRole"] integerValue]];
  154. [self.rtcEngine setAudioProfile:(AgoraAudioProfile)[options[@"audioProfile"] integerValue]
  155. scenario:(AgoraAudioScenario)[options[@"audioScenario"] integerValue]];
  156. //Enable Agora Native SDK be Interoperable with Agora Web SDK
  157. [self.rtcEngine enableWebSdkInteroperability:YES];
  158. }
  159. // renew token
  160. RCT_EXPORT_METHOD(renewToken
  161. :(NSString *)token
  162. resolve:(RCTPromiseResolveBlock)resolve
  163. reject:(RCTPromiseRejectBlock)reject) {
  164. NSInteger res = [self.rtcEngine renewToken:token];
  165. if (res == 0) {
  166. resolve(@{@"success": @(YES)});
  167. } else {
  168. reject(@"131002", @"renew token failed", [self makeNSError:@{
  169. @"code": @(131002),
  170. @"message":@{
  171. @"success": @(NO),
  172. @"value":[NSNumber numberWithInteger:res]
  173. }
  174. }]);
  175. }
  176. }
  177. // enable websdk interoperability
  178. RCT_EXPORT_METHOD(enableWebSdkInteroperability: (BOOL)enabled
  179. resolve:(RCTPromiseResolveBlock)resolve
  180. reject:(RCTPromiseRejectBlock)reject) {
  181. NSInteger res = [self.rtcEngine enableWebSdkInteroperability:enabled];
  182. if (res == 0) {
  183. resolve(@{@"success": @(YES)});
  184. } else {
  185. reject(@"131003", @"renew token failed", [self makeNSError:@{
  186. @"code": @(131003),
  187. @"message":@{
  188. @"success": @(NO),
  189. @"value":[NSNumber numberWithInteger:res]
  190. }
  191. }]);
  192. }
  193. }
  194. // get agora connection state
  195. RCT_EXPORT_METHOD(getConnectionState
  196. :(RCTPromiseResolveBlock) resolve
  197. reject:(RCTPromiseRejectBlock) reject) {
  198. resolve(@{@"success": @(YES), @"state": @([self.rtcEngine getConnectionState])});
  199. }
  200. // set client role
  201. RCT_EXPORT_METHOD(setClientRole:(NSInteger) role) {
  202. [self.rtcEngine setClientRole:(AgoraClientRole)role];
  203. }
  204. // join channel
  205. RCT_EXPORT_METHOD(joinChannel:(NSDictionary *) options) {
  206. [AgoraConst share].localUid = [options[@"uid"] integerValue];
  207. [self.rtcEngine joinChannelByToken:options[@"token"] channelId:options[@"channelName"] info:options[@"info"] uid:[AgoraConst share].localUid joinSuccess:nil];
  208. }
  209. // leave channel
  210. RCT_EXPORT_METHOD(leaveChannel
  211. :(RCTPromiseResolveBlock) resolve
  212. reject:(RCTPromiseRejectBlock) reject) {
  213. int res = [self.rtcEngine leaveChannel:^(AgoraChannelStats * _Nonnull stat) {
  214. [self sendEvent:AGLeaveChannel params:@{
  215. @"message": @"leaveChannel",
  216. @"duration": @(stat.duration),
  217. @"txBytes": @(stat.txBytes),
  218. @"rxBytes": @(stat.rxBytes),
  219. @"txAudioKBitrate": @(stat.txAudioKBitrate),
  220. @"rxAudioKBitrate": @(stat.rxAudioKBitrate),
  221. @"txVideoKBitrate": @(stat.txVideoKBitrate),
  222. @"rxVideoKBitrate": @(stat.rxVideoKBitrate),
  223. @"lastmileDelay": @(stat.lastmileDelay),
  224. @"userCount": @(stat.userCount),
  225. @"cpuAppUsage": @(stat.cpuAppUsage),
  226. @"cpuTotalUsage": @(stat.cpuTotalUsage)
  227. }];
  228. }];
  229. if (res != 0) {
  230. reject(@"131038", @"leaveChannel failed", [self makeNSError:@{
  231. @"code": @(131038),
  232. @"message":@{
  233. @"success": @(NO),
  234. @"value":[NSNumber numberWithInteger:res]
  235. }
  236. }]);
  237. } else {
  238. resolve(@{
  239. @"success": @(YES),
  240. @"value": @(res)
  241. });
  242. }
  243. }
  244. // destroy
  245. RCT_EXPORT_METHOD(destroy) {
  246. [self stopObserving];
  247. [AgoraRtcEngineKit destroy];
  248. }
  249. // set local video canvas
  250. RCT_EXPORT_METHOD(setupLocalVideo:(NSDictionary *)options){
  251. AgoraRtcVideoCanvas *canvas = [AgoraRtcVideoCanvas new];
  252. canvas.uid = [AgoraConst share].localUid;
  253. canvas.view = [self.bridge.uiManager viewForReactTag:options[@"reactTag"]];
  254. canvas.renderMode = [options[@"renderMode"] integerValue];
  255. [self.rtcEngine setupLocalVideo:canvas];
  256. }
  257. // set remote video canvas
  258. RCT_EXPORT_METHOD(setupRemoteVideo:(NSDictionary *) options) {
  259. AgoraRtcVideoCanvas *canvas = [AgoraRtcVideoCanvas new];
  260. canvas.uid = [options[@"uid"] integerValue];
  261. canvas.view = [self.bridge.uiManager viewForReactTag:options[@"reactTag"]];
  262. canvas.renderMode = [options[@"renderMode"] integerValue];
  263. [self.rtcEngine setupRemoteVideo:canvas];
  264. }
  265. // set local video render mode
  266. RCT_EXPORT_METHOD(setLocalRenderMode:(NSInteger) mode) {
  267. [self.rtcEngine setLocalRenderMode:mode];
  268. }
  269. // set remote video render mode
  270. RCT_EXPORT_METHOD(setRemoteRenderMode:(NSInteger) uid
  271. mode:(NSInteger) mode) {
  272. [self.rtcEngine setRemoteRenderMode:uid mode:mode];
  273. }
  274. // start video preview
  275. RCT_EXPORT_METHOD(startPreview) {
  276. [self.rtcEngine startPreview];
  277. }
  278. // stop video preview
  279. RCT_EXPORT_METHOD(stopPreview){
  280. [self.rtcEngine stopPreview];
  281. }
  282. /* enable speaker phone
  283. * @params enableSpeaker: BOOL
  284. YES: Audio output to speaker
  285. No: Audio output to the handset
  286. */
  287. RCT_EXPORT_METHOD(setEnableSpeakerphone:(BOOL)enableSpeaker){
  288. [self.rtcEngine setEnableSpeakerphone: enableSpeaker];
  289. }
  290. /* set default audio speaker
  291. * @params defaultToSpeaker: BOOL
  292. YES: Audio output to speaker
  293. No: Audio output to the handset
  294. */
  295. RCT_EXPORT_METHOD(setDefaultAudioRouteToSpeakerphone:(BOOL)defaultToSpeaker){
  296. [self.rtcEngine setDefaultAudioRouteToSpeakerphone:defaultToSpeaker];
  297. }
  298. RCT_EXPORT_METHOD(setDefaultMuteAllRemoteAudioStreams:(BOOL)defaultToSpeaker){
  299. [self.rtcEngine setDefaultMuteAllRemoteAudioStreams:defaultToSpeaker];
  300. }
  301. // enable video
  302. RCT_EXPORT_METHOD(enableVideo) {
  303. [self.rtcEngine enableVideo];
  304. }
  305. // disable Video
  306. RCT_EXPORT_METHOD(disableVideo) {
  307. [self.rtcEngine disableVideo];
  308. }
  309. // enable local video
  310. RCT_EXPORT_METHOD(enableLocalVideo:(BOOL)enabled){
  311. [self.rtcEngine enableLocalVideo:enabled];
  312. }
  313. // mute local video stream
  314. RCT_EXPORT_METHOD(muteLocalVideoStream:(BOOL)muted) {
  315. [self.rtcEngine muteLocalVideoStream:muted];
  316. }
  317. // mute all remote video streams
  318. RCT_EXPORT_METHOD(muteAllRemoteVideoStreams:(BOOL)muted){
  319. [self.rtcEngine muteAllRemoteVideoStreams:muted];
  320. }
  321. // mute video stream by uid
  322. RCT_EXPORT_METHOD(muteRemoteVideoStream:(NSUInteger)uid mute:(BOOL)mute){
  323. [self.rtcEngine muteRemoteVideoStream:uid mute:mute];
  324. }
  325. RCT_EXPORT_METHOD(setDefaultMuteAllRemoteVideoStreams:(BOOL)mute) {
  326. [self.rtcEngine setDefaultMuteAllRemoteVideoStreams:mute];
  327. }
  328. // enable audio
  329. RCT_EXPORT_METHOD(enableAudio) {
  330. [self.rtcEngine enableAudio];
  331. }
  332. // disable audio
  333. RCT_EXPORT_METHOD(disableAudio) {
  334. [self.rtcEngine disableAudio];
  335. }
  336. // enable local audio
  337. RCT_EXPORT_METHOD(enableLocalAudio:(BOOL)enabled){
  338. [self.rtcEngine enableLocalAudio:enabled];
  339. }
  340. // mute local audio stream
  341. RCT_EXPORT_METHOD(muteLocalAudioStream:(BOOL)mute){
  342. [self.rtcEngine muteLocalAudioStream:mute];
  343. }
  344. // mute all remote audio stream
  345. RCT_EXPORT_METHOD(muteAllRemoteAudioStreams:(BOOL)mute){
  346. [self.rtcEngine muteAllRemoteAudioStreams:mute];
  347. }
  348. // mute one remote audio stream by uid
  349. RCT_EXPORT_METHOD(muteRemoteAudioStream:(NSUInteger)uid muted:(BOOL)mute){
  350. [self.rtcEngine muteRemoteAudioStream:uid mute:mute];
  351. }
  352. // adjust recorcding signal volume
  353. RCT_EXPORT_METHOD(adjustRecordingSignalVolume: (NSInteger) volume){
  354. [self.rtcEngine adjustRecordingSignalVolume:volume];
  355. }
  356. // adjust playback signal volume
  357. RCT_EXPORT_METHOD(adjustPlaybackSignalVolume: (NSInteger) volume) {
  358. [self.rtcEngine adjustPlaybackSignalVolume:volume];
  359. }
  360. // enable audio volume indication
  361. RCT_EXPORT_METHOD(enableAudioVolumeIndication: (NSInteger) interval smooth:(NSInteger)smooth) {
  362. [self.rtcEngine enableAudioVolumeIndication:interval smooth:smooth];
  363. }
  364. // create data stream
  365. RCT_EXPORT_METHOD(createDataStream
  366. :(NSDictionary *)options
  367. resolve:(RCTPromiseResolveBlock)resolve
  368. reject:(RCTPromiseRejectBlock)reject) {
  369. NSInteger streamId = 0;
  370. if (options[@"streamId"] != nil) {
  371. streamId = [options[@"streamId"] integerValue];
  372. }
  373. [self.rtcEngine createDataStream:streamId reliable:[options[@"reliable"] boolValue] ordered:[options[@"ordered"] boolValue]];
  374. resolve(@[[NSNumber numberWithInteger:streamId]]);
  375. }
  376. // is speaker phone enabled
  377. RCT_EXPORT_METHOD(methodisSpeakerphoneEnabled:(RCTResponseSenderBlock)callback) {
  378. callback(@[@{@"status": @([self.rtcEngine isSpeakerphoneEnabled])}]);
  379. }
  380. // enable in ear monitoring
  381. RCT_EXPORT_METHOD(enableInEarMonitoring:(BOOL)enabled) {
  382. [self.rtcEngine enableInEarMonitoring:enabled];
  383. }
  384. // set in ear monitoring
  385. RCT_EXPORT_METHOD(setInEarMonitoringVolume:(NSInteger) volume) {
  386. [self.rtcEngine setInEarMonitoringVolume:volume];
  387. }
  388. // set local voice pitch
  389. RCT_EXPORT_METHOD(setLocalVoicePitch:(double) pitch) {
  390. [self.rtcEngine setLocalVoicePitch:pitch];
  391. }
  392. // set local video equalization of band frequency
  393. RCT_EXPORT_METHOD(setLocalVoiceEqualization:(NSInteger)band gain:(NSInteger)gain) {
  394. AgoraAudioEqualizationBandFrequency bandType = AgoraAudioEqualizationBand31;
  395. switch (band) {
  396. case AgoraAudioEqualizationBand31:
  397. bandType = AgoraAudioEqualizationBand31;
  398. break;
  399. case AgoraAudioEqualizationBand62:
  400. bandType = AgoraAudioEqualizationBand62;
  401. break;
  402. case AgoraAudioEqualizationBand125:
  403. bandType = AgoraAudioEqualizationBand125;
  404. break;
  405. case AgoraAudioEqualizationBand250:
  406. bandType = AgoraAudioEqualizationBand250;
  407. break;
  408. case AgoraAudioEqualizationBand500:
  409. bandType = AgoraAudioEqualizationBand500;
  410. break;
  411. case AgoraAudioEqualizationBand1K:
  412. bandType = AgoraAudioEqualizationBand1K;
  413. break;
  414. case AgoraAudioEqualizationBand2K:
  415. bandType = AgoraAudioEqualizationBand2K;
  416. break;
  417. case AgoraAudioEqualizationBand4K:
  418. bandType = AgoraAudioEqualizationBand4K;
  419. break;
  420. case AgoraAudioEqualizationBand8K:
  421. bandType = AgoraAudioEqualizationBand8K;
  422. break;
  423. case AgoraAudioEqualizationBand16K:
  424. bandType = AgoraAudioEqualizationBand16K;
  425. break;
  426. }
  427. [self.rtcEngine setLocalVoiceEqualizationOfBandFrequency:bandType withGain:gain];
  428. }
  429. // set local voice reverb of type
  430. RCT_EXPORT_METHOD(setLocalVoiceReverb:(NSInteger)reverb value:(NSInteger)value) {
  431. AgoraAudioReverbType reverbType = AgoraAudioReverbDryLevel;
  432. switch (reverb) {
  433. case AgoraAudioReverbDryLevel:
  434. reverbType = AgoraAudioReverbDryLevel;
  435. break;
  436. case AgoraAudioReverbWetLevel:
  437. reverbType = AgoraAudioReverbWetLevel;
  438. break;
  439. case AgoraAudioReverbRoomSize:
  440. reverbType = AgoraAudioReverbRoomSize;
  441. break;
  442. case AgoraAudioReverbWetDelay:
  443. reverbType = AgoraAudioReverbWetDelay;
  444. break;
  445. case AgoraAudioReverbStrength:
  446. reverbType = AgoraAudioReverbStrength;
  447. break;
  448. }
  449. [self.rtcEngine setLocalVoiceReverbOfType:reverb withValue:value];
  450. }
  451. // start audio mixing
  452. RCT_EXPORT_METHOD(startAudioMixing:(NSDictionary *) options) {
  453. [self.rtcEngine startAudioMixing:[options[@"filepath"] stringValue]
  454. loopback:[options[@"loopback"] boolValue]
  455. replace:[options[@"replace"] boolValue]
  456. cycle:[options[@"cycle"] integerValue]];
  457. }
  458. // stop audio mixing
  459. RCT_EXPORT_METHOD(stopAudioMixing) {
  460. [self.rtcEngine stopAudioMixing];
  461. }
  462. // pause audio mixing
  463. RCT_EXPORT_METHOD(pauseAudioMixing) {
  464. [self.rtcEngine pauseAudioMixing];
  465. }
  466. // resume audio mixing
  467. RCT_EXPORT_METHOD(resumeAudioMixing) {
  468. [self.rtcEngine resumeAudioMixing];
  469. }
  470. // adjust audio mixing volume
  471. RCT_EXPORT_METHOD(adjustAudioMixingVolume:(NSInteger) volume) {
  472. [self.rtcEngine adjustAudioMixingVolume:volume];
  473. }
  474. // adjust audio mixing playout volume
  475. RCT_EXPORT_METHOD(adjustAudioMixingPlayoutVolume:(NSInteger) volume) {
  476. [self.rtcEngine adjustAudioMixingPlayoutVolume:volume];
  477. }
  478. // adjust audio mixing publish volume
  479. RCT_EXPORT_METHOD(adjustAudioMixingPublishVolume:(NSInteger) volume) {
  480. [self.rtcEngine adjustAudioMixingPublishVolume:volume];
  481. }
  482. // get audio mixing duration
  483. RCT_EXPORT_METHOD(getAudioMixingDuration
  484. : (RCTPromiseResolveBlock)resolve
  485. reject:(RCTPromiseRejectBlock)reject) {
  486. NSInteger res = [self.rtcEngine getAudioMixingDuration];
  487. if (res != 0) {
  488. reject(@"131004", @"getAudioMixingDuration failed", [self makeNSError:@{
  489. @"code": @(131004),
  490. @"message":@{
  491. @"success": @(NO),
  492. @"value":[NSNumber numberWithInteger:res]
  493. }
  494. }]);
  495. } else {
  496. resolve(@{
  497. @"success": @(YES),
  498. @"value": @(res)
  499. });
  500. }
  501. }
  502. // get audio mixing current position
  503. RCT_EXPORT_METHOD(getAudioMixingCurrentPosition
  504. :(RCTPromiseResolveBlock)resolve
  505. reject:(RCTPromiseRejectBlock)reject) {
  506. NSInteger res = [self.rtcEngine getAudioMixingDuration];
  507. if (res != 0) {
  508. reject(@"131005", @"getAudioMixingCurrentPosition failed", [self makeNSError:@{
  509. @"code": @(131005),
  510. @"message":@{
  511. @"success": @(NO),
  512. @"value":[NSNumber numberWithInteger:res]
  513. }
  514. }]);
  515. } else {
  516. resolve(@{
  517. @"success": @(YES),
  518. @"value": @(res)
  519. });
  520. }
  521. }
  522. // set audio mixing position
  523. RCT_EXPORT_METHOD(setAudioMixingPosition
  524. :(NSInteger) pos
  525. resolve:(RCTPromiseResolveBlock)resolve
  526. reject:(RCTPromiseRejectBlock)reject) {
  527. NSInteger res = [self.rtcEngine setAudioMixingPosition:pos];
  528. if (res != 0) {
  529. reject(@"131006", @"setAudioMixingPosition failed", [self makeNSError:@{
  530. @"code": @(131006),
  531. @"message":@{
  532. @"success": @(NO),
  533. @"value":[NSNumber numberWithInteger:res]
  534. }
  535. }]);
  536. } else {
  537. resolve(@{
  538. @"success": @(YES)
  539. });
  540. }
  541. }
  542. // get effects volume
  543. RCT_EXPORT_METHOD(getEffectsVolume
  544. :(RCTPromiseResolveBlock)resolve
  545. reject:(RCTPromiseRejectBlock)reject) {
  546. double res = [self.rtcEngine getEffectsVolume];
  547. if (res != 0) {
  548. reject(@"131007", @"getEffectsVolume failed", [self makeNSError:@{
  549. @"code": @(131007),
  550. @"message":@{
  551. @"success": @(NO),
  552. @"value":@(res)
  553. }
  554. }]);
  555. } else {
  556. resolve(@{
  557. @"success": @(YES),
  558. @"value": @(res)
  559. });
  560. }
  561. }
  562. // set effects volume
  563. RCT_EXPORT_METHOD(setEffectsVolume
  564. :(double) volume
  565. resolve:(RCTPromiseResolveBlock)resolve
  566. reject:(RCTPromiseRejectBlock)reject) {
  567. NSInteger res = [self.rtcEngine setEffectsVolume:volume];
  568. if (res != 0) {
  569. reject(@"131008", @"setEffectsVolume failed", [self makeNSError:@{
  570. @"code": @(131008),
  571. @"message":@{
  572. @"success": @(NO),
  573. @"value":@(res)
  574. }
  575. }]);
  576. } else {
  577. resolve(@{
  578. @"success": @(YES),
  579. @"value": @(res)
  580. });
  581. }
  582. }
  583. // set volume of effect
  584. RCT_EXPORT_METHOD(setVolumeOfEffect
  585. :(NSInteger) soundId
  586. volume:(double)volume
  587. resolve:(RCTPromiseResolveBlock)resolve
  588. reject:(RCTPromiseRejectBlock)reject) {
  589. NSInteger res = [self.rtcEngine setVolumeOfEffect:soundId withVolume:volume];
  590. if (res != 0) {
  591. reject(@"131009", @"setVolumeOfEffect failed", [self makeNSError:@{
  592. @"code": @(131009),
  593. @"message":@{
  594. @"success": @(NO),
  595. @"value":@(res)
  596. }
  597. }]);
  598. } else {
  599. resolve(@{
  600. @"success": @(YES),
  601. @"value": @(res)
  602. });
  603. }
  604. }
  605. // play effect
  606. RCT_EXPORT_METHOD(playEffect
  607. :(NSDictionary *)options
  608. resolve:(RCTPromiseResolveBlock)resolve
  609. reject:(RCTPromiseRejectBlock)reject) {
  610. NSInteger res = [self.rtcEngine playEffect:(int)[options[@"soundId"] integerValue]
  611. filePath:[options[@"filePath"] stringValue]
  612. loopCount:(int)[options[@"loopCount"] integerValue]
  613. pitch:[options[@"pitch"] doubleValue]
  614. pan:[options[@"pan"] doubleValue]
  615. gain:[options[@"gain"] doubleValue]
  616. publish:[options[@"publish"] boolValue]];
  617. if (res != 0) {
  618. reject(@"131010", @"playEffect failed", [self makeNSError:@{
  619. @"code": @(131010),
  620. @"message":@{
  621. @"success": @(NO),
  622. @"value":@(res)
  623. }
  624. }]);
  625. } else {
  626. resolve(@{
  627. @"success": @(YES),
  628. @"value": @(res)
  629. });
  630. }
  631. }
  632. // stop effect by soundId
  633. RCT_EXPORT_METHOD(stopEffect
  634. :(NSInteger) soundId
  635. resolve:(RCTPromiseResolveBlock)resolve
  636. reject:(RCTPromiseRejectBlock)reject) {
  637. NSInteger res = [self.rtcEngine stopEffect:(int)soundId];
  638. if (res != 0) {
  639. reject(@"131011", @"stopEffect failed", [self makeNSError:@{
  640. @"code": @(131011),
  641. @"message":@{
  642. @"success": @(NO),
  643. @"value":@(res)
  644. }
  645. }]);
  646. } else {
  647. resolve(@{
  648. @"success": @(YES),
  649. @"value": @(res)
  650. });
  651. }
  652. }
  653. // stopAllEffects
  654. RCT_EXPORT_METHOD(stopAllEffects
  655. :(RCTPromiseResolveBlock)resolve
  656. reject:(RCTPromiseRejectBlock)reject) {
  657. NSInteger res = [self.rtcEngine stopAllEffects];
  658. if (res != 0) {
  659. reject(@"131012", @"stopAllEffects failed", [self makeNSError:@{
  660. @"code": @(131012),
  661. @"message":@{
  662. @"success": @(NO),
  663. @"value":@(res)
  664. }
  665. }]);
  666. } else {
  667. resolve(@{
  668. @"success": @(YES),
  669. @"value": @(res)
  670. });
  671. }
  672. }
  673. // preloadEffect
  674. RCT_EXPORT_METHOD(preloadEffect
  675. :(NSInteger) soundId
  676. filePath:(NSString *)filePath
  677. resolve:(RCTPromiseResolveBlock)resolve
  678. reject:(RCTPromiseRejectBlock)reject) {
  679. NSInteger res = [self.rtcEngine preloadEffect:(int)soundId filePath:filePath];
  680. if (res != 0) {
  681. reject(@"131013", @"preloadEffect failed", [self makeNSError:@{
  682. @"code": @(131013),
  683. @"message":@{
  684. @"success": @(NO),
  685. @"value":@(res)
  686. }
  687. }]);
  688. } else {
  689. resolve(@{
  690. @"success": @(YES),
  691. @"value": @(res)
  692. });
  693. }
  694. }
  695. // unload effect
  696. RCT_EXPORT_METHOD(unloadEffect
  697. :(NSInteger) soundId
  698. resolve:(RCTPromiseResolveBlock)resolve
  699. reject:(RCTPromiseRejectBlock)reject) {
  700. NSInteger res = [self.rtcEngine unloadEffect:(int)soundId];
  701. if (res != 0) {
  702. reject(@"131014", @"unloadEffect failed", [self makeNSError:@{
  703. @"code": @(131014),
  704. @"message":@{
  705. @"success": @(NO),
  706. @"value":@(res)
  707. }
  708. }]);
  709. } else {
  710. resolve(@{
  711. @"success": @(YES),
  712. @"value": @(res)
  713. });
  714. }
  715. }
  716. // pause effect by id
  717. RCT_EXPORT_METHOD(pauseEffect
  718. :(NSInteger) soundId
  719. resolve:(RCTPromiseResolveBlock)resolve
  720. reject:(RCTPromiseRejectBlock)reject) {
  721. NSInteger res = [self.rtcEngine pauseEffect:(int)soundId];
  722. if (res != 0) {
  723. reject(@"131014", @"pauseEffect failed", [self makeNSError:@{
  724. @"code": @(131014),
  725. @"message":@{
  726. @"success": @(NO),
  727. @"value":@(res)
  728. }
  729. }]);
  730. } else {
  731. resolve(@{
  732. @"success": @(YES),
  733. @"value": @(res)
  734. });
  735. }
  736. }
  737. // pause all effects
  738. RCT_EXPORT_METHOD(pauseAllEffects
  739. :(RCTPromiseResolveBlock)resolve
  740. reject:(RCTPromiseRejectBlock)reject) {
  741. NSInteger res = [self.rtcEngine pauseAllEffects];
  742. if (res != 0) {
  743. reject(@"131014", @"pauseAllEffects failed", [self makeNSError:@{
  744. @"code": @(131014),
  745. @"message":@{
  746. @"success": @(NO),
  747. @"value":@(res)
  748. }
  749. }]);
  750. } else {
  751. resolve(@{
  752. @"success": @(YES),
  753. @"value": @(res)
  754. });
  755. }
  756. }
  757. // resume effect by id
  758. RCT_EXPORT_METHOD(resumeEffect:(NSInteger) soundId
  759. resolve:(RCTPromiseResolveBlock)resolve
  760. reject:(RCTPromiseRejectBlock)reject) {
  761. NSInteger res = [self.rtcEngine resumeEffect:(int)soundId];
  762. if (res != 0) {
  763. reject(@"131015", @"resumeEffect failed", [self makeNSError:@{
  764. @"code": @(131015),
  765. @"message":@{
  766. @"success": @(NO),
  767. @"value":@(res)
  768. }
  769. }]);
  770. } else {
  771. resolve(@{
  772. @"success": @(YES),
  773. @"value": @(res)
  774. });
  775. }
  776. }
  777. // resume all effect
  778. RCT_EXPORT_METHOD(resumeAllEffects
  779. :(RCTPromiseResolveBlock)resolve
  780. reject:(RCTPromiseRejectBlock)reject) {
  781. NSInteger res = [self.rtcEngine resumeAllEffects];
  782. if (res != 0) {
  783. reject(@"131016", @"resumeAllEffects failed", [self makeNSError:@{
  784. @"code": @(131016),
  785. @"message":@{
  786. @"success": @(NO),
  787. @"value":@(res)
  788. }
  789. }]);
  790. } else {
  791. resolve(@{
  792. @"success": @(YES),
  793. @"value": @(res)
  794. });
  795. }
  796. }
  797. // start audio recoding quality
  798. RCT_EXPORT_METHOD(startAudioRecording:(NSDictionary *)options
  799. resolve:(RCTPromiseResolveBlock)resolve
  800. reject:(RCTPromiseRejectBlock)reject) {
  801. AgoraAudioRecordingQuality qualityType = AgoraAudioRecordingQualityLow;
  802. switch ([options[@"quality"] integerValue]) {
  803. case AgoraAudioRecordingQualityLow:
  804. qualityType = AgoraAudioRecordingQualityLow;
  805. break;
  806. case AgoraAudioRecordingQualityHigh:
  807. qualityType = AgoraAudioRecordingQualityHigh;
  808. break;
  809. case AgoraAudioRecordingQualityMedium:
  810. qualityType = AgoraAudioRecordingQualityMedium;
  811. break;
  812. }
  813. NSInteger res = [self.rtcEngine startAudioRecording:[options[@"filePath"] stringValue] quality:qualityType];
  814. if (res != 0) {
  815. reject(@"131017", @"startAudioRecording failed", [self makeNSError:@{
  816. @"code": @(131017),
  817. @"message":@{
  818. @"success": @(NO),
  819. @"value":@(res)
  820. }
  821. }]);
  822. } else {
  823. resolve(@{
  824. @"success": @(YES),
  825. @"value": @(res)
  826. });
  827. }
  828. }
  829. // stop audio recording
  830. RCT_EXPORT_METHOD(stopAudioRecording
  831. :(RCTPromiseResolveBlock)resolve
  832. reject:(RCTPromiseRejectBlock)reject) {
  833. NSInteger res = [self.rtcEngine stopAudioRecording];
  834. if (res != 0) {
  835. reject(@"131018", @"stopAudioRecording failed", [self makeNSError:@{
  836. @"code": @(131018),
  837. @"message":@{
  838. @"success": @(NO),
  839. @"value":@(res)
  840. }
  841. }]);
  842. } else {
  843. resolve(@{
  844. @"success": @(YES),
  845. @"value": @(res)
  846. });
  847. }
  848. }
  849. // set audio session operation restriction
  850. RCT_EXPORT_METHOD(setAudioSessionOperationRestriction
  851. :(NSInteger) restriction) {
  852. AgoraAudioSessionOperationRestriction restrictionType = AgoraAudioSessionOperationRestrictionNone;
  853. switch (restriction) {
  854. case AgoraAudioSessionOperationRestrictionNone:
  855. restrictionType = AgoraAudioSessionOperationRestrictionNone;
  856. break;
  857. case AgoraAudioSessionOperationRestrictionSetCategory:
  858. restrictionType = AgoraAudioSessionOperationRestrictionSetCategory;
  859. break;
  860. case AgoraAudioSessionOperationRestrictionConfigureSession:
  861. restrictionType = AgoraAudioSessionOperationRestrictionConfigureSession;
  862. break;
  863. case AgoraAudioSessionOperationRestrictionDeactivateSession:
  864. restrictionType = AgoraAudioSessionOperationRestrictionDeactivateSession;
  865. break;
  866. case AgoraAudioSessionOperationRestrictionAll:
  867. restrictionType = AgoraAudioSessionOperationRestrictionAll;
  868. break;
  869. }
  870. [self.rtcEngine setAudioSessionOperationRestriction:restrictionType];
  871. }
  872. // gateway test start echo
  873. RCT_EXPORT_METHOD(startEchoTest
  874. :(RCTPromiseResolveBlock)resolve
  875. reject:(RCTPromiseRejectBlock)reject) {
  876. NSInteger res = [self.rtcEngine startEchoTest:^(NSString * _Nonnull channel, NSUInteger uid, NSInteger elapsed) {
  877. _block(@{
  878. @"channel": channel,
  879. @"uid": @(uid),
  880. @"elapsed": @(elapsed)
  881. });
  882. }];
  883. if (res != 0) {
  884. reject(@"131019", @"startEchoTest failed", [self makeNSError:@{
  885. @"code": @(131019),
  886. @"message":@{
  887. @"success": @(NO),
  888. @"value":@(res)
  889. }
  890. }]);
  891. } else {
  892. resolve(@{
  893. @"success": @(YES),
  894. @"value": @(res)
  895. });
  896. }
  897. }
  898. // gateway test stop echo
  899. RCT_EXPORT_METHOD(stopEchoTest
  900. :(RCTPromiseResolveBlock)resolve
  901. reject:(RCTPromiseRejectBlock)reject) {
  902. NSInteger res = [self.rtcEngine stopEchoTest];
  903. if (res != 0) {
  904. reject(@"131020", @"stopEchoTest failed", [self makeNSError:@{
  905. @"code": @(131020),
  906. @"message":@{
  907. @"success": @(NO),
  908. @"value":@(res)
  909. }
  910. }]);
  911. } else {
  912. resolve(@{
  913. @"success": @(YES),
  914. @"value": @(res)
  915. });
  916. }
  917. }
  918. // enable last mile test
  919. RCT_EXPORT_METHOD(enableLastmileTest
  920. :(RCTPromiseResolveBlock)resolve
  921. reject:(RCTPromiseRejectBlock)reject) {
  922. NSInteger res = [self.rtcEngine enableLastmileTest];
  923. if (res != 0) {
  924. reject(@"131021", @"enableLastmileTest failed", [self makeNSError:@{
  925. @"code": @(131021),
  926. @"message":@{
  927. @"success": @(NO),
  928. @"value":@(res)
  929. }
  930. }]);
  931. } else {
  932. resolve(@{
  933. @"success": @(YES),
  934. @"value": @(res)
  935. });
  936. }
  937. }
  938. // disable last mile test
  939. RCT_EXPORT_METHOD(disableLastmileTest
  940. :(RCTPromiseResolveBlock)resolve
  941. reject:(RCTPromiseRejectBlock)reject) {
  942. NSInteger res = [self.rtcEngine disableLastmileTest];
  943. if (res != 0) {
  944. reject(@"131022", @"disableLastmileTest failed", [self makeNSError:@{
  945. @"code": @(131022),
  946. @"message":@{
  947. @"success": @(NO),
  948. @"value":@(res)
  949. }
  950. }]);
  951. } else {
  952. resolve(@{
  953. @"success": @(YES),
  954. @"value": @(res)
  955. });
  956. }
  957. }
  958. // set recording audioframe parameters with samplerate
  959. RCT_EXPORT_METHOD(setRecordingAudioFrameParameters:(NSDictionary *) options
  960. resolve:(RCTPromiseResolveBlock)resolve
  961. reject:(RCTPromiseRejectBlock)reject) {
  962. NSInteger res = [self.rtcEngine setRecordingAudioFrameParametersWithSampleRate:[options[@"sampleRate"] integerValue]
  963. channel:[options[@"channel"] integerValue]
  964. mode:(AgoraAudioRawFrameOperationMode)[options[@"mode"] integerValue]
  965. samplesPerCall:[options[@"samplesPerCall"] integerValue]
  966. ];
  967. if (res != 0) {
  968. reject(@"131023", @"setRecordingAudioFrameParameters failed", [self makeNSError:@{
  969. @"code": @(131023),
  970. @"message":@{
  971. @"success": @(NO),
  972. @"value":@(res)
  973. }
  974. }]);
  975. } else {
  976. resolve(@{
  977. @"success": @(YES),
  978. @"value": @(res)
  979. });
  980. }
  981. }
  982. // set playback audioframe parameters with samplerate
  983. RCT_EXPORT_METHOD(setPlaybackAudioFrameParameters:(NSDictionary *) options
  984. resolve:(RCTPromiseResolveBlock)resolve
  985. reject:(RCTPromiseRejectBlock)reject) {
  986. NSInteger res = [self.rtcEngine setPlaybackAudioFrameParametersWithSampleRate:[options[@"sampleRate"] integerValue]
  987. channel:[options[@"channel"] integerValue]
  988. mode:(AgoraAudioRawFrameOperationMode)[options[@"mode"] integerValue]
  989. samplesPerCall:[options[@"samplesPerCall"] integerValue]
  990. ];
  991. if (res != 0) {
  992. reject(@"131024", @"setPlaybackAudioFrameParameters failed", [self makeNSError:@{
  993. @"code": @(131024),
  994. @"message":@{
  995. @"success":@(NO),
  996. @"value":@(res)
  997. }
  998. }]);
  999. } else {
  1000. resolve(@{
  1001. @"success": @(YES),
  1002. @"value": @(res)
  1003. });
  1004. }
  1005. }
  1006. // set mixed audio frame parameters with sample rate
  1007. RCT_EXPORT_METHOD(setMixedAudioFrameParametersWithSampleRate
  1008. :(NSDictionary *)options
  1009. resolve:(RCTPromiseResolveBlock)resolve
  1010. reject:(RCTPromiseRejectBlock)reject) {
  1011. NSInteger res = [self.rtcEngine setMixedAudioFrameParametersWithSampleRate:[options[@"sampleRate"] integerValue] samplesPerCall:[options[@"samplesPerCall"] integerValue]];
  1012. if (res != 0) {
  1013. reject(@"131025", @"setMixedAudioFrameParametersWithSampleRate failed", [self makeNSError:@{
  1014. @"code": @(131025),
  1015. @"message":@{
  1016. @"success":@(NO),
  1017. @"value":@(res)
  1018. }
  1019. }]);
  1020. } else {
  1021. resolve(@{
  1022. @"success": @(YES),
  1023. @"value": @(res)
  1024. });
  1025. }
  1026. }
  1027. // add video watermark
  1028. RCT_EXPORT_METHOD(addVideoWatermark:(NSDictionary *)options
  1029. resolve:(RCTPromiseResolveBlock)resolve
  1030. reject:(RCTPromiseRejectBlock)reject) {
  1031. NSInteger res = [self.rtcEngine addVideoWatermark:[self makeAgoraImage:@{
  1032. @"url": options[@"url"],
  1033. @"x": options[@"x"],
  1034. @"y": options[@"y"],
  1035. @"width": options[@"width"],
  1036. @"height": options[@"height"]
  1037. }]];
  1038. if (res != 0) {
  1039. reject(@"131026", @"addVideoWatermark failed", [self makeNSError:@{
  1040. @"code": @(131026),
  1041. @"message":@{
  1042. @"success":@(NO),
  1043. @"value":@(res)
  1044. }
  1045. }]);
  1046. } else {
  1047. resolve(@{
  1048. @"success": @(YES),
  1049. @"value": @(res)
  1050. });
  1051. }
  1052. }
  1053. // clear video watermark
  1054. RCT_EXPORT_METHOD(clearVideoWatermarks
  1055. :(RCTPromiseResolveBlock)resolve
  1056. reject:(RCTPromiseRejectBlock)reject) {
  1057. NSInteger res = [self.rtcEngine clearVideoWatermarks];
  1058. if (res != 0) {
  1059. reject(@"131027", @"clearVideoWatermarks failed", [self makeNSError:@{
  1060. @"code": @(131027),
  1061. @"message":@{
  1062. @"success":@(NO),
  1063. @"value":@(res)
  1064. }
  1065. }]);
  1066. } else {
  1067. resolve(@{
  1068. @"success": @(YES),
  1069. @"value": @(res)
  1070. });
  1071. }
  1072. }
  1073. // set local publish fallback option
  1074. RCT_EXPORT_METHOD(setLocalPublishFallbackOption:(NSInteger)option
  1075. resolve:(RCTPromiseResolveBlock)resolve
  1076. reject:(RCTPromiseRejectBlock)reject) {
  1077. NSInteger res = [self.rtcEngine setLocalPublishFallbackOption:option];
  1078. if (res != 0) {
  1079. reject(@"131039", @"setLocalPublishFallbackOption failed", [self makeNSError:@{
  1080. @"code": @(131039),
  1081. @"message":@{
  1082. @"success":@(NO),
  1083. @"value":@(res)
  1084. }
  1085. }]);
  1086. } else {
  1087. resolve(@{
  1088. @"success": @(YES),
  1089. @"value": @(res)
  1090. });
  1091. }
  1092. }
  1093. // set remote subscribe fallback option
  1094. RCT_EXPORT_METHOD(setRemoteSubscribeFallbackOption:(NSInteger)option
  1095. resolve:(RCTPromiseResolveBlock)resolve
  1096. reject:(RCTPromiseRejectBlock)reject) {
  1097. NSInteger res = [self.rtcEngine setRemoteSubscribeFallbackOption:option];
  1098. if (res != 0) {
  1099. reject(@"131040", @"setRemoteSubscribeFallbackOption failed", [self makeNSError:@{
  1100. @"code": @(131040),
  1101. @"message":@{
  1102. @"success":@(NO),
  1103. @"value":@(res)
  1104. }
  1105. }]);
  1106. } else {
  1107. resolve(@{
  1108. @"success": @(YES),
  1109. @"value": @(res)
  1110. });
  1111. }
  1112. }
  1113. // enable dual stream mode
  1114. RCT_EXPORT_METHOD(enableDualStreamMode
  1115. :(BOOL) enabled
  1116. resolve:(RCTPromiseResolveBlock)resolve
  1117. reject:(RCTPromiseRejectBlock)reject) {
  1118. NSInteger res = [self.rtcEngine enableDualStreamMode:enabled];
  1119. if (res != 0) {
  1120. reject(@"131028", @"enableDualStreamMode failed", [self makeNSError:@{
  1121. @"code": @(131028),
  1122. @"message":@{
  1123. @"success":@(NO),
  1124. @"value":@(res)
  1125. }
  1126. }]);
  1127. } else {
  1128. resolve(@{
  1129. @"success": @(YES),
  1130. @"value": @(res)
  1131. });
  1132. }
  1133. }
  1134. // set remote video stream
  1135. RCT_EXPORT_METHOD(setRemoteVideoStreamType
  1136. :(NSDictionary *) options
  1137. resolve:(RCTPromiseResolveBlock)resolve
  1138. reject:(RCTPromiseRejectBlock)reject) {
  1139. NSInteger res = [self.rtcEngine setRemoteVideoStream:[options[@"uid"] integerValue]
  1140. type:(AgoraVideoStreamType)[options[@"streamType"] integerValue]];
  1141. if (res != 0) {
  1142. reject(@"131029", @"setRemoteVideoStreamType failed", [self makeNSError:@{
  1143. @"code": @(131029),
  1144. @"message":@{
  1145. @"success":@(NO),
  1146. @"value":@(res)
  1147. }
  1148. }]);
  1149. } else {
  1150. resolve(@{
  1151. @"success": @(YES),
  1152. @"value": @(res)
  1153. });
  1154. }
  1155. }
  1156. // set remote default video stream
  1157. RCT_EXPORT_METHOD(setRemoteDefaultVideoStreamType
  1158. :(NSDictionary *) options
  1159. resolve:(RCTPromiseResolveBlock)resolve
  1160. reject:(RCTPromiseRejectBlock)reject) {
  1161. NSInteger res = [self.rtcEngine setRemoteDefaultVideoStreamType:(AgoraVideoStreamType)[options[@"streamType"] integerValue]];
  1162. if (res != 0) {
  1163. reject(@"131030", @"setRemoteDefaultVideoStreamType failed", [self makeNSError:@{
  1164. @"code": @(131030),
  1165. @"message":@{
  1166. @"success":@(NO),
  1167. @"value":@(res)
  1168. }
  1169. }]);
  1170. } else {
  1171. resolve(@{
  1172. @"success": @(YES),
  1173. @"value": @(res)
  1174. });
  1175. }
  1176. }
  1177. // add injection stream url
  1178. RCT_EXPORT_METHOD(addInjectStreamUrl
  1179. :(NSDictionary *)options
  1180. resolve:(RCTPromiseResolveBlock)resolve
  1181. reject:(RCTPromiseRejectBlock)reject) {
  1182. AgoraLiveInjectStreamConfig *config = [AgoraLiveInjectStreamConfig new];
  1183. config.size = CGSizeMake([options[@"config"][@"size"][@"width"] floatValue], [options[@"config"][@"size"][@"height"] floatValue]);
  1184. config.videoGop = [options[@"config"][@"videoGop"] integerValue];
  1185. config.videoFramerate = [options[@"config"][@"videoFramerate"] integerValue];
  1186. config.videoBitrate = [options[@"config"][@"videoBitrate"] integerValue];
  1187. config.audioSampleRate = (AgoraAudioSampleRateType)[options[@"config"][@"audioSampleRate"] integerValue];
  1188. config.audioBitrate = [options[@"config"][@"audioBitrate"] integerValue];
  1189. config.audioChannels = [options[@"config"][@"audioChannels"] integerValue];
  1190. NSInteger res = [self.rtcEngine addInjectStreamUrl:[options[@"url"] stringValue]
  1191. config:config];
  1192. if (res != 0) {
  1193. reject(@"131031", @"addInjectStreamUrl failed", [self makeNSError:@{
  1194. @"code": @(131031),
  1195. @"message":@{
  1196. @"success":@(NO),
  1197. @"value":@(res)
  1198. }
  1199. }]);
  1200. } else {
  1201. resolve(@{
  1202. @"success": @(YES),
  1203. @"value": @(res)
  1204. });
  1205. }
  1206. }
  1207. // remove injection stream url
  1208. RCT_EXPORT_METHOD(removeInjectStreamUrl
  1209. :(NSString *)url
  1210. resolve:(RCTPromiseResolveBlock)resolve
  1211. reject:(RCTPromiseRejectBlock)reject) {
  1212. NSInteger res = [self.rtcEngine removeInjectStreamUrl:url];
  1213. if (res != 0) {
  1214. reject(@"131032", @"removeInjectStreamUrl failed", [self makeNSError:@{
  1215. @"code": @(131032),
  1216. @"message":@{
  1217. @"success":@(NO),
  1218. @"value":@(res)
  1219. }
  1220. }]);
  1221. } else {
  1222. resolve(@{
  1223. @"success": @(YES),
  1224. @"value": @(res)
  1225. });
  1226. }
  1227. }
  1228. // set video quality
  1229. RCT_EXPORT_METHOD(setVideoQualityParameters
  1230. :(BOOL) quality
  1231. resolve:(RCTPromiseResolveBlock)resolve
  1232. reject:(RCTPromiseRejectBlock)reject) {
  1233. NSInteger res = [self.rtcEngine setVideoQualityParameters:quality];
  1234. if (res == 0) {
  1235. resolve(@{@"success": @(YES)});
  1236. } else {
  1237. reject(@"131033", @"setVideoQualityParameters failed", [self makeNSError:@{
  1238. @"code": @(131033),
  1239. @"message":@{
  1240. @"success": @(NO),
  1241. @"value":[NSNumber numberWithInteger:res]
  1242. }
  1243. }]);
  1244. }
  1245. }
  1246. // set local video mirror mode
  1247. RCT_EXPORT_METHOD(setLocalVideoMirrorMode
  1248. :(NSInteger) mode
  1249. resolve:(RCTPromiseResolveBlock)resolve
  1250. reject:(RCTPromiseRejectBlock)reject) {
  1251. NSInteger res = [self.rtcEngine setLocalVideoMirrorMode:(AgoraVideoMirrorMode) mode];
  1252. if (res == 0) {
  1253. resolve(@{@"success": @(YES)});
  1254. } else {
  1255. reject(@"131034", @"setLocalVideoMirroMode failed", [self makeNSError:@{
  1256. @"code": @(131034),
  1257. @"message":@{
  1258. @"success": @(NO),
  1259. @"value":[NSNumber numberWithInteger:res]
  1260. }
  1261. }]);
  1262. }
  1263. }
  1264. // switchCamera
  1265. RCT_EXPORT_METHOD(switchCamera
  1266. :(RCTPromiseResolveBlock)resolve
  1267. reject:(RCTPromiseRejectBlock)reject) {
  1268. NSInteger res = [self.rtcEngine switchCamera];
  1269. if (res == 0) {
  1270. resolve(@{
  1271. @"success": @(YES),
  1272. @"value": @(res)
  1273. });
  1274. } else {
  1275. reject(@"131035", @"switchCamera failed", [self makeNSError:@{
  1276. @"code": @(131035),
  1277. @"message":@{
  1278. @"success": @(NO),
  1279. @"value":[NSNumber numberWithInteger:res]
  1280. }
  1281. }]);
  1282. }
  1283. }
  1284. // isCameraZoomSupported
  1285. RCT_EXPORT_METHOD(isCameraZoomSupported
  1286. :(RCTPromiseResolveBlock)resolve) {
  1287. BOOL res = [self.rtcEngine isCameraZoomSupported];
  1288. resolve(@{
  1289. @"success": @(YES),
  1290. @"value": @(res)
  1291. });
  1292. }
  1293. // isCameraTorchSupported
  1294. RCT_EXPORT_METHOD(isCameraTorchSupported
  1295. :(RCTPromiseResolveBlock)resolve) {
  1296. BOOL res = [self.rtcEngine isCameraTorchSupported];
  1297. resolve(@{
  1298. @"success": @(YES),
  1299. @"value": @(res)
  1300. });
  1301. }
  1302. // isCameraFocusSupported
  1303. RCT_EXPORT_METHOD(isCameraFocusSupported
  1304. :(RCTPromiseResolveBlock)resolve) {
  1305. BOOL res = [self.rtcEngine isCameraFocusPositionInPreviewSupported];
  1306. resolve(@{
  1307. @"success": @(YES),
  1308. @"value": @(res)
  1309. });
  1310. }
  1311. // isCameraExposurePositionSupported
  1312. RCT_EXPORT_METHOD(isCameraExposurePositionSupported
  1313. :(RCTPromiseResolveBlock)resolve) {
  1314. BOOL res = [self.rtcEngine isCameraExposurePositionSupported];
  1315. resolve(@{
  1316. @"success": @(YES),
  1317. @"value": @(res)
  1318. });
  1319. }
  1320. // isCameraAutoFocusFaceModeSupported
  1321. RCT_EXPORT_METHOD(isCameraAutoFocusFaceModeSupported
  1322. :(RCTPromiseResolveBlock)resolve) {
  1323. BOOL res = [self.rtcEngine isCameraAutoFocusFaceModeSupported];
  1324. resolve(@{
  1325. @"success": @(YES),
  1326. @"value": @(res)
  1327. });
  1328. }
  1329. // setCameraZoomFactor
  1330. RCT_EXPORT_METHOD(setCameraZoomFactor
  1331. :(float)zoomFactor
  1332. resolve:(RCTPromiseResolveBlock)resolve) {
  1333. BOOL res = [self.rtcEngine setCameraZoomFactor:(CGFloat)zoomFactor];
  1334. resolve(@{
  1335. @"success": @(YES),
  1336. @"value": @(res)
  1337. });
  1338. }
  1339. // setCameraFocusPositionInPreview
  1340. RCT_EXPORT_METHOD(setCameraFocusPositionInPreview
  1341. :(NSDictionary *)options
  1342. resolve:(RCTPromiseResolveBlock)resolve) {
  1343. BOOL res = [self.rtcEngine setCameraFocusPositionInPreview:CGPointMake((CGFloat)[options[@"x"] floatValue], (CGFloat)[options[@"y"] floatValue])];
  1344. resolve(@{
  1345. @"success": @(YES),
  1346. @"value": @(res)
  1347. });
  1348. }
  1349. // setCameraExposurePosition
  1350. RCT_EXPORT_METHOD(setCameraExposurePosition
  1351. :(NSDictionary *)options
  1352. resolve:(RCTPromiseResolveBlock)resolve) {
  1353. BOOL res = [self.rtcEngine setCameraExposurePosition:CGPointMake((CGFloat)[options[@"x"] floatValue], (CGFloat)[options[@"y"] floatValue])];
  1354. resolve(@{
  1355. @"success": @(YES),
  1356. @"value": @(res)
  1357. });
  1358. }
  1359. // enable camera torch
  1360. RCT_EXPORT_METHOD(setCameraTorchOn:(BOOL)isOn
  1361. resolve:(RCTPromiseResolveBlock)resolve
  1362. reject:(RCTPromiseRejectBlock)reject) {
  1363. BOOL res = [self.rtcEngine setCameraTorchOn:isOn];
  1364. resolve(@{
  1365. @"success": @(YES),
  1366. @"value": @(res)
  1367. });
  1368. }
  1369. // enable auto focus face mode
  1370. RCT_EXPORT_METHOD(setCameraAutoFocusFaceModeEnabled:(BOOL)enable
  1371. resolve:(RCTPromiseResolveBlock)resolve
  1372. reject:(RCTPromiseRejectBlock)reject) {
  1373. BOOL res = [self.rtcEngine setCameraAutoFocusFaceModeEnabled:enable];
  1374. resolve(@{
  1375. @"success": @(YES),
  1376. @"value": @(res)
  1377. });
  1378. }
  1379. // getCallId
  1380. RCT_EXPORT_METHOD(getCallId
  1381. :(RCTPromiseResolveBlock)resolve
  1382. reject:(RCTPromiseRejectBlock)reject) {
  1383. resolve(@{
  1384. @"success": @(YES),
  1385. @"value": [self.rtcEngine getCallId]
  1386. });
  1387. }
  1388. // setLogFile and setLogFilter
  1389. RCT_EXPORT_METHOD(setLog
  1390. :(NSString *)filePath
  1391. level:(NSUInteger)level
  1392. resolve:(RCTPromiseResolveBlock)resolve
  1393. reject:(RCTPromiseRejectBlock)reject) {
  1394. int res = [self.rtcEngine setLogFilter:level];
  1395. if (res != 0) {
  1396. reject(@"131036", @"setLogFilter failed", [self makeNSError:@{
  1397. @"code": @(131036),
  1398. @"message":@{
  1399. @"success": @(NO),
  1400. @"value":[NSNumber numberWithInteger:res]
  1401. }
  1402. }]);
  1403. } else {
  1404. resolve(@{
  1405. @"success": @(YES),
  1406. @"value": @(res)
  1407. });
  1408. }
  1409. res = [self.rtcEngine setLogFile:filePath];
  1410. if (res != 0) {
  1411. reject(@"131037", @"setLogFile failed", [self makeNSError:@{
  1412. @"code": @(131037),
  1413. @"message":@{
  1414. @"success": @(NO),
  1415. @"value":[NSNumber numberWithInteger:res]
  1416. }
  1417. }]);
  1418. } else {
  1419. resolve(@{
  1420. @"success": @(YES),
  1421. @"value": @(res)
  1422. });
  1423. }
  1424. }
  1425. // set
  1426. // send stream message
  1427. RCT_EXPORT_METHOD(sendStreamMessage:(NSInteger)streamId data:(NSData*)data
  1428. resolve:(RCTPromiseResolveBlock)resolve
  1429. reject:(RCTPromiseRejectBlock)reject) {
  1430. NSInteger res = [self.rtcEngine sendStreamMessage:(streamId) data:data];
  1431. if (res == 0) {
  1432. resolve(@{@"success": @(YES)});
  1433. } else {
  1434. reject(@"131001", @"sendStreamMessage failed", [self makeNSError:@{
  1435. @"code": @(131001),
  1436. @"message":@{
  1437. @"success": @(NO),
  1438. @"value":[NSNumber numberWithInteger:res]
  1439. }
  1440. }]);
  1441. }
  1442. }
  1443. // get sdk version
  1444. RCT_EXPORT_METHOD(getSdkVersion
  1445. :(RCTPromiseResolveBlock) resolve
  1446. reject:(RCTPromiseRejectBlock) reject) {
  1447. resolve(@[[AgoraRtcEngineKit getSdkVersion]]);
  1448. }
  1449. // add publish stream url
  1450. RCT_EXPORT_METHOD(addPublishStreamUrl:(NSDictionary *)options) {
  1451. [self.rtcEngine addPublishStreamUrl:options[@"url"] transcodingEnabled:[options[@"enable"] boolValue]];
  1452. }
  1453. // remove publish stream url
  1454. RCT_EXPORT_METHOD(removePublishStreamUrl:(NSDictionary *)options) {
  1455. [self.rtcEngine removePublishStreamUrl:options[@"url"]];
  1456. }
  1457. // set living transcoding
  1458. RCT_EXPORT_METHOD(setLiveTranscoding:(NSDictionary *)options) {
  1459. AgoraLiveTranscoding *transcoding = AgoraLiveTranscoding.defaultTranscoding;
  1460. if (options[@"size"] != nil) {
  1461. transcoding.size = CGSizeMake([options[@"size"][@"width"] doubleValue], [options[@"size"][@"height"] doubleValue]);
  1462. }
  1463. if (options[@"videoBitrate"] != nil) {
  1464. transcoding.videoBitrate = [options[@"videoBitrate"] integerValue];
  1465. }
  1466. if (options[@"videoFramerate"] != nil) {
  1467. transcoding.videoFramerate = [options[@"videoFramerate"] integerValue];
  1468. }
  1469. if (options[@"lowLatency"] != nil) {
  1470. transcoding.lowLatency = [options[@"lowLatancy"] boolValue];
  1471. }
  1472. if (options[@"videoGop"] != nil) {
  1473. transcoding.videoGop = [options[@"videoGop"] integerValue];
  1474. }
  1475. if (options[@"videoCodecProfile"] != nil) {
  1476. transcoding.videoCodecProfile = (AgoraVideoCodecProfileType)[options[@"videoCodecProfile"] integerValue];
  1477. }
  1478. if (options[@"transcodingUsers"] != nil) {
  1479. NSMutableArray<AgoraLiveTranscodingUser*> *transcodingUsers = [NSMutableArray new];
  1480. for (NSDictionary *optionUser in options[@"users"]) {
  1481. AgoraLiveTranscodingUser *liveUser = [AgoraLiveTranscodingUser new];
  1482. liveUser.uid = (NSUInteger)[optionUser[@"uid"] integerValue];
  1483. liveUser.rect = CGRectMake((CGFloat)[options[@"backgroundColor"][@"x"] floatValue], (CGFloat)[options[@"backgroundColor"][@"y"] floatValue], (CGFloat)[options[@"backgroundColor"][@"width"] floatValue], (CGFloat)[options[@"backgroundColor"][@"height"] floatValue]);
  1484. liveUser.zOrder = [optionUser[@"zOrder"] integerValue];
  1485. liveUser.alpha = [optionUser[@"alpha"] doubleValue];
  1486. liveUser.audioChannel = [optionUser[@"audioChannel"] integerValue];
  1487. [transcodingUsers addObject:liveUser];
  1488. }
  1489. transcoding.transcodingUsers = transcodingUsers;
  1490. }
  1491. if (options[@"transcodingExtraInfo"] != nil) {
  1492. transcoding.transcodingExtraInfo = [options[@"transcodingExtraInfo"] stringValue];
  1493. }
  1494. if (options[@"watermark"] != nil) {
  1495. transcoding.watermark = [self makeAgoraImage:@{
  1496. @"url": options[@"watermark"][@"url"],
  1497. @"x": options[@"watermark"][@"x"],
  1498. @"y": options[@"watermark"][@"y"],
  1499. @"width": options[@"watermark"][@"width"],
  1500. @"height": options[@"watermark"][@"height"]
  1501. }];
  1502. }
  1503. if (options[@"backgroundImage"] != nil) {
  1504. transcoding.backgroundImage = [self makeAgoraImage:@{
  1505. @"url": options[@"backgroundImage"][@"url"],
  1506. @"x": options[@"backgroundImage"][@"x"],
  1507. @"y": options[@"backgroundImage"][@"y"],
  1508. @"width": options[@"backgroundImage"][@"width"],
  1509. @"height": options[@"backgroundImage"][@"height"]
  1510. }];
  1511. }
  1512. if (options[@"backgroundColor"] != nil) {
  1513. transcoding.backgroundColor = [[UIColor new] initWithRed:(CGFloat)[options[@"backgroundColor"][@"red"] floatValue] green:(CGFloat)[options[@"backgroundColor"][@"green"] floatValue] blue:(CGFloat)[options[@"backgroundColor"][@"blue"] floatValue] alpha:(CGFloat)[options[@"backgroundColor"][@"alpha"] floatValue]];
  1514. }
  1515. if (options[@"audioSampleRate"] != nil) {
  1516. transcoding.audioSampleRate = (AgoraAudioSampleRateType)[options[@"audioSampleRate"] integerValue];
  1517. }
  1518. if (options[@"audioBitrate"] != nil) {
  1519. transcoding.audioBitrate = [options[@"audioBitrate"] integerValue];
  1520. }
  1521. if (options[@"audioChannels"] != nil) {
  1522. transcoding.audioChannels = [options[@"audioChannels"] integerValue];
  1523. }
  1524. [self.rtcEngine setLiveTranscoding:transcoding];
  1525. }
  1526. - (NSArray<NSString *> *)supportedEvents {
  1527. return @[
  1528. AGWarning,
  1529. AGError,
  1530. AGApiCallExecute,
  1531. AGJoinChannelSuccess,
  1532. AGRejoinChannelSuccess,
  1533. AGLeaveChannel,
  1534. AGClientRoleChanged,
  1535. AGUserJoined,
  1536. AGUserOffline,
  1537. AGConnectionStateChanged,
  1538. AGConnectionLost,
  1539. AGTokenPrivilegeWillExpire,
  1540. AGRequestToken,
  1541. AGMicrophoneEnabled,
  1542. AGAudioVolumeIndication,
  1543. AGActiveSpeaker,
  1544. AGFirstLocalAudioFrame,
  1545. AGFirstRemoteAudioFrame,
  1546. AGVideoStopped,
  1547. AGFirstLocalVideoFrame,
  1548. AGFirstRemoteVideoDecoded,
  1549. AGFirstRemoteVideoFrame,
  1550. AGUserMuteAudio,
  1551. AGUserMuteVideo,
  1552. AGUserEnableVideo,
  1553. AGUserEnableLocalVideo,
  1554. AGVideoSizeChanged,
  1555. AGRemoteVideoStateChanged,
  1556. AGLocalPublishFallbackToAudioOnly,
  1557. AGRemoteSubscribeFallbackToAudioOnly,
  1558. AGAudioRouteChanged,
  1559. AGCameraReady,
  1560. AGCameraFocusAreaChanged,
  1561. AGCameraExposureAreaChanged,
  1562. AGRtcStats,
  1563. AGLastmileQuality,
  1564. AGNetworkQuality,
  1565. AGLocalVideoStats,
  1566. AGRemoteVideoStats,
  1567. AGRemoteAudioStats,
  1568. AGAudioTransportStatsOfUid,
  1569. AGVideoTransportStatsOfUid,
  1570. AGLocalAudioMixingFinish,
  1571. AGRemoteAudioMixingStart,
  1572. AGRemoteAudioMixingFinish,
  1573. AGAudioEffectFinish,
  1574. AGStreamPublished,
  1575. AGStreamUnpublish,
  1576. AGTranscodingUpdate,
  1577. AGStreamInjectedStatus,
  1578. AGReceiveStreamMessage,
  1579. AGOccurStreamMessageError,
  1580. AGMediaEngineLoaded,
  1581. AGMediaEngineStartCall,
  1582. ];
  1583. }
  1584. - (void) sendEvent:(NSString *)msg params:(NSDictionary *)params {
  1585. if (hasListeners) {
  1586. [self sendEventWithName:msg body:params];
  1587. }
  1588. }
  1589. - (void) startObserving {
  1590. hasListeners = YES;
  1591. }
  1592. - (void) stopObserving {
  1593. hasListeners = NO;
  1594. }
  1595. #pragma mark - <AgoraRtcEngineDelegate>
  1596. // EVENT CALLBACKS
  1597. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didOccurWarning:(AgoraWarningCode)warningCode {
  1598. [self sendEvent:AGWarning params:@{@"message": @"AgoraWarning", @"code": @(warningCode)}];
  1599. }
  1600. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didOccurError:(AgoraErrorCode)errorCode {
  1601. [self sendEvent:AGError params:@{@"message": @"AgoraError", @"code": @(errorCode)}];
  1602. }
  1603. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didApiCallExecute:(NSInteger)error api:(NSString *_Nonnull)api result:(NSString *_Nonnull)result {
  1604. if (error != 0) {
  1605. [self sendEvent:AGError params:@{
  1606. @"api": api,
  1607. @"result": result,
  1608. @"error": @(error)
  1609. }];
  1610. } else {
  1611. [self sendEvent:AGApiCallExecute params:@{
  1612. @"api": api,
  1613. @"result": result,
  1614. @"error": @(error)
  1615. }];
  1616. }
  1617. }
  1618. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didJoinChannel:(NSString *_Nonnull)channel withUid:(NSUInteger)uid elapsed:(NSInteger)elapsed {
  1619. [self sendEvent:AGJoinChannelSuccess params:@{
  1620. @"channel": channel,
  1621. @"uid": @(uid),
  1622. @"elapsed": @(elapsed)
  1623. }];
  1624. }
  1625. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didRejoinChannel:(NSString *_Nonnull)channel withUid:(NSUInteger)uid elapsed:(NSInteger)elapsed {
  1626. [self sendEvent:AGRejoinChannelSuccess params:@{
  1627. @"channel": channel,
  1628. @"uid": @(uid),
  1629. @"elapsed": @(elapsed)
  1630. }];
  1631. }
  1632. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didLeaveChannelWithStats:(AgoraChannelStats *_Nonnull)stats {
  1633. [self sendEvent:AGLeaveChannel params:@{
  1634. @"stats": @{
  1635. @"duration": @(stats.duration),
  1636. @"txBytes": @(stats.txBytes),
  1637. @"rxBytes": @(stats.rxBytes),
  1638. @"txAudioKBitrate": @(stats.txAudioKBitrate),
  1639. @"rxAudioKBitrate": @(stats.rxVideoKBitrate),
  1640. @"txVideoKBitrate": @(stats.txVideoKBitrate),
  1641. @"rxVideoKBitrate": @(stats.rxVideoKBitrate),
  1642. @"lastmileDelay": @(stats.lastmileDelay),
  1643. @"userCount": @(stats.userCount),
  1644. @"cpuAppUsage": @(stats.cpuAppUsage),
  1645. @"cpuTotalUsage": @(stats.cpuTotalUsage)
  1646. }
  1647. }];
  1648. }
  1649. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didClientRoleChanged:(AgoraClientRole)oldRole newRole:(AgoraClientRole)newRole {
  1650. [self sendEvent:AGClientRoleChanged params:@{
  1651. @"oldRole": @(oldRole),
  1652. @"newRole": @(newRole)
  1653. }];
  1654. }
  1655. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didJoinedOfUid:(NSUInteger)uid elapsed:(NSInteger)elapsed {
  1656. [self sendEvent:AGUserJoined params:@{
  1657. @"uid": @(uid),
  1658. @"elapsed": @(elapsed)
  1659. }];
  1660. }
  1661. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didOfflineOfUid:(NSUInteger)uid reason:(AgoraUserOfflineReason)reason {
  1662. [self sendEvent:AGUserOffline params:@{
  1663. @"uid": @(uid),
  1664. @"reason": @(reason)
  1665. }];
  1666. }
  1667. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine connectionChangedToState:(AgoraConnectionStateType)state reason:(AgoraConnectionChangedReason)reason {
  1668. [self sendEvent:AGConnectionStateChanged params:@{
  1669. @"state": @(state),
  1670. @"reason": @(reason)
  1671. }];
  1672. }
  1673. - (void)rtcEngineConnectionDidLost:(AgoraRtcEngineKit *_Nonnull)engine {
  1674. [self sendEvent:AGConnectionLost params:@{
  1675. @"message": @"connectionLost"
  1676. }];
  1677. }
  1678. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine tokenPrivilegeWillExpire:(NSString *_Nonnull)token {
  1679. [self sendEvent:AGTokenPrivilegeWillExpire params:@{
  1680. @"token": token
  1681. }];
  1682. }
  1683. - (void)rtcEngineRequestToken:(AgoraRtcEngineKit *_Nonnull)engine {
  1684. [self sendEvent:AGRequestToken params:@{
  1685. @"message": @"RequestToken"
  1686. }];
  1687. }
  1688. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didMicrophoneEnabled:(BOOL)enabled {
  1689. [self sendEvent:AGMicrophoneEnabled params:@{
  1690. @"enabled": @(enabled)
  1691. }];
  1692. }
  1693. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine reportAudioVolumeIndicationOfSpeakers:(NSArray<AgoraRtcAudioVolumeInfo*> *_Nonnull)speakers totalVolume:(NSInteger)totalVolume {
  1694. NSMutableArray *result = [NSMutableArray new];
  1695. for (AgoraRtcAudioVolumeInfo *speaker in speakers) {
  1696. [result addObject:@{
  1697. @"uid": @(speaker.uid),
  1698. @"volume": @(speaker.volume)
  1699. }];
  1700. }
  1701. [self sendEvent:AGAudioVolumeIndication params:@{
  1702. @"speakers": result,
  1703. @"totalVolume": @(totalVolume)
  1704. }];
  1705. }
  1706. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine activeSpeaker:(NSUInteger)speakerUid {
  1707. [self sendEvent:AGActiveSpeaker params:@{
  1708. @"uid": @(speakerUid)
  1709. }];
  1710. }
  1711. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine firstLocalAudioFrame:(NSInteger)elapsed {
  1712. [self sendEvent:AGFirstLocalAudioFrame params:@{
  1713. @"elapsed": @(elapsed)
  1714. }];
  1715. }
  1716. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine firstRemoteAudioFrameOfUid:(NSUInteger)uid elapsed:(NSInteger)elapsed {
  1717. [self sendEvent:AGFirstRemoteAudioFrame params:@{
  1718. @"uid": @(uid),
  1719. @"elapsed": @(elapsed)
  1720. }];
  1721. }
  1722. - (void)rtcEngineVideoDidStop:(AgoraRtcEngineKit *_Nonnull)engine {
  1723. [self sendEvent:AGVideoStopped params:@{
  1724. @"message": @"VideoStopped"
  1725. }];
  1726. }
  1727. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine firstLocalVideoFrameWithSize:(CGSize)size elapsed:(NSInteger)elapsed {
  1728. [self sendEvent:AGFirstLocalVideoFrame params:@{
  1729. @"width": @(size.width),
  1730. @"height": @(size.height),
  1731. @"elapsed": @(elapsed)
  1732. }];
  1733. }
  1734. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size:(CGSize)size elapsed:(NSInteger)elapsed {
  1735. [self sendEvent:AGFirstRemoteVideoDecoded params:@{
  1736. @"uid": @(uid),
  1737. @"width": @(size.width),
  1738. @"height": @(size.height),
  1739. @"elapsed": @(elapsed)
  1740. }];
  1741. }
  1742. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine firstRemoteVideoFrameOfUid:(NSUInteger)uid size:(CGSize)size elapsed:(NSInteger)elapsed {
  1743. [self sendEvent:AGFirstRemoteVideoFrame params:@{
  1744. @"uid": @(uid),
  1745. @"width": @(size.width),
  1746. @"height": @(size.height),
  1747. @"elapsed": @(elapsed)}];
  1748. }
  1749. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didAudioMuted:(BOOL)muted byUid:(NSUInteger)uid {
  1750. [self sendEvent:AGUserMuteAudio params:@{
  1751. @"muted": @(muted),
  1752. @"uid": @(uid)
  1753. }];
  1754. }
  1755. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didVideoMuted:(BOOL)muted byUid:(NSUInteger)uid {
  1756. [self sendEvent:AGUserMuteVideo params:@{
  1757. @"muted": @(muted),
  1758. @"uid": @(uid)
  1759. }];
  1760. }
  1761. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didVideoEnabled:(BOOL)enabled byUid:(NSUInteger)uid {
  1762. [self sendEvent:AGUserEnableVideo params:@{
  1763. @"enabled": @(enabled),
  1764. @"uid": @(uid)
  1765. }];
  1766. }
  1767. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didLocalVideoEnabled:(BOOL)enabled byUid:(NSUInteger)uid {
  1768. [self sendEvent:AGUserEnableLocalVideo params:@{
  1769. @"enabled": @(enabled),
  1770. @"uid": @(uid)
  1771. }];
  1772. }
  1773. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine videoSizeChangedOfUid:(NSUInteger)uid size:(CGSize)size rotation:(NSInteger)rotation {
  1774. [self sendEvent:AGVideoSizeChanged params:@{
  1775. @"uid": @(uid),
  1776. @"width": @(size.width),
  1777. @"height": @(size.height),
  1778. @"roration": @(rotation)
  1779. }];
  1780. }
  1781. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine remoteVideoStateChangedOfUid:(NSUInteger)uid state:(AgoraVideoRemoteState)state {
  1782. [self sendEvent:AGRemoteVideoStateChanged params:@{
  1783. @"uid": @(uid),
  1784. @"state": @(state)
  1785. }];
  1786. }
  1787. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didLocalPublishFallbackToAudioOnly:(BOOL)isFallbackOrRecover {
  1788. [self sendEvent:AGLocalPublishFallbackToAudioOnly params:@{
  1789. @"isFallbackOrRecover": @(isFallbackOrRecover)
  1790. }];
  1791. }
  1792. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didRemoteSubscribeFallbackToAudioOnly:(BOOL)isFallbackOrRecover byUid:(NSUInteger)uid {
  1793. [self sendEvent:AGRemoteSubscribeFallbackToAudioOnly params:@{
  1794. @"isFallbackOrRecover": @(isFallbackOrRecover),
  1795. @"uid": @(uid)
  1796. }];
  1797. }
  1798. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didAudioRouteChanged:(AgoraAudioOutputRouting)routing {
  1799. [self sendEvent:AGAudioRouteChanged params:@{
  1800. @"routing": @(routing)
  1801. }];
  1802. }
  1803. - (void)rtcEngineCameraDidReady:(AgoraRtcEngineKit *_Nonnull)engine {
  1804. [self sendEvent:AGCameraReady params:@{
  1805. @"message": @"CameraDidReady"
  1806. }];
  1807. }
  1808. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine cameraFocusDidChangedToRect:(CGRect)rect {
  1809. [self sendEvent:AGCameraFocusAreaChanged params:@{
  1810. @"rect": @(rect)
  1811. }];
  1812. }
  1813. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine cameraExposureDidChangedToRect:(CGRect)rect {
  1814. [self sendEvent:AGCameraExposureAreaChanged params:@{
  1815. @"rect": @(rect)
  1816. }];
  1817. }
  1818. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine remoteAudioStats:(AgoraRtcRemoteAudioStats *_Nonnull)stats {
  1819. [self sendEvent:AGRemoteAudioStats params:@{
  1820. @"stats": @{
  1821. @"uid": @(stats.uid),
  1822. @"quality": @(stats.quality),
  1823. @"networkTransportDelay": @(stats.networkTransportDelay),
  1824. @"jitterBufferDelay": @(stats.jitterBufferDelay),
  1825. @"audioLossRate": @(stats.audioLossRate)
  1826. }
  1827. }];
  1828. }
  1829. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine reportRtcStats:(AgoraChannelStats *_Nonnull)stats {
  1830. [self sendEvent:AGRtcStats params:@{
  1831. @"stats": @{
  1832. @"duration": @(stats.duration),
  1833. @"txBytes": @(stats.txBytes),
  1834. @"rxBytes": @(stats.rxBytes),
  1835. @"txAudioKBitrate": @(stats.txAudioKBitrate),
  1836. @"rxAudioKBitrate": @(stats.rxAudioKBitrate),
  1837. @"txVideoKBitrate": @(stats.txVideoKBitrate),
  1838. @"rxVideoKBitrate": @(stats.rxVideoKBitrate),
  1839. @"lastmileDelay": @(stats.lastmileDelay),
  1840. @"userCount": @(stats.userCount),
  1841. @"cpuAppUsage": @(stats.cpuAppUsage),
  1842. @"cpuTotalUsage": @(stats.cpuTotalUsage)
  1843. }
  1844. }];
  1845. }
  1846. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine lastmileQuality:(AgoraNetworkQuality)quality {
  1847. [self sendEvent:AGLastmileQuality params:@{
  1848. @"quality": @(quality)
  1849. }];
  1850. }
  1851. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine networkQuality:(NSUInteger)uid txQuality:(AgoraNetworkQuality)txQuality rxQuality:(AgoraNetworkQuality)rxQuality {
  1852. [self sendEvent:AGNetworkQuality params:@{
  1853. @"uid": @(uid),
  1854. @"txQuality": @(txQuality),
  1855. @"rxQuality": @(rxQuality)
  1856. }];
  1857. }
  1858. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine localVideoStats:(AgoraRtcLocalVideoStats *_Nonnull)stats {
  1859. [self sendEvent:AGLocalVideoStats params:@{
  1860. @"stats": @{
  1861. @"sentBitrate": @(stats.sentBitrate),
  1862. @"sentFrameRate": @(stats.sentFrameRate)
  1863. }
  1864. }];
  1865. }
  1866. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine remoteVideoStats:(AgoraRtcRemoteVideoStats *_Nonnull)stats {
  1867. [self sendEvent:AGRemoteVideoStats params:@{
  1868. @"stats": @{
  1869. @"uid": @(stats.uid),
  1870. @"width": @(stats.width),
  1871. @"height": @(stats.height),
  1872. @"receivedBitrate": @(stats.receivedBitrate),
  1873. @"receivedFrameRate": @(stats.receivedFrameRate),
  1874. @"rxStreamType": @(stats.rxStreamType)
  1875. }
  1876. }];
  1877. }
  1878. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine audioTransportStatsOfUid:(NSUInteger)uid delay:(NSUInteger)delay lost:(NSUInteger)lost rxKBitRate:(NSUInteger)rxKBitRate {
  1879. [self sendEvent:AGAudioTransportStatsOfUid params:@{
  1880. @"uid": @(uid),
  1881. @"delay": @(delay),
  1882. @"lost": @(lost),
  1883. @"rxKBitrate": @(rxKBitRate)
  1884. }];
  1885. }
  1886. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine videoTransportStatsOfUid:(NSUInteger)uid delay:(NSUInteger)delay lost:(NSUInteger)lost rxKBitRate:(NSUInteger)rxKBitRate {
  1887. [self sendEvent:AGVideoTransportStatsOfUid params:@{
  1888. @"uid": @(uid),
  1889. @"delay": @(delay),
  1890. @"lost": @(lost),
  1891. @"rxKBitrate": @(rxKBitRate)
  1892. }];
  1893. }
  1894. - (void)rtcEngineLocalAudioMixingDidFinish:(AgoraRtcEngineKit *_Nonnull)engine {
  1895. [self sendEvent:AGLocalAudioMixingFinish params:@{
  1896. @"message": @"LocalAudioMixingSucceedFinish"
  1897. }];
  1898. }
  1899. - (void)rtcEngineRemoteAudioMixingDidStart:(AgoraRtcEngineKit *_Nonnull)engine {
  1900. [self sendEvent:AGRemoteAudioMixingStart params:@{
  1901. @"message": @"RemoteAudioMixingStarted"
  1902. }];
  1903. }
  1904. - (void)rtcEngineRemoteAudioMixingDidFinish:(AgoraRtcEngineKit *_Nonnull)engine {
  1905. [self sendEvent:AGRemoteAudioMixingFinish params:@{
  1906. @"message": @"RemoteAudioMixingFinish"
  1907. }];
  1908. }
  1909. - (void)rtcEngineDidAudioEffectFinish:(AgoraRtcEngineKit *_Nonnull)engine soundId:(NSInteger)soundId {
  1910. [self sendEvent:AGAudioEffectFinish params:@{
  1911. @"soundId": @(soundId)
  1912. }];
  1913. }
  1914. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine streamPublishedWithUrl:(NSString *_Nonnull)url errorCode:(AgoraErrorCode)errorCode {
  1915. [self sendEvent:AGStreamPublished params:@{
  1916. @"url": url,
  1917. @"code": @(errorCode)
  1918. }];
  1919. }
  1920. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine streamUnpublishedWithUrl:(NSString *_Nonnull)url {
  1921. [self sendEvent:AGStreamUnpublish params:@{
  1922. @"url": url,
  1923. }];
  1924. }
  1925. - (void)rtcEngineTranscodingUpdated:(AgoraRtcEngineKit *_Nonnull)engine {
  1926. [self sendEvent:AGTranscodingUpdate params:@{
  1927. @"message": @"AGTranscodingUpdate"
  1928. }];
  1929. }
  1930. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine streamInjectedStatusOfUrl:(NSString *_Nonnull)url uid:(NSUInteger)uid status:(AgoraInjectStreamStatus)status {
  1931. [self sendEvent:AGStreamInjectedStatus params:@{
  1932. @"uid": @(uid),
  1933. @"url": url,
  1934. @"status": @(status)
  1935. }];
  1936. }
  1937. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine receiveStreamMessageFromUid:(NSUInteger)uid streamId:(NSInteger)streamId data:(NSData *_Nonnull)data {
  1938. [self sendEvent:AGReceiveStreamMessage params:@{
  1939. @"uid": @(uid),
  1940. @"streamId": @(streamId),
  1941. @"data": data
  1942. }];
  1943. }
  1944. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didOccurStreamMessageErrorFromUid:(NSUInteger)uid streamId:(NSInteger)streamId error:(NSInteger)error missed:(NSInteger)missed cached:(NSInteger)cached {
  1945. [self sendEvent:AGOccurStreamMessageError params:@{
  1946. @"uid": @(uid),
  1947. @"streamId": @(streamId),
  1948. @"error": @(error),
  1949. @"missed": @(missed),
  1950. @"cached": @(cached)
  1951. }];
  1952. }
  1953. - (void)rtcEngineMediaEngineDidLoaded:(AgoraRtcEngineKit *_Nonnull)engine {
  1954. [self sendEvent:AGMediaEngineLoaded params:@{
  1955. @"message": @"MediaEngineLoaded"
  1956. }];
  1957. }
  1958. - (void)rtcEngineMediaEngineDidStartCall:(AgoraRtcEngineKit *_Nonnull)engine {
  1959. [self sendEvent:AGMediaEngineStartCall params:@{
  1960. @"message": @"AGMediaEngineStartCall"
  1961. }];
  1962. }
  1963. @end