No Description

RCTAgora.m 94KB

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