No Description

RCTAgora.m 94KB

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