diff --git a/android/build.gradle b/android/build.gradle index 88fb89aee..9ba91977f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -57,9 +57,9 @@ dependencies { if (isDev(project)) { api fileTree(dir: "libs", include: ["*.jar"]) } else { - api 'io.agora.rtc:iris-rtc:4.3.2.11-build.1' - api 'io.agora.rtc:agora-special-full:4.3.2.11' - api 'io.agora.rtc:full-screen-sharing:4.3.2.11' + api 'io.agora.rtc:iris-rtc:4.3.2.234-build.1' + api 'io.agora.rtc:agora-special-full:4.3.2.234' + api 'io.agora.rtc:full-screen-sharing:4.3.2.234' } } diff --git a/android/src/main/cpp/third_party/include/agora_rtc/AgoraBase.h b/android/src/main/cpp/third_party/include/agora_rtc/AgoraBase.h index 46ce3393c..18befbbba 100644 --- a/android/src/main/cpp/third_party/include/agora_rtc/AgoraBase.h +++ b/android/src/main/cpp/third_party/include/agora_rtc/AgoraBase.h @@ -695,6 +695,14 @@ enum ERROR_CODE_TYPE { ERR_PCMSEND_FORMAT = 200, // unsupport pcm format ERR_PCMSEND_BUFFEROVERFLOW = 201, // buffer overflow, the pcm send rate too quickly + // 250~270 RDT error code + ERR_RDT_USER_NOT_EXIST = 250, + ERR_RDT_USER_NOT_READY = 251, + ERR_RDT_DATA_BLOCKED = 252, + ERR_RDT_CMD_EXCEED_LIMIT = 253, + ERR_RDT_DATA_EXCEED_LIMIT = 254, + ERR_RDT_ENCRYPTION = 255, + /// @cond // signaling: 400~600 ERR_LOGIN_ALREADY_LOGIN = 428, @@ -6266,6 +6274,28 @@ struct RecorderStreamInfo { RecorderStreamInfo() : channelId(NULL), uid(0) {} RecorderStreamInfo(const char* channelId, uid_t uid) : channelId(channelId), uid(uid) {} }; + +/** + * Reliable Data Transmission Tunnel message type + */ +enum RdtStreamType { + RDT_STREAM_CMD, // Reliable; High priority; Limit 256 bytes per packet, 100 packets per second + RDT_STREAM_DATA, // Reliable; Low priority; Restricted by congestion control; Limit 128K bytes per packet + RDT_STREAM_COUNT, +}; + +/** + * Reliable Data Transmission tunnel state + */ +enum RdtState { + RDT_STATE_CLOSED, // initial or closed + RDT_STATE_OPENED, // opened and can send data + RDT_STATE_BLOCKED, // send buffer is full, can't send data, but can send cmd + RDT_STATE_PENDING, // reconnecting tunnel, can't send data + RDT_STATE_BROKEN, // rdt tunnel broken, will auto reset and rebuild tunnel +}; + + } // namespace rtc namespace base { diff --git a/android/src/main/cpp/third_party/include/agora_rtc/IAgoraRtcEngine.h b/android/src/main/cpp/third_party/include/agora_rtc/IAgoraRtcEngine.h index 9335491e9..582c4d738 100644 --- a/android/src/main/cpp/third_party/include/agora_rtc/IAgoraRtcEngine.h +++ b/android/src/main/cpp/third_party/include/agora_rtc/IAgoraRtcEngine.h @@ -2282,6 +2282,45 @@ class IRtcEngineEventHandler { (void)cached; } + /** Occurs when the local user receives the rdt data from the remote user. + * + * The SDK triggers this callback when the user receives the data stream that another user sends + * by calling the \ref agora::rtc::IRtcEngine::sendRdtMessage "sendRdtMessage" method. + * + * @param userId ID of the user who sends the data. + * @param type The RDT stream type + * @param data The sending data. + * @param length The length (byte) of the data. + */ + virtual void onRdtMessage(uid_t userId, RdtStreamType type, const char *data, size_t length) { + (void)userId; + (void)type; + (void)data; + (void)length; + }; + + /** Occurs when the RDT tunnel state changed + * + * @param userId ID of the user who sends the data. + * @param state The RDT tunnel state + */ + virtual void onRdtStateChanged(uid_t userId, RdtState state) { + (void)userId; + (void)state; + } + + /** Occurs when the Media Control Message sent by others use sendMediaControlMessage + * + * @param userId ID of the user who sends the data. + * @param data The sending data. + * @param length The length (byte) of the data. + */ + virtual void onMediaControlMessage(uid_t userId, const char* data, size_t length) { + (void)userId; + (void)data; + (void)length; + } + /** * Occurs when the token expires. * @@ -7669,6 +7708,27 @@ class IRtcEngine : public agora::base::IEngineBase { */ virtual int sendStreamMessage(int streamId, const char* data, size_t length) = 0; + /** Send Reliable message to remote uid in channel. + * @param uid remote user id. + * @param type Reliable Data Transmission tunnel message type. + * @param data The pointer to the sent data. + * @param length The length of the sent data. + * @return + * - 0: Success. + * - < 0: Failure. + */ + virtual int sendRdtMessage(uid_t uid, RdtStreamType type, const char *data, size_t length) = 0; + + /** Send media control message + * @param uid Remote user id. In particular, if uid=0, the user is broadcast to the channel + * @param data The pointer to the sent data. + * @param length The length of the sent data, max 1024. + * @return + * - 0: Success. + * - < 0: Failure. + */ + virtual int sendMediaControlMessage(uid_t uid, const char* data, size_t length) = 0; + /** **DEPRECATED** Adds a watermark image to the local video or CDN live stream. This method is not recommend, Use \ref agora::rtc::IRtcEngine::addVideoWatermark(const char* watermarkUrl, const WatermarkOptions& options) "addVideoWatermark"2 instead. diff --git a/android/src/main/cpp/third_party/include/agora_rtc/IAgoraRtcEngineEx.h b/android/src/main/cpp/third_party/include/agora_rtc/IAgoraRtcEngineEx.h index b16dc604b..f901bbefa 100644 --- a/android/src/main/cpp/third_party/include/agora_rtc/IAgoraRtcEngineEx.h +++ b/android/src/main/cpp/third_party/include/agora_rtc/IAgoraRtcEngineEx.h @@ -72,6 +72,9 @@ class IRtcEngineEventHandlerEx : public IRtcEngineEventHandler { using IRtcEngineEventHandler::onConnectionBanned; using IRtcEngineEventHandler::onStreamMessage; using IRtcEngineEventHandler::onStreamMessageError; + using IRtcEngineEventHandler::onRdtMessage; + using IRtcEngineEventHandler::onRdtStateChanged; + using IRtcEngineEventHandler::onMediaControlMessage; using IRtcEngineEventHandler::onRequestToken; using IRtcEngineEventHandler::onTokenPrivilegeWillExpire; using IRtcEngineEventHandler::onLicenseValidationFailure; @@ -661,6 +664,51 @@ class IRtcEngineEventHandlerEx : public IRtcEngineEventHandler { (void)cached; } + /** Occurs when the local user receives the rdt data from the remote user. + * + * The SDK triggers this callback when the user receives the data stream that another user sends + * by calling the \ref agora::rtc::IRtcEngine::sendRdtMessage "sendRdtMessage" method. + * + * @param connection The RtcConnection object. + * @param userId ID of the user who sends the data. + * @param type The RDT stream type + * @param data The sending data. + * @param length The length (byte) of the data. + */ + virtual void onRdtMessage(const RtcConnection& connection, uid_t userId, RdtStreamType type, const char *data, size_t length) { + (void)connection; + (void)userId; + (void)type; + (void)data; + (void)length; + } + + /** Occurs when the RDT tunnel state changed + * + * @param connection The RtcConnection object. + * @param userId ID of the user who sends the data. + * @param state The RDT tunnel state + */ + virtual void onRdtStateChanged(const RtcConnection& connection, uid_t userId, RdtState state) { + (void)connection; + (void)userId; + (void)state; + } + + /** Occurs when the Media Control Message sent by others use sendMediaControlMessage + * + * @param connection The RtcConnection object. + * @param userId ID of the user who sends the data. + * @param data The sending data. + * @param length The length (byte) of the data. + */ + virtual void onMediaControlMessage(const RtcConnection& connection, uid_t userId, const char* data, size_t length) { + (void)connection; + (void)userId; + (void)data; + (void)length; + } + /** * Occurs when the token expires. * @@ -1690,6 +1738,30 @@ class IRtcEngineEx : public IRtcEngine { * - < 0: Failure. */ virtual int sendStreamMessageEx(int streamId, const char* data, size_t length, const RtcConnection& connection) = 0; + + /** Send Reliable message to remote uid in channel. + * @param uid Remote user id. + * @param type Reliable Data Transmission tunnel message type. + * @param data The pointer to the sent data. + * @param length The length of the sent data. + * @param connection The RtcConnection object. + * @return + * - 0: Success. + * - < 0: Failure. + */ + virtual int sendRdtMessageEx(uid_t uid, RdtStreamType type, const char *data, size_t length, const RtcConnection& connection) = 0; + + /** Send media control message + * @param uid Remote user id. In particular, if uid=0, the user is broadcast to the channel + * @param data The pointer to the sent data. + * @param length The length of the sent data, max 1024. + * @param connection The RtcConnection object. + * @return + * - 0: Success. + * - < 0: Failure. + */ + virtual int sendMediaControlMessageEx(uid_t uid, const char *data, size_t length, const RtcConnection& connection) = 0; + /** Adds a watermark image to the local video. This method adds a PNG watermark image to the local video in a live broadcast. Once the watermark image is added, all the audience in the channel (CDN audience included), diff --git a/example/lib/examples/advanced/index.dart b/example/lib/examples/advanced/index.dart index 452aa76d3..0389c1c4d 100644 --- a/example/lib/examples/advanced/index.dart +++ b/example/lib/examples/advanced/index.dart @@ -14,6 +14,7 @@ import 'package:agora_rtc_engine_example/examples/advanced/spatial_audio_with_me import 'package:agora_rtc_engine_example/examples/advanced/start_direct_cdn_streaming/start_direct_cdn_streaming.dart'; import 'package:agora_rtc_engine_example/examples/advanced/start_local_video_transcoder/start_local_video_transcoder.dart'; import 'package:agora_rtc_engine_example/examples/advanced/stream_message/stream_message.dart'; +import 'package:agora_rtc_engine_example/examples/advanced/stream_rdt_message/stream_rdt_message.dart'; import 'package:agora_rtc_engine_example/examples/advanced/take_snapshot/take_snapshot.dart'; import 'package:flutter/foundation.dart'; @@ -53,6 +54,7 @@ final advanced = [ 'widget': const SetVideoEncoderConfiguration() }, {'name': 'StreamMessage', 'widget': const StreamMessage()}, + if (!kIsWeb) {'name': 'StreamRdtMessage', 'widget': const StreamRdtMessage()}, if (!kIsWeb) {'name': 'VoiceChanger', 'widget': const VoiceChanger()}, if (!kIsWeb) { diff --git a/example/lib/examples/advanced/picture_in_picture/picture_in_picture.dart b/example/lib/examples/advanced/picture_in_picture/picture_in_picture.dart index 84fc80b9e..b3784bad6 100644 --- a/example/lib/examples/advanced/picture_in_picture/picture_in_picture.dart +++ b/example/lib/examples/advanced/picture_in_picture/picture_in_picture.dart @@ -50,7 +50,7 @@ class _State extends State with WidgetsBindingObserver { @override Future didChangeAppLifecycleState(AppLifecycleState state) async { super.didChangeAppLifecycleState(state); - if(Platform.isAndroid){ + if (Platform.isAndroid) { return; } if (state == AppLifecycleState.paused) { @@ -70,7 +70,7 @@ class _State extends State with WidgetsBindingObserver { @override Future dispose() async { - if(Platform.isIOS){ + if (Platform.isIOS) { await _engine.stopPip(); } WidgetsBinding.instance.removeObserver(this); @@ -206,7 +206,7 @@ class _State extends State with WidgetsBindingObserver { } Future _leaveChannel() async { - if(Platform.isIOS){ + if (Platform.isIOS) { await _engine.stopPip(); } await _engine.leaveChannel(); diff --git a/example/lib/examples/advanced/stream_rdt_message/stream_rdt_message.dart b/example/lib/examples/advanced/stream_rdt_message/stream_rdt_message.dart new file mode 100644 index 000000000..a88f4d59c --- /dev/null +++ b/example/lib/examples/advanced/stream_rdt_message/stream_rdt_message.dart @@ -0,0 +1,253 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:agora_rtc_engine/agora_rtc_engine.dart'; +import 'package:agora_rtc_engine_example/config/agora.config.dart' as config; +import 'package:agora_rtc_engine_example/components/example_actions_widget.dart'; +import 'package:agora_rtc_engine_example/components/log_sink.dart'; +import 'package:agora_rtc_engine_example/components/remote_video_views_widget.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:permission_handler/permission_handler.dart'; + +/// StreamRdtMessage Example +class StreamRdtMessage extends StatefulWidget { + /// Construct the [StreamRdtMessage] + const StreamRdtMessage({Key? key}) : super(key: key); + + @override + State createState() => _State(); +} + +class _State extends State with KeepRemoteVideoViewsMixin { + late final RtcEngine _engine; + bool _isReadyPreview = false; + bool isJoined = false; + bool _isRdtStateOpened = false; + late final TextEditingController _channelIdController; + late final TextEditingController _myUidController; + late final TextEditingController _toUidController; + final TextEditingController _controller = TextEditingController(); + + @override + void initState() { + super.initState(); + _channelIdController = TextEditingController(text: config.channelId); + _myUidController = TextEditingController(text: config.uid.toString()); + _toUidController = TextEditingController(text: '1000'); + _initEngine(); + } + + @override + void dispose() { + super.dispose(); + + _dispose(); + } + + Future _dispose() async { + await _engine.release(); + } + + Future _initEngine() async { + _engine = createAgoraRtcEngine(); + await _engine.initialize(RtcEngineContext( + appId: config.appId, + channelProfile: ChannelProfileType.channelProfileLiveBroadcasting, + )); + + _engine.registerEventHandler(RtcEngineEventHandler( + onError: (ErrorCodeType err, String msg) { + logSink.log('[onError] err: $err, msg: $msg'); + }, + onJoinChannelSuccess: (RtcConnection connection, int elapsed) { + logSink.log( + '[onJoinChannelSuccess] connection: ${connection.toJson()} elapsed: $elapsed'); + setState(() { + isJoined = true; + }); + }, + onLeaveChannel: (RtcConnection connection, RtcStats stats) { + logSink.log( + '[onLeaveChannel] connection: ${connection.toJson()} stats: ${stats.toJson()}'); + setState(() { + isJoined = false; + }); + }, + onRdtMessage: (connection, userId, type, data, length) { + logSink.log( + '[onRdtMessage] connection: ${connection.toJson()} userId: $userId, type: $type, data: $data, length: $length'); + _showMyDialog(userId, utf8.decode(data)); + }, + onRdtStateChanged: (connection, userId, state) { + logSink.log( + '[onRdtStateChanged] connection: ${connection.toJson()} userId: $userId, state: $state'); + + if (state == RdtState.rdtStateOpened) { + setState(() { + _isRdtStateOpened = true; + }); + } + }, + )); + + await _engine + .setParameters('{"rtc.rdt_auto_connect":true}'); + + // enable video module and set up video encoding configs + await _engine.enableVideo(); + + // make this room live broadcasting room + await _engine.setClientRole(role: ClientRoleType.clientRoleBroadcaster); + + setState(() { + _isReadyPreview = true; + }); + } + + Future _joinChannel() async { + if (defaultTargetPlatform == TargetPlatform.android) { + await [Permission.microphone, Permission.camera].request(); + } + + int? myUid = int.tryParse(_myUidController.text); + if (myUid == null) { + return; + } + + await _engine.joinChannel( + token: config.token, + channelId: _channelIdController.text, + uid: myUid, + options: const ChannelMediaOptions()); + } + + Future _leaveChannel() async { + await _engine.leaveChannel(); + } + + Future _showMyDialog(int uid, String data) async { + return showDialog( + context: context, + barrierDismissible: false, // user must tap button! + builder: (BuildContext context) { + return AlertDialog( + title: Text('Receive from uid:$uid'), + content: SingleChildScrollView( + child: ListBody( + children: [Text('data: $data')], + ), + ), + actions: [ + TextButton( + child: const Text('Ok'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + + Future _onPressSend() async { + if (_controller.text.isEmpty) { + return; + } + + int? toUid = int.tryParse(_toUidController.text); + if (toUid == null) { + return; + } + + try { + final data = Uint8List.fromList(utf8.encode(_controller.text)); + + await _engine.sendRdtMessage( + uid: toUid, + type: RdtStreamType.rdtStreamData, + data: data, + length: data.lengthInBytes); + + _controller.clear(); + } catch (e) { + logSink.log('sendRdtMessage error: ${e.toString()}'); + } + } + + @override + Widget build(BuildContext context) { + return ExampleActionsWidget( + displayContentBuilder: (context, isLayoutHorizontal) { + if (!_isReadyPreview) return Container(); + + return Stack( + children: [ + AgoraVideoView( + controller: VideoViewController( + rtcEngine: _engine, canvas: const VideoCanvas(uid: 0)), + ), + Align( + alignment: Alignment.topLeft, + child: RemoteVideoViewsWidget( + key: keepRemoteVideoViewsKey, + rtcEngine: _engine, + channelId: _controller.text, + connectionUid: int.tryParse(_controller.text), + ), + ) + ], + ); + }, + actionsBuilder: (context, isLayoutHorizontal) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + TextField( + controller: _channelIdController, + decoration: const InputDecoration(hintText: 'Channel ID'), + ), + TextField( + controller: _myUidController, + decoration: const InputDecoration(hintText: 'Input my uid'), + ), + TextField( + controller: _toUidController, + decoration: const InputDecoration(hintText: 'Input to uid'), + ), + Row( + children: [ + Expanded( + flex: 1, + child: ElevatedButton( + onPressed: isJoined ? _leaveChannel : _joinChannel, + child: Text('${isJoined ? 'Leave' : 'Join'} channel'), + ), + ) + ], + ), + if (isJoined) + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: TextField( + controller: _controller, + decoration: const InputDecoration( + hintText: 'Input Message', + ))), + ElevatedButton( + onPressed: _isRdtStateOpened ? _onPressSend : null, + child: const Text('Send'), + ), + ], + ) + ], + ); + }, + ); + } +} \ No newline at end of file diff --git a/internal/deps_summary.txt b/internal/deps_summary.txt index 3311c053f..8b8152d37 100644 --- a/internal/deps_summary.txt +++ b/internal/deps_summary.txt @@ -1,18 +1,18 @@ Iris: -https://download.agora.io/sdk/release/iris_4.3.2.11-build.1_DCG_Android_Video_20241206_1145_704.zip -https://download.agora.io/sdk/release/iris_4.3.2.11-build.1_DCG_iOS_Video_20241206_1148_579.zip +https://download.agora.io/sdk/release/iris_4.3.2.234-build.1_DCG_Android_Video_20241218_1023_711.zip +https://download.agora.io/sdk/release/iris_4.3.2.234-build.1_DCG_iOS_Video_20241218_1025_587.zip https://download.agora.io/sdk/release/iris_4.3.2.11-build.1_DCG_Mac_Video_20241206_1145_537.zip https://download.agora.io/sdk/release/iris_4.3.2.11-build.1_DCG_Windows_Video_20241206_1146_579.zip -implementation 'io.agora.rtc:iris-rtc:4.3.2.11-build.1' -pod 'AgoraIrisRTC_iOS', '4.3.2.11-build.1' +implementation 'io.agora.rtc:iris-rtc:4.3.2.234-build.1' +pod 'AgoraIrisRTC_iOS', '4.3.2.234-build.1' pod 'AgoraIrisRTC_macOS', '4.3.2.11-build.1' Native: - - +https://download.agora.io/sdk/release/Agora_Native_SDK_for_Android_rel.v4.3.2.234_67684_FULL_20241216_1150_481084.zip +https://download.agora.io/sdk/release/Agora_Native_SDK_for_iOS_rel.v4.3.2.234_48133_FULL_20241216_1153_481087.zip -implementation 'io.agora.rtc:agora-special-full:4.3.2.11' -implementation 'io.agora.rtc:full-screen-sharing:4.3.2.11' -pod 'AgoraRtcEngine_Special_iOS', '4.3.2.11' +implementation 'io.agora.rtc:agora-special-full:4.3.2.234' +implementation 'io.agora.rtc:full-screen-sharing:4.3.2.234' +pod 'AgoraRtcEngine_Special_iOS', '4.3.2.234' pod 'AgoraRtcEngine_Special_macOS', '4.3.2.11' \ No newline at end of file diff --git a/ios/agora_rtc_engine.podspec b/ios/agora_rtc_engine.podspec index 7a6b1ec8b..7bdde97cf 100644 --- a/ios/agora_rtc_engine.podspec +++ b/ios/agora_rtc_engine.podspec @@ -23,8 +23,8 @@ Pod::Spec.new do |s| puts '[plugin_dev] Found .plugin_dev file, use vendored_frameworks instead.' s.vendored_frameworks = 'libs/*.xcframework' else - s.dependency 'AgoraIrisRTC_iOS', '4.3.2.11-build.1' - s.dependency 'AgoraRtcEngine_Special_iOS', '4.3.2.11' + s.dependency 'AgoraIrisRTC_iOS', '4.3.2.234-build.1' + s.dependency 'AgoraRtcEngine_Special_iOS', '4.3.2.234' end s.platform = :ios, '9.0' diff --git a/lib/src/agora_base.dart b/lib/src/agora_base.dart index bff78c6ea..b7eb84507 100644 --- a/lib/src/agora_base.dart +++ b/lib/src/agora_base.dart @@ -423,6 +423,30 @@ enum ErrorCodeType { @JsonValue(201) errPcmsendBufferoverflow, + /// @nodoc + @JsonValue(250) + errRdtUserNotExist, + + /// @nodoc + @JsonValue(251) + errRdtUserNotReady, + + /// @nodoc + @JsonValue(252) + errRdtDataBlocked, + + /// @nodoc + @JsonValue(253) + errRdtCmdExceedLimit, + + /// @nodoc + @JsonValue(254) + errRdtDataExceedLimit, + + /// @nodoc + @JsonValue(255) + errRdtEncryption, + /// @nodoc @JsonValue(428) errLoginAlreadyLogin, @@ -7089,6 +7113,72 @@ class RecorderStreamInfo { Map toJson() => _$RecorderStreamInfoToJson(this); } +/// @nodoc +@JsonEnum(alwaysCreate: true) +enum RdtStreamType { + /// @nodoc + @JsonValue(0) + rdtStreamCmd, + + /// @nodoc + @JsonValue(1) + rdtStreamData, + + /// @nodoc + @JsonValue(2) + rdtStreamCount, +} + +/// @nodoc +extension RdtStreamTypeExt on RdtStreamType { + /// @nodoc + static RdtStreamType fromValue(int value) { + return $enumDecode(_$RdtStreamTypeEnumMap, value); + } + + /// @nodoc + int value() { + return _$RdtStreamTypeEnumMap[this]!; + } +} + +/// @nodoc +@JsonEnum(alwaysCreate: true) +enum RdtState { + /// @nodoc + @JsonValue(0) + rdtStateClosed, + + /// @nodoc + @JsonValue(1) + rdtStateOpened, + + /// @nodoc + @JsonValue(2) + rdtStateBlocked, + + /// @nodoc + @JsonValue(3) + rdtStatePending, + + /// @nodoc + @JsonValue(4) + rdtStateBroken, +} + +/// @nodoc +extension RdtStateExt on RdtState { + /// @nodoc + static RdtState fromValue(int value) { + return $enumDecode(_$RdtStateEnumMap, value); + } + + /// @nodoc + int value() { + return _$RdtStateEnumMap[this]!; + } +} + /// The spatial audio parameters. @JsonSerializable(explicitToJson: true, includeIfNull: false) class SpatialAudioParams { diff --git a/lib/src/agora_base.g.dart b/lib/src/agora_base.g.dart index f16e20d1b..8a55208fa 100644 --- a/lib/src/agora_base.g.dart +++ b/lib/src/agora_base.g.dart @@ -2359,6 +2359,12 @@ const _$ErrorCodeTypeEnumMap = { ErrorCodeType.errCertRequest: 168, ErrorCodeType.errPcmsendFormat: 200, ErrorCodeType.errPcmsendBufferoverflow: 201, + ErrorCodeType.errRdtUserNotExist: 250, + ErrorCodeType.errRdtUserNotReady: 251, + ErrorCodeType.errRdtDataBlocked: 252, + ErrorCodeType.errRdtCmdExceedLimit: 253, + ErrorCodeType.errRdtDataExceedLimit: 254, + ErrorCodeType.errRdtEncryption: 255, ErrorCodeType.errLoginAlreadyLogin: 428, ErrorCodeType.errLoadMediaEngine: 1001, ErrorCodeType.errAdmGeneralError: 1005, @@ -2986,3 +2992,17 @@ const _$ConfigFetchTypeEnumMap = { ConfigFetchType.configFetchTypeInitialize: 1, ConfigFetchType.configFetchTypeJoinChannel: 2, }; + +const _$RdtStreamTypeEnumMap = { + RdtStreamType.rdtStreamCmd: 0, + RdtStreamType.rdtStreamData: 1, + RdtStreamType.rdtStreamCount: 2, +}; + +const _$RdtStateEnumMap = { + RdtState.rdtStateClosed: 0, + RdtState.rdtStateOpened: 1, + RdtState.rdtStateBlocked: 2, + RdtState.rdtStatePending: 3, + RdtState.rdtStateBroken: 4, +}; diff --git a/lib/src/agora_rtc_engine.dart b/lib/src/agora_rtc_engine.dart index c51d063e5..02e6c908d 100644 --- a/lib/src/agora_rtc_engine.dart +++ b/lib/src/agora_rtc_engine.dart @@ -1706,6 +1706,9 @@ class RtcEngineEventHandler { this.onConnectionBanned, this.onStreamMessage, this.onStreamMessageError, + this.onRdtMessage, + this.onRdtStateChanged, + this.onMediaControlMessage, this.onRequestToken, this.onTokenPrivilegeWillExpire, this.onLicenseValidationFailure, @@ -1975,7 +1978,7 @@ class RtcEngineEventHandler { /// Occurs when the remote video stream state changes. /// - /// This callback does not work properly when the number of users (in the communication profile) or hosts (in the live streaming channel) in a channel exceeds 17. + /// This callback does not work properly when the number of users (in the communication profile) or hosts (in the live streaming channel) in a channel exceeds 32. /// /// * [connection] The connection information. See RtcConnection. /// * [remoteUid] The ID of the remote user whose video state changes. @@ -2004,7 +2007,7 @@ class RtcEngineEventHandler { /// Occurs when a remote user (in the communication profile)/ host (in the live streaming profile) joins the channel. /// /// In a communication channel, this callback indicates that a remote user joins the channel. The SDK also triggers this callback to report the existing users in the channel when a user joins the channel. - /// In a live-broadcast channel, this callback indicates that a host joins the channel. The SDK also triggers this callback to report the existing hosts in the channel when a host joins the channel. Agora recommends limiting the number of hosts to 17. + /// In a live-broadcast channel, this callback indicates that a host joins the channel. The SDK also triggers this callback to report the existing hosts in the channel when a host joins the channel. Agora recommends limiting the number of co-hosts to 32, with a maximum of 17 video hosts. /// /// * [connection] The connection information. See RtcConnection. /// * [remoteUid] The ID of the user or host who joins the channel. @@ -2026,7 +2029,7 @@ class RtcEngineEventHandler { /// Occurs when a remote user (in the communication profile) or a host (in the live streaming profile) stops/resumes sending the audio stream. /// - /// The SDK triggers this callback when the remote user stops or resumes sending the audio stream by calling the muteLocalAudioStream method. This callback does not work properly when the number of users (in the communication profile) or hosts (in the live streaming channel) in a channel exceeds 17. + /// The SDK triggers this callback when the remote user stops or resumes sending the audio stream by calling the muteLocalAudioStream method. This callback does not work properly when the number of users (in the communication profile) or hosts (in the live streaming channel) in a channel exceeds 32. /// /// * [connection] The connection information. See RtcConnection. /// * [remoteUid] The user ID. @@ -2036,7 +2039,7 @@ class RtcEngineEventHandler { /// Occurs when a remote user stops or resumes publishing the video stream. /// - /// When a remote user calls muteLocalVideoStream to stop or resume publishing the video stream, the SDK triggers this callback to report to the local user the state of the streams published by the remote user. This callback can be inaccurate when the number of users (in the communication profile) or hosts (in the live streaming profile) in a channel exceeds 17. + /// When a remote user calls muteLocalVideoStream to stop or resume publishing the video stream, the SDK triggers this callback to report to the local user the state of the streams published by the remote user. This callback can be inaccurate when the number of users (in the communication profile) or hosts (in the live streaming profile) in a channel exceeds 32. /// /// * [connection] The connection information. See RtcConnection. /// * [remoteUid] The user ID of the remote user. @@ -2221,6 +2224,19 @@ class RtcEngineEventHandler { final void Function(RtcConnection connection, int remoteUid, int streamId, ErrorCodeType code, int missed, int cached)? onStreamMessageError; + /// @nodoc + final void Function(RtcConnection connection, int userId, RdtStreamType type, + Uint8List data, int length)? onRdtMessage; + + /// @nodoc + final void Function(RtcConnection connection, int userId, RdtState state)? + onRdtStateChanged; + + /// @nodoc + final void Function( + RtcConnection connection, int userId, Uint8List data, int length)? + onMediaControlMessage; + /// Occurs when the token expires. /// /// The SDK triggers this callback if the token expires. When receiving this callback, you need to generate a new token on your token server and you can renew your token through one of the following ways: @@ -2299,7 +2315,7 @@ class RtcEngineEventHandler { /// Occurs when the remote audio state changes. /// - /// When the audio state of a remote user (in a voice/video call channel) or host (in a live streaming channel) changes, the SDK triggers this callback to report the current state of the remote audio stream. This callback does not work properly when the number of users (in the communication profile) or hosts (in the live streaming channel) in a channel exceeds 17. + /// When the audio state of a remote user (in a voice/video call channel) or host (in a live streaming channel) changes, the SDK triggers this callback to report the current state of the remote audio stream. This callback does not work properly when the number of users (in the communication profile) or hosts (in the live streaming channel) in a channel exceeds 32. /// /// * [connection] The connection information. See RtcConnection. /// * [remoteUid] The ID of the remote user whose audio state changes. @@ -4876,7 +4892,6 @@ abstract class RtcEngine { /// /// If you enable loopback audio capturing, the output of the sound card is mixed into the audio stream sent to the other end. /// This method applies to the macOS and Windows only. - /// The macOS system's default sound card does not support recording functionality. As of v4.5.0, when you call this method for the first time, the SDK will automatically install the built-in AgoraALD virtual sound card developed by Agora. After successful installation, the audio routing will automatically switch to the virtual sound card and use it for audio capturing. /// You can call this method either before or after joining a channel. /// If you call the disableAudio method to disable the audio module, audio capturing will be disabled as well. If you need to enable audio capturing, call the enableAudio method to enable the audio module and then call the enableLoopbackRecording method. /// @@ -5682,6 +5697,17 @@ abstract class RtcEngine { Future sendStreamMessage( {required int streamId, required Uint8List data, required int length}); + /// @nodoc + Future sendRdtMessage( + {required int uid, + required RdtStreamType type, + required Uint8List data, + required int length}); + + /// @nodoc + Future sendMediaControlMessage( + {required int uid, required Uint8List data, required int length}); + /// Adds a watermark image to the local video. /// /// This method adds a PNG watermark image to the local video in the live streaming. Once the watermark image is added, all the audience in the channel (CDN audience included), and the capturing device can see and capture it. The Agora SDK supports adding only one watermark image onto a local video or CDN live stream. The newly added watermark image replaces the previous one. The watermark coordinates are dependent on the settings in the setVideoEncoderConfiguration method: diff --git a/lib/src/agora_rtc_engine_ex.dart b/lib/src/agora_rtc_engine_ex.dart index feb01f6bf..1ffafd818 100644 --- a/lib/src/agora_rtc_engine_ex.dart +++ b/lib/src/agora_rtc_engine_ex.dart @@ -452,6 +452,21 @@ abstract class RtcEngineEx implements RtcEngine { required int length, required RtcConnection connection}); + /// @nodoc + Future sendRdtMessageEx( + {required int uid, + required RdtStreamType type, + required Uint8List data, + required int length, + required RtcConnection connection}); + + /// @nodoc + Future sendMediaControlMessageEx( + {required int uid, + required Uint8List data, + required int length, + required RtcConnection connection}); + /// Adds a watermark image to the local video. /// /// This method adds a PNG watermark image to the local video in the live streaming. Once the watermark image is added, all the audience in the channel (CDN audience included), and the capturing device can see and capture it. The Agora SDK supports adding only one watermark image onto a local video or CDN live stream. The newly added watermark image replaces the previous one. The watermark coordinates are dependent on the settings in the setVideoEncoderConfigurationEx method: diff --git a/lib/src/binding/agora_rtc_engine_event_impl.dart b/lib/src/binding/agora_rtc_engine_event_impl.dart index 45f8b587c..772d6104a 100644 --- a/lib/src/binding/agora_rtc_engine_event_impl.dart +++ b/lib/src/binding/agora_rtc_engine_event_impl.dart @@ -981,6 +981,72 @@ class RtcEngineEventHandlerWrapper implements EventLoopEventHandler { connection, remoteUid, streamId, code, missed, cached); return true; + case 'onRdtMessage_1f6f532': + if (rtcEngineEventHandler.onRdtMessage == null) { + return true; + } + final jsonMap = jsonDecode(eventData); + RtcEngineEventHandlerOnRdtMessageJson paramJson = + RtcEngineEventHandlerOnRdtMessageJson.fromJson(jsonMap); + paramJson = paramJson.fillBuffers(buffers); + RtcConnection? connection = paramJson.connection; + int? userId = paramJson.userId; + RdtStreamType? type = paramJson.type; + Uint8List? data = paramJson.data; + int? length = paramJson.length; + if (connection == null || + userId == null || + type == null || + data == null || + length == null) { + return true; + } + connection = connection.fillBuffers(buffers); + rtcEngineEventHandler.onRdtMessage!( + connection, userId, type, data, length); + return true; + + case 'onRdtStateChanged_bf4ade0': + if (rtcEngineEventHandler.onRdtStateChanged == null) { + return true; + } + final jsonMap = jsonDecode(eventData); + RtcEngineEventHandlerOnRdtStateChangedJson paramJson = + RtcEngineEventHandlerOnRdtStateChangedJson.fromJson(jsonMap); + paramJson = paramJson.fillBuffers(buffers); + RtcConnection? connection = paramJson.connection; + int? userId = paramJson.userId; + RdtState? state = paramJson.state; + if (connection == null || userId == null || state == null) { + return true; + } + connection = connection.fillBuffers(buffers); + rtcEngineEventHandler.onRdtStateChanged!(connection, userId, state); + return true; + + case 'onMediaControlMessage_0d4eb96': + if (rtcEngineEventHandler.onMediaControlMessage == null) { + return true; + } + final jsonMap = jsonDecode(eventData); + RtcEngineEventHandlerOnMediaControlMessageJson paramJson = + RtcEngineEventHandlerOnMediaControlMessageJson.fromJson(jsonMap); + paramJson = paramJson.fillBuffers(buffers); + RtcConnection? connection = paramJson.connection; + int? userId = paramJson.userId; + Uint8List? data = paramJson.data; + int? length = paramJson.length; + if (connection == null || + userId == null || + data == null || + length == null) { + return true; + } + connection = connection.fillBuffers(buffers); + rtcEngineEventHandler.onMediaControlMessage!( + connection, userId, data, length); + return true; + case 'onRequestToken_c81e1a4': if (rtcEngineEventHandler.onRequestToken == null) { return true; diff --git a/lib/src/binding/agora_rtc_engine_ex_impl.dart b/lib/src/binding/agora_rtc_engine_ex_impl.dart index ca61ea582..c717701a2 100644 --- a/lib/src/binding/agora_rtc_engine_ex_impl.dart +++ b/lib/src/binding/agora_rtc_engine_ex_impl.dart @@ -731,6 +731,61 @@ class RtcEngineExImpl extends RtcEngineImpl implements RtcEngineEx { } } + @override + Future sendRdtMessageEx( + {required int uid, + required RdtStreamType type, + required Uint8List data, + required int length, + required RtcConnection connection}) async { + final apiType = + '${isOverrideClassName ? className : 'RtcEngineEx'}_sendRdtMessageEx_3a2998e'; + final param = createParams({ + 'uid': uid, + 'type': type.value(), + 'length': length, + 'connection': connection.toJson() + }); + final List buffers = []; + buffers.add(data); + buffers.addAll(connection.collectBufferList()); + final callApiResult = await irisMethodChannel.invokeMethod( + IrisMethodCall(apiType, jsonEncode(param), buffers: buffers)); + if (callApiResult.irisReturnCode < 0) { + throw AgoraRtcException(code: callApiResult.irisReturnCode); + } + final rm = callApiResult.data; + final result = rm['result']; + if (result < 0) { + throw AgoraRtcException(code: result); + } + } + + @override + Future sendMediaControlMessageEx( + {required int uid, + required Uint8List data, + required int length, + required RtcConnection connection}) async { + final apiType = + '${isOverrideClassName ? className : 'RtcEngineEx'}_sendMediaControlMessageEx_907822a'; + final param = createParams( + {'uid': uid, 'length': length, 'connection': connection.toJson()}); + final List buffers = []; + buffers.add(data); + buffers.addAll(connection.collectBufferList()); + final callApiResult = await irisMethodChannel.invokeMethod( + IrisMethodCall(apiType, jsonEncode(param), buffers: buffers)); + if (callApiResult.irisReturnCode < 0) { + throw AgoraRtcException(code: callApiResult.irisReturnCode); + } + final rm = callApiResult.data; + final result = rm['result']; + if (result < 0) { + throw AgoraRtcException(code: result); + } + } + @override Future addVideoWatermarkEx( {required String watermarkUrl, diff --git a/lib/src/binding/agora_rtc_engine_impl.dart b/lib/src/binding/agora_rtc_engine_impl.dart index e2b9f190c..eb6423c26 100644 --- a/lib/src/binding/agora_rtc_engine_impl.dart +++ b/lib/src/binding/agora_rtc_engine_impl.dart @@ -4395,6 +4395,50 @@ class RtcEngineImpl implements RtcEngine { } } + @override + Future sendRdtMessage( + {required int uid, + required RdtStreamType type, + required Uint8List data, + required int length}) async { + final apiType = + '${isOverrideClassName ? className : 'RtcEngine'}_sendRdtMessage_ea5e5d7'; + final param = + createParams({'uid': uid, 'type': type.value(), 'length': length}); + final List buffers = []; + buffers.add(data); + final callApiResult = await irisMethodChannel.invokeMethod( + IrisMethodCall(apiType, jsonEncode(param), buffers: buffers)); + if (callApiResult.irisReturnCode < 0) { + throw AgoraRtcException(code: callApiResult.irisReturnCode); + } + final rm = callApiResult.data; + final result = rm['result']; + if (result < 0) { + throw AgoraRtcException(code: result); + } + } + + @override + Future sendMediaControlMessage( + {required int uid, required Uint8List data, required int length}) async { + final apiType = + '${isOverrideClassName ? className : 'RtcEngine'}_sendMediaControlMessage_77edd82'; + final param = createParams({'uid': uid, 'length': length}); + final List buffers = []; + buffers.add(data); + final callApiResult = await irisMethodChannel.invokeMethod( + IrisMethodCall(apiType, jsonEncode(param), buffers: buffers)); + if (callApiResult.irisReturnCode < 0) { + throw AgoraRtcException(code: callApiResult.irisReturnCode); + } + final rm = callApiResult.data; + final result = rm['result']; + if (result < 0) { + throw AgoraRtcException(code: result); + } + } + @override Future addVideoWatermark( {required String watermarkUrl, required WatermarkOptions options}) async { diff --git a/lib/src/binding/event_handler_param_json.dart b/lib/src/binding/event_handler_param_json.dart index 1feb16e27..9c2f87be5 100644 --- a/lib/src/binding/event_handler_param_json.dart +++ b/lib/src/binding/event_handler_param_json.dart @@ -3203,6 +3203,143 @@ extension RtcEngineEventHandlerOnStreamMessageErrorJsonBufferExt } } +@JsonSerializable(explicitToJson: true, includeIfNull: false) +class RtcEngineEventHandlerOnRdtMessageJson { + const RtcEngineEventHandlerOnRdtMessageJson( + {this.connection, this.userId, this.type, this.data, this.length}); + + @JsonKey(name: 'connection') + final RtcConnection? connection; + + @JsonKey(name: 'userId') + final int? userId; + + @JsonKey(name: 'type') + final RdtStreamType? type; + + @JsonKey(name: 'data', ignore: true) + final Uint8List? data; + + @JsonKey(name: 'length') + final int? length; + + factory RtcEngineEventHandlerOnRdtMessageJson.fromJson( + Map json) => + _$RtcEngineEventHandlerOnRdtMessageJsonFromJson(json); + + Map toJson() => + _$RtcEngineEventHandlerOnRdtMessageJsonToJson(this); +} + +extension RtcEngineEventHandlerOnRdtMessageJsonBufferExt + on RtcEngineEventHandlerOnRdtMessageJson { + RtcEngineEventHandlerOnRdtMessageJson fillBuffers( + List bufferList) { + if (bufferList.isEmpty) return this; + Uint8List? data; + if (bufferList.length > 0) { + data = bufferList[0]; + } + return RtcEngineEventHandlerOnRdtMessageJson( + connection: connection, + userId: userId, + type: type, + data: data, + length: length); + } + + List collectBufferList() { + final bufferList = []; + if (data != null) { + bufferList.add(data!); + } + return bufferList; + } +} + +@JsonSerializable(explicitToJson: true, includeIfNull: false) +class RtcEngineEventHandlerOnRdtStateChangedJson { + const RtcEngineEventHandlerOnRdtStateChangedJson( + {this.connection, this.userId, this.state}); + + @JsonKey(name: 'connection') + final RtcConnection? connection; + + @JsonKey(name: 'userId') + final int? userId; + + @JsonKey(name: 'state') + final RdtState? state; + + factory RtcEngineEventHandlerOnRdtStateChangedJson.fromJson( + Map json) => + _$RtcEngineEventHandlerOnRdtStateChangedJsonFromJson(json); + + Map toJson() => + _$RtcEngineEventHandlerOnRdtStateChangedJsonToJson(this); +} + +extension RtcEngineEventHandlerOnRdtStateChangedJsonBufferExt + on RtcEngineEventHandlerOnRdtStateChangedJson { + RtcEngineEventHandlerOnRdtStateChangedJson fillBuffers( + List bufferList) { + if (bufferList.isEmpty) return this; + return this; + } + + List collectBufferList() { + final bufferList = []; + return bufferList; + } +} + +@JsonSerializable(explicitToJson: true, includeIfNull: false) +class RtcEngineEventHandlerOnMediaControlMessageJson { + const RtcEngineEventHandlerOnMediaControlMessageJson( + {this.connection, this.userId, this.data, this.length}); + + @JsonKey(name: 'connection') + final RtcConnection? connection; + + @JsonKey(name: 'userId') + final int? userId; + + @JsonKey(name: 'data', ignore: true) + final Uint8List? data; + + @JsonKey(name: 'length') + final int? length; + + factory RtcEngineEventHandlerOnMediaControlMessageJson.fromJson( + Map json) => + _$RtcEngineEventHandlerOnMediaControlMessageJsonFromJson(json); + + Map toJson() => + _$RtcEngineEventHandlerOnMediaControlMessageJsonToJson(this); +} + +extension RtcEngineEventHandlerOnMediaControlMessageJsonBufferExt + on RtcEngineEventHandlerOnMediaControlMessageJson { + RtcEngineEventHandlerOnMediaControlMessageJson fillBuffers( + List bufferList) { + if (bufferList.isEmpty) return this; + Uint8List? data; + if (bufferList.length > 0) { + data = bufferList[0]; + } + return RtcEngineEventHandlerOnMediaControlMessageJson( + connection: connection, userId: userId, data: data, length: length); + } + + List collectBufferList() { + final bufferList = []; + if (data != null) { + bufferList.add(data!); + } + return bufferList; + } +} + @JsonSerializable(explicitToJson: true, includeIfNull: false) class RtcEngineEventHandlerOnRequestTokenJson { const RtcEngineEventHandlerOnRequestTokenJson({this.connection}); diff --git a/lib/src/binding/event_handler_param_json.g.dart b/lib/src/binding/event_handler_param_json.g.dart index ad9da2713..6767b6384 100644 --- a/lib/src/binding/event_handler_param_json.g.dart +++ b/lib/src/binding/event_handler_param_json.g.dart @@ -1351,6 +1351,12 @@ const _$ErrorCodeTypeEnumMap = { ErrorCodeType.errCertRequest: 168, ErrorCodeType.errPcmsendFormat: 200, ErrorCodeType.errPcmsendBufferoverflow: 201, + ErrorCodeType.errRdtUserNotExist: 250, + ErrorCodeType.errRdtUserNotReady: 251, + ErrorCodeType.errRdtDataBlocked: 252, + ErrorCodeType.errRdtCmdExceedLimit: 253, + ErrorCodeType.errRdtDataExceedLimit: 254, + ErrorCodeType.errRdtEncryption: 255, ErrorCodeType.errLoginAlreadyLogin: 428, ErrorCodeType.errLoadMediaEngine: 1001, ErrorCodeType.errAdmGeneralError: 1005, @@ -2725,6 +2731,106 @@ Map _$RtcEngineEventHandlerOnStreamMessageErrorJsonToJson( return val; } +RtcEngineEventHandlerOnRdtMessageJson + _$RtcEngineEventHandlerOnRdtMessageJsonFromJson( + Map json) => + RtcEngineEventHandlerOnRdtMessageJson( + connection: json['connection'] == null + ? null + : RtcConnection.fromJson( + json['connection'] as Map), + userId: (json['userId'] as num?)?.toInt(), + type: $enumDecodeNullable(_$RdtStreamTypeEnumMap, json['type']), + length: (json['length'] as num?)?.toInt(), + ); + +Map _$RtcEngineEventHandlerOnRdtMessageJsonToJson( + RtcEngineEventHandlerOnRdtMessageJson instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('connection', instance.connection?.toJson()); + writeNotNull('userId', instance.userId); + writeNotNull('type', _$RdtStreamTypeEnumMap[instance.type]); + writeNotNull('length', instance.length); + return val; +} + +const _$RdtStreamTypeEnumMap = { + RdtStreamType.rdtStreamCmd: 0, + RdtStreamType.rdtStreamData: 1, + RdtStreamType.rdtStreamCount: 2, +}; + +RtcEngineEventHandlerOnRdtStateChangedJson + _$RtcEngineEventHandlerOnRdtStateChangedJsonFromJson( + Map json) => + RtcEngineEventHandlerOnRdtStateChangedJson( + connection: json['connection'] == null + ? null + : RtcConnection.fromJson( + json['connection'] as Map), + userId: (json['userId'] as num?)?.toInt(), + state: $enumDecodeNullable(_$RdtStateEnumMap, json['state']), + ); + +Map _$RtcEngineEventHandlerOnRdtStateChangedJsonToJson( + RtcEngineEventHandlerOnRdtStateChangedJson instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('connection', instance.connection?.toJson()); + writeNotNull('userId', instance.userId); + writeNotNull('state', _$RdtStateEnumMap[instance.state]); + return val; +} + +const _$RdtStateEnumMap = { + RdtState.rdtStateClosed: 0, + RdtState.rdtStateOpened: 1, + RdtState.rdtStateBlocked: 2, + RdtState.rdtStatePending: 3, + RdtState.rdtStateBroken: 4, +}; + +RtcEngineEventHandlerOnMediaControlMessageJson + _$RtcEngineEventHandlerOnMediaControlMessageJsonFromJson( + Map json) => + RtcEngineEventHandlerOnMediaControlMessageJson( + connection: json['connection'] == null + ? null + : RtcConnection.fromJson( + json['connection'] as Map), + userId: (json['userId'] as num?)?.toInt(), + length: (json['length'] as num?)?.toInt(), + ); + +Map _$RtcEngineEventHandlerOnMediaControlMessageJsonToJson( + RtcEngineEventHandlerOnMediaControlMessageJson instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('connection', instance.connection?.toJson()); + writeNotNull('userId', instance.userId); + writeNotNull('length', instance.length); + return val; +} + RtcEngineEventHandlerOnRequestTokenJson _$RtcEngineEventHandlerOnRequestTokenJsonFromJson( Map json) => diff --git a/pubspec.yaml b/pubspec.yaml index 926cc8719..53bd701be 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: agora_rtc_engine description: >- Flutter plugin of Agora RTC SDK, allow you to simply integrate Agora Video Calling or Live Video Streaming to your app with just a few lines of code. -version: 6.3.2-sp.43211 +version: 6.3.2-sp.432234 homepage: https://www.agora.io repository: https://github.com/AgoraIO-Extensions/Agora-Flutter-SDK/tree/main environment: diff --git a/scripts/artifacts_version.sh b/scripts/artifacts_version.sh index a1b8899fd..e45260486 100644 --- a/scripts/artifacts_version.sh +++ b/scripts/artifacts_version.sh @@ -1,6 +1,6 @@ set -e -export IRIS_CDN_URL_ANDROID="https://download.agora.io/sdk/release/iris_4.3.2.11-build.1_DCG_Android_Video_20241206_1145_704.zip" -export IRIS_CDN_URL_IOS="https://download.agora.io/sdk/release/iris_4.3.2.11-build.1_DCG_iOS_Video_20241206_1148_579.zip" +export IRIS_CDN_URL_ANDROID="https://download.agora.io/sdk/release/iris_4.3.2.234-build.1_DCG_Android_Video_20241218_1023_711.zip" +export IRIS_CDN_URL_IOS="https://download.agora.io/sdk/release/iris_4.3.2.234-build.1_DCG_iOS_Video_20241218_1025_587.zip" export IRIS_CDN_URL_MACOS="https://download.agora.io/sdk/release/iris_4.3.2.11-build.1_DCG_Mac_Video_20241206_1145_537.zip" export IRIS_CDN_URL_WINDOWS="https://download.agora.io/sdk/release/iris_4.3.2.11-build.1_DCG_Windows_Video_20241206_1146_579.zip" diff --git a/test_shard/fake_test_app/integration_test/generated/event_ids_mapping_gen.dart b/test_shard/fake_test_app/integration_test/generated/event_ids_mapping_gen.dart index a91c4f8ad..b709a4827 100644 --- a/test_shard/fake_test_app/integration_test/generated/event_ids_mapping_gen.dart +++ b/test_shard/fake_test_app/integration_test/generated/event_ids_mapping_gen.dart @@ -267,6 +267,15 @@ const eventIdsMapping = { "RtcEngineEventHandler_onStreamMessageError": [ "RtcEngineEventHandler_onStreamMessageError_fe302fc" ], + "RtcEngineEventHandler_onRdtMessage": [ + "RtcEngineEventHandler_onRdtMessage_1f6f532" + ], + "RtcEngineEventHandler_onRdtStateChanged": [ + "RtcEngineEventHandler_onRdtStateChanged_bf4ade0" + ], + "RtcEngineEventHandler_onMediaControlMessage": [ + "RtcEngineEventHandler_onMediaControlMessage_0d4eb96" + ], "RtcEngineEventHandler_onRequestToken": [ "RtcEngineEventHandler_onRequestToken_c81e1a4" ], diff --git a/test_shard/fake_test_app/integration_test/generated/rtcengine_fake_test.generated.dart b/test_shard/fake_test_app/integration_test/generated/rtcengine_fake_test.generated.dart index ab7212fbf..de073c61b 100644 --- a/test_shard/fake_test_app/integration_test/generated/rtcengine_fake_test.generated.dart +++ b/test_shard/fake_test_app/integration_test/generated/rtcengine_fake_test.generated.dart @@ -8319,6 +8319,12 @@ void rtcEngineSmokeTestCases() { int streamId, Uint8List data, int length, int sentTs) {}, onStreamMessageError: (RtcConnection connection, int remoteUid, int streamId, ErrorCodeType code, int missed, int cached) {}, + onRdtMessage: (RtcConnection connection, int userId, + RdtStreamType type, Uint8List data, int length) {}, + onRdtStateChanged: + (RtcConnection connection, int userId, RdtState state) {}, + onMediaControlMessage: (RtcConnection connection, int userId, + Uint8List data, int length) {}, onRequestToken: (RtcConnection connection) {}, onTokenPrivilegeWillExpire: (RtcConnection connection, String token) {}, @@ -8537,6 +8543,12 @@ void rtcEngineSmokeTestCases() { int streamId, Uint8List data, int length, int sentTs) {}, onStreamMessageError: (RtcConnection connection, int remoteUid, int streamId, ErrorCodeType code, int missed, int cached) {}, + onRdtMessage: (RtcConnection connection, int userId, + RdtStreamType type, Uint8List data, int length) {}, + onRdtStateChanged: + (RtcConnection connection, int userId, RdtState state) {}, + onMediaControlMessage: (RtcConnection connection, int userId, + Uint8List data, int length) {}, onRequestToken: (RtcConnection connection) {}, onTokenPrivilegeWillExpire: (RtcConnection connection, String token) {}, @@ -8843,6 +8855,85 @@ void rtcEngineSmokeTestCases() { }, ); + testWidgets( + 'RtcEngine.sendRdtMessage', + (WidgetTester tester) async { + String engineAppId = const String.fromEnvironment('TEST_APP_ID', + defaultValue: ''); + + RtcEngine rtcEngine = createAgoraRtcEngine(); + await rtcEngine.initialize(RtcEngineContext( + appId: engineAppId, + areaCode: AreaCode.areaCodeGlob.value(), + )); + await rtcEngine.setParameters('{"rtc.enable_debug_log": true}'); + + try { + int uid = 5; + RdtStreamType type = RdtStreamType.rdtStreamCmd; + Uint8List data = Uint8List.fromList([1, 1, 1, 1, 1]); + int length = 5; + await rtcEngine.sendRdtMessage( + uid: uid, + type: type, + data: data, + length: length, + ); + } catch (e) { + if (e is! AgoraRtcException) { + debugPrint('[RtcEngine.sendRdtMessage] error: ${e.toString()}'); + rethrow; + } + + if (e.code != -4) { + // Only not supported error supported. + rethrow; + } + } + + await rtcEngine.release(); + }, + ); + + testWidgets( + 'RtcEngine.sendMediaControlMessage', + (WidgetTester tester) async { + String engineAppId = const String.fromEnvironment('TEST_APP_ID', + defaultValue: ''); + + RtcEngine rtcEngine = createAgoraRtcEngine(); + await rtcEngine.initialize(RtcEngineContext( + appId: engineAppId, + areaCode: AreaCode.areaCodeGlob.value(), + )); + await rtcEngine.setParameters('{"rtc.enable_debug_log": true}'); + + try { + int uid = 5; + Uint8List data = Uint8List.fromList([1, 1, 1, 1, 1]); + int length = 5; + await rtcEngine.sendMediaControlMessage( + uid: uid, + data: data, + length: length, + ); + } catch (e) { + if (e is! AgoraRtcException) { + debugPrint( + '[RtcEngine.sendMediaControlMessage] error: ${e.toString()}'); + rethrow; + } + + if (e.code != -4) { + // Only not supported error supported. + rethrow; + } + } + + await rtcEngine.release(); + }, + ); + testWidgets( 'RtcEngine.addVideoWatermark', (WidgetTester tester) async { diff --git a/test_shard/fake_test_app/integration_test/generated/rtcengine_rtcengineeventhandler_testcases.generated.dart b/test_shard/fake_test_app/integration_test/generated/rtcengine_rtcengineeventhandler_testcases.generated.dart index 47d6bb755..56e7dd0d6 100644 --- a/test_shard/fake_test_app/integration_test/generated/rtcengine_rtcengineeventhandler_testcases.generated.dart +++ b/test_shard/fake_test_app/integration_test/generated/rtcengine_rtcengineeventhandler_testcases.generated.dart @@ -3547,6 +3547,229 @@ void generatedTestCases(ValueGetter irisTester) { timeout: const Timeout(Duration(minutes: 2)), ); + testWidgets( + 'RtcEngineEventHandler.onRdtMessage', + (WidgetTester tester) async { + RtcEngine rtcEngine = createAgoraRtcEngine(); + await rtcEngine.initialize(RtcEngineContext( + appId: 'app_id', + areaCode: AreaCode.areaCodeGlob.value(), + )); + await rtcEngine.setParameters('{"rtc.enable_debug_log": true}'); + + final onRdtMessageCompleter = Completer(); + final theRtcEngineEventHandler = RtcEngineEventHandler( + onRdtMessage: (RtcConnection connection, int userId, RdtStreamType type, + Uint8List data, int length) { + onRdtMessageCompleter.complete(true); + }, + ); + + rtcEngine.registerEventHandler( + theRtcEngineEventHandler, + ); + +// Delay 500 milliseconds to ensure the registerEventHandler call completed. + await Future.delayed(const Duration(milliseconds: 500)); + + { + String connectionChannelId = "hello"; + int connectionLocalUid = 5; + RtcConnection connection = RtcConnection( + channelId: connectionChannelId, + localUid: connectionLocalUid, + ); + int userId = 5; + RdtStreamType type = RdtStreamType.rdtStreamCmd; + Uint8List data = Uint8List.fromList([1, 1, 1, 1, 1]); + int length = 5; + + final eventJson = { + 'connection': connection.toJson(), + 'userId': userId, + 'type': type.value(), + 'data': data.toList(), + 'length': length, + }; + + final eventIds = + eventIdsMapping['RtcEngineEventHandler_onRdtMessage'] ?? []; + for (final event in eventIds) { + final ret = irisTester().fireEvent(event, params: eventJson); + // Delay 200 milliseconds to ensure the callback is called. + await Future.delayed(const Duration(milliseconds: 200)); + // TODO(littlegnal): Most of callbacks on web are not implemented, we're temporarily skip these callbacks at this time. + if (kIsWeb && ret) { + if (!onRdtMessageCompleter.isCompleted) { + onRdtMessageCompleter.complete(true); + } + } + } + } + + final eventCalled = await onRdtMessageCompleter.future; + expect(eventCalled, isTrue); + + { + rtcEngine.unregisterEventHandler( + theRtcEngineEventHandler, + ); + } +// Delay 500 milliseconds to ensure the unregisterEventHandler call completed. + await Future.delayed(const Duration(milliseconds: 500)); + + await rtcEngine.release(); + }, + timeout: const Timeout(Duration(minutes: 2)), + ); + + testWidgets( + 'RtcEngineEventHandler.onRdtStateChanged', + (WidgetTester tester) async { + RtcEngine rtcEngine = createAgoraRtcEngine(); + await rtcEngine.initialize(RtcEngineContext( + appId: 'app_id', + areaCode: AreaCode.areaCodeGlob.value(), + )); + await rtcEngine.setParameters('{"rtc.enable_debug_log": true}'); + + final onRdtStateChangedCompleter = Completer(); + final theRtcEngineEventHandler = RtcEngineEventHandler( + onRdtStateChanged: + (RtcConnection connection, int userId, RdtState state) { + onRdtStateChangedCompleter.complete(true); + }, + ); + + rtcEngine.registerEventHandler( + theRtcEngineEventHandler, + ); + +// Delay 500 milliseconds to ensure the registerEventHandler call completed. + await Future.delayed(const Duration(milliseconds: 500)); + + { + String connectionChannelId = "hello"; + int connectionLocalUid = 5; + RtcConnection connection = RtcConnection( + channelId: connectionChannelId, + localUid: connectionLocalUid, + ); + int userId = 5; + RdtState state = RdtState.rdtStateClosed; + + final eventJson = { + 'connection': connection.toJson(), + 'userId': userId, + 'state': state.value(), + }; + + final eventIds = + eventIdsMapping['RtcEngineEventHandler_onRdtStateChanged'] ?? []; + for (final event in eventIds) { + final ret = irisTester().fireEvent(event, params: eventJson); + // Delay 200 milliseconds to ensure the callback is called. + await Future.delayed(const Duration(milliseconds: 200)); + // TODO(littlegnal): Most of callbacks on web are not implemented, we're temporarily skip these callbacks at this time. + if (kIsWeb && ret) { + if (!onRdtStateChangedCompleter.isCompleted) { + onRdtStateChangedCompleter.complete(true); + } + } + } + } + + final eventCalled = await onRdtStateChangedCompleter.future; + expect(eventCalled, isTrue); + + { + rtcEngine.unregisterEventHandler( + theRtcEngineEventHandler, + ); + } +// Delay 500 milliseconds to ensure the unregisterEventHandler call completed. + await Future.delayed(const Duration(milliseconds: 500)); + + await rtcEngine.release(); + }, + timeout: const Timeout(Duration(minutes: 2)), + ); + + testWidgets( + 'RtcEngineEventHandler.onMediaControlMessage', + (WidgetTester tester) async { + RtcEngine rtcEngine = createAgoraRtcEngine(); + await rtcEngine.initialize(RtcEngineContext( + appId: 'app_id', + areaCode: AreaCode.areaCodeGlob.value(), + )); + await rtcEngine.setParameters('{"rtc.enable_debug_log": true}'); + + final onMediaControlMessageCompleter = Completer(); + final theRtcEngineEventHandler = RtcEngineEventHandler( + onMediaControlMessage: + (RtcConnection connection, int userId, Uint8List data, int length) { + onMediaControlMessageCompleter.complete(true); + }, + ); + + rtcEngine.registerEventHandler( + theRtcEngineEventHandler, + ); + +// Delay 500 milliseconds to ensure the registerEventHandler call completed. + await Future.delayed(const Duration(milliseconds: 500)); + + { + String connectionChannelId = "hello"; + int connectionLocalUid = 5; + RtcConnection connection = RtcConnection( + channelId: connectionChannelId, + localUid: connectionLocalUid, + ); + int userId = 5; + Uint8List data = Uint8List.fromList([1, 1, 1, 1, 1]); + int length = 5; + + final eventJson = { + 'connection': connection.toJson(), + 'userId': userId, + 'data': data.toList(), + 'length': length, + }; + + final eventIds = + eventIdsMapping['RtcEngineEventHandler_onMediaControlMessage'] ?? + []; + for (final event in eventIds) { + final ret = irisTester().fireEvent(event, params: eventJson); + // Delay 200 milliseconds to ensure the callback is called. + await Future.delayed(const Duration(milliseconds: 200)); + // TODO(littlegnal): Most of callbacks on web are not implemented, we're temporarily skip these callbacks at this time. + if (kIsWeb && ret) { + if (!onMediaControlMessageCompleter.isCompleted) { + onMediaControlMessageCompleter.complete(true); + } + } + } + } + + final eventCalled = await onMediaControlMessageCompleter.future; + expect(eventCalled, isTrue); + + { + rtcEngine.unregisterEventHandler( + theRtcEngineEventHandler, + ); + } +// Delay 500 milliseconds to ensure the unregisterEventHandler call completed. + await Future.delayed(const Duration(milliseconds: 500)); + + await rtcEngine.release(); + }, + timeout: const Timeout(Duration(minutes: 2)), + ); + testWidgets( 'RtcEngineEventHandler.onRequestToken', (WidgetTester tester) async { diff --git a/test_shard/fake_test_app/integration_test/generated/rtcengineex_fake_test.generated.dart b/test_shard/fake_test_app/integration_test/generated/rtcengineex_fake_test.generated.dart index 69a9d7d79..de76c4bae 100644 --- a/test_shard/fake_test_app/integration_test/generated/rtcengineex_fake_test.generated.dart +++ b/test_shard/fake_test_app/integration_test/generated/rtcengineex_fake_test.generated.dart @@ -1340,6 +1340,101 @@ void rtcEngineExSmokeTestCases() { // skip: !(), ); + testWidgets( + 'RtcEngineEx.sendRdtMessageEx', + (WidgetTester tester) async { + String engineAppId = const String.fromEnvironment('TEST_APP_ID', + defaultValue: ''); + + RtcEngineEx rtcEngineEx = createAgoraRtcEngineEx(); + await rtcEngineEx.initialize(RtcEngineContext( + appId: engineAppId, + areaCode: AreaCode.areaCodeGlob.value(), + )); + await rtcEngineEx.setParameters('{"rtc.enable_debug_log": true}'); + + try { + int uid = 5; + RdtStreamType type = RdtStreamType.rdtStreamCmd; + Uint8List data = Uint8List.fromList([1, 1, 1, 1, 1]); + int length = 5; + String connectionChannelId = "hello"; + int connectionLocalUid = 5; + RtcConnection connection = RtcConnection( + channelId: connectionChannelId, + localUid: connectionLocalUid, + ); + await rtcEngineEx.sendRdtMessageEx( + uid: uid, + type: type, + data: data, + length: length, + connection: connection, + ); + } catch (e) { + if (e is! AgoraRtcException) { + debugPrint('[RtcEngineEx.sendRdtMessageEx] error: ${e.toString()}'); + rethrow; + } + + if (e.code != -4) { + // Only not supported error supported. + rethrow; + } + } + + await rtcEngineEx.release(); + }, +// skip: !(), + ); + + testWidgets( + 'RtcEngineEx.sendMediaControlMessageEx', + (WidgetTester tester) async { + String engineAppId = const String.fromEnvironment('TEST_APP_ID', + defaultValue: ''); + + RtcEngineEx rtcEngineEx = createAgoraRtcEngineEx(); + await rtcEngineEx.initialize(RtcEngineContext( + appId: engineAppId, + areaCode: AreaCode.areaCodeGlob.value(), + )); + await rtcEngineEx.setParameters('{"rtc.enable_debug_log": true}'); + + try { + int uid = 5; + Uint8List data = Uint8List.fromList([1, 1, 1, 1, 1]); + int length = 5; + String connectionChannelId = "hello"; + int connectionLocalUid = 5; + RtcConnection connection = RtcConnection( + channelId: connectionChannelId, + localUid: connectionLocalUid, + ); + await rtcEngineEx.sendMediaControlMessageEx( + uid: uid, + data: data, + length: length, + connection: connection, + ); + } catch (e) { + if (e is! AgoraRtcException) { + debugPrint( + '[RtcEngineEx.sendMediaControlMessageEx] error: ${e.toString()}'); + rethrow; + } + + if (e.code != -4) { + // Only not supported error supported. + rethrow; + } + } + + await rtcEngineEx.release(); + }, +// skip: !(), + ); + testWidgets( 'RtcEngineEx.addVideoWatermarkEx', (WidgetTester tester) async { diff --git a/tool/terra/configs/cud_node_parser.config.ts b/tool/terra/configs/cud_node_parser.config.ts index 52d3254ee..8f2f900f3 100644 --- a/tool/terra/configs/cud_node_parser.config.ts +++ b/tool/terra/configs/cud_node_parser.config.ts @@ -598,6 +598,52 @@ const updateNodes = [ }, }, }, + // agora::rtc::IRtcEngineEventHandler::onRdtMessage + { + node: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "onRdtMessage", + }, + updated: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "onRdtMessage", + type: { + __TYPE: CXXTYPE.SimpleType, + is_builtin_type: false, + is_const: true, + kind: SimpleTypeKind.pointer_t, + name: "uint8_t", + source: "const uint8_t*", + }, + }, + }, + // agora::rtc::IRtcEngineEventHandler::onMediaControlMessage + { + node: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "onMediaControlMessage", + }, + updated: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "onMediaControlMessage", + type: { + __TYPE: CXXTYPE.SimpleType, + is_builtin_type: false, + is_const: true, + kind: SimpleTypeKind.pointer_t, + name: "uint8_t", + source: "const uint8_t*", + }, + }, + }, // // agora::rtc::IRtcEngineEventHandlerEx @@ -739,6 +785,52 @@ const updateNodes = [ }, }, }, + // onRdtMessage + { + node: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "onRdtMessage", + }, + updated: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "onRdtMessage", + type: { + __TYPE: CXXTYPE.SimpleType, + is_builtin_type: false, + is_const: true, + kind: SimpleTypeKind.pointer_t, + name: "uint8_t", + source: "const uint8_t*", + }, + }, + }, + // onMediaControlMessage + { + node: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "onMediaControlMessage", + }, + updated: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "onMediaControlMessage", + type: { + __TYPE: CXXTYPE.SimpleType, + is_builtin_type: false, + is_const: true, + kind: SimpleTypeKind.pointer_t, + name: "uint8_t", + source: "const uint8_t*", + }, + }, + }, // VideoCompositingLayout { node: { @@ -1144,6 +1236,52 @@ const updateNodes = [ }, }, }, + // agora::rtc::IRtcEngineEx::sendRdtMessageEx + { + node: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "sendRdtMessageEx", + }, + updated: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "sendRdtMessageEx", + type: { + __TYPE: CXXTYPE.SimpleType, + is_builtin_type: false, + is_const: true, + kind: SimpleTypeKind.pointer_t, + name: "uint8_t", + source: "const uint8_t*", + }, + }, + }, + // agora::rtc::IRtcEngineEx::sendMediaControlMessageEx + { + node: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "sendMediaControlMessageEx", + }, + updated: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "sendMediaControlMessageEx", + type: { + __TYPE: CXXTYPE.SimpleType, + is_builtin_type: false, + is_const: true, + kind: SimpleTypeKind.pointer_t, + name: "uint8_t", + source: "const uint8_t*", + }, + }, + }, // agora::rtc::IRtcEngine // agora::rtc::IRtcEngine::queryCodecCapability { @@ -1340,6 +1478,52 @@ const updateNodes = [ }, }, }, + // agora::rtc::IRtcEngine::sendRdtMessage + { + node: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "sendRdtMessage", + }, + updated: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "sendRdtMessage", + type: { + __TYPE: CXXTYPE.SimpleType, + is_builtin_type: false, + is_const: true, + kind: SimpleTypeKind.pointer_t, + name: "uint8_t", + source: "const uint8_t*", + }, + }, + }, + // agora::rtc::IRtcEngine::sendMediaControlMessage + { + node: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "sendMediaControlMessage", + }, + updated: { + __TYPE: CXXTYPE.Variable, + name: "data", + namespaces: ["agora", "rtc"], + parent_name: "sendMediaControlMessage", + type: { + __TYPE: CXXTYPE.SimpleType, + is_builtin_type: false, + is_const: true, + kind: SimpleTypeKind.pointer_t, + name: "uint8_t", + source: "const uint8_t*", + }, + }, + }, // agora::rtc::IRtcEngine::startDirectCdnStreaming { node: { diff --git a/tool/terra/terra_config_main.yaml b/tool/terra/terra_config_main.yaml index ad2df446f..9bcbd2c35 100644 --- a/tool/terra/terra_config_main.yaml +++ b/tool/terra/terra_config_main.yaml @@ -3,17 +3,17 @@ parsers: package: '@agoraio-extensions/cxx-parser' args: includeHeaderDirs: - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include' parseFiles: include: - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include/*.h' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include/*.h' exclude: - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include/AgoraRefPtr.h' - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include/time_utils.h' - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include/AgoraOptional.h' - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include/AgoraRefPtr.h' - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include/IAgoraMediaComponentFactory.h' - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include/IAgoraParameter.h' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include/AgoraRefPtr.h' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include/time_utils.h' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include/AgoraOptional.h' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include/AgoraRefPtr.h' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include/IAgoraMediaComponentFactory.h' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include/IAgoraParameter.h' - name: IrisApiIdParser package: '@agoraio-extensions/terra_shared_configs' @@ -23,14 +23,14 @@ parsers: args: customHeaderFileNamePrefix: 'Custom' includeHeaderDirs: - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include' parseFiles: include: - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include/*.h' - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/custom_headers/*.h' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include/*.h' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/custom_headers/*.h' exclude: - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include/time_utils.h' - - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.11/include/IAgoraMediaComponentFactory.h' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include/time_utils.h' + - '@agoraio-extensions/terra_shared_configs:headers/rtc_4.3.2.234/include/IAgoraMediaComponentFactory.h' - path: parsers/cud_node_parser.ts args: