No Description

RCTAgora.m 118KB

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