No Description

RCTAgora.m 99KB

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