From 680048f7836940f586ce7228559ba2cde9e0de62 Mon Sep 17 00:00:00 2001 From: HUI Date: Wed, 2 Dec 2020 14:59:38 +0800 Subject: [PATCH 01/20] feat: upgrade to 3.2.0 --- .circleci/config.yml | 98 + .editorconfig | 15 + android/build.gradle | 18 +- android/src/main/AndroidManifest.xml | 28 +- .../java/io/agora/rtc/base/Annotations.java | 1629 +++++++++-------- .../java/io/agora/rtc/base/BeanCovertor.kt | 234 +-- .../main/java/io/agora/rtc/base/Callback.kt | 52 +- .../java/io/agora/rtc/base/EnumCovertor.kt | 100 +- .../main/java/io/agora/rtc/base/Extensions.kt | 224 +-- .../java/io/agora/rtc/base/MediaObserver.kt | 48 +- .../main/java/io/agora/rtc/base/RtcChannel.kt | 546 +++--- .../java/io/agora/rtc/base/RtcChannelEvent.kt | 412 ++--- .../main/java/io/agora/rtc/base/RtcEngine.kt | 1416 +++++++------- .../java/io/agora/rtc/base/RtcEngineEvent.kt | 1004 +++++----- .../java/io/agora/rtc/base/RtcSurfaceView.kt | 142 +- .../java/io/agora/rtc/base/RtcTextureView.kt | 110 +- .../io/agora/rtc/react/PromiseCallback.kt | 30 +- .../rtc/react/RCTAgoraRtcChannelModule.kt | 86 +- .../rtc/react/RCTAgoraRtcEngineModule.kt | 80 +- .../io/agora/rtc/react/RCTAgoraRtcPackage.kt | 32 +- .../react/RCTAgoraRtcSurfaceViewManager.kt | 86 +- .../react/RCTAgoraRtcTextureViewManager.kt | 90 +- example/agora.config.json | 10 +- example/android/app/build.gradle | 172 +- example/android/build.gradle | 58 +- .../AgoraExample.xcodeproj/project.pbxproj | 10 +- .../src/examples/basic/JoinChannelAudio.tsx | 2 +- .../src/examples/basic/JoinChannelVideo.tsx | 2 +- example/src/examples/basic/StringUid.tsx | 2 +- ios/RCTAgora/Base/RtcEngine.swift | 22 + react-native-agora.podspec | 2 +- src/common/Enums.ts | 92 + src/common/RtcEngine.native.ts | 53 + 33 files changed, 3638 insertions(+), 3267 deletions(-) create mode 100644 .circleci/config.yml create mode 100644 .editorconfig diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..5d401a7da --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,98 @@ +version: 2.1 + +executors: + default: + docker: + - image: circleci/node:10 + working_directory: ~/project + +commands: + attach_project: + steps: + - attach_workspace: + at: ~/project + +jobs: + install-dependencies: + executor: default + steps: + - checkout + - attach_project + - restore_cache: + keys: + - dependencies-{{ checksum "package.json" }} + - dependencies- + - restore_cache: + keys: + - dependencies-example-{{ checksum "example/package.json" }} + - dependencies-example- + - run: + name: Install dependencies + command: | + yarn install --cwd example --frozen-lockfile + yarn install --frozen-lockfile + - save_cache: + key: dependencies-{{ checksum "package.json" }} + paths: node_modules + - save_cache: + key: dependencies-example-{{ checksum "example/package.json" }} + paths: example/node_modules + - persist_to_workspace: + root: . + paths: . + + lint: + executor: default + steps: + - attach_project + - run: + name: Lint files + command: | + yarn lint + + typescript: + executor: default + steps: + - attach_project + - run: + name: Typecheck files + command: | + yarn typescript + + unit-tests: + executor: default + steps: + - attach_project + - run: + name: Run unit tests + command: | + yarn test --coverage + - store_artifacts: + path: coverage + destination: coverage + + build-package: + executor: default + steps: + - attach_project + - run: + name: Build package + command: | + yarn prepare + +workflows: + build-and-test: + jobs: + - install-dependencies + - lint: + requires: + - install-dependencies + - typescript: + requires: + - install-dependencies + - unit-tests: + requires: + - install-dependencies + - build-package: + requires: + - install-dependencies diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..65365be68 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] + +indent_style = space +indent_size = 2 + +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/android/build.gradle b/android/build.gradle index 36b35e27e..0b2f90dbc 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -65,8 +65,8 @@ repositories { defaultDir = rootProject.ext.get('reactNativeAndroidRoot') } else { defaultDir = new File( - projectDir, - '/../../../node_modules/react-native/android' + projectDir, + '/../../../node_modules/react-native/android' ) } @@ -86,13 +86,13 @@ repositories { parentDir = parentDir.parentFile def androidSourcesDir = new File( - parentDir, - 'node_modules/react-native' + parentDir, + 'node_modules/react-native' ) def androidPrebuiltBinaryDir = new File( - parentDir, - 'node_modules/react-native/android' + parentDir, + 'node_modules/react-native/android' ) if (androidPrebuiltBinaryDir.exists()) { @@ -117,8 +117,8 @@ repositories { if (!found) { throw new GradleException( - "${project.name}: unable to locate React Native android sources. " + - "Ensure you have you installed React Native as a dependency in your project and try again." + "${project.name}: unable to locate React Native android sources. " + + "Ensure you have you installed React Native as a dependency in your project and try again." ) } } @@ -128,7 +128,7 @@ def kotlin_version = getExtOrDefault('kotlinVersion') dependencies { // noinspection GradleDynamicVersion api 'com.facebook.react:react-native:+' - api "io.agora.rtc:full-sdk:3.1.2" + api "io.agora.rtc:full-sdk:3.2.0" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" } diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index c78e0b7c9..2ef550020 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,18 +1,18 @@ + xmlns:tools="http://schemas.android.com/tools" + package="io.agora.rtc.react"> - - - - - - - - - - + + + + + + + + + + diff --git a/android/src/main/java/io/agora/rtc/base/Annotations.java b/android/src/main/java/io/agora/rtc/base/Annotations.java index 3e584a77d..54e7ba9a5 100644 --- a/android/src/main/java/io/agora/rtc/base/Annotations.java +++ b/android/src/main/java/io/agora/rtc/base/Annotations.java @@ -12,788 +12,849 @@ @SuppressWarnings("deprecation") public class Annotations { - @IntDef({ - AgoraRtcAppType.NATIVE, - AgoraRtcAppType.COCOS, - AgoraRtcAppType.UNITY, - AgoraRtcAppType.ELECTRON, - AgoraRtcAppType.FLUTTER, - AgoraRtcAppType.UNREAL, - AgoraRtcAppType.XAMARIN, - AgoraRtcAppType.APICLOUD, - AgoraRtcAppType.REACTNATIVE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraRtcAppType { - int NATIVE = 0; - int COCOS = 1; - int UNITY = 2; - int ELECTRON = 3; - int FLUTTER = 4; - int UNREAL = 5; - int XAMARIN = 6; - int APICLOUD = 7; - int REACTNATIVE = 8; - } - - @IntDef({ - AgoraAudioCodecProfileType.LC_AAC, - AgoraAudioCodecProfileType.HE_AAC, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioCodecProfileType { - int LC_AAC = 0; - int HE_AAC = 1; - } - - @IntDef({ - Constants.AUDIO_EQUALIZATION_BAND_31, - Constants.AUDIO_EQUALIZATION_BAND_62, - Constants.AUDIO_EQUALIZATION_BAND_125, - Constants.AUDIO_EQUALIZATION_BAND_250, - Constants.AUDIO_EQUALIZATION_BAND_500, - Constants.AUDIO_EQUALIZATION_BAND_1K, - Constants.AUDIO_EQUALIZATION_BAND_2K, - Constants.AUDIO_EQUALIZATION_BAND_4K, - Constants.AUDIO_EQUALIZATION_BAND_8K, - Constants.AUDIO_EQUALIZATION_BAND_16K, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioEqualizationBandFrequency { - } - - @IntDef({ - Constants.LOCAL_AUDIO_STREAM_ERROR_OK, - Constants.LOCAL_AUDIO_STREAM_ERROR_FAILURE, - Constants.LOCAL_AUDIO_STREAM_ERROR_DEVICE_NO_PERMISSION, - Constants.LOCAL_AUDIO_STREAM_ERROR_DEVICE_BUSY, - Constants.LOCAL_AUDIO_STREAM_ERROR_CAPTURE_FAILURE, - Constants.LOCAL_AUDIO_STREAM_ERROR_ENCODE_FAILURE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioLocalError { - } - - @IntDef({ - Constants.LOCAL_AUDIO_STREAM_STATE_STOPPED, - Constants.LOCAL_AUDIO_STREAM_STATE_CAPTURING, - Constants.LOCAL_AUDIO_STREAM_STATE_ENCODING, - Constants.LOCAL_AUDIO_STREAM_STATE_FAILED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioLocalState { - } - - @IntDef({ - Constants.MEDIA_ENGINE_AUDIO_ERROR_MIXING_OPEN, - Constants.MEDIA_ENGINE_AUDIO_ERROR_MIXING_TOO_FREQUENT, - Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_INTERRUPTED_EOF, - AgoraAudioMixingErrorCode.MEDIA_ENGINE_AUDIO_ERROR_OK, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioMixingErrorCode { - int MEDIA_ENGINE_AUDIO_ERROR_OK = 0; - } - - @IntDef({ - Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_PLAY, - Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_PAUSED, - Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_STOPPED, - Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_ERROR, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioMixingStateCode { - } - - @IntDef({ - Constants.AUDIO_ROUTE_DEFAULT, - Constants.AUDIO_ROUTE_HEADSET, - Constants.AUDIO_ROUTE_EARPIECE, - Constants.AUDIO_ROUTE_HEADSETNOMIC, - Constants.AUDIO_ROUTE_SPEAKERPHONE, - Constants.AUDIO_ROUTE_LOUDSPEAKER, - Constants.AUDIO_ROUTE_HEADSETBLUETOOTH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioOutputRouting { - } - - @IntDef({ - Constants.AUDIO_PROFILE_DEFAULT, - Constants.AUDIO_PROFILE_SPEECH_STANDARD, - Constants.AUDIO_PROFILE_MUSIC_STANDARD, - Constants.AUDIO_PROFILE_MUSIC_STANDARD_STEREO, - Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY, - Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioProfile { - } - - @IntDef({ - Constants.AUDIO_RECORDING_QUALITY_LOW, - Constants.AUDIO_RECORDING_QUALITY_MEDIUM, - Constants.AUDIO_RECORDING_QUALITY_HIGH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioRecordingQuality { - } - - @IntDef({ - Constants.REMOTE_AUDIO_STATE_STOPPED, - Constants.REMOTE_AUDIO_STATE_STARTING, - Constants.REMOTE_AUDIO_STATE_DECODING, - Constants.REMOTE_AUDIO_STATE_FROZEN, - Constants.REMOTE_AUDIO_STATE_FAILED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioRemoteState { - } - - @IntDef({ - Constants.REMOTE_AUDIO_REASON_INTERNAL, - Constants.REMOTE_AUDIO_REASON_NETWORK_CONGESTION, - Constants.REMOTE_AUDIO_REASON_NETWORK_RECOVERY, - Constants.REMOTE_AUDIO_REASON_LOCAL_MUTED, - Constants.REMOTE_AUDIO_REASON_LOCAL_UNMUTED, - Constants.REMOTE_AUDIO_REASON_REMOTE_MUTED, - Constants.REMOTE_AUDIO_REASON_REMOTE_UNMUTED, - Constants.REMOTE_AUDIO_REASON_REMOTE_OFFLINE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioRemoteStateReason { - } - - @IntDef({ - Constants.AUDIO_REVERB_OFF, - Constants.AUDIO_REVERB_POPULAR, - Constants.AUDIO_REVERB_RNB, - Constants.AUDIO_REVERB_ROCK, - Constants.AUDIO_REVERB_HIPHOP, - Constants.AUDIO_REVERB_VOCAL_CONCERT, - Constants.AUDIO_REVERB_KTV, - Constants.AUDIO_REVERB_STUDIO, - Constants.AUDIO_REVERB_FX_KTV, - Constants.AUDIO_REVERB_FX_VOCAL_CONCERT, - Constants.AUDIO_REVERB_FX_UNCLE, - Constants.AUDIO_REVERB_FX_SISTER, - Constants.AUDIO_REVERB_FX_STUDIO, - Constants.AUDIO_REVERB_FX_POPULAR, - Constants.AUDIO_REVERB_FX_RNB, - Constants.AUDIO_REVERB_FX_PHONOGRAPH, - Constants.AUDIO_VIRTUAL_STEREO, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioReverbPreset { - } - - @IntDef({ - Constants.AUDIO_REVERB_DRY_LEVEL, - Constants.AUDIO_REVERB_WET_LEVEL, - Constants.AUDIO_REVERB_ROOM_SIZE, - Constants.AUDIO_REVERB_WET_DELAY, - Constants.AUDIO_REVERB_STRENGTH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioReverbType { - } - - @IntDef({ - AgoraAudioSampleRateType.TYPE_32000, - AgoraAudioSampleRateType.TYPE_44100, - AgoraAudioSampleRateType.TYPE_48000, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioSampleRateType { - int TYPE_32000 = 32000; - int TYPE_44100 = 44100; - int TYPE_48000 = 48000; - } - - @IntDef({ - Constants.AUDIO_SCENARIO_DEFAULT, - Constants.AUDIO_SCENARIO_CHATROOM_ENTERTAINMENT, - Constants.AUDIO_SCENARIO_EDUCATION, - Constants.AUDIO_SCENARIO_GAME_STREAMING, - Constants.AUDIO_SCENARIO_SHOWROOM, - Constants.AUDIO_SCENARIO_CHATROOM_GAMING, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioScenario { - } - - @IntDef({ - Constants.VOICE_CHANGER_OFF, - Constants.VOICE_CHANGER_OLDMAN, - Constants.VOICE_CHANGER_BABYBOY, - Constants.VOICE_CHANGER_BABYGIRL, - Constants.VOICE_CHANGER_ZHUBAJIE, - Constants.VOICE_CHANGER_ETHEREAL, - Constants.VOICE_CHANGER_HULK, - Constants.VOICE_BEAUTY_VIGOROUS, - Constants.VOICE_BEAUTY_DEEP, - Constants.VOICE_BEAUTY_MELLOW, - Constants.VOICE_BEAUTY_FALSETTO, - Constants.VOICE_BEAUTY_FULL, - Constants.VOICE_BEAUTY_CLEAR, - Constants.VOICE_BEAUTY_RESOUNDING, - Constants.VOICE_BEAUTY_RINGING, - Constants.VOICE_BEAUTY_SPACIAL, - Constants.GENERAL_BEAUTY_VOICE_MALE_MAGNETIC, - Constants.GENERAL_BEAUTY_VOICE_FEMALE_FRESH, - Constants.GENERAL_BEAUTY_VOICE_FEMALE_VITALITY, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioVoiceChanger { - } - - @IntDef({ - AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_AUTO, - AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE, - AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_PREVIEW, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraCameraCaptureOutputPreference { - int CAPTURER_OUTPUT_PREFERENCE_AUTO = 0; - int CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE = 1; - int CAPTURER_OUTPUT_PREFERENCE_PREVIEW = 2; - } - - @IntDef({ - AgoraCameraDirection.CAMERA_REAR, - AgoraCameraDirection.CAMERA_FRONT, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraCameraDirection { - int CAMERA_REAR = 0; - int CAMERA_FRONT = 1; - } - - @IntDef({ - Constants.RELAY_OK, - Constants.RELAY_ERROR_SERVER_ERROR_RESPONSE, - Constants.RELAY_ERROR_SERVER_NO_RESPONSE, - Constants.RELAY_ERROR_NO_RESOURCE_AVAILABLE, - Constants.RELAY_ERROR_FAILED_JOIN_SRC, - Constants.RELAY_ERROR_FAILED_JOIN_DEST, - Constants.RELAY_ERROR_FAILED_PACKET_RECEIVED_FROM_SRC, - Constants.RELAY_ERROR_FAILED_PACKET_SENT_TO_DEST, - Constants.RELAY_ERROR_SERVER_CONNECTION_LOST, - Constants.RELAY_ERROR_INTERNAL_ERROR, - Constants.RELAY_ERROR_SRC_TOKEN_EXPIRED, - Constants.RELAY_ERROR_DEST_TOKEN_EXPIRED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraChannelMediaRelayError { - } - - @IntDef({ - Constants.RELAY_EVENT_NETWORK_DISCONNECTED, - Constants.RELAY_EVENT_NETWORK_CONNECTED, - Constants.RELAY_EVENT_PACKET_JOINED_SRC_CHANNEL, - Constants.RELAY_EVENT_PACKET_JOINED_DEST_CHANNEL, - Constants.RELAY_EVENT_PACKET_SENT_TO_DEST_CHANNEL, - Constants.RELAY_EVENT_PACKET_RECEIVED_VIDEO_FROM_SRC, - Constants.RELAY_EVENT_PACKET_RECEIVED_AUDIO_FROM_SRC, - Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL, - Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED, - Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_NOT_CHANGE, - Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_IS_NULL, - Constants.RELAY_EVENT_VIDEO_PROFILE_UPDATE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraChannelMediaRelayEvent { - } - - @IntDef({ - Constants.RELAY_STATE_IDLE, - Constants.RELAY_STATE_CONNECTING, - Constants.RELAY_STATE_RUNNING, - Constants.RELAY_STATE_FAILURE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraChannelMediaRelayState { - } - - @IntDef({ - Constants.CHANNEL_PROFILE_COMMUNICATION, - Constants.CHANNEL_PROFILE_LIVE_BROADCASTING, - Constants.CHANNEL_PROFILE_GAME, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraChannelProfile { - } - - @IntDef({ - Constants.CLIENT_ROLE_BROADCASTER, - Constants.CLIENT_ROLE_AUDIENCE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraClientRole { - } - - @IntDef({ - Constants.CONNECTION_CHANGED_CONNECTING, - Constants.CONNECTION_CHANGED_JOIN_SUCCESS, - Constants.CONNECTION_CHANGED_INTERRUPTED, - Constants.CONNECTION_CHANGED_BANNED_BY_SERVER, - Constants.CONNECTION_CHANGED_JOIN_FAILED, - Constants.CONNECTION_CHANGED_LEAVE_CHANNEL, - Constants.CONNECTION_CHANGED_INVALID_APP_ID, - Constants.CONNECTION_CHANGED_INVALID_CHANNEL_NAME, - Constants.CONNECTION_CHANGED_INVALID_TOKEN, - Constants.CONNECTION_CHANGED_TOKEN_EXPIRED, - Constants.CONNECTION_CHANGED_REJECTED_BY_SERVER, - Constants.CONNECTION_CHANGED_SETTING_PROXY_SERVER, - Constants.CONNECTION_CHANGED_RENEW_TOKEN, - Constants.CONNECTION_CHANGED_CLIENT_IP_ADDRESS_CHANGED, - Constants.CONNECTION_CHANGED_KEEP_ALIVE_TIMEOUT, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraConnectionChangedReason { - } - - @IntDef({ - Constants.CONNECTION_STATE_DISCONNECTED, - Constants.CONNECTION_STATE_CONNECTING, - Constants.CONNECTION_STATE_CONNECTED, - Constants.CONNECTION_STATE_RECONNECTING, - Constants.CONNECTION_STATE_FAILED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraConnectionStateType { - } - - @IntDef({ - AgoraDegradationPreference.MAINTAIN_QUALITY, - AgoraDegradationPreference.MAINTAIN_FRAMERATE, - AgoraDegradationPreference.MAINTAIN_BALANCED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraDegradationPreference { - int MAINTAIN_QUALITY = 0; - int MAINTAIN_FRAMERATE = 1; - int MAINTAIN_BALANCED = 2; - } - - @IntDef({ - AgoraEncryptionMode.NONE, - AgoraEncryptionMode.AES128XTS, - AgoraEncryptionMode.AES128ECB, - AgoraEncryptionMode.AES256XTS, - AgoraEncryptionMode.SM4128ECB, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraEncryptionMode { - int NONE = 0; - int AES128XTS = 1; - int AES128ECB = 2; - int AES256XTS = 3; - int SM4128ECB = 4; - } - - @IntDef({ - Constants.ERR_OK, - Constants.ERR_FAILED, - Constants.ERR_INVALID_ARGUMENT, - Constants.ERR_NOT_READY, - Constants.ERR_NOT_SUPPORTED, - Constants.ERR_REFUSED, - Constants.ERR_BUFFER_TOO_SMALL, - Constants.ERR_NOT_INITIALIZED, - Constants.ERR_NO_PERMISSION, - Constants.ERR_TIMEDOUT, - Constants.ERR_CANCELED, - Constants.ERR_TOO_OFTEN, - Constants.ERR_BIND_SOCKET, - Constants.ERR_NET_DOWN, - Constants.ERR_NET_NOBUFS, - Constants.ERR_JOIN_CHANNEL_REJECTED, - Constants.ERR_LEAVE_CHANNEL_REJECTED, - Constants.ERR_ALREADY_IN_USE, - Constants.ERR_INVALID_APP_ID, - Constants.ERR_INVALID_CHANNEL_NAME, - Constants.ERR_NO_SERVER_RESOURCES, - Constants.ERR_TOKEN_EXPIRED, - Constants.ERR_INVALID_TOKEN, - Constants.ERR_CONNECTION_INTERRUPTED, - Constants.ERR_CONNECTION_LOST, - Constants.ERR_NOT_IN_CHANNEL, - Constants.ERR_SIZE_TOO_LARGE, - Constants.ERR_BITRATE_LIMIT, - Constants.ERR_TOO_MANY_DATA_STREAMS, - Constants.ERR_DECRYPTION_FAILED, - Constants.ERR_CLIENT_IS_BANNED_BY_SERVER, - Constants.ERR_WATERMARK_PARAM, - Constants.ERR_WATERMARK_PATH, - Constants.ERR_WATERMARK_PNG, - Constants.ERR_WATERMARKR_INFO, - Constants.ERR_WATERMARK_ARGB, - Constants.ERR_WATERMARK_READ, - Constants.ERR_ENCRYPTED_STREAM_NOT_ALLOWED_PUBLISHED, - Constants.ERR_INVALID_USER_ACCOUNT, - Constants.ERR_PUBLISH_STREAM_CDN_ERROR, - Constants.ERR_PUBLISH_STREAM_NUM_REACH_LIMIT, - Constants.ERR_PUBLISH_STREAM_NOT_AUTHORIZED, - Constants.ERR_PUBLISH_STREAM_INTERNAL_SERVER_ERROR, - Constants.ERR_PUBLISH_STREAM_NOT_FOUND, - Constants.ERR_PUBLISH_STREAM_FORMAT_NOT_SUPPORTED, - Constants.ERR_LOAD_MEDIA_ENGINE, - Constants.ERR_START_CALL, - Constants.ERR_START_CAMERA, - Constants.ERR_START_VIDEO_RENDER, - Constants.ERR_ADM_GENERAL_ERROR, - Constants.ERR_ADM_JAVA_RESOURCE, - Constants.ERR_ADM_SAMPLE_RATE, - Constants.ERR_ADM_INIT_PLAYOUT, - Constants.ERR_ADM_START_PLAYOUT, - Constants.ERR_ADM_STOP_PLAYOUT, - Constants.ERR_ADM_INIT_RECORDING, - Constants.ERR_ADM_START_RECORDING, - Constants.ERR_ADM_STOP_RECORDING, - Constants.ERR_ADM_RUNTIME_PLAYOUT_ERROR, - Constants.ERR_ADM_RUNTIME_RECORDING_ERROR, - Constants.ERR_ADM_RECORD_AUDIO_FAILED, - Constants.ERR_ADM_INIT_LOOPBACK, - Constants.ERR_ADM_START_LOOPBACK, - Constants.ERR_AUDIO_BT_SCO_FAILED, - Constants.ERR_ADM_NO_RECORDING_DEVICE, - Constants.ERR_ADM_NO_PLAYOUT_DEVICE, - Constants.ERR_VDM_CAMERA_NOT_AUTHORIZED, - Constants.ERR_VCM_UNKNOWN_ERROR, - Constants.ERR_VCM_ENCODER_INIT_ERROR, - Constants.ERR_VCM_ENCODER_ENCODE_ERROR, - Constants.ERR_VCM_ENCODER_SET_ERROR, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraErrorCode { - } - - @IntDef({ - Constants.INJECT_STREAM_STATUS_START_SUCCESS, - Constants.INJECT_STREAM_STATUS_START_ALREADY_EXISTS, - Constants.INJECT_STREAM_STATUS_START_UNAUTHORIZED, - Constants.INJECT_STREAM_STATUS_START_TIMEDOUT, - Constants.INJECT_STREAM_STATUS_START_FAILED, - Constants.INJECT_STREAM_STATUS_STOP_SUCCESS, - Constants.INJECT_STREAM_STATUS_STOP_NOT_FOUND, - Constants.INJECT_STREAM_STATUS_STOP_UNAUTHORIZED, - Constants.INJECT_STREAM_STATUS_STOP_TIMEDOUT, - Constants.INJECT_STREAM_STATUS_STOP_FAILED, - Constants.INJECT_STREAM_STATUS_BROKEN, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraInjectStreamStatus { - } - - @IntDef({ - Constants.LASTMILE_PROBE_RESULT_COMPLETE, - Constants.LASTMILE_PROBE_RESULT_INCOMPLETE_NO_BWE, - Constants.LASTMILE_PROBE_RESULT_UNAVAILABLE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraLastmileProbeResultState { - } - - @IntDef({ - BeautyOptions.LIGHTENING_CONTRAST_LOW, - BeautyOptions.LIGHTENING_CONTRAST_NORMAL, - BeautyOptions.LIGHTENING_CONTRAST_HIGH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraLighteningContrastLevel { - } - - @IntDef({ - Constants.LOCAL_VIDEO_STREAM_ERROR_OK, - Constants.LOCAL_VIDEO_STREAM_ERROR_FAILURE, - Constants.LOCAL_VIDEO_STREAM_ERROR_DEVICE_NO_PERMISSION, - Constants.LOCAL_VIDEO_STREAM_ERROR_DEVICE_BUSY, - Constants.LOCAL_VIDEO_STREAM_ERROR_CAPTURE_FAILURE, - Constants.LOCAL_VIDEO_STREAM_ERROR_ENCODE_FAILURE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraLocalVideoStreamError { - } - - @IntDef({ - Constants.LOCAL_VIDEO_STREAM_STATE_STOPPED, - Constants.LOCAL_VIDEO_STREAM_STATE_CAPTURING, - Constants.LOCAL_VIDEO_STREAM_STATE_ENCODING, - Constants.LOCAL_VIDEO_STREAM_STATE_FAILED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraLocalVideoStreamState { - } - - @IntDef({ - Constants.LOG_FILTER_OFF, - Constants.LOG_FILTER_DEBUG, - Constants.LOG_FILTER_INFO, - Constants.LOG_FILTER_WARNING, - Constants.LOG_FILTER_ERROR, - Constants.LOG_FILTER_CRITICAL, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraLogFilter { - } - - @IntDef({ - Constants.QUALITY_UNKNOWN, - Constants.QUALITY_EXCELLENT, - Constants.QUALITY_GOOD, - Constants.QUALITY_POOR, - Constants.QUALITY_BAD, - Constants.QUALITY_VBAD, - Constants.QUALITY_DOWN, - Constants.QUALITY_UNSUPPORTED, - Constants.QUALITY_DETECTING, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraNetworkQuality { - } - - @IntDef({ - Constants.NETWORK_TYPE_UNKNOWN, - Constants.NETWORK_TYPE_DISCONNECTED, - Constants.NETWORK_TYPE_LAN, - Constants.NETWORK_TYPE_WIFI, - Constants.NETWORK_TYPE_MOBILE_2G, - Constants.NETWORK_TYPE_MOBILE_3G, - Constants.NETWORK_TYPE_MOBILE_4G, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraNetworkType { - } - - @IntDef({ - Constants.RTMP_STREAM_PUBLISH_ERROR_OK, - Constants.RTMP_STREAM_PUBLISH_ERROR_INVALID_ARGUMENT, - Constants.RTMP_STREAM_PUBLISH_ERROR_ENCRYPTED_STREAM_NOT_ALLOWED, - Constants.RTMP_STREAM_PUBLISH_ERROR_CONNECTION_TIMEOUT, - Constants.RTMP_STREAM_PUBLISH_ERROR_INTERNAL_SERVER_ERROR, - Constants.RTMP_STREAM_PUBLISH_ERROR_RTMP_SERVER_ERROR, - Constants.RTMP_STREAM_PUBLISH_ERROR_TOO_OFTEN, - Constants.RTMP_STREAM_PUBLISH_ERROR_REACH_LIMIT, - Constants.RTMP_STREAM_PUBLISH_ERROR_NOT_AUTHORIZED, - Constants.RTMP_STREAM_PUBLISH_ERROR_STREAM_NOT_FOUND, - Constants.RTMP_STREAM_PUBLISH_ERROR_FORMAT_NOT_SUPPORTED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraRtmpStreamingErrorCode { - } - - @IntDef({ - Constants.RTMP_STREAM_PUBLISH_STATE_IDLE, - Constants.RTMP_STREAM_PUBLISH_STATE_CONNECTING, - Constants.RTMP_STREAM_PUBLISH_STATE_RUNNING, - Constants.RTMP_STREAM_PUBLISH_STATE_RECOVERING, - Constants.RTMP_STREAM_PUBLISH_STATE_FAILURE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraRtmpStreamingState { - } - - @IntDef({ - Constants.STREAM_FALLBACK_OPTION_DISABLED, - Constants.STREAM_FALLBACK_OPTION_VIDEO_STREAM_LOW, - Constants.STREAM_FALLBACK_OPTION_AUDIO_ONLY, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraStreamFallbackOptions { - } - - @IntDef({ - Constants.USER_OFFLINE_QUIT, - Constants.USER_OFFLINE_DROPPED, - Constants.USER_OFFLINE_BECOME_AUDIENCE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraUserOfflineReason { - } - - @IntDef({ - Constants.USER_PRIORITY_HIGH, - Constants.USER_PRIORITY_NORANL, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraUserPriority { - } - - @IntDef({ - AgoraVideoCodecProfileType.BASELINE, - AgoraVideoCodecProfileType.MAIN, - AgoraVideoCodecProfileType.HIGH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoCodecProfileType { - int BASELINE = 66; - int MAIN = 77; - int HIGH = 100; - } - - @IntDef({ - AgoraVideoFrameRate.FRAME_RATE_FPS_1, - AgoraVideoFrameRate.FRAME_RATE_FPS_7, - AgoraVideoFrameRate.FRAME_RATE_FPS_10, - AgoraVideoFrameRate.FRAME_RATE_FPS_15, - AgoraVideoFrameRate.FRAME_RATE_FPS_24, - AgoraVideoFrameRate.FRAME_RATE_FPS_30, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoFrameRate { - int FRAME_RATE_FPS_1 = 1; - int FRAME_RATE_FPS_7 = 7; - int FRAME_RATE_FPS_10 = 10; - int FRAME_RATE_FPS_15 = 15; - int FRAME_RATE_FPS_24 = 24; - int FRAME_RATE_FPS_30 = 30; - } - - @IntDef({ - Constants.VIDEO_MIRROR_MODE_AUTO, - Constants.VIDEO_MIRROR_MODE_ENABLED, - Constants.VIDEO_MIRROR_MODE_DISABLED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoMirrorMode { - } - - @IntDef({ - AgoraVideoOutputOrientationMode.ORIENTATION_MODE_ADAPTIVE, - AgoraVideoOutputOrientationMode.ORIENTATION_MODE_FIXED_LANDSCAPE, - AgoraVideoOutputOrientationMode.ORIENTATION_MODE_FIXED_PORTRAIT, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoOutputOrientationMode { - int ORIENTATION_MODE_ADAPTIVE = 0; - int ORIENTATION_MODE_FIXED_LANDSCAPE = 1; - int ORIENTATION_MODE_FIXED_PORTRAIT = 2; - } - - @IntDef({ - Constants.ADAPT_NONE, - Constants.ADAPT_UP_BANDWIDTH, - Constants.ADAPT_DOWN_BANDWIDTH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoQualityAdaptIndication { - } - - @IntDef({ - Constants.REMOTE_VIDEO_STATE_STOPPED, - Constants.REMOTE_VIDEO_STATE_STARTING, - Constants.REMOTE_VIDEO_STATE_DECODING, - Constants.REMOTE_VIDEO_STATE_FROZEN, - Constants.REMOTE_VIDEO_STATE_FAILED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoRemoteState { - } - - @IntDef({ - Constants.REMOTE_VIDEO_STATE_REASON_INTERNAL, - Constants.REMOTE_VIDEO_STATE_REASON_NETWORK_CONGESTION, - Constants.REMOTE_VIDEO_STATE_REASON_NETWORK_RECOVERY, - Constants.REMOTE_VIDEO_STATE_REASON_LOCAL_MUTED, - Constants.REMOTE_VIDEO_STATE_REASON_LOCAL_UNMUTED, - Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_MUTED, - Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_UNMUTED, - Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_OFFLINE, - Constants.REMOTE_VIDEO_STATE_REASON_AUDIO_FALLBACK, - Constants.REMOTE_VIDEO_STATE_REASON_AUDIO_FALLBACK_RECOVERY, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoRemoteStateReason { - } - - @IntDef({ - VideoCanvas.RENDER_MODE_HIDDEN, - VideoCanvas.RENDER_MODE_FIT, - VideoCanvas.RENDER_MODE_ADAPTIVE, - VideoCanvas.RENDER_MODE_FILL, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoRenderMode { - } - - @IntDef({ - Constants.VIDEO_STREAM_HIGH, - Constants.VIDEO_STREAM_LOW, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoStreamType { - } - - @IntDef({ - Constants.WARN_INVALID_VIEW, - Constants.WARN_INIT_VIDEO, - Constants.WARN_PENDING, - Constants.WARN_NO_AVAILABLE_CHANNEL, - Constants.WARN_LOOKUP_CHANNEL_TIMEOUT, - Constants.WARN_LOOKUP_CHANNEL_REJECTED, - Constants.WARN_OPEN_CHANNEL_TIMEOUT, - Constants.WARN_OPEN_CHANNEL_REJECTED, - Constants.WARN_SWITCH_LIVE_VIDEO_TIMEOUT, - Constants.WARN_SET_CLIENT_ROLE_TIMEOUT, - Constants.WARN_SET_CLIENT_ROLE_NOT_AUTHORIZED, - Constants.WARN_OPEN_CHANNEL_INVALID_TICKET, - Constants.WARN_OPEN_CHANNEL_TRY_NEXT_VOS, - Constants.WARN_AUDIO_MIXING_OPEN_ERROR, - Constants.WARN_ADM_RUNTIME_PLAYOUT_WARNING, - Constants.WARN_ADM_RUNTIME_RECORDING_WARNING, - Constants.WARN_ADM_RECORD_AUDIO_SILENCE, - Constants.WARN_ADM_PLAYOUT_ABNORMAL_FREQUENCY, - Constants.WARN_ADM_RECORD_ABNORMAL_FREQUENCY, - Constants.WARN_ADM_CALL_INTERRUPTION, - Constants.WARN_ADM_RECORD_AUDIO_LOWLEVEL, - Constants.WARN_ADM_PLAYOUT_AUDIO_LOWLEVEL, - Constants.WARN_ADM_RECORD_IS_OCCUPIED, - Constants.WARN_APM_HOWLING, - Constants.WARN_ADM_GLITCH_STATE, - Constants.WARN_APM_RESIDUAL_ECHO, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraWarningCode { - } - - @IntDef({ - RtcEngineConfig.AreaCode.AREA_CODE_CN, - RtcEngineConfig.AreaCode.AREA_CODE_NA, - RtcEngineConfig.AreaCode.AREA_CODE_EU, - RtcEngineConfig.AreaCode.AREA_CODE_AS, - RtcEngineConfig.AreaCode.AREA_CODE_JP, - RtcEngineConfig.AreaCode.AREA_CODE_IN, - RtcEngineConfig.AreaCode.AREA_CODE_GLOB, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAreaCode { - } - - @IntDef({ - Constants.SUB_STATE_IDLE, - Constants.SUB_STATE_NO_SUBSCRIBED, - Constants.SUB_STATE_SUBSCRIBING, - Constants.SUB_STATE_SUBSCRIBED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraStreamSubscribeState { - } - - @IntDef({ - Constants.PUB_STATE_IDLE, - Constants.PUB_STATE_NO_PUBLISHED, - Constants.PUB_STATE_PUBLISHING, - Constants.PUB_STATE_PUBLISHED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraStreamPublishState { - } - - @IntDef({ - Constants.RTMP_STREAMING_EVENT_FAILED_LOAD_IMAGE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraRtmpStreamingEvent { - } + @IntDef({ + AgoraRtcAppType.NATIVE, + AgoraRtcAppType.COCOS, + AgoraRtcAppType.UNITY, + AgoraRtcAppType.ELECTRON, + AgoraRtcAppType.FLUTTER, + AgoraRtcAppType.UNREAL, + AgoraRtcAppType.XAMARIN, + AgoraRtcAppType.API_CLOUD, + AgoraRtcAppType.REACT_NATIVE, + AgoraRtcAppType.PYTHON, + AgoraRtcAppType.COCOS_CREATOR, + AgoraRtcAppType.RUST, + AgoraRtcAppType.C_SHARP, + AgoraRtcAppType.CEF, + AgoraRtcAppType.UNI_APP, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraRtcAppType { + int NATIVE = 0; + int COCOS = 1; + int UNITY = 2; + int ELECTRON = 3; + int FLUTTER = 4; + int UNREAL = 5; + int XAMARIN = 6; + int API_CLOUD = 7; + int REACT_NATIVE = 8; + int PYTHON = 9; + int COCOS_CREATOR = 10; + int RUST = 11; + int C_SHARP = 12; + int CEF = 13; + int UNI_APP = 14; + } + + @IntDef({ + AgoraAudioCodecProfileType.LC_AAC, + AgoraAudioCodecProfileType.HE_AAC, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioCodecProfileType { + int LC_AAC = 0; + int HE_AAC = 1; + } + + @IntDef({ + Constants.AUDIO_EQUALIZATION_BAND_31, + Constants.AUDIO_EQUALIZATION_BAND_62, + Constants.AUDIO_EQUALIZATION_BAND_125, + Constants.AUDIO_EQUALIZATION_BAND_250, + Constants.AUDIO_EQUALIZATION_BAND_500, + Constants.AUDIO_EQUALIZATION_BAND_1K, + Constants.AUDIO_EQUALIZATION_BAND_2K, + Constants.AUDIO_EQUALIZATION_BAND_4K, + Constants.AUDIO_EQUALIZATION_BAND_8K, + Constants.AUDIO_EQUALIZATION_BAND_16K, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioEqualizationBandFrequency { + } + + @IntDef({ + Constants.LOCAL_AUDIO_STREAM_ERROR_OK, + Constants.LOCAL_AUDIO_STREAM_ERROR_FAILURE, + Constants.LOCAL_AUDIO_STREAM_ERROR_DEVICE_NO_PERMISSION, + Constants.LOCAL_AUDIO_STREAM_ERROR_DEVICE_BUSY, + Constants.LOCAL_AUDIO_STREAM_ERROR_CAPTURE_FAILURE, + Constants.LOCAL_AUDIO_STREAM_ERROR_ENCODE_FAILURE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioLocalError { + } + + @IntDef({ + Constants.LOCAL_AUDIO_STREAM_STATE_STOPPED, + Constants.LOCAL_AUDIO_STREAM_STATE_CAPTURING, + Constants.LOCAL_AUDIO_STREAM_STATE_ENCODING, + Constants.LOCAL_AUDIO_STREAM_STATE_FAILED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioLocalState { + } + + @IntDef({ + Constants.MEDIA_ENGINE_AUDIO_ERROR_MIXING_OPEN, + Constants.MEDIA_ENGINE_AUDIO_ERROR_MIXING_TOO_FREQUENT, + Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_INTERRUPTED_EOF, + AgoraAudioMixingErrorCode.MEDIA_ENGINE_AUDIO_ERROR_OK, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioMixingErrorCode { + int MEDIA_ENGINE_AUDIO_ERROR_OK = 0; + } + + @IntDef({ + Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_PLAY, + Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_PAUSED, + Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_STOPPED, + Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_ERROR, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioMixingStateCode { + } + + @IntDef({ + Constants.AUDIO_ROUTE_DEFAULT, + Constants.AUDIO_ROUTE_HEADSET, + Constants.AUDIO_ROUTE_EARPIECE, + Constants.AUDIO_ROUTE_HEADSETNOMIC, + Constants.AUDIO_ROUTE_SPEAKERPHONE, + Constants.AUDIO_ROUTE_LOUDSPEAKER, + Constants.AUDIO_ROUTE_HEADSETBLUETOOTH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioOutputRouting { + } + + @IntDef({ + Constants.AUDIO_PROFILE_DEFAULT, + Constants.AUDIO_PROFILE_SPEECH_STANDARD, + Constants.AUDIO_PROFILE_MUSIC_STANDARD, + Constants.AUDIO_PROFILE_MUSIC_STANDARD_STEREO, + Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY, + Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioProfile { + } + + @IntDef({ + Constants.AUDIO_RECORDING_QUALITY_LOW, + Constants.AUDIO_RECORDING_QUALITY_MEDIUM, + Constants.AUDIO_RECORDING_QUALITY_HIGH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioRecordingQuality { + } + + @IntDef({ + Constants.REMOTE_AUDIO_STATE_STOPPED, + Constants.REMOTE_AUDIO_STATE_STARTING, + Constants.REMOTE_AUDIO_STATE_DECODING, + Constants.REMOTE_AUDIO_STATE_FROZEN, + Constants.REMOTE_AUDIO_STATE_FAILED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioRemoteState { + } + + @IntDef({ + Constants.REMOTE_AUDIO_REASON_INTERNAL, + Constants.REMOTE_AUDIO_REASON_NETWORK_CONGESTION, + Constants.REMOTE_AUDIO_REASON_NETWORK_RECOVERY, + Constants.REMOTE_AUDIO_REASON_LOCAL_MUTED, + Constants.REMOTE_AUDIO_REASON_LOCAL_UNMUTED, + Constants.REMOTE_AUDIO_REASON_REMOTE_MUTED, + Constants.REMOTE_AUDIO_REASON_REMOTE_UNMUTED, + Constants.REMOTE_AUDIO_REASON_REMOTE_OFFLINE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioRemoteStateReason { + } + + @IntDef({ + Constants.AUDIO_REVERB_OFF, + Constants.AUDIO_REVERB_POPULAR, + Constants.AUDIO_REVERB_RNB, + Constants.AUDIO_REVERB_ROCK, + Constants.AUDIO_REVERB_HIPHOP, + Constants.AUDIO_REVERB_VOCAL_CONCERT, + Constants.AUDIO_REVERB_KTV, + Constants.AUDIO_REVERB_STUDIO, + Constants.AUDIO_REVERB_FX_KTV, + Constants.AUDIO_REVERB_FX_VOCAL_CONCERT, + Constants.AUDIO_REVERB_FX_UNCLE, + Constants.AUDIO_REVERB_FX_SISTER, + Constants.AUDIO_REVERB_FX_STUDIO, + Constants.AUDIO_REVERB_FX_POPULAR, + Constants.AUDIO_REVERB_FX_RNB, + Constants.AUDIO_REVERB_FX_PHONOGRAPH, + Constants.AUDIO_VIRTUAL_STEREO, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioReverbPreset { + } + + @IntDef({ + Constants.AUDIO_REVERB_DRY_LEVEL, + Constants.AUDIO_REVERB_WET_LEVEL, + Constants.AUDIO_REVERB_ROOM_SIZE, + Constants.AUDIO_REVERB_WET_DELAY, + Constants.AUDIO_REVERB_STRENGTH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioReverbType { + } + + @IntDef({ + AgoraAudioSampleRateType.TYPE_32000, + AgoraAudioSampleRateType.TYPE_44100, + AgoraAudioSampleRateType.TYPE_48000, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioSampleRateType { + int TYPE_32000 = 32000; + int TYPE_44100 = 44100; + int TYPE_48000 = 48000; + } + + @IntDef({ + Constants.AUDIO_SCENARIO_DEFAULT, + Constants.AUDIO_SCENARIO_CHATROOM_ENTERTAINMENT, + Constants.AUDIO_SCENARIO_EDUCATION, + Constants.AUDIO_SCENARIO_GAME_STREAMING, + Constants.AUDIO_SCENARIO_SHOWROOM, + Constants.AUDIO_SCENARIO_CHATROOM_GAMING, + Constants.AUDIO_SCENARIO_IOT, + Constants.AUDIO_SCENARIO_MEETING, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioScenario { + } + + @IntDef({ + Constants.VOICE_CHANGER_OFF, + Constants.VOICE_CHANGER_OLDMAN, + Constants.VOICE_CHANGER_BABYBOY, + Constants.VOICE_CHANGER_BABYGIRL, + Constants.VOICE_CHANGER_ZHUBAJIE, + Constants.VOICE_CHANGER_ETHEREAL, + Constants.VOICE_CHANGER_HULK, + Constants.VOICE_BEAUTY_VIGOROUS, + Constants.VOICE_BEAUTY_DEEP, + Constants.VOICE_BEAUTY_MELLOW, + Constants.VOICE_BEAUTY_FALSETTO, + Constants.VOICE_BEAUTY_FULL, + Constants.VOICE_BEAUTY_CLEAR, + Constants.VOICE_BEAUTY_RESOUNDING, + Constants.VOICE_BEAUTY_RINGING, + Constants.VOICE_BEAUTY_SPACIAL, + Constants.GENERAL_BEAUTY_VOICE_MALE_MAGNETIC, + Constants.GENERAL_BEAUTY_VOICE_FEMALE_FRESH, + Constants.GENERAL_BEAUTY_VOICE_FEMALE_VITALITY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioVoiceChanger { + } + + @IntDef({ + AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_AUTO, + AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE, + AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_PREVIEW, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraCameraCaptureOutputPreference { + int CAPTURER_OUTPUT_PREFERENCE_AUTO = 0; + int CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE = 1; + int CAPTURER_OUTPUT_PREFERENCE_PREVIEW = 2; + } + + @IntDef({ + AgoraCameraDirection.CAMERA_REAR, + AgoraCameraDirection.CAMERA_FRONT, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraCameraDirection { + int CAMERA_REAR = 0; + int CAMERA_FRONT = 1; + } + + @IntDef({ + Constants.RELAY_OK, + Constants.RELAY_ERROR_SERVER_ERROR_RESPONSE, + Constants.RELAY_ERROR_SERVER_NO_RESPONSE, + Constants.RELAY_ERROR_NO_RESOURCE_AVAILABLE, + Constants.RELAY_ERROR_FAILED_JOIN_SRC, + Constants.RELAY_ERROR_FAILED_JOIN_DEST, + Constants.RELAY_ERROR_FAILED_PACKET_RECEIVED_FROM_SRC, + Constants.RELAY_ERROR_FAILED_PACKET_SENT_TO_DEST, + Constants.RELAY_ERROR_SERVER_CONNECTION_LOST, + Constants.RELAY_ERROR_INTERNAL_ERROR, + Constants.RELAY_ERROR_SRC_TOKEN_EXPIRED, + Constants.RELAY_ERROR_DEST_TOKEN_EXPIRED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraChannelMediaRelayError { + } + + @IntDef({ + Constants.RELAY_EVENT_NETWORK_DISCONNECTED, + Constants.RELAY_EVENT_NETWORK_CONNECTED, + Constants.RELAY_EVENT_PACKET_JOINED_SRC_CHANNEL, + Constants.RELAY_EVENT_PACKET_JOINED_DEST_CHANNEL, + Constants.RELAY_EVENT_PACKET_SENT_TO_DEST_CHANNEL, + Constants.RELAY_EVENT_PACKET_RECEIVED_VIDEO_FROM_SRC, + Constants.RELAY_EVENT_PACKET_RECEIVED_AUDIO_FROM_SRC, + Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL, + Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED, + Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_NOT_CHANGE, + Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_IS_NULL, + Constants.RELAY_EVENT_VIDEO_PROFILE_UPDATE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraChannelMediaRelayEvent { + } + + @IntDef({ + Constants.RELAY_STATE_IDLE, + Constants.RELAY_STATE_CONNECTING, + Constants.RELAY_STATE_RUNNING, + Constants.RELAY_STATE_FAILURE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraChannelMediaRelayState { + } + + @IntDef({ + Constants.CHANNEL_PROFILE_COMMUNICATION, + Constants.CHANNEL_PROFILE_LIVE_BROADCASTING, + Constants.CHANNEL_PROFILE_GAME, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraChannelProfile { + } + + @IntDef({ + Constants.CLIENT_ROLE_BROADCASTER, + Constants.CLIENT_ROLE_AUDIENCE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraClientRole { + } + + @IntDef({ + Constants.CONNECTION_CHANGED_CONNECTING, + Constants.CONNECTION_CHANGED_JOIN_SUCCESS, + Constants.CONNECTION_CHANGED_INTERRUPTED, + Constants.CONNECTION_CHANGED_BANNED_BY_SERVER, + Constants.CONNECTION_CHANGED_JOIN_FAILED, + Constants.CONNECTION_CHANGED_LEAVE_CHANNEL, + Constants.CONNECTION_CHANGED_INVALID_APP_ID, + Constants.CONNECTION_CHANGED_INVALID_CHANNEL_NAME, + Constants.CONNECTION_CHANGED_INVALID_TOKEN, + Constants.CONNECTION_CHANGED_TOKEN_EXPIRED, + Constants.CONNECTION_CHANGED_REJECTED_BY_SERVER, + Constants.CONNECTION_CHANGED_SETTING_PROXY_SERVER, + Constants.CONNECTION_CHANGED_RENEW_TOKEN, + Constants.CONNECTION_CHANGED_CLIENT_IP_ADDRESS_CHANGED, + Constants.CONNECTION_CHANGED_KEEP_ALIVE_TIMEOUT, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraConnectionChangedReason { + } + + @IntDef({ + Constants.CONNECTION_STATE_DISCONNECTED, + Constants.CONNECTION_STATE_CONNECTING, + Constants.CONNECTION_STATE_CONNECTED, + Constants.CONNECTION_STATE_RECONNECTING, + Constants.CONNECTION_STATE_FAILED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraConnectionStateType { + } + + @IntDef({ + AgoraDegradationPreference.MAINTAIN_QUALITY, + AgoraDegradationPreference.MAINTAIN_FRAMERATE, + AgoraDegradationPreference.MAINTAIN_BALANCED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraDegradationPreference { + int MAINTAIN_QUALITY = 0; + int MAINTAIN_FRAMERATE = 1; + int MAINTAIN_BALANCED = 2; + } + + @IntDef({ + AgoraEncryptionMode.NONE, + AgoraEncryptionMode.AES128XTS, + AgoraEncryptionMode.AES128ECB, + AgoraEncryptionMode.AES256XTS, + AgoraEncryptionMode.SM4128ECB, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraEncryptionMode { + int NONE = 0; + int AES128XTS = 1; + int AES128ECB = 2; + int AES256XTS = 3; + int SM4128ECB = 4; + } + + @IntDef({ + Constants.ERR_OK, + Constants.ERR_FAILED, + Constants.ERR_INVALID_ARGUMENT, + Constants.ERR_NOT_READY, + Constants.ERR_NOT_SUPPORTED, + Constants.ERR_REFUSED, + Constants.ERR_BUFFER_TOO_SMALL, + Constants.ERR_NOT_INITIALIZED, + Constants.ERR_NO_PERMISSION, + Constants.ERR_TIMEDOUT, + Constants.ERR_CANCELED, + Constants.ERR_TOO_OFTEN, + Constants.ERR_BIND_SOCKET, + Constants.ERR_NET_DOWN, + Constants.ERR_NET_NOBUFS, + Constants.ERR_JOIN_CHANNEL_REJECTED, + Constants.ERR_LEAVE_CHANNEL_REJECTED, + Constants.ERR_ALREADY_IN_USE, + Constants.ERR_INVALID_APP_ID, + Constants.ERR_INVALID_CHANNEL_NAME, + Constants.ERR_NO_SERVER_RESOURCES, + Constants.ERR_TOKEN_EXPIRED, + Constants.ERR_INVALID_TOKEN, + Constants.ERR_CONNECTION_INTERRUPTED, + Constants.ERR_CONNECTION_LOST, + Constants.ERR_NOT_IN_CHANNEL, + Constants.ERR_SIZE_TOO_LARGE, + Constants.ERR_BITRATE_LIMIT, + Constants.ERR_TOO_MANY_DATA_STREAMS, + Constants.ERR_DECRYPTION_FAILED, + Constants.ERR_CLIENT_IS_BANNED_BY_SERVER, + Constants.ERR_WATERMARK_PARAM, + Constants.ERR_WATERMARK_PATH, + Constants.ERR_WATERMARK_PNG, + Constants.ERR_WATERMARKR_INFO, + Constants.ERR_WATERMARK_ARGB, + Constants.ERR_WATERMARK_READ, + Constants.ERR_ENCRYPTED_STREAM_NOT_ALLOWED_PUBLISHED, + Constants.ERR_INVALID_USER_ACCOUNT, + Constants.ERR_PUBLISH_STREAM_CDN_ERROR, + Constants.ERR_PUBLISH_STREAM_NUM_REACH_LIMIT, + Constants.ERR_PUBLISH_STREAM_NOT_AUTHORIZED, + Constants.ERR_PUBLISH_STREAM_INTERNAL_SERVER_ERROR, + Constants.ERR_PUBLISH_STREAM_NOT_FOUND, + Constants.ERR_PUBLISH_STREAM_FORMAT_NOT_SUPPORTED, + Constants.ERR_LOAD_MEDIA_ENGINE, + Constants.ERR_START_CALL, + Constants.ERR_START_CAMERA, + Constants.ERR_START_VIDEO_RENDER, + Constants.ERR_ADM_GENERAL_ERROR, + Constants.ERR_ADM_JAVA_RESOURCE, + Constants.ERR_ADM_SAMPLE_RATE, + Constants.ERR_ADM_INIT_PLAYOUT, + Constants.ERR_ADM_START_PLAYOUT, + Constants.ERR_ADM_STOP_PLAYOUT, + Constants.ERR_ADM_INIT_RECORDING, + Constants.ERR_ADM_START_RECORDING, + Constants.ERR_ADM_STOP_RECORDING, + Constants.ERR_ADM_RUNTIME_PLAYOUT_ERROR, + Constants.ERR_ADM_RUNTIME_RECORDING_ERROR, + Constants.ERR_ADM_RECORD_AUDIO_FAILED, + Constants.ERR_ADM_INIT_LOOPBACK, + Constants.ERR_ADM_START_LOOPBACK, + Constants.ERR_AUDIO_BT_SCO_FAILED, + Constants.ERR_ADM_NO_RECORDING_DEVICE, + Constants.ERR_ADM_NO_PLAYOUT_DEVICE, + Constants.ERR_VDM_CAMERA_NOT_AUTHORIZED, + Constants.ERR_VCM_UNKNOWN_ERROR, + Constants.ERR_VCM_ENCODER_INIT_ERROR, + Constants.ERR_VCM_ENCODER_ENCODE_ERROR, + Constants.ERR_VCM_ENCODER_SET_ERROR, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraErrorCode { + } + + @IntDef({ + Constants.INJECT_STREAM_STATUS_START_SUCCESS, + Constants.INJECT_STREAM_STATUS_START_ALREADY_EXISTS, + Constants.INJECT_STREAM_STATUS_START_UNAUTHORIZED, + Constants.INJECT_STREAM_STATUS_START_TIMEDOUT, + Constants.INJECT_STREAM_STATUS_START_FAILED, + Constants.INJECT_STREAM_STATUS_STOP_SUCCESS, + Constants.INJECT_STREAM_STATUS_STOP_NOT_FOUND, + Constants.INJECT_STREAM_STATUS_STOP_UNAUTHORIZED, + Constants.INJECT_STREAM_STATUS_STOP_TIMEDOUT, + Constants.INJECT_STREAM_STATUS_STOP_FAILED, + Constants.INJECT_STREAM_STATUS_BROKEN, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraInjectStreamStatus { + } + + @IntDef({ + Constants.LASTMILE_PROBE_RESULT_COMPLETE, + Constants.LASTMILE_PROBE_RESULT_INCOMPLETE_NO_BWE, + Constants.LASTMILE_PROBE_RESULT_UNAVAILABLE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraLastmileProbeResultState { + } + + @IntDef({ + BeautyOptions.LIGHTENING_CONTRAST_LOW, + BeautyOptions.LIGHTENING_CONTRAST_NORMAL, + BeautyOptions.LIGHTENING_CONTRAST_HIGH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraLighteningContrastLevel { + } + + @IntDef({ + Constants.LOCAL_VIDEO_STREAM_ERROR_OK, + Constants.LOCAL_VIDEO_STREAM_ERROR_FAILURE, + Constants.LOCAL_VIDEO_STREAM_ERROR_DEVICE_NO_PERMISSION, + Constants.LOCAL_VIDEO_STREAM_ERROR_DEVICE_BUSY, + Constants.LOCAL_VIDEO_STREAM_ERROR_CAPTURE_FAILURE, + Constants.LOCAL_VIDEO_STREAM_ERROR_ENCODE_FAILURE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraLocalVideoStreamError { + } + + @IntDef({ + Constants.LOCAL_VIDEO_STREAM_STATE_STOPPED, + Constants.LOCAL_VIDEO_STREAM_STATE_CAPTURING, + Constants.LOCAL_VIDEO_STREAM_STATE_ENCODING, + Constants.LOCAL_VIDEO_STREAM_STATE_FAILED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraLocalVideoStreamState { + } + + @IntDef({ + Constants.LOG_FILTER_OFF, + Constants.LOG_FILTER_DEBUG, + Constants.LOG_FILTER_INFO, + Constants.LOG_FILTER_WARNING, + Constants.LOG_FILTER_ERROR, + Constants.LOG_FILTER_CRITICAL, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraLogFilter { + } + + @IntDef({ + Constants.QUALITY_UNKNOWN, + Constants.QUALITY_EXCELLENT, + Constants.QUALITY_GOOD, + Constants.QUALITY_POOR, + Constants.QUALITY_BAD, + Constants.QUALITY_VBAD, + Constants.QUALITY_DOWN, + Constants.QUALITY_UNSUPPORTED, + Constants.QUALITY_DETECTING, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraNetworkQuality { + } + + @IntDef({ + Constants.NETWORK_TYPE_UNKNOWN, + Constants.NETWORK_TYPE_DISCONNECTED, + Constants.NETWORK_TYPE_LAN, + Constants.NETWORK_TYPE_WIFI, + Constants.NETWORK_TYPE_MOBILE_2G, + Constants.NETWORK_TYPE_MOBILE_3G, + Constants.NETWORK_TYPE_MOBILE_4G, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraNetworkType { + } + + @IntDef({ + Constants.RTMP_STREAM_PUBLISH_ERROR_OK, + Constants.RTMP_STREAM_PUBLISH_ERROR_INVALID_ARGUMENT, + Constants.RTMP_STREAM_PUBLISH_ERROR_ENCRYPTED_STREAM_NOT_ALLOWED, + Constants.RTMP_STREAM_PUBLISH_ERROR_CONNECTION_TIMEOUT, + Constants.RTMP_STREAM_PUBLISH_ERROR_INTERNAL_SERVER_ERROR, + Constants.RTMP_STREAM_PUBLISH_ERROR_RTMP_SERVER_ERROR, + Constants.RTMP_STREAM_PUBLISH_ERROR_TOO_OFTEN, + Constants.RTMP_STREAM_PUBLISH_ERROR_REACH_LIMIT, + Constants.RTMP_STREAM_PUBLISH_ERROR_NOT_AUTHORIZED, + Constants.RTMP_STREAM_PUBLISH_ERROR_STREAM_NOT_FOUND, + Constants.RTMP_STREAM_PUBLISH_ERROR_FORMAT_NOT_SUPPORTED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraRtmpStreamingErrorCode { + } + + @IntDef({ + Constants.RTMP_STREAM_PUBLISH_STATE_IDLE, + Constants.RTMP_STREAM_PUBLISH_STATE_CONNECTING, + Constants.RTMP_STREAM_PUBLISH_STATE_RUNNING, + Constants.RTMP_STREAM_PUBLISH_STATE_RECOVERING, + Constants.RTMP_STREAM_PUBLISH_STATE_FAILURE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraRtmpStreamingState { + } + + @IntDef({ + Constants.STREAM_FALLBACK_OPTION_DISABLED, + Constants.STREAM_FALLBACK_OPTION_VIDEO_STREAM_LOW, + Constants.STREAM_FALLBACK_OPTION_AUDIO_ONLY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraStreamFallbackOptions { + } + + @IntDef({ + Constants.USER_OFFLINE_QUIT, + Constants.USER_OFFLINE_DROPPED, + Constants.USER_OFFLINE_BECOME_AUDIENCE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraUserOfflineReason { + } + + @IntDef({ + Constants.USER_PRIORITY_HIGH, + Constants.USER_PRIORITY_NORMAL, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraUserPriority { + } + + @IntDef({ + AgoraVideoCodecProfileType.BASELINE, + AgoraVideoCodecProfileType.MAIN, + AgoraVideoCodecProfileType.HIGH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoCodecProfileType { + int BASELINE = 66; + int MAIN = 77; + int HIGH = 100; + } + + @IntDef({ + AgoraVideoFrameRate.FRAME_RATE_FPS_1, + AgoraVideoFrameRate.FRAME_RATE_FPS_7, + AgoraVideoFrameRate.FRAME_RATE_FPS_10, + AgoraVideoFrameRate.FRAME_RATE_FPS_15, + AgoraVideoFrameRate.FRAME_RATE_FPS_24, + AgoraVideoFrameRate.FRAME_RATE_FPS_30, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoFrameRate { + int FRAME_RATE_FPS_1 = 1; + int FRAME_RATE_FPS_7 = 7; + int FRAME_RATE_FPS_10 = 10; + int FRAME_RATE_FPS_15 = 15; + int FRAME_RATE_FPS_24 = 24; + int FRAME_RATE_FPS_30 = 30; + } + + @IntDef({ + Constants.VIDEO_MIRROR_MODE_AUTO, + Constants.VIDEO_MIRROR_MODE_ENABLED, + Constants.VIDEO_MIRROR_MODE_DISABLED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoMirrorMode { + } + + @IntDef({ + AgoraVideoOutputOrientationMode.ORIENTATION_MODE_ADAPTIVE, + AgoraVideoOutputOrientationMode.ORIENTATION_MODE_FIXED_LANDSCAPE, + AgoraVideoOutputOrientationMode.ORIENTATION_MODE_FIXED_PORTRAIT, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoOutputOrientationMode { + int ORIENTATION_MODE_ADAPTIVE = 0; + int ORIENTATION_MODE_FIXED_LANDSCAPE = 1; + int ORIENTATION_MODE_FIXED_PORTRAIT = 2; + } + + @IntDef({ + Constants.ADAPT_NONE, + Constants.ADAPT_UP_BANDWIDTH, + Constants.ADAPT_DOWN_BANDWIDTH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoQualityAdaptIndication { + } + + @IntDef({ + Constants.REMOTE_VIDEO_STATE_STOPPED, + Constants.REMOTE_VIDEO_STATE_STARTING, + Constants.REMOTE_VIDEO_STATE_DECODING, + Constants.REMOTE_VIDEO_STATE_FROZEN, + Constants.REMOTE_VIDEO_STATE_FAILED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoRemoteState { + } + + @IntDef({ + Constants.REMOTE_VIDEO_STATE_REASON_INTERNAL, + Constants.REMOTE_VIDEO_STATE_REASON_NETWORK_CONGESTION, + Constants.REMOTE_VIDEO_STATE_REASON_NETWORK_RECOVERY, + Constants.REMOTE_VIDEO_STATE_REASON_LOCAL_MUTED, + Constants.REMOTE_VIDEO_STATE_REASON_LOCAL_UNMUTED, + Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_MUTED, + Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_UNMUTED, + Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_OFFLINE, + Constants.REMOTE_VIDEO_STATE_REASON_AUDIO_FALLBACK, + Constants.REMOTE_VIDEO_STATE_REASON_AUDIO_FALLBACK_RECOVERY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoRemoteStateReason { + } + + @IntDef({ + VideoCanvas.RENDER_MODE_HIDDEN, + VideoCanvas.RENDER_MODE_FIT, + VideoCanvas.RENDER_MODE_ADAPTIVE, + VideoCanvas.RENDER_MODE_FILL, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoRenderMode { + } + + @IntDef({ + Constants.VIDEO_STREAM_HIGH, + Constants.VIDEO_STREAM_LOW, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoStreamType { + } + + @IntDef({ + Constants.WARN_INVALID_VIEW, + Constants.WARN_INIT_VIDEO, + Constants.WARN_PENDING, + Constants.WARN_NO_AVAILABLE_CHANNEL, + Constants.WARN_LOOKUP_CHANNEL_TIMEOUT, + Constants.WARN_LOOKUP_CHANNEL_REJECTED, + Constants.WARN_OPEN_CHANNEL_TIMEOUT, + Constants.WARN_OPEN_CHANNEL_REJECTED, + Constants.WARN_SWITCH_LIVE_VIDEO_TIMEOUT, + Constants.WARN_SET_CLIENT_ROLE_TIMEOUT, + Constants.WARN_SET_CLIENT_ROLE_NOT_AUTHORIZED, + Constants.WARN_OPEN_CHANNEL_INVALID_TICKET, + Constants.WARN_OPEN_CHANNEL_TRY_NEXT_VOS, + Constants.WARN_AUDIO_MIXING_OPEN_ERROR, + Constants.WARN_ADM_RUNTIME_PLAYOUT_WARNING, + Constants.WARN_ADM_RUNTIME_RECORDING_WARNING, + Constants.WARN_ADM_RECORD_AUDIO_SILENCE, + Constants.WARN_ADM_PLAYOUT_ABNORMAL_FREQUENCY, + Constants.WARN_ADM_RECORD_ABNORMAL_FREQUENCY, + Constants.WARN_ADM_CALL_INTERRUPTION, + Constants.WARN_ADM_RECORD_AUDIO_LOWLEVEL, + Constants.WARN_ADM_PLAYOUT_AUDIO_LOWLEVEL, + Constants.WARN_ADM_RECORD_IS_OCCUPIED, + Constants.WARN_APM_HOWLING, + Constants.WARN_ADM_GLITCH_STATE, + // TODO(3.3.0) WARN_APM_RESIDUAL_ECHO + Constants.WARN_ADM_IMPROPER_SETTINGS, + Constants.WARN_SUPER_RESOLUTION_STREAM_OVER_LIMITATION, + Constants.WARN_SUPER_RESOLUTION_USER_COUNT_OVER_LIMITATION, + Constants.WARN_SUPER_RESOLUTION_DEVICE_NOT_SUPPORTED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraWarningCode { + } + + @IntDef({ + RtcEngineConfig.AreaCode.AREA_CODE_CN, + RtcEngineConfig.AreaCode.AREA_CODE_NA, + RtcEngineConfig.AreaCode.AREA_CODE_EU, + RtcEngineConfig.AreaCode.AREA_CODE_AS, + RtcEngineConfig.AreaCode.AREA_CODE_JP, + RtcEngineConfig.AreaCode.AREA_CODE_IN, + RtcEngineConfig.AreaCode.AREA_CODE_GLOB, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAreaCode { + } + + @IntDef({ + Constants.SUB_STATE_IDLE, + Constants.SUB_STATE_NO_SUBSCRIBED, + Constants.SUB_STATE_SUBSCRIBING, + Constants.SUB_STATE_SUBSCRIBED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraStreamSubscribeState { + } + + @IntDef({ + Constants.PUB_STATE_IDLE, + Constants.PUB_STATE_NO_PUBLISHED, + Constants.PUB_STATE_PUBLISHING, + Constants.PUB_STATE_PUBLISHED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraStreamPublishState { + } + + @IntDef({ + Constants.RTMP_STREAMING_EVENT_FAILED_LOAD_IMAGE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraRtmpStreamingEvent { + } + + @IntDef({ + Constants.AUDIO_EFFECT_OFF, + Constants.ROOM_ACOUSTICS_KTV, + Constants.ROOM_ACOUSTICS_VOCAL_CONCERT, + Constants.ROOM_ACOUSTICS_STUDIO, + Constants.ROOM_ACOUSTICS_PHONOGRAPH, + Constants.ROOM_ACOUSTICS_VIRTUAL_STEREO, + Constants.ROOM_ACOUSTICS_SPACIAL, + Constants.ROOM_ACOUSTICS_ETHEREAL, + Constants.ROOM_ACOUSTICS_3D_VOICE, + Constants.VOICE_CHANGER_EFFECT_UNCLE, + Constants.VOICE_CHANGER_EFFECT_OLDMAN, + Constants.VOICE_CHANGER_EFFECT_BOY, + Constants.VOICE_CHANGER_EFFECT_SISTER, + Constants.VOICE_CHANGER_EFFECT_GIRL, + Constants.VOICE_CHANGER_EFFECT_PIGKING, + Constants.VOICE_CHANGER_EFFECT_HULK, + Constants.STYLE_TRANSFORMATION_RNB, + Constants.STYLE_TRANSFORMATION_POPULAR, + Constants.PITCH_CORRECTION, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioEffectPreset { + } + + @IntDef({ + Constants.VOICE_BEAUTIFIER_OFF, + Constants.CHAT_BEAUTIFIER_MAGNETIC, + Constants.CHAT_BEAUTIFIER_FRESH, + Constants.CHAT_BEAUTIFIER_VITALITY, + Constants.TIMBRE_TRANSFORMATION_VIGOROUS, + Constants.TIMBRE_TRANSFORMATION_DEEP, + Constants.TIMBRE_TRANSFORMATION_MELLOW, + Constants.TIMBRE_TRANSFORMATION_FALSETTO, + Constants.TIMBRE_TRANSFORMATION_FULL, + Constants.TIMBRE_TRANSFORMATION_CLEAR, + Constants.TIMBRE_TRANSFORMATION_RESOUNDING, + Constants.TIMBRE_TRANSFORMATION_RINGING, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVoiceBeautifierPreset { + } } diff --git a/android/src/main/java/io/agora/rtc/base/BeanCovertor.kt b/android/src/main/java/io/agora/rtc/base/BeanCovertor.kt index bd346c5e1..d7a94fb9a 100644 --- a/android/src/main/java/io/agora/rtc/base/BeanCovertor.kt +++ b/android/src/main/java/io/agora/rtc/base/BeanCovertor.kt @@ -10,170 +10,170 @@ import io.agora.rtc.models.ChannelMediaOptions import io.agora.rtc.video.* fun mapToVideoDimensions(map: Map<*, *>): VideoEncoderConfiguration.VideoDimensions { - return VideoEncoderConfiguration.VideoDimensions().apply { - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - } + return VideoEncoderConfiguration.VideoDimensions().apply { + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + } } fun mapToVideoEncoderConfiguration(map: Map<*, *>): VideoEncoderConfiguration { - return VideoEncoderConfiguration().apply { - (map["dimensions"] as? Map<*, *>)?.let { dimensions = mapToVideoDimensions(it) } - (map["frameRate"] as? Number)?.let { frameRate = it.toInt() } - (map["minFrameRate"] as? Number)?.let { minFrameRate = it.toInt() } - (map["bitrate"] as? Number)?.let { bitrate = it.toInt() } - (map["minBitrate"] as? Number)?.let { minBitrate = it.toInt() } - (map["orientationMode"] as? Number)?.let { orientationMode = intToOrientationMode(it.toInt()) } - (map["degradationPrefer"] as? Number)?.let { degradationPrefer = intToDegradationPreference(it.toInt()) } - (map["mirrorMode"] as? Number)?.let { mirrorMode = it.toInt() } - } + return VideoEncoderConfiguration().apply { + (map["dimensions"] as? Map<*, *>)?.let { dimensions = mapToVideoDimensions(it) } + (map["frameRate"] as? Number)?.let { frameRate = it.toInt() } + (map["minFrameRate"] as? Number)?.let { minFrameRate = it.toInt() } + (map["bitrate"] as? Number)?.let { bitrate = it.toInt() } + (map["minBitrate"] as? Number)?.let { minBitrate = it.toInt() } + (map["orientationMode"] as? Number)?.let { orientationMode = intToOrientationMode(it.toInt()) } + (map["degradationPrefer"] as? Number)?.let { degradationPrefer = intToDegradationPreference(it.toInt()) } + (map["mirrorMode"] as? Number)?.let { mirrorMode = it.toInt() } + } } fun mapToBeautyOptions(map: Map<*, *>): BeautyOptions { - return BeautyOptions().apply { - (map["lighteningContrastLevel"] as? Number)?.let { lighteningContrastLevel = it.toInt() } - (map["lighteningLevel"] as? Number)?.let { lighteningLevel = it.toFloat() } - (map["smoothnessLevel"] as? Number)?.let { smoothnessLevel = it.toFloat() } - (map["rednessLevel"] as? Number)?.let { rednessLevel = it.toFloat() } - } + return BeautyOptions().apply { + (map["lighteningContrastLevel"] as? Number)?.let { lighteningContrastLevel = it.toInt() } + (map["lighteningLevel"] as? Number)?.let { lighteningLevel = it.toFloat() } + (map["smoothnessLevel"] as? Number)?.let { smoothnessLevel = it.toFloat() } + (map["rednessLevel"] as? Number)?.let { rednessLevel = it.toFloat() } + } } fun mapToAgoraImage(map: Map<*, *>): AgoraImage { - return AgoraImage().apply { - (map["url"] as? String)?.let { url = it } - (map["x"] as? Number)?.let { x = it.toInt() } - (map["y"] as? Number)?.let { y = it.toInt() } - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - } + return AgoraImage().apply { + (map["url"] as? String)?.let { url = it } + (map["x"] as? Number)?.let { x = it.toInt() } + (map["y"] as? Number)?.let { y = it.toInt() } + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + } } fun mapToTranscodingUser(map: Map<*, *>): TranscodingUser { - return TranscodingUser().apply { - (map["uid"] as? Number)?.let { uid = it.toInt() } - (map["x"] as? Number)?.let { x = it.toInt() } - (map["y"] as? Number)?.let { y = it.toInt() } - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - (map["zOrder"] as? Number)?.let { zOrder = it.toInt() } - (map["alpha"] as? Number)?.let { alpha = it.toFloat() } - (map["audioChannel"] as? Number)?.let { audioChannel = it.toInt() } - } + return TranscodingUser().apply { + (map["uid"] as? Number)?.let { uid = it.toInt() } + (map["x"] as? Number)?.let { x = it.toInt() } + (map["y"] as? Number)?.let { y = it.toInt() } + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + (map["zOrder"] as? Number)?.let { zOrder = it.toInt() } + (map["alpha"] as? Number)?.let { alpha = it.toFloat() } + (map["audioChannel"] as? Number)?.let { audioChannel = it.toInt() } + } } fun mapToColor(map: Map<*, *>): Int { - return Color.rgb( - (map["red"] as Number).toInt(), - (map["green"] as Number).toInt(), - (map["blue"] as Number).toInt() - ) + return Color.rgb( + (map["red"] as Number).toInt(), + (map["green"] as Number).toInt(), + (map["blue"] as Number).toInt() + ) } fun mapToLiveTranscoding(map: Map<*, *>): LiveTranscoding { - return LiveTranscoding().apply { - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - (map["videoBitrate"] as? Number)?.let { videoBitrate = it.toInt() } - (map["videoFramerate"] as? Number)?.let { videoFramerate = it.toInt() } - (map["lowLatency"] as? Boolean)?.let { lowLatency = it } - (map["videoGop"] as? Number)?.let { videoGop = it.toInt() } - (map["watermark"] as? Map<*, *>)?.let { watermark = mapToAgoraImage(it) } - (map["backgroundImage"] as? Map<*, *>)?.let { backgroundImage = mapToAgoraImage(it) } - (map["audioSampleRate"] as? Number)?.let { audioSampleRate = intToLiveTranscodingAudioSampleRate(it.toInt()) } - (map["audioBitrate"] as? Number)?.let { audioBitrate = it.toInt() } - (map["audioChannels"] as? Number)?.let { audioChannels = it.toInt() } - (map["audioCodecProfile"] as? Number)?.let { audioCodecProfile = intToAudioCodecProfile(it.toInt()) } - (map["videoCodecProfile"] as? Number)?.let { videoCodecProfile = intToVideoCodecProfile(it.toInt()) } - (map["backgroundColor"] as? Map<*, *>)?.let { backgroundColor = mapToColor(it) } - (map["userConfigExtraInfo"] as? String)?.let { userConfigExtraInfo = it } - (map["transcodingUsers"] as? List<*>)?.let { list -> - list.forEach { item -> - (item as? Map<*, *>)?.let { - addUser(mapToTranscodingUser(it)) - } - } + return LiveTranscoding().apply { + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + (map["videoBitrate"] as? Number)?.let { videoBitrate = it.toInt() } + (map["videoFramerate"] as? Number)?.let { videoFramerate = it.toInt() } + (map["lowLatency"] as? Boolean)?.let { lowLatency = it } + (map["videoGop"] as? Number)?.let { videoGop = it.toInt() } + (map["watermark"] as? Map<*, *>)?.let { watermark = mapToAgoraImage(it) } + (map["backgroundImage"] as? Map<*, *>)?.let { backgroundImage = mapToAgoraImage(it) } + (map["audioSampleRate"] as? Number)?.let { audioSampleRate = intToLiveTranscodingAudioSampleRate(it.toInt()) } + (map["audioBitrate"] as? Number)?.let { audioBitrate = it.toInt() } + (map["audioChannels"] as? Number)?.let { audioChannels = it.toInt() } + (map["audioCodecProfile"] as? Number)?.let { audioCodecProfile = intToAudioCodecProfile(it.toInt()) } + (map["videoCodecProfile"] as? Number)?.let { videoCodecProfile = intToVideoCodecProfile(it.toInt()) } + (map["backgroundColor"] as? Map<*, *>)?.let { backgroundColor = mapToColor(it) } + (map["userConfigExtraInfo"] as? String)?.let { userConfigExtraInfo = it } + (map["transcodingUsers"] as? List<*>)?.let { list -> + list.forEach { item -> + (item as? Map<*, *>)?.let { + addUser(mapToTranscodingUser(it)) } + } } + } } fun mapToChannelMediaInfo(map: Map<*, *>): ChannelMediaInfo { - return ChannelMediaInfo( - map["channelName"] as? String, - map["token"] as? String, - (map["uid"] as Number).toInt() - ) + return ChannelMediaInfo( + map["channelName"] as? String, + map["token"] as? String, + (map["uid"] as Number).toInt() + ) } fun mapToChannelMediaRelayConfiguration(map: Map<*, *>): ChannelMediaRelayConfiguration { - return ChannelMediaRelayConfiguration().apply { - (map["srcInfo"] as? Map<*, *>)?.let { setSrcChannelInfo(mapToChannelMediaInfo(it)) } - (map["destInfos"] as? List<*>)?.let { list -> - list.forEach { item -> - (item as? Map<*, *>)?.let { - val info = mapToChannelMediaInfo(it) - setDestChannelInfo(info.channelName, info) - } - } + return ChannelMediaRelayConfiguration().apply { + (map["srcInfo"] as? Map<*, *>)?.let { setSrcChannelInfo(mapToChannelMediaInfo(it)) } + (map["destInfos"] as? List<*>)?.let { list -> + list.forEach { item -> + (item as? Map<*, *>)?.let { + val info = mapToChannelMediaInfo(it) + setDestChannelInfo(info.channelName, info) } + } } + } } fun mapToLastmileProbeConfig(map: Map<*, *>): LastmileProbeConfig { - return LastmileProbeConfig().apply { - (map["probeUplink"] as? Boolean)?.let { probeUplink = it } - (map["probeDownlink"] as? Boolean)?.let { probeDownlink = it } - (map["expectedUplinkBitrate"] as? Number)?.let { expectedUplinkBitrate = it.toInt() } - (map["expectedDownlinkBitrate"] as? Number)?.let { expectedUplinkBitrate = it.toInt() } - } + return LastmileProbeConfig().apply { + (map["probeUplink"] as? Boolean)?.let { probeUplink = it } + (map["probeDownlink"] as? Boolean)?.let { probeDownlink = it } + (map["expectedUplinkBitrate"] as? Number)?.let { expectedUplinkBitrate = it.toInt() } + (map["expectedDownlinkBitrate"] as? Number)?.let { expectedUplinkBitrate = it.toInt() } + } } fun mapToRectangle(map: Map<*, *>): WatermarkOptions.Rectangle { - return WatermarkOptions.Rectangle().apply { - (map["x"] as? Number)?.let { x = it.toInt() } - (map["y"] as? Number)?.let { y = it.toInt() } - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - } + return WatermarkOptions.Rectangle().apply { + (map["x"] as? Number)?.let { x = it.toInt() } + (map["y"] as? Number)?.let { y = it.toInt() } + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + } } fun mapToWatermarkOptions(map: Map<*, *>): WatermarkOptions { - return WatermarkOptions().apply { - (map["visibleInPreview"] as? Boolean)?.let { visibleInPreview = it } - (map["positionInLandscapeMode"] as? Map<*, *>)?.let { positionInLandscapeMode = mapToRectangle(it) } - (map["positionInPortraitMode"] as? Map<*, *>)?.let { positionInPortraitMode = mapToRectangle(it) } - } + return WatermarkOptions().apply { + (map["visibleInPreview"] as? Boolean)?.let { visibleInPreview = it } + (map["positionInLandscapeMode"] as? Map<*, *>)?.let { positionInLandscapeMode = mapToRectangle(it) } + (map["positionInPortraitMode"] as? Map<*, *>)?.let { positionInPortraitMode = mapToRectangle(it) } + } } fun mapToLiveInjectStreamConfig(map: Map<*, *>): LiveInjectStreamConfig { - return LiveInjectStreamConfig().apply { - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - (map["videoGop"] as? Number)?.let { videoGop = it.toInt() } - (map["videoFramerate"] as? Number)?.let { videoFramerate = it.toInt() } - (map["videoBitrate"] as? Number)?.let { videoBitrate = it.toInt() } - (map["audioSampleRate"] as? Number)?.let { audioSampleRate = intToLiveInjectStreamConfigAudioSampleRate(it.toInt()) } - (map["audioBitrate"] as? Number)?.let { audioBitrate = it.toInt() } - (map["audioChannels"] as? Number)?.let { audioChannels = it.toInt() } - } + return LiveInjectStreamConfig().apply { + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + (map["videoGop"] as? Number)?.let { videoGop = it.toInt() } + (map["videoFramerate"] as? Number)?.let { videoFramerate = it.toInt() } + (map["videoBitrate"] as? Number)?.let { videoBitrate = it.toInt() } + (map["audioSampleRate"] as? Number)?.let { audioSampleRate = intToLiveInjectStreamConfigAudioSampleRate(it.toInt()) } + (map["audioBitrate"] as? Number)?.let { audioBitrate = it.toInt() } + (map["audioChannels"] as? Number)?.let { audioChannels = it.toInt() } + } } fun mapToCameraCapturerConfiguration(map: Map<*, *>): CameraCapturerConfiguration { - return CameraCapturerConfiguration( - intToCapturerOutputPreference((map["preference"] as Number).toInt()), - intToCameraDirection((map["cameraDirection"] as Number).toInt()) - ) + return CameraCapturerConfiguration( + intToCapturerOutputPreference((map["preference"] as Number).toInt()), + intToCameraDirection((map["cameraDirection"] as Number).toInt()) + ) } fun mapToChannelMediaOptions(map: Map<*, *>): ChannelMediaOptions { - return ChannelMediaOptions().apply { - (map["autoSubscribeAudio"] as? Boolean)?.let { autoSubscribeAudio = it } - (map["autoSubscribeVideo"] as? Boolean)?.let { autoSubscribeVideo = it } - } + return ChannelMediaOptions().apply { + (map["autoSubscribeAudio"] as? Boolean)?.let { autoSubscribeAudio = it } + (map["autoSubscribeVideo"] as? Boolean)?.let { autoSubscribeVideo = it } + } } fun mapToEncryptionConfig(map: Map<*, *>): EncryptionConfig { - return EncryptionConfig().apply { - (map["encryptionMode"] as? Number)?.let { encryptionMode = intToEncryptionMode(it.toInt()) } - (map["encryptionKey"] as? String)?.let { encryptionKey = it } - } + return EncryptionConfig().apply { + (map["encryptionMode"] as? Number)?.let { encryptionMode = intToEncryptionMode(it.toInt()) } + (map["encryptionKey"] as? String)?.let { encryptionKey = it } + } } diff --git a/android/src/main/java/io/agora/rtc/base/Callback.kt b/android/src/main/java/io/agora/rtc/base/Callback.kt index 3394d8303..d2dd152c1 100644 --- a/android/src/main/java/io/agora/rtc/base/Callback.kt +++ b/android/src/main/java/io/agora/rtc/base/Callback.kt @@ -5,37 +5,37 @@ import io.agora.rtc.RtcEngine import kotlin.math.abs abstract class Callback { - fun code(code: Int?, runnable: ((Int) -> Any?)? = null) { - if (code == null || code < 0) { - val newCode = abs(code ?: Constants.ERR_NOT_INITIALIZED) - failure(newCode.toString(), RtcEngine.getErrorDescription(newCode)) - return - } + fun code(code: Int?, runnable: ((Int) -> Any?)? = null) { + if (code == null || code < 0) { + val newCode = abs(code ?: Constants.ERR_NOT_INITIALIZED) + failure(newCode.toString(), RtcEngine.getErrorDescription(newCode)) + return + } - val res = if (runnable != null) runnable(code) else Unit - if (res is Unit) { - success(null) - } else { - success(res) - } + val res = if (runnable != null) runnable(code) else Unit + if (res is Unit) { + success(null) + } else { + success(res) } + } - fun resolve(source: T?, runnable: (T) -> Any?) { - if (source == null) { - val code = Constants.ERR_NOT_INITIALIZED - failure(code.toString(), RtcEngine.getErrorDescription(code)) - return - } + fun resolve(source: T?, runnable: (T) -> Any?) { + if (source == null) { + val code = Constants.ERR_NOT_INITIALIZED + failure(code.toString(), RtcEngine.getErrorDescription(code)) + return + } - val res = runnable(source) - if (res is Unit) { - success(null) - } else { - success(res) - } + val res = runnable(source) + if (res is Unit) { + success(null) + } else { + success(res) } + } - abstract fun success(data: Any?) + abstract fun success(data: Any?) - abstract fun failure(code: String, message: String) + abstract fun failure(code: String, message: String) } diff --git a/android/src/main/java/io/agora/rtc/base/EnumCovertor.kt b/android/src/main/java/io/agora/rtc/base/EnumCovertor.kt index a6306629c..ea423ce69 100644 --- a/android/src/main/java/io/agora/rtc/base/EnumCovertor.kt +++ b/android/src/main/java/io/agora/rtc/base/EnumCovertor.kt @@ -7,91 +7,91 @@ import io.agora.rtc.video.CameraCapturerConfiguration import io.agora.rtc.video.VideoEncoderConfiguration fun intToFrameRate(@Annotations.AgoraVideoFrameRate intValue: Int): VideoEncoderConfiguration.FRAME_RATE { - for (value in VideoEncoderConfiguration.FRAME_RATE.values()) { - if (value.value == intValue) { - return value - } + for (value in VideoEncoderConfiguration.FRAME_RATE.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("VideoEncoderConfiguration.FRAME_RATE not contains $intValue") + } + throw RuntimeException("VideoEncoderConfiguration.FRAME_RATE not contains $intValue") } fun intToOrientationMode(@Annotations.AgoraVideoOutputOrientationMode intValue: Int): VideoEncoderConfiguration.ORIENTATION_MODE { - for (value in VideoEncoderConfiguration.ORIENTATION_MODE.values()) { - if (value.value == intValue) { - return value - } + for (value in VideoEncoderConfiguration.ORIENTATION_MODE.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("VideoEncoderConfiguration.ORIENTATION_MODE not contains $intValue") + } + throw RuntimeException("VideoEncoderConfiguration.ORIENTATION_MODE not contains $intValue") } fun intToDegradationPreference(@Annotations.AgoraDegradationPreference intValue: Int): VideoEncoderConfiguration.DEGRADATION_PREFERENCE { - for (value in VideoEncoderConfiguration.DEGRADATION_PREFERENCE.values()) { - if (value.value == intValue) { - return value - } + for (value in VideoEncoderConfiguration.DEGRADATION_PREFERENCE.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("VideoEncoderConfiguration.DEGRADATION_PREFERENCE not contains $intValue") + } + throw RuntimeException("VideoEncoderConfiguration.DEGRADATION_PREFERENCE not contains $intValue") } fun intToLiveTranscodingAudioSampleRate(@Annotations.AgoraAudioSampleRateType intValue: Int): LiveTranscoding.AudioSampleRateType { - for (value in LiveTranscoding.AudioSampleRateType.values()) { - if (LiveTranscoding.AudioSampleRateType.getValue(value) == intValue) { - return value - } + for (value in LiveTranscoding.AudioSampleRateType.values()) { + if (LiveTranscoding.AudioSampleRateType.getValue(value) == intValue) { + return value } - throw RuntimeException("LiveTranscoding.AudioSampleRateType not contains $intValue") + } + throw RuntimeException("LiveTranscoding.AudioSampleRateType not contains $intValue") } fun intToLiveInjectStreamConfigAudioSampleRate(@Annotations.AgoraAudioSampleRateType intValue: Int): LiveInjectStreamConfig.AudioSampleRateType { - for (value in LiveInjectStreamConfig.AudioSampleRateType.values()) { - if (LiveInjectStreamConfig.AudioSampleRateType.getValue(value) == intValue) { - return value - } + for (value in LiveInjectStreamConfig.AudioSampleRateType.values()) { + if (LiveInjectStreamConfig.AudioSampleRateType.getValue(value) == intValue) { + return value } - throw RuntimeException("LiveInjectStreamConfig.AudioSampleRateType not contains $intValue") + } + throw RuntimeException("LiveInjectStreamConfig.AudioSampleRateType not contains $intValue") } fun intToAudioCodecProfile(@Annotations.AgoraAudioCodecProfileType intValue: Int): LiveTranscoding.AudioCodecProfileType { - for (value in LiveTranscoding.AudioCodecProfileType.values()) { - if (LiveTranscoding.AudioCodecProfileType.getValue(value) == intValue) { - return value - } + for (value in LiveTranscoding.AudioCodecProfileType.values()) { + if (LiveTranscoding.AudioCodecProfileType.getValue(value) == intValue) { + return value } - throw RuntimeException("LiveTranscoding.AudioCodecProfileType not contains $intValue") + } + throw RuntimeException("LiveTranscoding.AudioCodecProfileType not contains $intValue") } fun intToVideoCodecProfile(@Annotations.AgoraVideoCodecProfileType intValue: Int): LiveTranscoding.VideoCodecProfileType { - for (value in LiveTranscoding.VideoCodecProfileType.values()) { - if (LiveTranscoding.VideoCodecProfileType.getValue(value) == intValue) { - return value - } + for (value in LiveTranscoding.VideoCodecProfileType.values()) { + if (LiveTranscoding.VideoCodecProfileType.getValue(value) == intValue) { + return value } - throw RuntimeException("LiveTranscoding.VideoCodecProfileType not contains $intValue") + } + throw RuntimeException("LiveTranscoding.VideoCodecProfileType not contains $intValue") } fun intToCapturerOutputPreference(@Annotations.AgoraCameraCaptureOutputPreference intValue: Int): CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE { - for (value in CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE.values()) { - if (value.value == intValue) { - return value - } + for (value in CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE not contains $intValue") + } + throw RuntimeException("CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE not contains $intValue") } fun intToCameraDirection(@Annotations.AgoraCameraDirection intValue: Int): CameraCapturerConfiguration.CAMERA_DIRECTION { - for (value in CameraCapturerConfiguration.CAMERA_DIRECTION.values()) { - if (value.value == intValue) { - return value - } + for (value in CameraCapturerConfiguration.CAMERA_DIRECTION.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("CameraCapturerConfiguration.CAMERA_DIRECTION not contains $intValue") + } + throw RuntimeException("CameraCapturerConfiguration.CAMERA_DIRECTION not contains $intValue") } fun intToEncryptionMode(@Annotations.AgoraEncryptionMode intValue: Int): EncryptionConfig.EncryptionMode { - for (value in EncryptionConfig.EncryptionMode.values()) { - if (value.value == intValue) { - return value - } + for (value in EncryptionConfig.EncryptionMode.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("EncryptionConfig.EncryptionMode not contains $intValue") + } + throw RuntimeException("EncryptionConfig.EncryptionMode not contains $intValue") } diff --git a/android/src/main/java/io/agora/rtc/base/Extensions.kt b/android/src/main/java/io/agora/rtc/base/Extensions.kt index b745ddb7c..13d594918 100644 --- a/android/src/main/java/io/agora/rtc/base/Extensions.kt +++ b/android/src/main/java/io/agora/rtc/base/Extensions.kt @@ -5,152 +5,152 @@ import io.agora.rtc.IRtcEngineEventHandler.* import io.agora.rtc.models.UserInfo fun UserInfo.toMap(): Map { - return hashMapOf( - "uid" to uid, - "userAccount" to userAccount - ) + return hashMapOf( + "uid" to uid, + "userAccount" to userAccount + ) } fun LocalAudioStats.toMap(): Map { - return hashMapOf( - "numChannels" to numChannels, - "sentSampleRate" to sentSampleRate, - "sentBitrate" to sentBitrate, - "txPacketLossRate" to txPacketLossRate - ) + return hashMapOf( + "numChannels" to numChannels, + "sentSampleRate" to sentSampleRate, + "sentBitrate" to sentBitrate, + "txPacketLossRate" to txPacketLossRate + ) } fun RtcStats.toMap(): Map { - return hashMapOf( - "totalDuration" to totalDuration, - "txBytes" to txBytes, - "rxBytes" to rxBytes, - "txAudioBytes" to txAudioBytes, - "txVideoBytes" to txVideoBytes, - "rxAudioBytes" to rxAudioBytes, - "rxVideoBytes" to rxVideoBytes, - "txKBitRate" to txKBitRate, - "rxKBitRate" to rxKBitRate, - "txAudioKBitRate" to txAudioKBitRate, - "rxAudioKBitRate" to rxAudioKBitRate, - "txVideoKBitRate" to txVideoKBitRate, - "rxVideoKBitRate" to rxVideoKBitRate, - "users" to users, - "lastmileDelay" to lastmileDelay, - "txPacketLossRate" to txPacketLossRate, - "rxPacketLossRate" to rxPacketLossRate, - "cpuTotalUsage" to cpuTotalUsage, - "cpuAppUsage" to cpuAppUsage, - "gatewayRtt" to gatewayRtt, - "memoryAppUsageRatio" to memoryAppUsageRatio, - "memoryTotalUsageRatio" to memoryTotalUsageRatio, - "memoryAppUsageInKbytes" to memoryAppUsageInKbytes - ) + return hashMapOf( + "totalDuration" to totalDuration, + "txBytes" to txBytes, + "rxBytes" to rxBytes, + "txAudioBytes" to txAudioBytes, + "txVideoBytes" to txVideoBytes, + "rxAudioBytes" to rxAudioBytes, + "rxVideoBytes" to rxVideoBytes, + "txKBitRate" to txKBitRate, + "rxKBitRate" to rxKBitRate, + "txAudioKBitRate" to txAudioKBitRate, + "rxAudioKBitRate" to rxAudioKBitRate, + "txVideoKBitRate" to txVideoKBitRate, + "rxVideoKBitRate" to rxVideoKBitRate, + "users" to users, + "lastmileDelay" to lastmileDelay, + "txPacketLossRate" to txPacketLossRate, + "rxPacketLossRate" to rxPacketLossRate, + "cpuTotalUsage" to cpuTotalUsage, + "cpuAppUsage" to cpuAppUsage, + "gatewayRtt" to gatewayRtt, + "memoryAppUsageRatio" to memoryAppUsageRatio, + "memoryTotalUsageRatio" to memoryTotalUsageRatio, + "memoryAppUsageInKbytes" to memoryAppUsageInKbytes + ) } fun Rect.toMap(): Map { - return hashMapOf( - "left" to left, - "top" to top, - "right" to right, - "bottom" to bottom - ) + return hashMapOf( + "left" to left, + "top" to top, + "right" to right, + "bottom" to bottom + ) } fun RemoteAudioStats.toMap(): Map { - return hashMapOf( - "uid" to uid, - "quality" to quality, - "networkTransportDelay" to networkTransportDelay, - "jitterBufferDelay" to jitterBufferDelay, - "audioLossRate" to audioLossRate, - "numChannels" to numChannels, - "receivedSampleRate" to receivedSampleRate, - "receivedBitrate" to receivedBitrate, - "totalFrozenTime" to totalFrozenTime, - "frozenRate" to frozenRate, - "totalActiveTime" to totalActiveTime, - "publishDuration" to publishDuration - ) + return hashMapOf( + "uid" to uid, + "quality" to quality, + "networkTransportDelay" to networkTransportDelay, + "jitterBufferDelay" to jitterBufferDelay, + "audioLossRate" to audioLossRate, + "numChannels" to numChannels, + "receivedSampleRate" to receivedSampleRate, + "receivedBitrate" to receivedBitrate, + "totalFrozenTime" to totalFrozenTime, + "frozenRate" to frozenRate, + "totalActiveTime" to totalActiveTime, + "publishDuration" to publishDuration + ) } fun LocalVideoStats.toMap(): Map { - return hashMapOf( - "sentBitrate" to sentBitrate, - "sentFrameRate" to sentFrameRate, - "encoderOutputFrameRate" to encoderOutputFrameRate, - "rendererOutputFrameRate" to rendererOutputFrameRate, - "targetBitrate" to targetBitrate, - "targetFrameRate" to targetFrameRate, - "qualityAdaptIndication" to qualityAdaptIndication, - "encodedBitrate" to encodedBitrate, - "encodedFrameWidth" to encodedFrameWidth, - "encodedFrameHeight" to encodedFrameHeight, - "encodedFrameCount" to encodedFrameCount, - "codecType" to codecType, - "txPacketLossRate" to txPacketLossRate, - "captureFrameRate" to captureFrameRate - ) + return hashMapOf( + "sentBitrate" to sentBitrate, + "sentFrameRate" to sentFrameRate, + "encoderOutputFrameRate" to encoderOutputFrameRate, + "rendererOutputFrameRate" to rendererOutputFrameRate, + "targetBitrate" to targetBitrate, + "targetFrameRate" to targetFrameRate, + "qualityAdaptIndication" to qualityAdaptIndication, + "encodedBitrate" to encodedBitrate, + "encodedFrameWidth" to encodedFrameWidth, + "encodedFrameHeight" to encodedFrameHeight, + "encodedFrameCount" to encodedFrameCount, + "codecType" to codecType, + "txPacketLossRate" to txPacketLossRate, + "captureFrameRate" to captureFrameRate + ) } fun RemoteVideoStats.toMap(): Map { - return hashMapOf( - "uid" to uid, - "delay" to delay, - "width" to width, - "height" to height, - "receivedBitrate" to receivedBitrate, - "decoderOutputFrameRate" to decoderOutputFrameRate, - "rendererOutputFrameRate" to rendererOutputFrameRate, - "packetLossRate" to packetLossRate, - "rxStreamType" to rxStreamType, - "totalFrozenTime" to totalFrozenTime, - "frozenRate" to frozenRate, - "totalActiveTime" to totalActiveTime, - "publishDuration" to publishDuration - ) + return hashMapOf( + "uid" to uid, + "delay" to delay, + "width" to width, + "height" to height, + "receivedBitrate" to receivedBitrate, + "decoderOutputFrameRate" to decoderOutputFrameRate, + "rendererOutputFrameRate" to rendererOutputFrameRate, + "packetLossRate" to packetLossRate, + "rxStreamType" to rxStreamType, + "totalFrozenTime" to totalFrozenTime, + "frozenRate" to frozenRate, + "totalActiveTime" to totalActiveTime, + "publishDuration" to publishDuration + ) } fun AudioVolumeInfo.toMap(): Map { - return hashMapOf( - "uid" to uid, - "volume" to volume, - "vad" to vad, - "channelId" to channelId - ) + return hashMapOf( + "uid" to uid, + "volume" to volume, + "vad" to vad, + "channelId" to channelId + ) } fun Array.toMapList(): List> { - return List(size) { this[it].toMap() } + return List(size) { this[it].toMap() } } fun LastmileProbeResult.LastmileProbeOneWayResult.toMap(): Map { - return hashMapOf( - "packetLossRate" to packetLossRate, - "jitter" to jitter, - "availableBandwidth" to availableBandwidth - ) + return hashMapOf( + "packetLossRate" to packetLossRate, + "jitter" to jitter, + "availableBandwidth" to availableBandwidth + ) } fun LastmileProbeResult.toMap(): Map { - return hashMapOf( - "state" to state, - "rtt" to rtt, - "uplinkReport" to uplinkReport.toMap(), - "downlinkReport" to downlinkReport.toMap() - ) + return hashMapOf( + "state" to state, + "rtt" to rtt, + "uplinkReport" to uplinkReport.toMap(), + "downlinkReport" to downlinkReport.toMap() + ) } fun AgoraFacePositionInfo.toMap(): Map { - return hashMapOf( - "x" to x, - "y" to y, - "width" to width, - "height" to height, - "distance" to distance - ) + return hashMapOf( + "x" to x, + "y" to y, + "width" to width, + "height" to height, + "distance" to distance + ) } fun Array.toMapList(): List> { - return List(size) { this[it].toMap() } + return List(size) { this[it].toMap() } } diff --git a/android/src/main/java/io/agora/rtc/base/MediaObserver.kt b/android/src/main/java/io/agora/rtc/base/MediaObserver.kt index 729d7e57f..1983ecfc4 100644 --- a/android/src/main/java/io/agora/rtc/base/MediaObserver.kt +++ b/android/src/main/java/io/agora/rtc/base/MediaObserver.kt @@ -6,35 +6,35 @@ import java.util.* import java.util.concurrent.atomic.AtomicInteger class MediaObserver( - private val emit: (data: Map?) -> Unit + private val emit: (data: Map?) -> Unit ) : IMetadataObserver { - private var maxMetadataSize = AtomicInteger(0) - private var metadataList = Collections.synchronizedList(mutableListOf()) + private var maxMetadataSize = AtomicInteger(0) + private var metadataList = Collections.synchronizedList(mutableListOf()) - fun addMetadata(metadata: String) { - metadataList.add(metadata) - } + fun addMetadata(metadata: String) { + metadataList.add(metadata) + } - fun setMaxMetadataSize(@IntRange(from = 0, to = 1024) size: Int) { - maxMetadataSize.set(size) - } + fun setMaxMetadataSize(@IntRange(from = 0, to = 1024) size: Int) { + maxMetadataSize.set(size) + } - override fun onReadyToSendMetadata(timeStampMs: Long): ByteArray? { - if (metadataList.size > 0) { - return metadataList.removeAt(0).toByteArray() - } - return null + override fun onReadyToSendMetadata(timeStampMs: Long): ByteArray? { + if (metadataList.size > 0) { + return metadataList.removeAt(0).toByteArray() } + return null + } - override fun getMaxMetadataSize(): Int { - return maxMetadataSize.get() - } + override fun getMaxMetadataSize(): Int { + return maxMetadataSize.get() + } - override fun onMetadataReceived(buffer: ByteArray, uid: Int, timeStampMs: Long) { - emit(hashMapOf( - "buffer" to String(buffer), - "uid" to uid, - "timeStampMs" to timeStampMs - )) - } + override fun onMetadataReceived(buffer: ByteArray, uid: Int, timeStampMs: Long) { + emit(hashMapOf( + "buffer" to String(buffer), + "uid" to uid, + "timeStampMs" to timeStampMs + )) + } } diff --git a/android/src/main/java/io/agora/rtc/base/RtcChannel.kt b/android/src/main/java/io/agora/rtc/base/RtcChannel.kt index 5d270ca0c..58432cee0 100644 --- a/android/src/main/java/io/agora/rtc/base/RtcChannel.kt +++ b/android/src/main/java/io/agora/rtc/base/RtcChannel.kt @@ -8,323 +8,323 @@ import io.agora.rtc.internal.EncryptionConfig import java.util.* class IRtcChannel { - interface RtcChannelInterface : RtcAudioInterface, RtcVideoInterface, RtcVoicePositionInterface, - RtcPublishStreamInterface, RtcMediaRelayInterface, RtcDualStreamInterface, - RtcFallbackInterface, RtcMediaMetadataInterface, RtcEncryptionInterface, - RtcInjectStreamInterface, RtcStreamMessageInterface { - fun create(params: Map, callback: Callback) + interface RtcChannelInterface : RtcAudioInterface, RtcVideoInterface, RtcVoicePositionInterface, + RtcPublishStreamInterface, RtcMediaRelayInterface, RtcDualStreamInterface, + RtcFallbackInterface, RtcMediaMetadataInterface, RtcEncryptionInterface, + RtcInjectStreamInterface, RtcStreamMessageInterface { + fun create(params: Map, callback: Callback) - fun destroy(params: Map, callback: Callback) + fun destroy(params: Map, callback: Callback) - fun setClientRole(params: Map, callback: Callback) + fun setClientRole(params: Map, callback: Callback) - fun joinChannel(params: Map, callback: Callback) + fun joinChannel(params: Map, callback: Callback) - fun joinChannelWithUserAccount(params: Map, callback: Callback) + fun joinChannelWithUserAccount(params: Map, callback: Callback) - fun leaveChannel(params: Map, callback: Callback) + fun leaveChannel(params: Map, callback: Callback) - fun renewToken(params: Map, callback: Callback) + fun renewToken(params: Map, callback: Callback) - fun getConnectionState(params: Map, callback: Callback) + fun getConnectionState(params: Map, callback: Callback) - fun publish(params: Map, callback: Callback) + fun publish(params: Map, callback: Callback) - fun unpublish(params: Map, callback: Callback) + fun unpublish(params: Map, callback: Callback) - fun getCallId(params: Map, callback: Callback) - } + fun getCallId(params: Map, callback: Callback) + } - interface RtcAudioInterface { - fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) + interface RtcAudioInterface { + fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) - fun muteRemoteAudioStream(params: Map, callback: Callback) + fun muteRemoteAudioStream(params: Map, callback: Callback) - fun muteAllRemoteAudioStreams(params: Map, callback: Callback) + fun muteAllRemoteAudioStreams(params: Map, callback: Callback) - fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) - } + fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) + } - interface RtcVideoInterface { - fun muteRemoteVideoStream(params: Map, callback: Callback) + interface RtcVideoInterface { + fun muteRemoteVideoStream(params: Map, callback: Callback) - fun muteAllRemoteVideoStreams(params: Map, callback: Callback) + fun muteAllRemoteVideoStreams(params: Map, callback: Callback) - fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) - } + fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) + } - interface RtcVoicePositionInterface { - fun setRemoteVoicePosition(params: Map, callback: Callback) - } + interface RtcVoicePositionInterface { + fun setRemoteVoicePosition(params: Map, callback: Callback) + } - interface RtcPublishStreamInterface { - fun setLiveTranscoding(params: Map, callback: Callback) + interface RtcPublishStreamInterface { + fun setLiveTranscoding(params: Map, callback: Callback) - fun addPublishStreamUrl(params: Map, callback: Callback) + fun addPublishStreamUrl(params: Map, callback: Callback) - fun removePublishStreamUrl(params: Map, callback: Callback) - } + fun removePublishStreamUrl(params: Map, callback: Callback) + } - interface RtcMediaRelayInterface { - fun startChannelMediaRelay(params: Map, callback: Callback) + interface RtcMediaRelayInterface { + fun startChannelMediaRelay(params: Map, callback: Callback) - fun updateChannelMediaRelay(params: Map, callback: Callback) + fun updateChannelMediaRelay(params: Map, callback: Callback) - fun stopChannelMediaRelay(params: Map, callback: Callback) - } + fun stopChannelMediaRelay(params: Map, callback: Callback) + } - interface RtcDualStreamInterface { - fun setRemoteVideoStreamType(params: Map, callback: Callback) + interface RtcDualStreamInterface { + fun setRemoteVideoStreamType(params: Map, callback: Callback) - fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) - } + fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) + } - interface RtcFallbackInterface { - fun setRemoteUserPriority(params: Map, callback: Callback) - } + interface RtcFallbackInterface { + fun setRemoteUserPriority(params: Map, callback: Callback) + } - interface RtcMediaMetadataInterface { - fun registerMediaMetadataObserver(params: Map, callback: Callback) + interface RtcMediaMetadataInterface { + fun registerMediaMetadataObserver(params: Map, callback: Callback) - fun unregisterMediaMetadataObserver(params: Map, callback: Callback) + fun unregisterMediaMetadataObserver(params: Map, callback: Callback) - fun setMaxMetadataSize(params: Map, callback: Callback) + fun setMaxMetadataSize(params: Map, callback: Callback) - fun sendMetadata(params: Map, callback: Callback) - } + fun sendMetadata(params: Map, callback: Callback) + } - interface RtcEncryptionInterface { - fun setEncryptionSecret(params: Map, callback: Callback) + interface RtcEncryptionInterface { + fun setEncryptionSecret(params: Map, callback: Callback) - fun setEncryptionMode(params: Map, callback: Callback) + fun setEncryptionMode(params: Map, callback: Callback) - fun enableEncryption(params: Map, callback: Callback) - } + fun enableEncryption(params: Map, callback: Callback) + } - interface RtcInjectStreamInterface { - fun addInjectStreamUrl(params: Map, callback: Callback) + interface RtcInjectStreamInterface { + fun addInjectStreamUrl(params: Map, callback: Callback) - fun removeInjectStreamUrl(params: Map, callback: Callback) - } + fun removeInjectStreamUrl(params: Map, callback: Callback) + } - interface RtcStreamMessageInterface { - fun createDataStream(params: Map, callback: Callback) + interface RtcStreamMessageInterface { + fun createDataStream(params: Map, callback: Callback) - fun sendStreamMessage(params: Map, callback: Callback) - } + fun sendStreamMessage(params: Map, callback: Callback) + } } class RtcChannelManager( - private val emit: (methodName: String, data: Map?) -> Unit + private val emit: (methodName: String, data: Map?) -> Unit ) : IRtcChannel.RtcChannelInterface { - private val rtcChannelMap = Collections.synchronizedMap(mutableMapOf()) - private val mediaObserverMap = Collections.synchronizedMap(mutableMapOf()) - - fun release() { - rtcChannelMap.forEach { it.value.destroy() } - rtcChannelMap.clear() - mediaObserverMap.clear() - } - - operator fun get(channelId: String): RtcChannel? { - return rtcChannelMap[channelId] - } - - override fun create(params: Map, callback: Callback) { - callback.resolve(params["engine"] as RtcEngine) { e -> - e.createRtcChannel(params["channelId"] as String)?.let { - it.setRtcChannelEventHandler(RtcChannelEventHandler { methodName, data -> emit(methodName, data) }) - rtcChannelMap[it.channelId()] = it - } - Unit - } - } - - override fun destroy(params: Map, callback: Callback) { - var code: Int? = -Constants.ERR_NOT_INITIALIZED - this[params["channelId"] as String]?.let { - code = rtcChannelMap.remove(it.channelId())?.destroy() - } - callback.code(code) - } - - override fun setClientRole(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setClientRole((params["role"] as Number).toInt())) - } - - override fun joinChannel(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.joinChannel(params["token"] as? String, params["optionalInfo"] as? String, (params["optionalUid"] as Number).toInt(), mapToChannelMediaOptions(params["options"] as Map<*, *>))) - } - - override fun joinChannelWithUserAccount(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.joinChannelWithUserAccount(params["token"] as? String, params["userAccount"] as String, mapToChannelMediaOptions(params["options"] as Map<*, *>))) - } - - override fun leaveChannel(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.leaveChannel()) - } - - override fun renewToken(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.renewToken(params["token"] as String)) - } - - override fun getConnectionState(params: Map, callback: Callback) { - callback.resolve(this[params["channelId"] as String]) { it.connectionState } - } - - override fun publish(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.publish()) - } - - override fun unpublish(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.unpublish()) - } - - override fun getCallId(params: Map, callback: Callback) { - callback.resolve(this[params["channelId"] as String]) { it.callId } - } - - override fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.adjustUserPlaybackSignalVolume((params["uid"] as Number).toInt(), (params["volume"] as Number).toInt())) - } - - override fun muteRemoteAudioStream(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.muteRemoteAudioStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) - } - - override fun muteAllRemoteAudioStreams(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.muteAllRemoteAudioStreams(params["muted"] as Boolean)) - } - - override fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setDefaultMuteAllRemoteAudioStreams(params["muted"] as Boolean)) - } - - override fun muteRemoteVideoStream(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.muteRemoteVideoStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) - } - - override fun muteAllRemoteVideoStreams(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.muteAllRemoteVideoStreams(params["muted"] as Boolean)) - } - - override fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setDefaultMuteAllRemoteVideoStreams(params["muted"] as Boolean)) - } - - override fun setRemoteVoicePosition(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setRemoteVoicePosition((params["uid"] as Number).toInt(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble())) - } + private val rtcChannelMap = Collections.synchronizedMap(mutableMapOf()) + private val mediaObserverMap = Collections.synchronizedMap(mutableMapOf()) - override fun setLiveTranscoding(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setLiveTranscoding(mapToLiveTranscoding(params["transcoding"] as Map<*, *>))) - } + fun release() { + rtcChannelMap.forEach { it.value.destroy() } + rtcChannelMap.clear() + mediaObserverMap.clear() + } + + operator fun get(channelId: String): RtcChannel? { + return rtcChannelMap[channelId] + } + + override fun create(params: Map, callback: Callback) { + callback.resolve(params["engine"] as RtcEngine) { e -> + e.createRtcChannel(params["channelId"] as String)?.let { + it.setRtcChannelEventHandler(RtcChannelEventHandler { methodName, data -> emit(methodName, data) }) + rtcChannelMap[it.channelId()] = it + } + Unit + } + } - override fun addPublishStreamUrl(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.addPublishStreamUrl(params["url"] as String, params["transcodingEnabled"] as Boolean)) - } + override fun destroy(params: Map, callback: Callback) { + var code: Int? = -Constants.ERR_NOT_INITIALIZED + this[params["channelId"] as String]?.let { + code = rtcChannelMap.remove(it.channelId())?.destroy() + } + callback.code(code) + } - override fun removePublishStreamUrl(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.removePublishStreamUrl(params["url"] as String)) - } + override fun setClientRole(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setClientRole((params["role"] as Number).toInt())) + } - override fun startChannelMediaRelay(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.startChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) - } - - override fun updateChannelMediaRelay(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.updateChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) - } - - override fun stopChannelMediaRelay(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.stopChannelMediaRelay()) - } - - override fun setRemoteVideoStreamType(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setRemoteVideoStreamType((params["uid"] as Number).toInt(), (params["streamType"] as Number).toInt())) - } - - override fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setRemoteDefaultVideoStreamType((params["streamType"] as Number).toInt())) - } - - override fun setRemoteUserPriority(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setRemoteUserPriority((params["uid"] as Number).toInt(), (params["userPriority"] as Number).toInt())) - } - - override fun registerMediaMetadataObserver(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - this[params["channelId"] as String]?.let { - val mediaObserver = MediaObserver { data -> - emit(RtcChannelEvents.MetadataReceived, data?.toMutableMap()?.apply { put("channelId", it.channelId()) }) - } - code = it.registerMediaMetadataObserver(mediaObserver, IMetadataObserver.VIDEO_METADATA) - if (code == 0) mediaObserverMap[it.channelId()] = mediaObserver - } - callback.code(code) - } - - override fun unregisterMediaMetadataObserver(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - this[params["channelId"] as String]?.let { - code = it.registerMediaMetadataObserver(null, IMetadataObserver.VIDEO_METADATA) - if (code == 0) mediaObserverMap.remove(it.channelId()) - } - callback.code(code) - } - - override fun setMaxMetadataSize(params: Map, callback: Callback) { - callback.resolve(mediaObserverMap[params["channelId"] as String]) { - it.maxMetadataSize = (params["size"] as Number).toInt() - Unit - } - } - - override fun sendMetadata(params: Map, callback: Callback) { - callback.resolve(mediaObserverMap[params["channelId"] as String]) { - it.addMetadata(params["metadata"] as String) - Unit - } - } - - override fun setEncryptionSecret(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setEncryptionSecret(params["secret"] as String)) - } - - override fun setEncryptionMode(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setEncryptionMode(when ((params["encryptionMode"] as Number).toInt()) { - EncryptionConfig.EncryptionMode.AES_128_XTS.value -> "aes-128-xts" - EncryptionConfig.EncryptionMode.AES_128_ECB.value -> "aes-128-ecb" - EncryptionConfig.EncryptionMode.AES_256_XTS.value -> "aes-256-xts" - else -> "" - })) - } - - override fun enableEncryption(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.enableEncryption(params["enabled"] as Boolean, mapToEncryptionConfig(params["config"] as Map<*, *>))) - } - - override fun addInjectStreamUrl(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.addInjectStreamUrl(params["url"] as String, mapToLiveInjectStreamConfig(params["config"] as Map<*, *>))) - } - - override fun removeInjectStreamUrl(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.removeInjectStreamUrl(params["url"] as String)) - } - - override fun createDataStream(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - this[params["channelId"] as String]?.let { - code = it.createDataStream(params["reliable"] as Boolean, params["ordered"] as Boolean) - } - callback.code(code) { it } - } - - override fun sendStreamMessage(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - this[params["channelId"] as String]?.let { - code = it.sendStreamMessage((params["streamId"] as Number).toInt(), (params["message"] as String).toByteArray()) - } - callback.code(code) - } + override fun joinChannel(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.joinChannel(params["token"] as? String, params["optionalInfo"] as? String, (params["optionalUid"] as Number).toInt(), mapToChannelMediaOptions(params["options"] as Map<*, *>))) + } + + override fun joinChannelWithUserAccount(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.joinChannelWithUserAccount(params["token"] as? String, params["userAccount"] as String, mapToChannelMediaOptions(params["options"] as Map<*, *>))) + } + + override fun leaveChannel(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.leaveChannel()) + } + + override fun renewToken(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.renewToken(params["token"] as String)) + } + + override fun getConnectionState(params: Map, callback: Callback) { + callback.resolve(this[params["channelId"] as String]) { it.connectionState } + } + + override fun publish(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.publish()) + } + + override fun unpublish(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.unpublish()) + } + + override fun getCallId(params: Map, callback: Callback) { + callback.resolve(this[params["channelId"] as String]) { it.callId } + } + + override fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.adjustUserPlaybackSignalVolume((params["uid"] as Number).toInt(), (params["volume"] as Number).toInt())) + } + + override fun muteRemoteAudioStream(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.muteRemoteAudioStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) + } + + override fun muteAllRemoteAudioStreams(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.muteAllRemoteAudioStreams(params["muted"] as Boolean)) + } + + override fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setDefaultMuteAllRemoteAudioStreams(params["muted"] as Boolean)) + } + + override fun muteRemoteVideoStream(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.muteRemoteVideoStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) + } + + override fun muteAllRemoteVideoStreams(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.muteAllRemoteVideoStreams(params["muted"] as Boolean)) + } + + override fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setDefaultMuteAllRemoteVideoStreams(params["muted"] as Boolean)) + } + + override fun setRemoteVoicePosition(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setRemoteVoicePosition((params["uid"] as Number).toInt(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble())) + } + + override fun setLiveTranscoding(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setLiveTranscoding(mapToLiveTranscoding(params["transcoding"] as Map<*, *>))) + } + + override fun addPublishStreamUrl(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.addPublishStreamUrl(params["url"] as String, params["transcodingEnabled"] as Boolean)) + } + + override fun removePublishStreamUrl(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.removePublishStreamUrl(params["url"] as String)) + } + + override fun startChannelMediaRelay(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.startChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) + } + + override fun updateChannelMediaRelay(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.updateChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) + } + + override fun stopChannelMediaRelay(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.stopChannelMediaRelay()) + } + + override fun setRemoteVideoStreamType(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setRemoteVideoStreamType((params["uid"] as Number).toInt(), (params["streamType"] as Number).toInt())) + } + + override fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setRemoteDefaultVideoStreamType((params["streamType"] as Number).toInt())) + } + + override fun setRemoteUserPriority(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setRemoteUserPriority((params["uid"] as Number).toInt(), (params["userPriority"] as Number).toInt())) + } + + override fun registerMediaMetadataObserver(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + this[params["channelId"] as String]?.let { + val mediaObserver = MediaObserver { data -> + emit(RtcChannelEvents.MetadataReceived, data?.toMutableMap()?.apply { put("channelId", it.channelId()) }) + } + code = it.registerMediaMetadataObserver(mediaObserver, IMetadataObserver.VIDEO_METADATA) + if (code == 0) mediaObserverMap[it.channelId()] = mediaObserver + } + callback.code(code) + } + + override fun unregisterMediaMetadataObserver(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + this[params["channelId"] as String]?.let { + code = it.registerMediaMetadataObserver(null, IMetadataObserver.VIDEO_METADATA) + if (code == 0) mediaObserverMap.remove(it.channelId()) + } + callback.code(code) + } + + override fun setMaxMetadataSize(params: Map, callback: Callback) { + callback.resolve(mediaObserverMap[params["channelId"] as String]) { + it.maxMetadataSize = (params["size"] as Number).toInt() + Unit + } + } + + override fun sendMetadata(params: Map, callback: Callback) { + callback.resolve(mediaObserverMap[params["channelId"] as String]) { + it.addMetadata(params["metadata"] as String) + Unit + } + } + + override fun setEncryptionSecret(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setEncryptionSecret(params["secret"] as String)) + } + + override fun setEncryptionMode(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setEncryptionMode(when ((params["encryptionMode"] as Number).toInt()) { + EncryptionConfig.EncryptionMode.AES_128_XTS.value -> "aes-128-xts" + EncryptionConfig.EncryptionMode.AES_128_ECB.value -> "aes-128-ecb" + EncryptionConfig.EncryptionMode.AES_256_XTS.value -> "aes-256-xts" + else -> "" + })) + } + + override fun enableEncryption(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.enableEncryption(params["enabled"] as Boolean, mapToEncryptionConfig(params["config"] as Map<*, *>))) + } + + override fun addInjectStreamUrl(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.addInjectStreamUrl(params["url"] as String, mapToLiveInjectStreamConfig(params["config"] as Map<*, *>))) + } + + override fun removeInjectStreamUrl(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.removeInjectStreamUrl(params["url"] as String)) + } + + override fun createDataStream(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + this[params["channelId"] as String]?.let { + code = it.createDataStream(params["reliable"] as Boolean, params["ordered"] as Boolean) + } + callback.code(code) { it } + } + + override fun sendStreamMessage(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + this[params["channelId"] as String]?.let { + code = it.sendStreamMessage((params["streamId"] as Number).toInt(), (params["message"] as String).toByteArray()) + } + callback.code(code) + } } diff --git a/android/src/main/java/io/agora/rtc/base/RtcChannelEvent.kt b/android/src/main/java/io/agora/rtc/base/RtcChannelEvent.kt index fe3dca3b0..f00f9a5fa 100644 --- a/android/src/main/java/io/agora/rtc/base/RtcChannelEvent.kt +++ b/android/src/main/java/io/agora/rtc/base/RtcChannelEvent.kt @@ -6,234 +6,234 @@ import io.agora.rtc.IRtcEngineEventHandler import io.agora.rtc.RtcChannel class RtcChannelEvents { - companion object { - const val Warning = "Warning" - const val Error = "Error" - const val JoinChannelSuccess = "JoinChannelSuccess" - const val RejoinChannelSuccess = "RejoinChannelSuccess" - const val LeaveChannel = "LeaveChannel" - const val ClientRoleChanged = "ClientRoleChanged" - const val UserJoined = "UserJoined" - const val UserOffline = "UserOffline" - const val ConnectionStateChanged = "ConnectionStateChanged" - const val ConnectionLost = "ConnectionLost" - const val TokenPrivilegeWillExpire = "TokenPrivilegeWillExpire" - const val RequestToken = "RequestToken" - const val ActiveSpeaker = "ActiveSpeaker" - const val VideoSizeChanged = "VideoSizeChanged" - const val RemoteVideoStateChanged = "RemoteVideoStateChanged" - const val RemoteAudioStateChanged = "RemoteAudioStateChanged" - const val LocalPublishFallbackToAudioOnly = "LocalPublishFallbackToAudioOnly" - const val RemoteSubscribeFallbackToAudioOnly = "RemoteSubscribeFallbackToAudioOnly" - const val RtcStats = "RtcStats" - const val NetworkQuality = "NetworkQuality" - const val RemoteVideoStats = "RemoteVideoStats" - const val RemoteAudioStats = "RemoteAudioStats" - const val RtmpStreamingStateChanged = "RtmpStreamingStateChanged" - const val TranscodingUpdated = "TranscodingUpdated" - const val StreamInjectedStatus = "StreamInjectedStatus" - const val StreamMessage = "StreamMessage" - const val StreamMessageError = "StreamMessageError" - const val ChannelMediaRelayStateChanged = "ChannelMediaRelayStateChanged" - const val ChannelMediaRelayEvent = "ChannelMediaRelayEvent" - const val MetadataReceived = "MetadataReceived" - const val AudioPublishStateChanged = "AudioPublishStateChanged" - const val VideoPublishStateChanged = "VideoPublishStateChanged" - const val AudioSubscribeStateChanged = "AudioSubscribeStateChanged" - const val VideoSubscribeStateChanged = "VideoSubscribeStateChanged" - const val RtmpStreamingEvent = "RtmpStreamingEvent" - - fun toMap(): Map { - return hashMapOf( - "Warning" to Warning, - "Error" to Error, - "JoinChannelSuccess" to JoinChannelSuccess, - "RejoinChannelSuccess" to RejoinChannelSuccess, - "LeaveChannel" to LeaveChannel, - "ClientRoleChanged" to ClientRoleChanged, - "UserJoined" to UserJoined, - "UserOffline" to UserOffline, - "ConnectionStateChanged" to ConnectionStateChanged, - "ConnectionLost" to ConnectionLost, - "TokenPrivilegeWillExpire" to TokenPrivilegeWillExpire, - "RequestToken" to RequestToken, - "ActiveSpeaker" to ActiveSpeaker, - "VideoSizeChanged" to VideoSizeChanged, - "RemoteVideoStateChanged" to RemoteVideoStateChanged, - "RemoteAudioStateChanged" to RemoteAudioStateChanged, - "LocalPublishFallbackToAudioOnly" to LocalPublishFallbackToAudioOnly, - "RemoteSubscribeFallbackToAudioOnly" to RemoteSubscribeFallbackToAudioOnly, - "RtcStats" to RtcStats, - "NetworkQuality" to NetworkQuality, - "RemoteVideoStats" to RemoteVideoStats, - "RemoteAudioStats" to RemoteAudioStats, - "RtmpStreamingStateChanged" to RtmpStreamingStateChanged, - "TranscodingUpdated" to TranscodingUpdated, - "StreamInjectedStatus" to StreamInjectedStatus, - "StreamMessage" to StreamMessage, - "StreamMessageError" to StreamMessageError, - "ChannelMediaRelayStateChanged" to ChannelMediaRelayStateChanged, - "ChannelMediaRelayEvent" to ChannelMediaRelayEvent, - "MetadataReceived" to MetadataReceived, - "AudioPublishStateChanged" to AudioPublishStateChanged, - "VideoPublishStateChanged" to VideoPublishStateChanged, - "AudioSubscribeStateChanged" to AudioSubscribeStateChanged, - "VideoSubscribeStateChanged" to VideoSubscribeStateChanged, - "RtmpStreamingEvent" to RtmpStreamingEvent - ) - } - } + companion object { + const val Warning = "Warning" + const val Error = "Error" + const val JoinChannelSuccess = "JoinChannelSuccess" + const val RejoinChannelSuccess = "RejoinChannelSuccess" + const val LeaveChannel = "LeaveChannel" + const val ClientRoleChanged = "ClientRoleChanged" + const val UserJoined = "UserJoined" + const val UserOffline = "UserOffline" + const val ConnectionStateChanged = "ConnectionStateChanged" + const val ConnectionLost = "ConnectionLost" + const val TokenPrivilegeWillExpire = "TokenPrivilegeWillExpire" + const val RequestToken = "RequestToken" + const val ActiveSpeaker = "ActiveSpeaker" + const val VideoSizeChanged = "VideoSizeChanged" + const val RemoteVideoStateChanged = "RemoteVideoStateChanged" + const val RemoteAudioStateChanged = "RemoteAudioStateChanged" + const val LocalPublishFallbackToAudioOnly = "LocalPublishFallbackToAudioOnly" + const val RemoteSubscribeFallbackToAudioOnly = "RemoteSubscribeFallbackToAudioOnly" + const val RtcStats = "RtcStats" + const val NetworkQuality = "NetworkQuality" + const val RemoteVideoStats = "RemoteVideoStats" + const val RemoteAudioStats = "RemoteAudioStats" + const val RtmpStreamingStateChanged = "RtmpStreamingStateChanged" + const val TranscodingUpdated = "TranscodingUpdated" + const val StreamInjectedStatus = "StreamInjectedStatus" + const val StreamMessage = "StreamMessage" + const val StreamMessageError = "StreamMessageError" + const val ChannelMediaRelayStateChanged = "ChannelMediaRelayStateChanged" + const val ChannelMediaRelayEvent = "ChannelMediaRelayEvent" + const val MetadataReceived = "MetadataReceived" + const val AudioPublishStateChanged = "AudioPublishStateChanged" + const val VideoPublishStateChanged = "VideoPublishStateChanged" + const val AudioSubscribeStateChanged = "AudioSubscribeStateChanged" + const val VideoSubscribeStateChanged = "VideoSubscribeStateChanged" + const val RtmpStreamingEvent = "RtmpStreamingEvent" + + fun toMap(): Map { + return hashMapOf( + "Warning" to Warning, + "Error" to Error, + "JoinChannelSuccess" to JoinChannelSuccess, + "RejoinChannelSuccess" to RejoinChannelSuccess, + "LeaveChannel" to LeaveChannel, + "ClientRoleChanged" to ClientRoleChanged, + "UserJoined" to UserJoined, + "UserOffline" to UserOffline, + "ConnectionStateChanged" to ConnectionStateChanged, + "ConnectionLost" to ConnectionLost, + "TokenPrivilegeWillExpire" to TokenPrivilegeWillExpire, + "RequestToken" to RequestToken, + "ActiveSpeaker" to ActiveSpeaker, + "VideoSizeChanged" to VideoSizeChanged, + "RemoteVideoStateChanged" to RemoteVideoStateChanged, + "RemoteAudioStateChanged" to RemoteAudioStateChanged, + "LocalPublishFallbackToAudioOnly" to LocalPublishFallbackToAudioOnly, + "RemoteSubscribeFallbackToAudioOnly" to RemoteSubscribeFallbackToAudioOnly, + "RtcStats" to RtcStats, + "NetworkQuality" to NetworkQuality, + "RemoteVideoStats" to RemoteVideoStats, + "RemoteAudioStats" to RemoteAudioStats, + "RtmpStreamingStateChanged" to RtmpStreamingStateChanged, + "TranscodingUpdated" to TranscodingUpdated, + "StreamInjectedStatus" to StreamInjectedStatus, + "StreamMessage" to StreamMessage, + "StreamMessageError" to StreamMessageError, + "ChannelMediaRelayStateChanged" to ChannelMediaRelayStateChanged, + "ChannelMediaRelayEvent" to ChannelMediaRelayEvent, + "MetadataReceived" to MetadataReceived, + "AudioPublishStateChanged" to AudioPublishStateChanged, + "VideoPublishStateChanged" to VideoPublishStateChanged, + "AudioSubscribeStateChanged" to AudioSubscribeStateChanged, + "VideoSubscribeStateChanged" to VideoSubscribeStateChanged, + "RtmpStreamingEvent" to RtmpStreamingEvent + ) + } + } } class RtcChannelEventHandler( - private val emitter: (methodName: String, data: Map?) -> Unit + private val emitter: (methodName: String, data: Map?) -> Unit ) : IRtcChannelEventHandler() { - companion object { - const val PREFIX = "io.agora.rtc." - } - - private fun callback(methodName: String, channel: RtcChannel?, vararg data: Any?) { - channel?.let { - emitter(methodName, hashMapOf( - "channelId" to it.channelId(), - "data" to data.toList() - )) - } - } - - override fun onChannelWarning(rtcChannel: RtcChannel?, @Annotations.AgoraWarningCode warn: Int) { - callback(RtcChannelEvents.Warning, rtcChannel, warn) - } - - override fun onChannelError(rtcChannel: RtcChannel?, @Annotations.AgoraErrorCode err: Int) { - callback(RtcChannelEvents.Error, rtcChannel, err) - } - - override fun onJoinChannelSuccess(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { - callback(RtcChannelEvents.JoinChannelSuccess, rtcChannel, rtcChannel?.channelId(), uid, elapsed) - } - - override fun onRejoinChannelSuccess(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { - callback(RtcChannelEvents.RejoinChannelSuccess, rtcChannel, rtcChannel?.channelId(), uid, elapsed) - } - - override fun onLeaveChannel(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RtcStats?) { - callback(RtcChannelEvents.LeaveChannel, rtcChannel, stats?.toMap()) - } - - override fun onClientRoleChanged(rtcChannel: RtcChannel?, @Annotations.AgoraClientRole oldRole: Int, @Annotations.AgoraClientRole newRole: Int) { - callback(RtcChannelEvents.ClientRoleChanged, rtcChannel, oldRole, newRole) - } - - override fun onUserJoined(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { - callback(RtcChannelEvents.UserJoined, rtcChannel, uid, elapsed) - } - - override fun onUserOffline(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraUserOfflineReason reason: Int) { - callback(RtcChannelEvents.UserOffline, rtcChannel, uid, reason) - } - - override fun onConnectionStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraConnectionStateType state: Int, @Annotations.AgoraConnectionChangedReason reason: Int) { - callback(RtcChannelEvents.ConnectionStateChanged, rtcChannel, state, reason) - } - - override fun onConnectionLost(rtcChannel: RtcChannel?) { - callback(RtcChannelEvents.ConnectionLost, rtcChannel) - } - - override fun onTokenPrivilegeWillExpire(rtcChannel: RtcChannel?, token: String?) { - callback(RtcChannelEvents.TokenPrivilegeWillExpire, rtcChannel, token) - } - - override fun onRequestToken(rtcChannel: RtcChannel?) { - callback(RtcChannelEvents.RequestToken, rtcChannel) + companion object { + const val PREFIX = "io.agora.rtc." + } + + private fun callback(methodName: String, channel: RtcChannel?, vararg data: Any?) { + channel?.let { + emitter(methodName, hashMapOf( + "channelId" to it.channelId(), + "data" to data.toList() + )) } + } - override fun onActiveSpeaker(rtcChannel: RtcChannel?, uid: Int) { - callback(RtcChannelEvents.ActiveSpeaker, rtcChannel, uid) - } + override fun onChannelWarning(rtcChannel: RtcChannel?, @Annotations.AgoraWarningCode warn: Int) { + callback(RtcChannelEvents.Warning, rtcChannel, warn) + } - override fun onVideoSizeChanged(rtcChannel: RtcChannel?, uid: Int, width: Int, height: Int, @IntRange(from = 0, to = 360) rotation: Int) { - callback(RtcChannelEvents.VideoSizeChanged, rtcChannel, uid, width, height, rotation) - } + override fun onChannelError(rtcChannel: RtcChannel?, @Annotations.AgoraErrorCode err: Int) { + callback(RtcChannelEvents.Error, rtcChannel, err) + } - override fun onRemoteVideoStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraVideoRemoteState state: Int, @Annotations.AgoraVideoRemoteStateReason reason: Int, elapsed: Int) { - callback(RtcChannelEvents.RemoteVideoStateChanged, rtcChannel, uid, state, reason, elapsed) - } + override fun onJoinChannelSuccess(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { + callback(RtcChannelEvents.JoinChannelSuccess, rtcChannel, rtcChannel?.channelId(), uid, elapsed) + } - override fun onRemoteAudioStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraAudioRemoteState state: Int, @Annotations.AgoraAudioRemoteStateReason reason: Int, elapsed: Int) { - callback(RtcChannelEvents.RemoteAudioStateChanged, rtcChannel, uid, state, reason, elapsed) - } + override fun onRejoinChannelSuccess(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { + callback(RtcChannelEvents.RejoinChannelSuccess, rtcChannel, rtcChannel?.channelId(), uid, elapsed) + } - override fun onLocalPublishFallbackToAudioOnly(rtcChannel: RtcChannel?, isFallbackOrRecover: Boolean) { - callback(RtcChannelEvents.LocalPublishFallbackToAudioOnly, rtcChannel, isFallbackOrRecover) - } + override fun onLeaveChannel(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RtcStats?) { + callback(RtcChannelEvents.LeaveChannel, rtcChannel, stats?.toMap()) + } - override fun onRemoteSubscribeFallbackToAudioOnly(rtcChannel: RtcChannel?, uid: Int, isFallbackOrRecover: Boolean) { - callback(RtcChannelEvents.RemoteSubscribeFallbackToAudioOnly, rtcChannel, uid, isFallbackOrRecover) - } - - override fun onRtcStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RtcStats?) { - callback(RtcChannelEvents.RtcStats, rtcChannel, stats?.toMap()) - } - - override fun onNetworkQuality(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraNetworkQuality txQuality: Int, @Annotations.AgoraNetworkQuality rxQuality: Int) { - callback(RtcChannelEvents.NetworkQuality, rtcChannel, uid, txQuality, rxQuality) - } - - override fun onRemoteVideoStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RemoteVideoStats?) { - callback(RtcChannelEvents.RemoteVideoStats, rtcChannel, stats?.toMap()) - } + override fun onClientRoleChanged(rtcChannel: RtcChannel?, @Annotations.AgoraClientRole oldRole: Int, @Annotations.AgoraClientRole newRole: Int) { + callback(RtcChannelEvents.ClientRoleChanged, rtcChannel, oldRole, newRole) + } - override fun onRemoteAudioStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RemoteAudioStats?) { - callback(RtcChannelEvents.RemoteAudioStats, rtcChannel, stats?.toMap()) - } + override fun onUserJoined(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { + callback(RtcChannelEvents.UserJoined, rtcChannel, uid, elapsed) + } - override fun onRtmpStreamingStateChanged(rtcChannel: RtcChannel?, url: String?, @Annotations.AgoraRtmpStreamingState state: Int, @Annotations.AgoraRtmpStreamingErrorCode errCode: Int) { - callback(RtcChannelEvents.RtmpStreamingStateChanged, rtcChannel, url, state, errCode) - } + override fun onUserOffline(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraUserOfflineReason reason: Int) { + callback(RtcChannelEvents.UserOffline, rtcChannel, uid, reason) + } - override fun onTranscodingUpdated(rtcChannel: RtcChannel?) { - callback(RtcChannelEvents.TranscodingUpdated, rtcChannel) - } + override fun onConnectionStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraConnectionStateType state: Int, @Annotations.AgoraConnectionChangedReason reason: Int) { + callback(RtcChannelEvents.ConnectionStateChanged, rtcChannel, state, reason) + } + + override fun onConnectionLost(rtcChannel: RtcChannel?) { + callback(RtcChannelEvents.ConnectionLost, rtcChannel) + } + + override fun onTokenPrivilegeWillExpire(rtcChannel: RtcChannel?, token: String?) { + callback(RtcChannelEvents.TokenPrivilegeWillExpire, rtcChannel, token) + } + + override fun onRequestToken(rtcChannel: RtcChannel?) { + callback(RtcChannelEvents.RequestToken, rtcChannel) + } + + override fun onActiveSpeaker(rtcChannel: RtcChannel?, uid: Int) { + callback(RtcChannelEvents.ActiveSpeaker, rtcChannel, uid) + } + + override fun onVideoSizeChanged(rtcChannel: RtcChannel?, uid: Int, width: Int, height: Int, @IntRange(from = 0, to = 360) rotation: Int) { + callback(RtcChannelEvents.VideoSizeChanged, rtcChannel, uid, width, height, rotation) + } + + override fun onRemoteVideoStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraVideoRemoteState state: Int, @Annotations.AgoraVideoRemoteStateReason reason: Int, elapsed: Int) { + callback(RtcChannelEvents.RemoteVideoStateChanged, rtcChannel, uid, state, reason, elapsed) + } + + override fun onRemoteAudioStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraAudioRemoteState state: Int, @Annotations.AgoraAudioRemoteStateReason reason: Int, elapsed: Int) { + callback(RtcChannelEvents.RemoteAudioStateChanged, rtcChannel, uid, state, reason, elapsed) + } + + override fun onLocalPublishFallbackToAudioOnly(rtcChannel: RtcChannel?, isFallbackOrRecover: Boolean) { + callback(RtcChannelEvents.LocalPublishFallbackToAudioOnly, rtcChannel, isFallbackOrRecover) + } + + override fun onRemoteSubscribeFallbackToAudioOnly(rtcChannel: RtcChannel?, uid: Int, isFallbackOrRecover: Boolean) { + callback(RtcChannelEvents.RemoteSubscribeFallbackToAudioOnly, rtcChannel, uid, isFallbackOrRecover) + } + + override fun onRtcStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RtcStats?) { + callback(RtcChannelEvents.RtcStats, rtcChannel, stats?.toMap()) + } + + override fun onNetworkQuality(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraNetworkQuality txQuality: Int, @Annotations.AgoraNetworkQuality rxQuality: Int) { + callback(RtcChannelEvents.NetworkQuality, rtcChannel, uid, txQuality, rxQuality) + } + + override fun onRemoteVideoStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RemoteVideoStats?) { + callback(RtcChannelEvents.RemoteVideoStats, rtcChannel, stats?.toMap()) + } + + override fun onRemoteAudioStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RemoteAudioStats?) { + callback(RtcChannelEvents.RemoteAudioStats, rtcChannel, stats?.toMap()) + } + + override fun onRtmpStreamingStateChanged(rtcChannel: RtcChannel?, url: String?, @Annotations.AgoraRtmpStreamingState state: Int, @Annotations.AgoraRtmpStreamingErrorCode errCode: Int) { + callback(RtcChannelEvents.RtmpStreamingStateChanged, rtcChannel, url, state, errCode) + } + + override fun onTranscodingUpdated(rtcChannel: RtcChannel?) { + callback(RtcChannelEvents.TranscodingUpdated, rtcChannel) + } - override fun onStreamInjectedStatus(rtcChannel: RtcChannel?, url: String?, uid: Int, @Annotations.AgoraInjectStreamStatus status: Int) { - callback(RtcChannelEvents.StreamInjectedStatus, rtcChannel, url, uid, status) - } + override fun onStreamInjectedStatus(rtcChannel: RtcChannel?, url: String?, uid: Int, @Annotations.AgoraInjectStreamStatus status: Int) { + callback(RtcChannelEvents.StreamInjectedStatus, rtcChannel, url, uid, status) + } - override fun onStreamMessage(rtcChannel: RtcChannel?, uid: Int, streamId: Int, data: ByteArray?) { - callback(RtcChannelEvents.StreamMessage, rtcChannel, uid, streamId, data?.let { String(it, Charsets.UTF_8) }) - } + override fun onStreamMessage(rtcChannel: RtcChannel?, uid: Int, streamId: Int, data: ByteArray?) { + callback(RtcChannelEvents.StreamMessage, rtcChannel, uid, streamId, data?.let { String(it, Charsets.UTF_8) }) + } - override fun onStreamMessageError(rtcChannel: RtcChannel?, uid: Int, streamId: Int, @Annotations.AgoraErrorCode error: Int, missed: Int, cached: Int) { - callback(RtcChannelEvents.StreamMessageError, rtcChannel, uid, streamId, error, missed, cached) - } + override fun onStreamMessageError(rtcChannel: RtcChannel?, uid: Int, streamId: Int, @Annotations.AgoraErrorCode error: Int, missed: Int, cached: Int) { + callback(RtcChannelEvents.StreamMessageError, rtcChannel, uid, streamId, error, missed, cached) + } - override fun onChannelMediaRelayStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraChannelMediaRelayState state: Int, @Annotations.AgoraChannelMediaRelayError code: Int) { - callback(RtcChannelEvents.ChannelMediaRelayStateChanged, rtcChannel, state, code) - } + override fun onChannelMediaRelayStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraChannelMediaRelayState state: Int, @Annotations.AgoraChannelMediaRelayError code: Int) { + callback(RtcChannelEvents.ChannelMediaRelayStateChanged, rtcChannel, state, code) + } - override fun onChannelMediaRelayEvent(rtcChannel: RtcChannel?, @Annotations.AgoraChannelMediaRelayEvent code: Int) { - callback(RtcChannelEvents.ChannelMediaRelayEvent, rtcChannel, code) - } + override fun onChannelMediaRelayEvent(rtcChannel: RtcChannel?, @Annotations.AgoraChannelMediaRelayEvent code: Int) { + callback(RtcChannelEvents.ChannelMediaRelayEvent, rtcChannel, code) + } - override fun onAudioPublishStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { - callback(RtcChannelEvents.AudioPublishStateChanged, rtcChannel, rtcChannel?.channelId(), oldState, newState, elapseSinceLastState) - } + override fun onAudioPublishStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { + callback(RtcChannelEvents.AudioPublishStateChanged, rtcChannel, rtcChannel?.channelId(), oldState, newState, elapseSinceLastState) + } - override fun onVideoPublishStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { - callback(RtcChannelEvents.VideoPublishStateChanged, rtcChannel, rtcChannel?.channelId(), oldState, newState, elapseSinceLastState) - } + override fun onVideoPublishStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { + callback(RtcChannelEvents.VideoPublishStateChanged, rtcChannel, rtcChannel?.channelId(), oldState, newState, elapseSinceLastState) + } - override fun onAudioSubscribeStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { - callback(RtcChannelEvents.AudioSubscribeStateChanged, rtcChannel, rtcChannel?.channelId(), uid, oldState, newState, elapseSinceLastState) - } + override fun onAudioSubscribeStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { + callback(RtcChannelEvents.AudioSubscribeStateChanged, rtcChannel, rtcChannel?.channelId(), uid, oldState, newState, elapseSinceLastState) + } - override fun onVideoSubscribeStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { - callback(RtcChannelEvents.VideoSubscribeStateChanged, rtcChannel, rtcChannel?.channelId(), uid, oldState, newState, elapseSinceLastState) - } + override fun onVideoSubscribeStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { + callback(RtcChannelEvents.VideoSubscribeStateChanged, rtcChannel, rtcChannel?.channelId(), uid, oldState, newState, elapseSinceLastState) + } - override fun onRtmpStreamingEvent(rtcChannel: RtcChannel?, url: String?, @Annotations.AgoraRtmpStreamingEvent errCode: Int) { - callback(RtcChannelEvents.RtmpStreamingEvent, rtcChannel, url, errCode) - } + override fun onRtmpStreamingEvent(rtcChannel: RtcChannel?, url: String?, @Annotations.AgoraRtmpStreamingEvent errCode: Int) { + callback(RtcChannelEvents.RtmpStreamingEvent, rtcChannel, url, errCode) + } } diff --git a/android/src/main/java/io/agora/rtc/base/RtcEngine.kt b/android/src/main/java/io/agora/rtc/base/RtcEngine.kt index 38a3561f3..9249a05f3 100644 --- a/android/src/main/java/io/agora/rtc/base/RtcEngine.kt +++ b/android/src/main/java/io/agora/rtc/base/RtcEngine.kt @@ -6,901 +6,923 @@ import io.agora.rtc.internal.EncryptionConfig import io.agora.rtc.models.UserInfo class IRtcEngine { - interface RtcEngineInterface : RtcUserInfoInterface, RtcAudioInterface, RtcVideoInterface, - RtcAudioMixingInterface, RtcAudioEffectInterface, RtcVoiceChangerInterface, - RtcVoicePositionInterface, RtcPublishStreamInterface, RtcMediaRelayInterface, - RtcAudioRouteInterface, RtcEarMonitoringInterface, RtcDualStreamInterface, - RtcFallbackInterface, RtcTestInterface, RtcMediaMetadataInterface, - RtcWatermarkInterface, RtcEncryptionInterface, RtcAudioRecorderInterface, - RtcInjectStreamInterface, RtcCameraInterface, RtcStreamMessageInterface { - fun create(params: Map, callback: Callback) + interface RtcEngineInterface : RtcUserInfoInterface, RtcAudioInterface, RtcVideoInterface, + RtcAudioMixingInterface, RtcAudioEffectInterface, RtcVoiceChangerInterface, + RtcVoicePositionInterface, RtcPublishStreamInterface, RtcMediaRelayInterface, + RtcAudioRouteInterface, RtcEarMonitoringInterface, RtcDualStreamInterface, + RtcFallbackInterface, RtcTestInterface, RtcMediaMetadataInterface, + RtcWatermarkInterface, RtcEncryptionInterface, RtcAudioRecorderInterface, + RtcInjectStreamInterface, RtcCameraInterface, RtcStreamMessageInterface { + fun create(params: Map, callback: Callback) - fun destroy(callback: Callback) + fun destroy(callback: Callback) - fun setChannelProfile(params: Map, callback: Callback) + fun setChannelProfile(params: Map, callback: Callback) - fun setClientRole(params: Map, callback: Callback) + fun setClientRole(params: Map, callback: Callback) - fun joinChannel(params: Map, callback: Callback) + fun joinChannel(params: Map, callback: Callback) - fun switchChannel(params: Map, callback: Callback) + fun switchChannel(params: Map, callback: Callback) - fun leaveChannel(callback: Callback) + fun leaveChannel(callback: Callback) - fun renewToken(params: Map, callback: Callback) + fun renewToken(params: Map, callback: Callback) - @Deprecated("") - fun enableWebSdkInteroperability(params: Map, callback: Callback) + @Deprecated("") + fun enableWebSdkInteroperability(params: Map, callback: Callback) - fun getConnectionState(callback: Callback) + fun getConnectionState(callback: Callback) - fun sendCustomReportMessage(params: Map, callback: Callback) + fun sendCustomReportMessage(params: Map, callback: Callback) - fun getCallId(callback: Callback) + fun getCallId(callback: Callback) - fun rate(params: Map, callback: Callback) + fun rate(params: Map, callback: Callback) - fun complain(params: Map, callback: Callback) + fun complain(params: Map, callback: Callback) - fun setLogFile(params: Map, callback: Callback) + fun setLogFile(params: Map, callback: Callback) - fun setLogFilter(params: Map, callback: Callback) + fun setLogFilter(params: Map, callback: Callback) - fun setLogFileSize(params: Map, callback: Callback) + fun setLogFileSize(params: Map, callback: Callback) - fun setParameters(params: Map, callback: Callback) + fun setParameters(params: Map, callback: Callback) - fun getNativeHandle(callback: Callback) - } - - interface RtcUserInfoInterface { - fun registerLocalUserAccount(params: Map, callback: Callback) - - fun joinChannelWithUserAccount(params: Map, callback: Callback) - - fun getUserInfoByUserAccount(params: Map, callback: Callback) - - fun getUserInfoByUid(params: Map, callback: Callback) - } - - interface RtcAudioInterface { - fun enableAudio(callback: Callback) - - fun disableAudio(callback: Callback) - - fun setAudioProfile(params: Map, callback: Callback) - - fun adjustRecordingSignalVolume(params: Map, callback: Callback) - - fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) - - fun adjustPlaybackSignalVolume(params: Map, callback: Callback) - - fun enableLocalAudio(params: Map, callback: Callback) - - fun muteLocalAudioStream(params: Map, callback: Callback) - - fun muteRemoteAudioStream(params: Map, callback: Callback) - - fun muteAllRemoteAudioStreams(params: Map, callback: Callback) - - fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) - - fun enableAudioVolumeIndication(params: Map, callback: Callback) - } - - interface RtcVideoInterface { - fun enableVideo(callback: Callback) - - fun disableVideo(callback: Callback) - - fun setVideoEncoderConfiguration(params: Map, callback: Callback) - - fun startPreview(callback: Callback) - - fun stopPreview(callback: Callback) - - fun enableLocalVideo(params: Map, callback: Callback) - - fun muteLocalVideoStream(params: Map, callback: Callback) - - fun muteRemoteVideoStream(params: Map, callback: Callback) - - fun muteAllRemoteVideoStreams(params: Map, callback: Callback) + fun getNativeHandle(callback: Callback) + } - fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) + interface RtcUserInfoInterface { + fun registerLocalUserAccount(params: Map, callback: Callback) - fun setBeautyEffectOptions(params: Map, callback: Callback) - } - - interface RtcAudioMixingInterface { - fun startAudioMixing(params: Map, callback: Callback) - - fun stopAudioMixing(callback: Callback) - - fun pauseAudioMixing(callback: Callback) - - fun resumeAudioMixing(callback: Callback) - - fun adjustAudioMixingVolume(params: Map, callback: Callback) - - fun adjustAudioMixingPlayoutVolume(params: Map, callback: Callback) + fun joinChannelWithUserAccount(params: Map, callback: Callback) - fun adjustAudioMixingPublishVolume(params: Map, callback: Callback) + fun getUserInfoByUserAccount(params: Map, callback: Callback) - fun getAudioMixingPlayoutVolume(callback: Callback) + fun getUserInfoByUid(params: Map, callback: Callback) + } - fun getAudioMixingPublishVolume(callback: Callback) + interface RtcAudioInterface { + fun enableAudio(callback: Callback) - fun getAudioMixingDuration(callback: Callback) + fun disableAudio(callback: Callback) - fun getAudioMixingCurrentPosition(callback: Callback) + fun setAudioProfile(params: Map, callback: Callback) - fun setAudioMixingPosition(params: Map, callback: Callback) + fun adjustRecordingSignalVolume(params: Map, callback: Callback) - fun setAudioMixingPitch(params: Map, callback: Callback) - } - - interface RtcAudioEffectInterface { - fun getEffectsVolume(callback: Callback) - - fun setEffectsVolume(params: Map, callback: Callback) - - fun setVolumeOfEffect(params: Map, callback: Callback) + fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) - fun playEffect(params: Map, callback: Callback) + fun adjustPlaybackSignalVolume(params: Map, callback: Callback) - fun stopEffect(params: Map, callback: Callback) + fun enableLocalAudio(params: Map, callback: Callback) - fun stopAllEffects(callback: Callback) + fun muteLocalAudioStream(params: Map, callback: Callback) - fun preloadEffect(params: Map, callback: Callback) + fun muteRemoteAudioStream(params: Map, callback: Callback) - fun unloadEffect(params: Map, callback: Callback) + fun muteAllRemoteAudioStreams(params: Map, callback: Callback) - fun pauseEffect(params: Map, callback: Callback) + fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) - fun pauseAllEffects(callback: Callback) + fun enableAudioVolumeIndication(params: Map, callback: Callback) + } - fun resumeEffect(params: Map, callback: Callback) - - fun resumeAllEffects(callback: Callback) - - fun setAudioSessionOperationRestriction(params: Map, callback: Callback) - } + interface RtcVideoInterface { + fun enableVideo(callback: Callback) - interface RtcVoiceChangerInterface { - fun setLocalVoiceChanger(params: Map, callback: Callback) + fun disableVideo(callback: Callback) - fun setLocalVoiceReverbPreset(params: Map, callback: Callback) + fun setVideoEncoderConfiguration(params: Map, callback: Callback) - fun setLocalVoicePitch(params: Map, callback: Callback) + fun startPreview(callback: Callback) - fun setLocalVoiceEqualization(params: Map, callback: Callback) + fun stopPreview(callback: Callback) - fun setLocalVoiceReverb(params: Map, callback: Callback) - } + fun enableLocalVideo(params: Map, callback: Callback) - interface RtcVoicePositionInterface { - fun enableSoundPositionIndication(params: Map, callback: Callback) + fun muteLocalVideoStream(params: Map, callback: Callback) - fun setRemoteVoicePosition(params: Map, callback: Callback) - } + fun muteRemoteVideoStream(params: Map, callback: Callback) - interface RtcPublishStreamInterface { - fun setLiveTranscoding(params: Map, callback: Callback) + fun muteAllRemoteVideoStreams(params: Map, callback: Callback) - fun addPublishStreamUrl(params: Map, callback: Callback) + fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) - fun removePublishStreamUrl(params: Map, callback: Callback) - } + fun setBeautyEffectOptions(params: Map, callback: Callback) + } - interface RtcMediaRelayInterface { - fun startChannelMediaRelay(params: Map, callback: Callback) + interface RtcAudioMixingInterface { + fun startAudioMixing(params: Map, callback: Callback) - fun updateChannelMediaRelay(params: Map, callback: Callback) + fun stopAudioMixing(callback: Callback) - fun stopChannelMediaRelay(callback: Callback) - } + fun pauseAudioMixing(callback: Callback) - interface RtcAudioRouteInterface { - fun setDefaultAudioRoutetoSpeakerphone(params: Map, callback: Callback) + fun resumeAudioMixing(callback: Callback) - fun setEnableSpeakerphone(params: Map, callback: Callback) + fun adjustAudioMixingVolume(params: Map, callback: Callback) - fun isSpeakerphoneEnabled(callback: Callback) - } + fun adjustAudioMixingPlayoutVolume(params: Map, callback: Callback) - interface RtcEarMonitoringInterface { - fun enableInEarMonitoring(params: Map, callback: Callback) + fun adjustAudioMixingPublishVolume(params: Map, callback: Callback) - fun setInEarMonitoringVolume(params: Map, callback: Callback) - } + fun getAudioMixingPlayoutVolume(callback: Callback) - interface RtcDualStreamInterface { - fun enableDualStreamMode(params: Map, callback: Callback) + fun getAudioMixingPublishVolume(callback: Callback) - fun setRemoteVideoStreamType(params: Map, callback: Callback) + fun getAudioMixingDuration(callback: Callback) - fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) - } + fun getAudioMixingCurrentPosition(callback: Callback) - interface RtcFallbackInterface { - fun setLocalPublishFallbackOption(params: Map, callback: Callback) + fun setAudioMixingPosition(params: Map, callback: Callback) - fun setRemoteSubscribeFallbackOption(params: Map, callback: Callback) + fun setAudioMixingPitch(params: Map, callback: Callback) + } - fun setRemoteUserPriority(params: Map, callback: Callback) - } + interface RtcAudioEffectInterface { + fun getEffectsVolume(callback: Callback) - interface RtcTestInterface { - fun startEchoTest(params: Map, callback: Callback) + fun setEffectsVolume(params: Map, callback: Callback) - fun stopEchoTest(callback: Callback) + fun setVolumeOfEffect(params: Map, callback: Callback) - fun enableLastmileTest(callback: Callback) + fun playEffect(params: Map, callback: Callback) - fun disableLastmileTest(callback: Callback) + fun stopEffect(params: Map, callback: Callback) - fun startLastmileProbeTest(params: Map, callback: Callback) + fun stopAllEffects(callback: Callback) - fun stopLastmileProbeTest(callback: Callback) - } + fun preloadEffect(params: Map, callback: Callback) - interface RtcMediaMetadataInterface { - fun registerMediaMetadataObserver(callback: Callback) + fun unloadEffect(params: Map, callback: Callback) - fun unregisterMediaMetadataObserver(callback: Callback) + fun pauseEffect(params: Map, callback: Callback) - fun setMaxMetadataSize(params: Map, callback: Callback) + fun pauseAllEffects(callback: Callback) - fun sendMetadata(params: Map, callback: Callback) - } + fun resumeEffect(params: Map, callback: Callback) - interface RtcWatermarkInterface { - fun addVideoWatermark(params: Map, callback: Callback) + fun resumeAllEffects(callback: Callback) - fun clearVideoWatermarks(callback: Callback) - } + fun setAudioSessionOperationRestriction(params: Map, callback: Callback) + } - interface RtcEncryptionInterface { - fun setEncryptionSecret(params: Map, callback: Callback) + interface RtcVoiceChangerInterface { + @Deprecated("") + fun setLocalVoiceChanger(params: Map, callback: Callback) - fun setEncryptionMode(params: Map, callback: Callback) + @Deprecated("") + fun setLocalVoiceReverbPreset(params: Map, callback: Callback) - fun enableEncryption(params: Map, callback: Callback) - } + fun setLocalVoicePitch(params: Map, callback: Callback) - interface RtcAudioRecorderInterface { - fun startAudioRecording(params: Map, callback: Callback) + fun setLocalVoiceEqualization(params: Map, callback: Callback) - fun stopAudioRecording(callback: Callback) - } + fun setLocalVoiceReverb(params: Map, callback: Callback) - interface RtcInjectStreamInterface { - fun addInjectStreamUrl(params: Map, callback: Callback) + fun setAudioEffectPreset(params: Map, callback: Callback) - fun removeInjectStreamUrl(params: Map, callback: Callback) - } + fun setVoiceBeautifierPreset(params: Map, callback: Callback) - interface RtcCameraInterface { - fun switchCamera(callback: Callback) + fun setAudioEffectParameters(params: Map, callback: Callback) + } - fun isCameraZoomSupported(callback: Callback) + interface RtcVoicePositionInterface { + fun enableSoundPositionIndication(params: Map, callback: Callback) - fun isCameraTorchSupported(callback: Callback) + fun setRemoteVoicePosition(params: Map, callback: Callback) + } - fun isCameraFocusSupported(callback: Callback) + interface RtcPublishStreamInterface { + fun setLiveTranscoding(params: Map, callback: Callback) - fun isCameraExposurePositionSupported(callback: Callback) + fun addPublishStreamUrl(params: Map, callback: Callback) - fun isCameraAutoFocusFaceModeSupported(callback: Callback) + fun removePublishStreamUrl(params: Map, callback: Callback) + } - fun setCameraZoomFactor(params: Map, callback: Callback) + interface RtcMediaRelayInterface { + fun startChannelMediaRelay(params: Map, callback: Callback) - fun getCameraMaxZoomFactor(callback: Callback) + fun updateChannelMediaRelay(params: Map, callback: Callback) - fun setCameraFocusPositionInPreview(params: Map, callback: Callback) + fun stopChannelMediaRelay(callback: Callback) + } - fun setCameraExposurePosition(params: Map, callback: Callback) + interface RtcAudioRouteInterface { + fun setDefaultAudioRoutetoSpeakerphone(params: Map, callback: Callback) - fun enableFaceDetection(params: Map, callback: Callback) + fun setEnableSpeakerphone(params: Map, callback: Callback) - fun setCameraTorchOn(params: Map, callback: Callback) + fun isSpeakerphoneEnabled(callback: Callback) + } - fun setCameraAutoFocusFaceModeEnabled(params: Map, callback: Callback) + interface RtcEarMonitoringInterface { + fun enableInEarMonitoring(params: Map, callback: Callback) - fun setCameraCapturerConfiguration(params: Map, callback: Callback) - } - - interface RtcStreamMessageInterface { - fun createDataStream(params: Map, callback: Callback) - - fun sendStreamMessage(params: Map, callback: Callback) - } -} - -class RtcEngineManager( - private val emit: (methodName: String, data: Map?) -> Unit -) : IRtcEngine.RtcEngineInterface { - var engine: RtcEngine? = null - private set - private var mediaObserver: MediaObserver? = null - - fun release() { - RtcEngine.destroy() - engine = null - mediaObserver = null - } - - override fun create(params: Map, callback: Callback) { - engine = RtcEngineEx.create(RtcEngineConfig().apply { - mContext = params["context"] as Context - mAppId = params["appId"] as String - mAreaCode = (params["areaCode"] as Number).toInt() - mEventHandler = RtcEngineEventHandler { methodName, data -> - emit(methodName, data) - } - }) - callback.code((engine as RtcEngineEx).setAppType((params["appType"] as Number).toInt())) - } - - override fun destroy(callback: Callback) { - callback.resolve(engine) { release() } - } - - override fun setChannelProfile(params: Map, callback: Callback) { - callback.code(engine?.setChannelProfile((params["profile"] as Number).toInt())) - } - - override fun setClientRole(params: Map, callback: Callback) { - callback.code(engine?.setClientRole((params["role"] as Number).toInt())) - } - - override fun joinChannel(params: Map, callback: Callback) { - callback.code(engine?.joinChannel(params["token"] as? String, params["channelName"] as String, params["optionalInfo"] as? String, (params["optionalUid"] as Number).toInt())) - } - - override fun switchChannel(params: Map, callback: Callback) { - callback.code(engine?.switchChannel(params["token"] as? String, params["channelName"] as String)) - } - - override fun leaveChannel(callback: Callback) { - callback.code(engine?.leaveChannel()) - } - - override fun renewToken(params: Map, callback: Callback) { - callback.code(engine?.renewToken(params["token"] as String)) - } - - override fun enableWebSdkInteroperability(params: Map, callback: Callback) { - callback.code(engine?.enableWebSdkInteroperability(params["enabled"] as Boolean)) - } - - override fun getConnectionState(callback: Callback) { - callback.resolve(engine) { it.connectionState } - } - - override fun sendCustomReportMessage(params: Map, callback: Callback) { - callback.code(engine?.sendCustomReportMessage(params["id"] as String, params["category"] as String, params["event"] as String, params["label"] as String, (params["value"] as Number).toInt())) - } - - override fun getCallId(callback: Callback) { - callback.resolve(engine) { it.callId } - } - - override fun rate(params: Map, callback: Callback) { - callback.code(engine?.rate(params["callId"] as String, (params["rating"] as Number).toInt(), params["description"] as? String)) - } - - override fun complain(params: Map, callback: Callback) { - callback.code(engine?.complain(params["callId"] as String, params["description"] as String)) - } - - override fun setLogFile(params: Map, callback: Callback) { - callback.code(engine?.setLogFile(params["filePath"] as String)) - } - - override fun setLogFilter(params: Map, callback: Callback) { - callback.code(engine?.setLogFilter((params["filter"] as Number).toInt())) - } - - override fun setLogFileSize(params: Map, callback: Callback) { - callback.code(engine?.setLogFileSize((params["fileSizeInKBytes"] as Number).toInt())) - } - - override fun setParameters(params: Map, callback: Callback) { - callback.code(engine?.setParameters(params["parameters"] as String)) - } - - override fun getNativeHandle(callback: Callback) { - callback.resolve(engine) { it.nativeHandle } - } - - override fun registerLocalUserAccount(params: Map, callback: Callback) { - callback.code(engine?.registerLocalUserAccount(params["appId"] as String, params["userAccount"] as String)) - } - - override fun joinChannelWithUserAccount(params: Map, callback: Callback) { - callback.code(engine?.joinChannelWithUserAccount(params["token"] as? String, params["channelName"] as String, params["userAccount"] as String)) - } - - override fun getUserInfoByUserAccount(params: Map, callback: Callback) { - callback.resolve(engine) { - val userInfo = UserInfo() - it.getUserInfoByUserAccount(params["userAccount"] as String, userInfo) - userInfo.toMap() - } - } - - override fun getUserInfoByUid(params: Map, callback: Callback) { - callback.resolve(engine) { - val userInfo = UserInfo() - it.getUserInfoByUid((params["uid"] as Number).toInt(), userInfo) - userInfo.toMap() - } - } + fun setInEarMonitoringVolume(params: Map, callback: Callback) + } - override fun enableAudio(callback: Callback) { - callback.code(engine?.enableAudio()) - } + interface RtcDualStreamInterface { + fun enableDualStreamMode(params: Map, callback: Callback) - override fun disableAudio(callback: Callback) { - callback.code(engine?.disableAudio()) - } + fun setRemoteVideoStreamType(params: Map, callback: Callback) - override fun setAudioProfile(params: Map, callback: Callback) { - callback.code(engine?.setAudioProfile((params["profile"] as Number).toInt(), (params["scenario"] as Number).toInt())) - } + fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) + } - override fun adjustRecordingSignalVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustRecordingSignalVolume((params["volume"] as Number).toInt())) - } + interface RtcFallbackInterface { + fun setLocalPublishFallbackOption(params: Map, callback: Callback) - override fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustUserPlaybackSignalVolume((params["uid"] as Number).toInt(), (params["volume"] as Number).toInt())) - } + fun setRemoteSubscribeFallbackOption(params: Map, callback: Callback) - override fun adjustPlaybackSignalVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustPlaybackSignalVolume((params["volume"] as Number).toInt())) - } + fun setRemoteUserPriority(params: Map, callback: Callback) + } - override fun enableLocalAudio(params: Map, callback: Callback) { - callback.code(engine?.enableLocalAudio(params["enabled"] as Boolean)) - } + interface RtcTestInterface { + fun startEchoTest(params: Map, callback: Callback) - override fun muteLocalAudioStream(params: Map, callback: Callback) { - callback.code(engine?.muteLocalAudioStream(params["muted"] as Boolean)) - } + fun stopEchoTest(callback: Callback) - override fun muteRemoteAudioStream(params: Map, callback: Callback) { - callback.code(engine?.muteRemoteAudioStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) - } + fun enableLastmileTest(callback: Callback) - override fun muteAllRemoteAudioStreams(params: Map, callback: Callback) { - callback.code(engine?.muteAllRemoteAudioStreams(params["muted"] as Boolean)) - } + fun disableLastmileTest(callback: Callback) - override fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) { - callback.code(engine?.setDefaultMuteAllRemoteAudioStreams(params["muted"] as Boolean)) - } + fun startLastmileProbeTest(params: Map, callback: Callback) - override fun enableAudioVolumeIndication(params: Map, callback: Callback) { - callback.code(engine?.enableAudioVolumeIndication((params["interval"] as Number).toInt(), (params["smooth"] as Number).toInt(), params["report_vad"] as Boolean)) - } + fun stopLastmileProbeTest(callback: Callback) + } - override fun enableVideo(callback: Callback) { - callback.code(engine?.enableVideo()) - } + interface RtcMediaMetadataInterface { + fun registerMediaMetadataObserver(callback: Callback) - override fun disableVideo(callback: Callback) { - callback.code(engine?.disableVideo()) - } + fun unregisterMediaMetadataObserver(callback: Callback) - override fun setVideoEncoderConfiguration(params: Map, callback: Callback) { - callback.code(engine?.setVideoEncoderConfiguration(mapToVideoEncoderConfiguration(params["config"] as Map<*, *>))) - } + fun setMaxMetadataSize(params: Map, callback: Callback) - override fun startPreview(callback: Callback) { - callback.code(engine?.startPreview()) - } + fun sendMetadata(params: Map, callback: Callback) + } - override fun stopPreview(callback: Callback) { - callback.code(engine?.stopPreview()) - } + interface RtcWatermarkInterface { + fun addVideoWatermark(params: Map, callback: Callback) - override fun enableLocalVideo(params: Map, callback: Callback) { - callback.code(engine?.enableLocalVideo(params["enabled"] as Boolean)) - } + fun clearVideoWatermarks(callback: Callback) + } - override fun muteLocalVideoStream(params: Map, callback: Callback) { - callback.code(engine?.muteLocalVideoStream(params["muted"] as Boolean)) - } + interface RtcEncryptionInterface { + @Deprecated("") + fun setEncryptionSecret(params: Map, callback: Callback) - override fun muteRemoteVideoStream(params: Map, callback: Callback) { - callback.code(engine?.muteRemoteVideoStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) - } + @Deprecated("") + fun setEncryptionMode(params: Map, callback: Callback) - override fun muteAllRemoteVideoStreams(params: Map, callback: Callback) { - callback.code(engine?.muteAllRemoteVideoStreams(params["muted"] as Boolean)) - } + fun enableEncryption(params: Map, callback: Callback) + } - override fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) { - callback.code(engine?.setDefaultMuteAllRemoteVideoStreams(params["muted"] as Boolean)) - } + interface RtcAudioRecorderInterface { + fun startAudioRecording(params: Map, callback: Callback) - override fun setBeautyEffectOptions(params: Map, callback: Callback) { - callback.code(engine?.setBeautyEffectOptions(params["enabled"] as Boolean, mapToBeautyOptions(params["options"] as Map<*, *>))) - } + fun stopAudioRecording(callback: Callback) + } - override fun startAudioMixing(params: Map, callback: Callback) { - callback.code(engine?.startAudioMixing(params["filePath"] as String, params["loopback"] as Boolean, params["replace"] as Boolean, (params["cycle"] as Number).toInt())) - } + interface RtcInjectStreamInterface { + fun addInjectStreamUrl(params: Map, callback: Callback) - override fun stopAudioMixing(callback: Callback) { - callback.code(engine?.stopAudioMixing()) - } + fun removeInjectStreamUrl(params: Map, callback: Callback) + } - override fun pauseAudioMixing(callback: Callback) { - callback.code(engine?.pauseAudioMixing()) - } + interface RtcCameraInterface { + fun switchCamera(callback: Callback) - override fun resumeAudioMixing(callback: Callback) { - callback.code(engine?.resumeAudioMixing()) - } + fun isCameraZoomSupported(callback: Callback) - override fun adjustAudioMixingVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustAudioMixingVolume((params["volume"] as Number).toInt())) - } + fun isCameraTorchSupported(callback: Callback) - override fun adjustAudioMixingPlayoutVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustAudioMixingPlayoutVolume((params["volume"] as Number).toInt())) - } + fun isCameraFocusSupported(callback: Callback) - override fun adjustAudioMixingPublishVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustAudioMixingPublishVolume((params["volume"] as Number).toInt())) - } + fun isCameraExposurePositionSupported(callback: Callback) - override fun getAudioMixingPlayoutVolume(callback: Callback) { - callback.code(engine?.audioMixingPlayoutVolume) { it } - } + fun isCameraAutoFocusFaceModeSupported(callback: Callback) - override fun getAudioMixingPublishVolume(callback: Callback) { - callback.code(engine?.audioMixingPublishVolume) { it } - } + fun setCameraZoomFactor(params: Map, callback: Callback) - override fun getAudioMixingDuration(callback: Callback) { - callback.code(engine?.audioMixingDuration) { it } - } + fun getCameraMaxZoomFactor(callback: Callback) - override fun getAudioMixingCurrentPosition(callback: Callback) { - callback.code(engine?.audioMixingCurrentPosition) { it } - } + fun setCameraFocusPositionInPreview(params: Map, callback: Callback) - override fun setAudioMixingPosition(params: Map, callback: Callback) { - callback.code(engine?.setAudioMixingPosition((params["pos"] as Number).toInt())) - } + fun setCameraExposurePosition(params: Map, callback: Callback) - override fun setAudioMixingPitch(params: Map, callback: Callback) { - callback.code(engine?.setAudioMixingPitch((params["pitch"] as Number).toInt())) - } + fun enableFaceDetection(params: Map, callback: Callback) - override fun getEffectsVolume(callback: Callback) { - callback.resolve(engine) { it.audioEffectManager.effectsVolume } - } + fun setCameraTorchOn(params: Map, callback: Callback) - override fun setEffectsVolume(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.setEffectsVolume((params["volume"] as Number).toDouble())) - } + fun setCameraAutoFocusFaceModeEnabled(params: Map, callback: Callback) - override fun setVolumeOfEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.setVolumeOfEffect((params["soundId"] as Number).toInt(), (params["volume"] as Number).toDouble())) - } + fun setCameraCapturerConfiguration(params: Map, callback: Callback) + } - override fun playEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.playEffect((params["soundId"] as Number).toInt(), params["filePath"] as String, (params["loopCount"] as Number).toInt(), (params["pitch"] as Number).toDouble(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble(), params["publish"] as Boolean)) - } + interface RtcStreamMessageInterface { + fun createDataStream(params: Map, callback: Callback) - override fun stopEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.stopEffect((params["soundId"] as Number).toInt())) - } + fun sendStreamMessage(params: Map, callback: Callback) + } +} - override fun stopAllEffects(callback: Callback) { - callback.code(engine?.audioEffectManager?.stopAllEffects()) - } +class RtcEngineManager( + private val emit: (methodName: String, data: Map?) -> Unit +) : IRtcEngine.RtcEngineInterface { + var engine: RtcEngine? = null + private set + private var mediaObserver: MediaObserver? = null + + fun release() { + RtcEngine.destroy() + engine = null + mediaObserver = null + } + + override fun create(params: Map, callback: Callback) { + engine = RtcEngineEx.create(RtcEngineConfig().apply { + mContext = params["context"] as Context + mAppId = params["appId"] as String + mAreaCode = (params["areaCode"] as Number).toInt() + mEventHandler = RtcEngineEventHandler { methodName, data -> + emit(methodName, data) + } + }) + callback.code((engine as RtcEngineEx).setAppType((params["appType"] as Number).toInt())) + } + + override fun destroy(callback: Callback) { + callback.resolve(engine) { release() } + } + + override fun setChannelProfile(params: Map, callback: Callback) { + callback.code(engine?.setChannelProfile((params["profile"] as Number).toInt())) + } + + override fun setClientRole(params: Map, callback: Callback) { + callback.code(engine?.setClientRole((params["role"] as Number).toInt())) + } + + override fun joinChannel(params: Map, callback: Callback) { + callback.code(engine?.joinChannel(params["token"] as? String, params["channelName"] as String, params["optionalInfo"] as? String, (params["optionalUid"] as Number).toInt())) + } + + override fun switchChannel(params: Map, callback: Callback) { + callback.code(engine?.switchChannel(params["token"] as? String, params["channelName"] as String)) + } + + override fun leaveChannel(callback: Callback) { + callback.code(engine?.leaveChannel()) + } + + override fun renewToken(params: Map, callback: Callback) { + callback.code(engine?.renewToken(params["token"] as String)) + } + + override fun enableWebSdkInteroperability(params: Map, callback: Callback) { + callback.code(engine?.enableWebSdkInteroperability(params["enabled"] as Boolean)) + } + + override fun getConnectionState(callback: Callback) { + callback.resolve(engine) { it.connectionState } + } + + override fun sendCustomReportMessage(params: Map, callback: Callback) { + callback.code(engine?.sendCustomReportMessage(params["id"] as String, params["category"] as String, params["event"] as String, params["label"] as String, (params["value"] as Number).toInt())) + } + + override fun getCallId(callback: Callback) { + callback.resolve(engine) { it.callId } + } + + override fun rate(params: Map, callback: Callback) { + callback.code(engine?.rate(params["callId"] as String, (params["rating"] as Number).toInt(), params["description"] as? String)) + } + + override fun complain(params: Map, callback: Callback) { + callback.code(engine?.complain(params["callId"] as String, params["description"] as String)) + } + + override fun setLogFile(params: Map, callback: Callback) { + callback.code(engine?.setLogFile(params["filePath"] as String)) + } + + override fun setLogFilter(params: Map, callback: Callback) { + callback.code(engine?.setLogFilter((params["filter"] as Number).toInt())) + } + + override fun setLogFileSize(params: Map, callback: Callback) { + callback.code(engine?.setLogFileSize((params["fileSizeInKBytes"] as Number).toInt())) + } + + override fun setParameters(params: Map, callback: Callback) { + callback.code(engine?.setParameters(params["parameters"] as String)) + } + + override fun getNativeHandle(callback: Callback) { + callback.resolve(engine) { it.nativeHandle } + } + + override fun registerLocalUserAccount(params: Map, callback: Callback) { + callback.code(engine?.registerLocalUserAccount(params["appId"] as String, params["userAccount"] as String)) + } + + override fun joinChannelWithUserAccount(params: Map, callback: Callback) { + callback.code(engine?.joinChannelWithUserAccount(params["token"] as? String, params["channelName"] as String, params["userAccount"] as String)) + } + + override fun getUserInfoByUserAccount(params: Map, callback: Callback) { + callback.resolve(engine) { + val userInfo = UserInfo() + it.getUserInfoByUserAccount(params["userAccount"] as String, userInfo) + userInfo.toMap() + } + } + + override fun getUserInfoByUid(params: Map, callback: Callback) { + callback.resolve(engine) { + val userInfo = UserInfo() + it.getUserInfoByUid((params["uid"] as Number).toInt(), userInfo) + userInfo.toMap() + } + } - override fun preloadEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.preloadEffect((params["soundId"] as Number).toInt(), params["filePath"] as String)) - } + override fun enableAudio(callback: Callback) { + callback.code(engine?.enableAudio()) + } - override fun unloadEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.unloadEffect((params["soundId"] as Number).toInt())) - } + override fun disableAudio(callback: Callback) { + callback.code(engine?.disableAudio()) + } - override fun pauseEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.pauseEffect((params["soundId"] as Number).toInt())) - } + override fun setAudioProfile(params: Map, callback: Callback) { + callback.code(engine?.setAudioProfile((params["profile"] as Number).toInt(), (params["scenario"] as Number).toInt())) + } - override fun pauseAllEffects(callback: Callback) { - callback.code(engine?.audioEffectManager?.pauseAllEffects()) - } + override fun adjustRecordingSignalVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustRecordingSignalVolume((params["volume"] as Number).toInt())) + } - override fun resumeEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.resumeEffect((params["soundId"] as Number).toInt())) - } + override fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustUserPlaybackSignalVolume((params["uid"] as Number).toInt(), (params["volume"] as Number).toInt())) + } - override fun resumeAllEffects(callback: Callback) { - callback.code(engine?.audioEffectManager?.resumeAllEffects()) - } + override fun adjustPlaybackSignalVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustPlaybackSignalVolume((params["volume"] as Number).toInt())) + } - override fun setAudioSessionOperationRestriction(params: Map, callback: Callback) { - callback.code(-Constants.ERR_NOT_SUPPORTED) - } + override fun enableLocalAudio(params: Map, callback: Callback) { + callback.code(engine?.enableLocalAudio(params["enabled"] as Boolean)) + } - override fun setLocalVoiceChanger(params: Map, callback: Callback) { - callback.code(engine?.setLocalVoiceChanger((params["voiceChanger"] as Number).toInt())) - } + override fun muteLocalAudioStream(params: Map, callback: Callback) { + callback.code(engine?.muteLocalAudioStream(params["muted"] as Boolean)) + } - override fun setLocalVoiceReverbPreset(params: Map, callback: Callback) { - callback.code(engine?.setLocalVoiceReverbPreset((params["preset"] as Number).toInt())) - } + override fun muteRemoteAudioStream(params: Map, callback: Callback) { + callback.code(engine?.muteRemoteAudioStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) + } - override fun setLocalVoicePitch(params: Map, callback: Callback) { - callback.code(engine?.setLocalVoicePitch((params["pitch"] as Number).toDouble())) - } + override fun muteAllRemoteAudioStreams(params: Map, callback: Callback) { + callback.code(engine?.muteAllRemoteAudioStreams(params["muted"] as Boolean)) + } - override fun setLocalVoiceEqualization(params: Map, callback: Callback) { - callback.code(engine?.setLocalVoiceEqualization((params["bandFrequency"] as Number).toInt(), (params["bandGain"] as Number).toInt())) - } + override fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) { + callback.code(engine?.setDefaultMuteAllRemoteAudioStreams(params["muted"] as Boolean)) + } - override fun setLocalVoiceReverb(params: Map, callback: Callback) { - callback.code(engine?.setLocalVoiceReverb((params["reverbKey"] as Number).toInt(), (params["value"] as Number).toInt())) - } + override fun enableAudioVolumeIndication(params: Map, callback: Callback) { + callback.code(engine?.enableAudioVolumeIndication((params["interval"] as Number).toInt(), (params["smooth"] as Number).toInt(), params["report_vad"] as Boolean)) + } - override fun enableSoundPositionIndication(params: Map, callback: Callback) { - callback.code(engine?.enableSoundPositionIndication(params["enabled"] as Boolean)) - } + override fun enableVideo(callback: Callback) { + callback.code(engine?.enableVideo()) + } - override fun setRemoteVoicePosition(params: Map, callback: Callback) { - callback.code(engine?.setRemoteVoicePosition((params["uid"] as Number).toInt(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble())) - } + override fun disableVideo(callback: Callback) { + callback.code(engine?.disableVideo()) + } - override fun setLiveTranscoding(params: Map, callback: Callback) { - callback.code(engine?.setLiveTranscoding(mapToLiveTranscoding(params["transcoding"] as Map<*, *>))) - } + override fun setVideoEncoderConfiguration(params: Map, callback: Callback) { + callback.code(engine?.setVideoEncoderConfiguration(mapToVideoEncoderConfiguration(params["config"] as Map<*, *>))) + } - override fun addPublishStreamUrl(params: Map, callback: Callback) { - callback.code(engine?.addPublishStreamUrl(params["url"] as String, params["transcodingEnabled"] as Boolean)) - } + override fun startPreview(callback: Callback) { + callback.code(engine?.startPreview()) + } - override fun removePublishStreamUrl(params: Map, callback: Callback) { - callback.code(engine?.removePublishStreamUrl(params["url"] as String)) - } + override fun stopPreview(callback: Callback) { + callback.code(engine?.stopPreview()) + } - override fun startChannelMediaRelay(params: Map, callback: Callback) { - callback.code(engine?.startChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) - } + override fun enableLocalVideo(params: Map, callback: Callback) { + callback.code(engine?.enableLocalVideo(params["enabled"] as Boolean)) + } - override fun updateChannelMediaRelay(params: Map, callback: Callback) { - callback.code(engine?.updateChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) - } + override fun muteLocalVideoStream(params: Map, callback: Callback) { + callback.code(engine?.muteLocalVideoStream(params["muted"] as Boolean)) + } - override fun stopChannelMediaRelay(callback: Callback) { - callback.code(engine?.stopChannelMediaRelay()) - } + override fun muteRemoteVideoStream(params: Map, callback: Callback) { + callback.code(engine?.muteRemoteVideoStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) + } - override fun setDefaultAudioRoutetoSpeakerphone(params: Map, callback: Callback) { - callback.code(engine?.setDefaultAudioRoutetoSpeakerphone(params["defaultToSpeaker"] as Boolean)) - } + override fun muteAllRemoteVideoStreams(params: Map, callback: Callback) { + callback.code(engine?.muteAllRemoteVideoStreams(params["muted"] as Boolean)) + } - override fun setEnableSpeakerphone(params: Map, callback: Callback) { - callback.code(engine?.setEnableSpeakerphone(params["enabled"] as Boolean)) - } + override fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) { + callback.code(engine?.setDefaultMuteAllRemoteVideoStreams(params["muted"] as Boolean)) + } - override fun isSpeakerphoneEnabled(callback: Callback) { - callback.resolve(engine) { it.isSpeakerphoneEnabled } - } + override fun setBeautyEffectOptions(params: Map, callback: Callback) { + callback.code(engine?.setBeautyEffectOptions(params["enabled"] as Boolean, mapToBeautyOptions(params["options"] as Map<*, *>))) + } - override fun enableInEarMonitoring(params: Map, callback: Callback) { - callback.code(engine?.enableInEarMonitoring(params["enabled"] as Boolean)) - } + override fun startAudioMixing(params: Map, callback: Callback) { + callback.code(engine?.startAudioMixing(params["filePath"] as String, params["loopback"] as Boolean, params["replace"] as Boolean, (params["cycle"] as Number).toInt())) + } - override fun setInEarMonitoringVolume(params: Map, callback: Callback) { - callback.code(engine?.setInEarMonitoringVolume((params["volume"] as Number).toInt())) - } + override fun stopAudioMixing(callback: Callback) { + callback.code(engine?.stopAudioMixing()) + } - override fun enableDualStreamMode(params: Map, callback: Callback) { - callback.code(engine?.enableDualStreamMode(params["enabled"] as Boolean)) - } + override fun pauseAudioMixing(callback: Callback) { + callback.code(engine?.pauseAudioMixing()) + } - override fun setRemoteVideoStreamType(params: Map, callback: Callback) { - callback.code(engine?.setRemoteVideoStreamType((params["uid"] as Number).toInt(), (params["streamType"] as Number).toInt())) - } + override fun resumeAudioMixing(callback: Callback) { + callback.code(engine?.resumeAudioMixing()) + } - override fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) { - callback.code(engine?.setRemoteDefaultVideoStreamType((params["streamType"] as Number).toInt())) - } + override fun adjustAudioMixingVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustAudioMixingVolume((params["volume"] as Number).toInt())) + } - override fun setLocalPublishFallbackOption(params: Map, callback: Callback) { - callback.code(engine?.setLocalPublishFallbackOption((params["option"] as Number).toInt())) - } + override fun adjustAudioMixingPlayoutVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustAudioMixingPlayoutVolume((params["volume"] as Number).toInt())) + } - override fun setRemoteSubscribeFallbackOption(params: Map, callback: Callback) { - callback.code(engine?.setRemoteSubscribeFallbackOption((params["option"] as Number).toInt())) - } + override fun adjustAudioMixingPublishVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustAudioMixingPublishVolume((params["volume"] as Number).toInt())) + } - override fun setRemoteUserPriority(params: Map, callback: Callback) { - callback.code(engine?.setRemoteUserPriority((params["uid"] as Number).toInt(), (params["userPriority"] as Number).toInt())) - } + override fun getAudioMixingPlayoutVolume(callback: Callback) { + callback.code(engine?.audioMixingPlayoutVolume) { it } + } - override fun startEchoTest(params: Map, callback: Callback) { - callback.code(engine?.startEchoTest((params["intervalInSeconds"] as Number).toInt())) - } + override fun getAudioMixingPublishVolume(callback: Callback) { + callback.code(engine?.audioMixingPublishVolume) { it } + } - override fun stopEchoTest(callback: Callback) { - callback.code(engine?.stopEchoTest()) - } + override fun getAudioMixingDuration(callback: Callback) { + callback.code(engine?.audioMixingDuration) { it } + } - override fun enableLastmileTest(callback: Callback) { - callback.code(engine?.enableLastmileTest()) - } + override fun getAudioMixingCurrentPosition(callback: Callback) { + callback.code(engine?.audioMixingCurrentPosition) { it } + } - override fun disableLastmileTest(callback: Callback) { - callback.code(engine?.disableLastmileTest()) - } + override fun setAudioMixingPosition(params: Map, callback: Callback) { + callback.code(engine?.setAudioMixingPosition((params["pos"] as Number).toInt())) + } - override fun startLastmileProbeTest(params: Map, callback: Callback) { - callback.code(engine?.startLastmileProbeTest(mapToLastmileProbeConfig(params["config"] as Map<*, *>))) - } + override fun setAudioMixingPitch(params: Map, callback: Callback) { + callback.code(engine?.setAudioMixingPitch((params["pitch"] as Number).toInt())) + } - override fun stopLastmileProbeTest(callback: Callback) { - callback.code(engine?.stopLastmileProbeTest()) - } + override fun getEffectsVolume(callback: Callback) { + callback.resolve(engine) { it.audioEffectManager.effectsVolume } + } - override fun registerMediaMetadataObserver(callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - engine?.let { - val mediaObserver = MediaObserver { data -> - emit(RtcEngineEvents.MetadataReceived, data) - } - code = it.registerMediaMetadataObserver(mediaObserver, IMetadataObserver.VIDEO_METADATA) - if (code == 0) this.mediaObserver = mediaObserver - } - callback.code(code) - } + override fun setEffectsVolume(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.setEffectsVolume((params["volume"] as Number).toDouble())) + } - override fun unregisterMediaMetadataObserver(callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - engine?.let { - code = it.registerMediaMetadataObserver(null, IMetadataObserver.VIDEO_METADATA) - if (code == 0) mediaObserver = null - } - callback.code(code) - } + override fun setVolumeOfEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.setVolumeOfEffect((params["soundId"] as Number).toInt(), (params["volume"] as Number).toDouble())) + } - override fun setMaxMetadataSize(params: Map, callback: Callback) { - callback.resolve(mediaObserver) { - it.maxMetadataSize = (params["size"] as Number).toInt() - Unit - } - } + override fun playEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.playEffect((params["soundId"] as Number).toInt(), params["filePath"] as String, (params["loopCount"] as Number).toInt(), (params["pitch"] as Number).toDouble(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble(), params["publish"] as Boolean)) + } - override fun sendMetadata(params: Map, callback: Callback) { - callback.resolve(mediaObserver) { - it.addMetadata(params["metadata"] as String) - } - } + override fun stopEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.stopEffect((params["soundId"] as Number).toInt())) + } - override fun addVideoWatermark(params: Map, callback: Callback) { - callback.code(engine?.addVideoWatermark(params["watermarkUrl"] as String, mapToWatermarkOptions(params["options"] as Map<*, *>))) - } + override fun stopAllEffects(callback: Callback) { + callback.code(engine?.audioEffectManager?.stopAllEffects()) + } - override fun clearVideoWatermarks(callback: Callback) { - callback.code(engine?.clearVideoWatermarks()) - } + override fun preloadEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.preloadEffect((params["soundId"] as Number).toInt(), params["filePath"] as String)) + } - override fun setEncryptionSecret(params: Map, callback: Callback) { - callback.code(engine?.setEncryptionSecret(params["secret"] as String)) - } + override fun unloadEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.unloadEffect((params["soundId"] as Number).toInt())) + } - override fun setEncryptionMode(params: Map, callback: Callback) { - callback.code(engine?.setEncryptionMode(when ((params["encryptionMode"] as Number).toInt()) { - EncryptionConfig.EncryptionMode.AES_128_XTS.value -> "aes-128-xts" - EncryptionConfig.EncryptionMode.AES_128_ECB.value -> "aes-128-ecb" - EncryptionConfig.EncryptionMode.AES_256_XTS.value -> "aes-256-xts" - else -> "" - })) - } + override fun pauseEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.pauseEffect((params["soundId"] as Number).toInt())) + } - override fun enableEncryption(params: Map, callback: Callback) { - callback.code(engine?.enableEncryption(params["enabled"] as Boolean, mapToEncryptionConfig(params["config"] as Map<*, *>))) - } + override fun pauseAllEffects(callback: Callback) { + callback.code(engine?.audioEffectManager?.pauseAllEffects()) + } - override fun startAudioRecording(params: Map, callback: Callback) { - callback.code(engine?.startAudioRecording(params["filePath"] as String, (params["sampleRate"] as Number).toInt(), (params["quality"] as Number).toInt())) - } + override fun resumeEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.resumeEffect((params["soundId"] as Number).toInt())) + } - override fun stopAudioRecording(callback: Callback) { - callback.code(engine?.stopAudioRecording()) - } + override fun resumeAllEffects(callback: Callback) { + callback.code(engine?.audioEffectManager?.resumeAllEffects()) + } - override fun addInjectStreamUrl(params: Map, callback: Callback) { - callback.code(engine?.addInjectStreamUrl(params["url"] as String, mapToLiveInjectStreamConfig(params["config"] as Map<*, *>))) - } + override fun setAudioSessionOperationRestriction(params: Map, callback: Callback) { + callback.code(-Constants.ERR_NOT_SUPPORTED) + } - override fun removeInjectStreamUrl(params: Map, callback: Callback) { - callback.code(engine?.removeInjectStreamUrl(params["url"] as String)) - } + override fun setLocalVoiceChanger(params: Map, callback: Callback) { + callback.code(engine?.setLocalVoiceChanger((params["voiceChanger"] as Number).toInt())) + } - override fun switchCamera(callback: Callback) { - callback.code(engine?.switchCamera()) - } + override fun setLocalVoiceReverbPreset(params: Map, callback: Callback) { + callback.code(engine?.setLocalVoiceReverbPreset((params["preset"] as Number).toInt())) + } - override fun isCameraZoomSupported(callback: Callback) { - callback.resolve(engine) { it.isCameraZoomSupported } - } + override fun setLocalVoicePitch(params: Map, callback: Callback) { + callback.code(engine?.setLocalVoicePitch((params["pitch"] as Number).toDouble())) + } - override fun isCameraTorchSupported(callback: Callback) { - callback.resolve(engine) { it.isCameraTorchSupported } - } + override fun setLocalVoiceEqualization(params: Map, callback: Callback) { + callback.code(engine?.setLocalVoiceEqualization((params["bandFrequency"] as Number).toInt(), (params["bandGain"] as Number).toInt())) + } - override fun isCameraFocusSupported(callback: Callback) { - callback.resolve(engine) { it.isCameraFocusSupported } - } + override fun setLocalVoiceReverb(params: Map, callback: Callback) { + callback.code(engine?.setLocalVoiceReverb((params["reverbKey"] as Number).toInt(), (params["value"] as Number).toInt())) + } - override fun isCameraExposurePositionSupported(callback: Callback) { - callback.resolve(engine) { it.isCameraExposurePositionSupported } - } + override fun setAudioEffectPreset(params: Map, callback: Callback) { + callback.code(engine?.setAudioEffectPreset((params["preset"] as Number).toInt())) + } - override fun isCameraAutoFocusFaceModeSupported(callback: Callback) { - callback.resolve(engine) { it.isCameraAutoFocusFaceModeSupported } - } + override fun setVoiceBeautifierPreset(params: Map, callback: Callback) { + callback.code(engine?.setVoiceBeautifierPreset((params["preset"] as Number).toInt())) + } - override fun setCameraZoomFactor(params: Map, callback: Callback) { - callback.code(engine?.setCameraZoomFactor((params["factor"] as Number).toFloat())) - } + override fun setAudioEffectParameters(params: Map, callback: Callback) { + callback.code(engine?.setAudioEffectParameters((params["preset"] as Number).toInt(), (params["param1"] as Number).toInt(), (params["param2"] as Number).toInt())) + } - override fun getCameraMaxZoomFactor(callback: Callback) { - callback.resolve(engine) { it.cameraMaxZoomFactor } - } + override fun enableSoundPositionIndication(params: Map, callback: Callback) { + callback.code(engine?.enableSoundPositionIndication(params["enabled"] as Boolean)) + } - override fun setCameraFocusPositionInPreview(params: Map, callback: Callback) { - callback.code(engine?.setCameraFocusPositionInPreview((params["positionX"] as Number).toFloat(), (params["positionY"] as Number).toFloat())) - } + override fun setRemoteVoicePosition(params: Map, callback: Callback) { + callback.code(engine?.setRemoteVoicePosition((params["uid"] as Number).toInt(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble())) + } + + override fun setLiveTranscoding(params: Map, callback: Callback) { + callback.code(engine?.setLiveTranscoding(mapToLiveTranscoding(params["transcoding"] as Map<*, *>))) + } - override fun setCameraExposurePosition(params: Map, callback: Callback) { - callback.code(engine?.setCameraExposurePosition((params["positionXinView"] as Number).toFloat(), (params["positionYinView"] as Number).toFloat())) - } + override fun addPublishStreamUrl(params: Map, callback: Callback) { + callback.code(engine?.addPublishStreamUrl(params["url"] as String, params["transcodingEnabled"] as Boolean)) + } + + override fun removePublishStreamUrl(params: Map, callback: Callback) { + callback.code(engine?.removePublishStreamUrl(params["url"] as String)) + } + + override fun startChannelMediaRelay(params: Map, callback: Callback) { + callback.code(engine?.startChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) + } + + override fun updateChannelMediaRelay(params: Map, callback: Callback) { + callback.code(engine?.updateChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) + } - override fun enableFaceDetection(params: Map, callback: Callback) { - callback.code(engine?.enableFaceDetection(params["enable"] as Boolean)) - } + override fun stopChannelMediaRelay(callback: Callback) { + callback.code(engine?.stopChannelMediaRelay()) + } - override fun setCameraTorchOn(params: Map, callback: Callback) { - callback.code(engine?.setCameraTorchOn(params["isOn"] as Boolean)) - } + override fun setDefaultAudioRoutetoSpeakerphone(params: Map, callback: Callback) { + callback.code(engine?.setDefaultAudioRoutetoSpeakerphone(params["defaultToSpeaker"] as Boolean)) + } - override fun setCameraAutoFocusFaceModeEnabled(params: Map, callback: Callback) { - callback.code(engine?.setCameraAutoFocusFaceModeEnabled(params["enabled"] as Boolean)) - } + override fun setEnableSpeakerphone(params: Map, callback: Callback) { + callback.code(engine?.setEnableSpeakerphone(params["enabled"] as Boolean)) + } - override fun setCameraCapturerConfiguration(params: Map, callback: Callback) { - callback.code(engine?.setCameraCapturerConfiguration(mapToCameraCapturerConfiguration(params["config"] as Map<*, *>))) - } + override fun isSpeakerphoneEnabled(callback: Callback) { + callback.resolve(engine) { it.isSpeakerphoneEnabled } + } - override fun createDataStream(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - engine?.let { - code = it.createDataStream(params["reliable"] as Boolean, params["ordered"] as Boolean) - } - callback.code(code) { it } - } + override fun enableInEarMonitoring(params: Map, callback: Callback) { + callback.code(engine?.enableInEarMonitoring(params["enabled"] as Boolean)) + } - override fun sendStreamMessage(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - engine?.let { - code = it.sendStreamMessage((params["streamId"] as Number).toInt(), (params["message"] as String).toByteArray()) - } - callback.code(code) - } + override fun setInEarMonitoringVolume(params: Map, callback: Callback) { + callback.code(engine?.setInEarMonitoringVolume((params["volume"] as Number).toInt())) + } + + override fun enableDualStreamMode(params: Map, callback: Callback) { + callback.code(engine?.enableDualStreamMode(params["enabled"] as Boolean)) + } + + override fun setRemoteVideoStreamType(params: Map, callback: Callback) { + callback.code(engine?.setRemoteVideoStreamType((params["uid"] as Number).toInt(), (params["streamType"] as Number).toInt())) + } + + override fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) { + callback.code(engine?.setRemoteDefaultVideoStreamType((params["streamType"] as Number).toInt())) + } + + override fun setLocalPublishFallbackOption(params: Map, callback: Callback) { + callback.code(engine?.setLocalPublishFallbackOption((params["option"] as Number).toInt())) + } + + override fun setRemoteSubscribeFallbackOption(params: Map, callback: Callback) { + callback.code(engine?.setRemoteSubscribeFallbackOption((params["option"] as Number).toInt())) + } + + override fun setRemoteUserPriority(params: Map, callback: Callback) { + callback.code(engine?.setRemoteUserPriority((params["uid"] as Number).toInt(), (params["userPriority"] as Number).toInt())) + } + + override fun startEchoTest(params: Map, callback: Callback) { + callback.code(engine?.startEchoTest((params["intervalInSeconds"] as Number).toInt())) + } + + override fun stopEchoTest(callback: Callback) { + callback.code(engine?.stopEchoTest()) + } + + override fun enableLastmileTest(callback: Callback) { + callback.code(engine?.enableLastmileTest()) + } + + override fun disableLastmileTest(callback: Callback) { + callback.code(engine?.disableLastmileTest()) + } + + override fun startLastmileProbeTest(params: Map, callback: Callback) { + callback.code(engine?.startLastmileProbeTest(mapToLastmileProbeConfig(params["config"] as Map<*, *>))) + } + + override fun stopLastmileProbeTest(callback: Callback) { + callback.code(engine?.stopLastmileProbeTest()) + } + + override fun registerMediaMetadataObserver(callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + engine?.let { + val mediaObserver = MediaObserver { data -> + emit(RtcEngineEvents.MetadataReceived, data) + } + code = it.registerMediaMetadataObserver(mediaObserver, IMetadataObserver.VIDEO_METADATA) + if (code == 0) this.mediaObserver = mediaObserver + } + callback.code(code) + } + + override fun unregisterMediaMetadataObserver(callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + engine?.let { + code = it.registerMediaMetadataObserver(null, IMetadataObserver.VIDEO_METADATA) + if (code == 0) mediaObserver = null + } + callback.code(code) + } + + override fun setMaxMetadataSize(params: Map, callback: Callback) { + callback.resolve(mediaObserver) { + it.maxMetadataSize = (params["size"] as Number).toInt() + Unit + } + } + + override fun sendMetadata(params: Map, callback: Callback) { + callback.resolve(mediaObserver) { + it.addMetadata(params["metadata"] as String) + } + } + + override fun addVideoWatermark(params: Map, callback: Callback) { + callback.code(engine?.addVideoWatermark(params["watermarkUrl"] as String, mapToWatermarkOptions(params["options"] as Map<*, *>))) + } + + override fun clearVideoWatermarks(callback: Callback) { + callback.code(engine?.clearVideoWatermarks()) + } + + override fun setEncryptionSecret(params: Map, callback: Callback) { + callback.code(engine?.setEncryptionSecret(params["secret"] as String)) + } + + override fun setEncryptionMode(params: Map, callback: Callback) { + callback.code(engine?.setEncryptionMode(when ((params["encryptionMode"] as Number).toInt()) { + EncryptionConfig.EncryptionMode.AES_128_XTS.value -> "aes-128-xts" + EncryptionConfig.EncryptionMode.AES_128_ECB.value -> "aes-128-ecb" + EncryptionConfig.EncryptionMode.AES_256_XTS.value -> "aes-256-xts" + else -> "" + })) + } + + override fun enableEncryption(params: Map, callback: Callback) { + callback.code(engine?.enableEncryption(params["enabled"] as Boolean, mapToEncryptionConfig(params["config"] as Map<*, *>))) + } + + override fun startAudioRecording(params: Map, callback: Callback) { + callback.code(engine?.startAudioRecording(params["filePath"] as String, (params["sampleRate"] as Number).toInt(), (params["quality"] as Number).toInt())) + } + + override fun stopAudioRecording(callback: Callback) { + callback.code(engine?.stopAudioRecording()) + } + + override fun addInjectStreamUrl(params: Map, callback: Callback) { + callback.code(engine?.addInjectStreamUrl(params["url"] as String, mapToLiveInjectStreamConfig(params["config"] as Map<*, *>))) + } + + override fun removeInjectStreamUrl(params: Map, callback: Callback) { + callback.code(engine?.removeInjectStreamUrl(params["url"] as String)) + } + + override fun switchCamera(callback: Callback) { + callback.code(engine?.switchCamera()) + } + + override fun isCameraZoomSupported(callback: Callback) { + callback.resolve(engine) { it.isCameraZoomSupported } + } + + override fun isCameraTorchSupported(callback: Callback) { + callback.resolve(engine) { it.isCameraTorchSupported } + } + + override fun isCameraFocusSupported(callback: Callback) { + callback.resolve(engine) { it.isCameraFocusSupported } + } + + override fun isCameraExposurePositionSupported(callback: Callback) { + callback.resolve(engine) { it.isCameraExposurePositionSupported } + } + + override fun isCameraAutoFocusFaceModeSupported(callback: Callback) { + callback.resolve(engine) { it.isCameraAutoFocusFaceModeSupported } + } + + override fun setCameraZoomFactor(params: Map, callback: Callback) { + callback.code(engine?.setCameraZoomFactor((params["factor"] as Number).toFloat())) + } + + override fun getCameraMaxZoomFactor(callback: Callback) { + callback.resolve(engine) { it.cameraMaxZoomFactor } + } + + override fun setCameraFocusPositionInPreview(params: Map, callback: Callback) { + callback.code(engine?.setCameraFocusPositionInPreview((params["positionX"] as Number).toFloat(), (params["positionY"] as Number).toFloat())) + } + + override fun setCameraExposurePosition(params: Map, callback: Callback) { + callback.code(engine?.setCameraExposurePosition((params["positionXinView"] as Number).toFloat(), (params["positionYinView"] as Number).toFloat())) + } + + override fun enableFaceDetection(params: Map, callback: Callback) { + callback.code(engine?.enableFaceDetection(params["enable"] as Boolean)) + } + + override fun setCameraTorchOn(params: Map, callback: Callback) { + callback.code(engine?.setCameraTorchOn(params["isOn"] as Boolean)) + } + + override fun setCameraAutoFocusFaceModeEnabled(params: Map, callback: Callback) { + callback.code(engine?.setCameraAutoFocusFaceModeEnabled(params["enabled"] as Boolean)) + } + + override fun setCameraCapturerConfiguration(params: Map, callback: Callback) { + callback.code(engine?.setCameraCapturerConfiguration(mapToCameraCapturerConfiguration(params["config"] as Map<*, *>))) + } + + override fun createDataStream(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + engine?.let { + code = it.createDataStream(params["reliable"] as Boolean, params["ordered"] as Boolean) + } + callback.code(code) { it } + } + + override fun sendStreamMessage(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + engine?.let { + code = it.sendStreamMessage((params["streamId"] as Number).toInt(), (params["message"] as String).toByteArray()) + } + callback.code(code) + } } diff --git a/android/src/main/java/io/agora/rtc/base/RtcEngineEvent.kt b/android/src/main/java/io/agora/rtc/base/RtcEngineEvent.kt index 767f2c31a..553446afd 100644 --- a/android/src/main/java/io/agora/rtc/base/RtcEngineEvent.kt +++ b/android/src/main/java/io/agora/rtc/base/RtcEngineEvent.kt @@ -6,510 +6,510 @@ import io.agora.rtc.IRtcEngineEventHandler import io.agora.rtc.models.UserInfo class RtcEngineEvents { - companion object { - const val Warning = "Warning" - const val Error = "Error" - const val ApiCallExecuted = "ApiCallExecuted" - const val JoinChannelSuccess = "JoinChannelSuccess" - const val RejoinChannelSuccess = "RejoinChannelSuccess" - const val LeaveChannel = "LeaveChannel" - const val LocalUserRegistered = "LocalUserRegistered" - const val UserInfoUpdated = "UserInfoUpdated" - const val ClientRoleChanged = "ClientRoleChanged" - const val UserJoined = "UserJoined" - const val UserOffline = "UserOffline" - const val ConnectionStateChanged = "ConnectionStateChanged" - const val NetworkTypeChanged = "NetworkTypeChanged" - const val ConnectionLost = "ConnectionLost" - const val TokenPrivilegeWillExpire = "TokenPrivilegeWillExpire" - const val RequestToken = "RequestToken" - const val AudioVolumeIndication = "AudioVolumeIndication" - const val ActiveSpeaker = "ActiveSpeaker" - const val FirstLocalAudioFrame = "FirstLocalAudioFrame" - const val FirstLocalVideoFrame = "FirstLocalVideoFrame" - const val UserMuteVideo = "UserMuteVideo" - const val VideoSizeChanged = "VideoSizeChanged" - const val RemoteVideoStateChanged = "RemoteVideoStateChanged" - const val LocalVideoStateChanged = "LocalVideoStateChanged" - const val RemoteAudioStateChanged = "RemoteAudioStateChanged" - const val LocalAudioStateChanged = "LocalAudioStateChanged" - const val LocalPublishFallbackToAudioOnly = "LocalPublishFallbackToAudioOnly" - const val RemoteSubscribeFallbackToAudioOnly = "RemoteSubscribeFallbackToAudioOnly" - const val AudioRouteChanged = "AudioRouteChanged" - const val CameraFocusAreaChanged = "CameraFocusAreaChanged" - const val CameraExposureAreaChanged = "CameraExposureAreaChanged" - const val FacePositionChanged = "FacePositionChanged" - const val RtcStats = "RtcStats" - const val LastmileQuality = "LastmileQuality" - const val NetworkQuality = "NetworkQuality" - const val LastmileProbeResult = "LastmileProbeResult" - const val LocalVideoStats = "LocalVideoStats" - const val LocalAudioStats = "LocalAudioStats" - const val RemoteVideoStats = "RemoteVideoStats" - const val RemoteAudioStats = "RemoteAudioStats" - const val AudioMixingFinished = "AudioMixingFinished" - const val AudioMixingStateChanged = "AudioMixingStateChanged" - const val AudioEffectFinished = "AudioEffectFinished" - const val RtmpStreamingStateChanged = "RtmpStreamingStateChanged" - const val TranscodingUpdated = "TranscodingUpdated" - const val StreamInjectedStatus = "StreamInjectedStatus" - const val StreamMessage = "StreamMessage" - const val StreamMessageError = "StreamMessageError" - const val MediaEngineLoadSuccess = "MediaEngineLoadSuccess" - const val MediaEngineStartCallSuccess = "MediaEngineStartCallSuccess" - const val ChannelMediaRelayStateChanged = "ChannelMediaRelayStateChanged" - const val ChannelMediaRelayEvent = "ChannelMediaRelayEvent" - const val FirstRemoteVideoFrame = "FirstRemoteVideoFrame" - const val FirstRemoteAudioFrame = "FirstRemoteAudioFrame" - const val FirstRemoteAudioDecoded = "FirstRemoteAudioDecoded" - const val UserMuteAudio = "UserMuteAudio" - const val StreamPublished = "StreamPublished" - const val StreamUnpublished = "StreamUnpublished" - const val RemoteAudioTransportStats = "RemoteAudioTransportStats" - const val RemoteVideoTransportStats = "RemoteVideoTransportStats" - const val UserEnableVideo = "UserEnableVideo" - const val UserEnableLocalVideo = "UserEnableLocalVideo" - const val FirstRemoteVideoDecoded = "FirstRemoteVideoDecoded" - const val MicrophoneEnabled = "MicrophoneEnabled" - const val ConnectionInterrupted = "ConnectionInterrupted" - const val ConnectionBanned = "ConnectionBanned" - const val AudioQuality = "AudioQuality" - const val CameraReady = "CameraReady" - const val VideoStopped = "VideoStopped" - const val MetadataReceived = "MetadataReceived" - const val FirstLocalAudioFramePublished = "FirstLocalAudioFramePublished" - const val FirstLocalVideoFramePublished = "FirstLocalVideoFramePublished" - const val AudioPublishStateChanged = "AudioPublishStateChanged" - const val VideoPublishStateChanged = "VideoPublishStateChanged" - const val AudioSubscribeStateChanged = "AudioSubscribeStateChanged" - const val VideoSubscribeStateChanged = "VideoSubscribeStateChanged" - const val RtmpStreamingEvent = "RtmpStreamingEvent" - - fun toMap(): Map { - return hashMapOf( - "Warning" to Warning, - "Error" to Error, - "ApiCallExecuted" to ApiCallExecuted, - "JoinChannelSuccess" to JoinChannelSuccess, - "RejoinChannelSuccess" to RejoinChannelSuccess, - "LeaveChannel" to LeaveChannel, - "LocalUserRegistered" to LocalUserRegistered, - "UserInfoUpdated" to UserInfoUpdated, - "ClientRoleChanged" to ClientRoleChanged, - "UserJoined" to UserJoined, - "UserOffline" to UserOffline, - "ConnectionStateChanged" to ConnectionStateChanged, - "NetworkTypeChanged" to NetworkTypeChanged, - "ConnectionLost" to ConnectionLost, - "TokenPrivilegeWillExpire" to TokenPrivilegeWillExpire, - "RequestToken" to RequestToken, - "AudioVolumeIndication" to AudioVolumeIndication, - "ActiveSpeaker" to ActiveSpeaker, - "FirstLocalAudioFrame" to FirstLocalAudioFrame, - "FirstLocalVideoFrame" to FirstLocalVideoFrame, - "UserMuteVideo" to UserMuteVideo, - "VideoSizeChanged" to VideoSizeChanged, - "RemoteVideoStateChanged" to RemoteVideoStateChanged, - "LocalVideoStateChanged" to LocalVideoStateChanged, - "RemoteAudioStateChanged" to RemoteAudioStateChanged, - "LocalAudioStateChanged" to LocalAudioStateChanged, - "LocalPublishFallbackToAudioOnly" to LocalPublishFallbackToAudioOnly, - "RemoteSubscribeFallbackToAudioOnly" to RemoteSubscribeFallbackToAudioOnly, - "AudioRouteChanged" to AudioRouteChanged, - "CameraFocusAreaChanged" to CameraFocusAreaChanged, - "CameraExposureAreaChanged" to CameraExposureAreaChanged, - "FacePositionChanged" to FacePositionChanged, - "RtcStats" to RtcStats, - "LastmileQuality" to LastmileQuality, - "NetworkQuality" to NetworkQuality, - "LastmileProbeResult" to LastmileProbeResult, - "LocalVideoStats" to LocalVideoStats, - "LocalAudioStats" to LocalAudioStats, - "RemoteVideoStats" to RemoteVideoStats, - "RemoteAudioStats" to RemoteAudioStats, - "AudioMixingFinished" to AudioMixingFinished, - "AudioMixingStateChanged" to AudioMixingStateChanged, - "AudioEffectFinished" to AudioEffectFinished, - "RtmpStreamingStateChanged" to RtmpStreamingStateChanged, - "TranscodingUpdated" to TranscodingUpdated, - "StreamInjectedStatus" to StreamInjectedStatus, - "StreamMessage" to StreamMessage, - "StreamMessageError" to StreamMessageError, - "MediaEngineLoadSuccess" to MediaEngineLoadSuccess, - "MediaEngineStartCallSuccess" to MediaEngineStartCallSuccess, - "ChannelMediaRelayStateChanged" to ChannelMediaRelayStateChanged, - "ChannelMediaRelayEvent" to ChannelMediaRelayEvent, - "FirstRemoteVideoFrame" to FirstRemoteVideoFrame, - "FirstRemoteAudioFrame" to FirstRemoteAudioFrame, - "FirstRemoteAudioDecoded" to FirstRemoteAudioDecoded, - "UserMuteAudio" to UserMuteAudio, - "StreamPublished" to StreamPublished, - "StreamUnpublished" to StreamUnpublished, - "RemoteAudioTransportStats" to RemoteAudioTransportStats, - "RemoteVideoTransportStats" to RemoteVideoTransportStats, - "UserEnableVideo" to UserEnableVideo, - "UserEnableLocalVideo" to UserEnableLocalVideo, - "FirstRemoteVideoDecoded" to FirstRemoteVideoDecoded, - "MicrophoneEnabled" to MicrophoneEnabled, - "ConnectionInterrupted" to ConnectionInterrupted, - "ConnectionBanned" to ConnectionBanned, - "AudioQuality" to AudioQuality, - "CameraReady" to CameraReady, - "VideoStopped" to VideoStopped, - "MetadataReceived" to MetadataReceived, - "FirstLocalAudioFramePublished" to FirstLocalAudioFramePublished, - "FirstLocalVideoFramePublished" to FirstLocalVideoFramePublished, - "AudioPublishStateChanged" to AudioPublishStateChanged, - "VideoPublishStateChanged" to VideoPublishStateChanged, - "AudioSubscribeStateChanged" to AudioSubscribeStateChanged, - "VideoSubscribeStateChanged" to VideoSubscribeStateChanged, - "RtmpStreamingEvent" to RtmpStreamingEvent - ) - } - } + companion object { + const val Warning = "Warning" + const val Error = "Error" + const val ApiCallExecuted = "ApiCallExecuted" + const val JoinChannelSuccess = "JoinChannelSuccess" + const val RejoinChannelSuccess = "RejoinChannelSuccess" + const val LeaveChannel = "LeaveChannel" + const val LocalUserRegistered = "LocalUserRegistered" + const val UserInfoUpdated = "UserInfoUpdated" + const val ClientRoleChanged = "ClientRoleChanged" + const val UserJoined = "UserJoined" + const val UserOffline = "UserOffline" + const val ConnectionStateChanged = "ConnectionStateChanged" + const val NetworkTypeChanged = "NetworkTypeChanged" + const val ConnectionLost = "ConnectionLost" + const val TokenPrivilegeWillExpire = "TokenPrivilegeWillExpire" + const val RequestToken = "RequestToken" + const val AudioVolumeIndication = "AudioVolumeIndication" + const val ActiveSpeaker = "ActiveSpeaker" + const val FirstLocalAudioFrame = "FirstLocalAudioFrame" + const val FirstLocalVideoFrame = "FirstLocalVideoFrame" + const val UserMuteVideo = "UserMuteVideo" + const val VideoSizeChanged = "VideoSizeChanged" + const val RemoteVideoStateChanged = "RemoteVideoStateChanged" + const val LocalVideoStateChanged = "LocalVideoStateChanged" + const val RemoteAudioStateChanged = "RemoteAudioStateChanged" + const val LocalAudioStateChanged = "LocalAudioStateChanged" + const val LocalPublishFallbackToAudioOnly = "LocalPublishFallbackToAudioOnly" + const val RemoteSubscribeFallbackToAudioOnly = "RemoteSubscribeFallbackToAudioOnly" + const val AudioRouteChanged = "AudioRouteChanged" + const val CameraFocusAreaChanged = "CameraFocusAreaChanged" + const val CameraExposureAreaChanged = "CameraExposureAreaChanged" + const val FacePositionChanged = "FacePositionChanged" + const val RtcStats = "RtcStats" + const val LastmileQuality = "LastmileQuality" + const val NetworkQuality = "NetworkQuality" + const val LastmileProbeResult = "LastmileProbeResult" + const val LocalVideoStats = "LocalVideoStats" + const val LocalAudioStats = "LocalAudioStats" + const val RemoteVideoStats = "RemoteVideoStats" + const val RemoteAudioStats = "RemoteAudioStats" + const val AudioMixingFinished = "AudioMixingFinished" + const val AudioMixingStateChanged = "AudioMixingStateChanged" + const val AudioEffectFinished = "AudioEffectFinished" + const val RtmpStreamingStateChanged = "RtmpStreamingStateChanged" + const val TranscodingUpdated = "TranscodingUpdated" + const val StreamInjectedStatus = "StreamInjectedStatus" + const val StreamMessage = "StreamMessage" + const val StreamMessageError = "StreamMessageError" + const val MediaEngineLoadSuccess = "MediaEngineLoadSuccess" + const val MediaEngineStartCallSuccess = "MediaEngineStartCallSuccess" + const val ChannelMediaRelayStateChanged = "ChannelMediaRelayStateChanged" + const val ChannelMediaRelayEvent = "ChannelMediaRelayEvent" + const val FirstRemoteVideoFrame = "FirstRemoteVideoFrame" + const val FirstRemoteAudioFrame = "FirstRemoteAudioFrame" + const val FirstRemoteAudioDecoded = "FirstRemoteAudioDecoded" + const val UserMuteAudio = "UserMuteAudio" + const val StreamPublished = "StreamPublished" + const val StreamUnpublished = "StreamUnpublished" + const val RemoteAudioTransportStats = "RemoteAudioTransportStats" + const val RemoteVideoTransportStats = "RemoteVideoTransportStats" + const val UserEnableVideo = "UserEnableVideo" + const val UserEnableLocalVideo = "UserEnableLocalVideo" + const val FirstRemoteVideoDecoded = "FirstRemoteVideoDecoded" + const val MicrophoneEnabled = "MicrophoneEnabled" + const val ConnectionInterrupted = "ConnectionInterrupted" + const val ConnectionBanned = "ConnectionBanned" + const val AudioQuality = "AudioQuality" + const val CameraReady = "CameraReady" + const val VideoStopped = "VideoStopped" + const val MetadataReceived = "MetadataReceived" + const val FirstLocalAudioFramePublished = "FirstLocalAudioFramePublished" + const val FirstLocalVideoFramePublished = "FirstLocalVideoFramePublished" + const val AudioPublishStateChanged = "AudioPublishStateChanged" + const val VideoPublishStateChanged = "VideoPublishStateChanged" + const val AudioSubscribeStateChanged = "AudioSubscribeStateChanged" + const val VideoSubscribeStateChanged = "VideoSubscribeStateChanged" + const val RtmpStreamingEvent = "RtmpStreamingEvent" + + fun toMap(): Map { + return hashMapOf( + "Warning" to Warning, + "Error" to Error, + "ApiCallExecuted" to ApiCallExecuted, + "JoinChannelSuccess" to JoinChannelSuccess, + "RejoinChannelSuccess" to RejoinChannelSuccess, + "LeaveChannel" to LeaveChannel, + "LocalUserRegistered" to LocalUserRegistered, + "UserInfoUpdated" to UserInfoUpdated, + "ClientRoleChanged" to ClientRoleChanged, + "UserJoined" to UserJoined, + "UserOffline" to UserOffline, + "ConnectionStateChanged" to ConnectionStateChanged, + "NetworkTypeChanged" to NetworkTypeChanged, + "ConnectionLost" to ConnectionLost, + "TokenPrivilegeWillExpire" to TokenPrivilegeWillExpire, + "RequestToken" to RequestToken, + "AudioVolumeIndication" to AudioVolumeIndication, + "ActiveSpeaker" to ActiveSpeaker, + "FirstLocalAudioFrame" to FirstLocalAudioFrame, + "FirstLocalVideoFrame" to FirstLocalVideoFrame, + "UserMuteVideo" to UserMuteVideo, + "VideoSizeChanged" to VideoSizeChanged, + "RemoteVideoStateChanged" to RemoteVideoStateChanged, + "LocalVideoStateChanged" to LocalVideoStateChanged, + "RemoteAudioStateChanged" to RemoteAudioStateChanged, + "LocalAudioStateChanged" to LocalAudioStateChanged, + "LocalPublishFallbackToAudioOnly" to LocalPublishFallbackToAudioOnly, + "RemoteSubscribeFallbackToAudioOnly" to RemoteSubscribeFallbackToAudioOnly, + "AudioRouteChanged" to AudioRouteChanged, + "CameraFocusAreaChanged" to CameraFocusAreaChanged, + "CameraExposureAreaChanged" to CameraExposureAreaChanged, + "FacePositionChanged" to FacePositionChanged, + "RtcStats" to RtcStats, + "LastmileQuality" to LastmileQuality, + "NetworkQuality" to NetworkQuality, + "LastmileProbeResult" to LastmileProbeResult, + "LocalVideoStats" to LocalVideoStats, + "LocalAudioStats" to LocalAudioStats, + "RemoteVideoStats" to RemoteVideoStats, + "RemoteAudioStats" to RemoteAudioStats, + "AudioMixingFinished" to AudioMixingFinished, + "AudioMixingStateChanged" to AudioMixingStateChanged, + "AudioEffectFinished" to AudioEffectFinished, + "RtmpStreamingStateChanged" to RtmpStreamingStateChanged, + "TranscodingUpdated" to TranscodingUpdated, + "StreamInjectedStatus" to StreamInjectedStatus, + "StreamMessage" to StreamMessage, + "StreamMessageError" to StreamMessageError, + "MediaEngineLoadSuccess" to MediaEngineLoadSuccess, + "MediaEngineStartCallSuccess" to MediaEngineStartCallSuccess, + "ChannelMediaRelayStateChanged" to ChannelMediaRelayStateChanged, + "ChannelMediaRelayEvent" to ChannelMediaRelayEvent, + "FirstRemoteVideoFrame" to FirstRemoteVideoFrame, + "FirstRemoteAudioFrame" to FirstRemoteAudioFrame, + "FirstRemoteAudioDecoded" to FirstRemoteAudioDecoded, + "UserMuteAudio" to UserMuteAudio, + "StreamPublished" to StreamPublished, + "StreamUnpublished" to StreamUnpublished, + "RemoteAudioTransportStats" to RemoteAudioTransportStats, + "RemoteVideoTransportStats" to RemoteVideoTransportStats, + "UserEnableVideo" to UserEnableVideo, + "UserEnableLocalVideo" to UserEnableLocalVideo, + "FirstRemoteVideoDecoded" to FirstRemoteVideoDecoded, + "MicrophoneEnabled" to MicrophoneEnabled, + "ConnectionInterrupted" to ConnectionInterrupted, + "ConnectionBanned" to ConnectionBanned, + "AudioQuality" to AudioQuality, + "CameraReady" to CameraReady, + "VideoStopped" to VideoStopped, + "MetadataReceived" to MetadataReceived, + "FirstLocalAudioFramePublished" to FirstLocalAudioFramePublished, + "FirstLocalVideoFramePublished" to FirstLocalVideoFramePublished, + "AudioPublishStateChanged" to AudioPublishStateChanged, + "VideoPublishStateChanged" to VideoPublishStateChanged, + "AudioSubscribeStateChanged" to AudioSubscribeStateChanged, + "VideoSubscribeStateChanged" to VideoSubscribeStateChanged, + "RtmpStreamingEvent" to RtmpStreamingEvent + ) + } + } } class RtcEngineEventHandler( - private val emitter: (methodName: String, data: Map?) -> Unit + private val emitter: (methodName: String, data: Map?) -> Unit ) : IRtcEngineEventHandler() { - companion object { - const val PREFIX = "io.agora.rtc." - } - - private fun callback(methodName: String, vararg data: Any?) { - emitter(methodName, hashMapOf("data" to data.toList())) - } - - override fun onWarning(@Annotations.AgoraWarningCode warn: Int) { - callback(RtcEngineEvents.Warning, warn) - } - - override fun onError(@Annotations.AgoraErrorCode err: Int) { - callback(RtcEngineEvents.Error, err) - } - - override fun onApiCallExecuted(@Annotations.AgoraErrorCode error: Int, api: String?, result: String?) { - callback(RtcEngineEvents.ApiCallExecuted, error, api, result) - } - - override fun onJoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) { - callback(RtcEngineEvents.JoinChannelSuccess, channel, uid, elapsed) - } - - override fun onRejoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) { - callback(RtcEngineEvents.RejoinChannelSuccess, channel, uid, elapsed) - } - - override fun onLeaveChannel(stats: RtcStats?) { - callback(RtcEngineEvents.LeaveChannel, stats?.toMap()) - } - - override fun onLocalUserRegistered(uid: Int, userAccount: String?) { - callback(RtcEngineEvents.LocalUserRegistered, uid, userAccount) - } - - override fun onUserInfoUpdated(uid: Int, userInfo: UserInfo?) { - callback(RtcEngineEvents.UserInfoUpdated, uid, userInfo?.toMap()) - } - - override fun onClientRoleChanged(@Annotations.AgoraClientRole oldRole: Int, @Annotations.AgoraClientRole newRole: Int) { - callback(RtcEngineEvents.ClientRoleChanged, oldRole, newRole) - } - - override fun onUserJoined(uid: Int, elapsed: Int) { - callback(RtcEngineEvents.UserJoined, uid, elapsed) - } - - override fun onUserOffline(uid: Int, @Annotations.AgoraUserOfflineReason reason: Int) { - callback(RtcEngineEvents.UserOffline, uid, reason) - } - - override fun onConnectionStateChanged(@Annotations.AgoraConnectionStateType state: Int, @Annotations.AgoraConnectionChangedReason reason: Int) { - callback(RtcEngineEvents.ConnectionStateChanged, state, reason) - } - - override fun onNetworkTypeChanged(@Annotations.AgoraNetworkType type: Int) { - callback(RtcEngineEvents.NetworkTypeChanged, type) - } - - override fun onConnectionLost() { - callback(RtcEngineEvents.ConnectionLost) - } - - override fun onTokenPrivilegeWillExpire(token: String?) { - callback(RtcEngineEvents.TokenPrivilegeWillExpire, token) - } - - override fun onRequestToken() { - callback(RtcEngineEvents.RequestToken) - } - - override fun onAudioVolumeIndication(speakers: Array?, @IntRange(from = 0, to = 255) totalVolume: Int) { - callback(RtcEngineEvents.AudioVolumeIndication, speakers?.toMapList(), totalVolume) - } - - override fun onActiveSpeaker(uid: Int) { - callback(RtcEngineEvents.ActiveSpeaker, uid) - } - - override fun onFirstLocalAudioFrame(elapsed: Int) { - callback(RtcEngineEvents.FirstLocalAudioFrame, elapsed) - } - - override fun onFirstLocalVideoFrame(width: Int, height: Int, elapsed: Int) { - callback(RtcEngineEvents.FirstLocalVideoFrame, width, height, elapsed) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) - override fun onUserMuteVideo(uid: Int, muted: Boolean) { - callback(RtcEngineEvents.UserMuteVideo, uid, muted) - } - - override fun onVideoSizeChanged(uid: Int, width: Int, height: Int, @IntRange(from = 0, to = 360) rotation: Int) { - callback(RtcEngineEvents.VideoSizeChanged, uid, width, height, rotation) - } - - override fun onRemoteVideoStateChanged(uid: Int, @Annotations.AgoraVideoRemoteState state: Int, @Annotations.AgoraVideoRemoteStateReason reason: Int, elapsed: Int) { - callback(RtcEngineEvents.RemoteVideoStateChanged, uid, state, reason, elapsed) - } - - override fun onLocalVideoStateChanged(@Annotations.AgoraLocalVideoStreamState localVideoState: Int, @Annotations.AgoraLocalVideoStreamError error: Int) { - callback(RtcEngineEvents.LocalVideoStateChanged, localVideoState, error) - } - - override fun onRemoteAudioStateChanged(uid: Int, @Annotations.AgoraAudioRemoteState state: Int, @Annotations.AgoraAudioRemoteStateReason reason: Int, elapsed: Int) { - callback(RtcEngineEvents.RemoteAudioStateChanged, uid, state, reason, elapsed) - } - - override fun onLocalAudioStateChanged(@Annotations.AgoraAudioLocalState state: Int, @Annotations.AgoraAudioLocalError error: Int) { - callback(RtcEngineEvents.LocalAudioStateChanged, state, error) - } - - override fun onLocalPublishFallbackToAudioOnly(isFallbackOrRecover: Boolean) { - callback(RtcEngineEvents.LocalPublishFallbackToAudioOnly, isFallbackOrRecover) - } - - override fun onRemoteSubscribeFallbackToAudioOnly(uid: Int, isFallbackOrRecover: Boolean) { - callback(RtcEngineEvents.RemoteSubscribeFallbackToAudioOnly, uid, isFallbackOrRecover) - } - - override fun onAudioRouteChanged(@Annotations.AgoraAudioOutputRouting routing: Int) { - callback(RtcEngineEvents.AudioRouteChanged, routing) - } - - override fun onCameraFocusAreaChanged(rect: Rect?) { - callback(RtcEngineEvents.CameraFocusAreaChanged, rect?.toMap()) - } - - override fun onCameraExposureAreaChanged(rect: Rect?) { - callback(RtcEngineEvents.CameraExposureAreaChanged, rect?.toMap()) - } - - override fun onFacePositionChanged(imageWidth: Int, imageHeight: Int, faces: Array?) { - callback(RtcEngineEvents.FacePositionChanged, imageWidth, imageHeight, faces?.toMapList()) - } - - override fun onRtcStats(stats: RtcStats?) { - callback(RtcEngineEvents.RtcStats, stats?.toMap()) - } - - override fun onLastmileQuality(@Annotations.AgoraNetworkQuality quality: Int) { - callback(RtcEngineEvents.LastmileQuality, quality) - } - - override fun onNetworkQuality(uid: Int, @Annotations.AgoraNetworkQuality txQuality: Int, @Annotations.AgoraNetworkQuality rxQuality: Int) { - callback(RtcEngineEvents.NetworkQuality, uid, txQuality, rxQuality) - } - - override fun onLastmileProbeResult(result: LastmileProbeResult?) { - callback(RtcEngineEvents.LastmileProbeResult, result?.toMap()) - } - - @Deprecated("", ReplaceWith("onLocalVideoStats")) - override fun onLocalVideoStat(sentBitrate: Int, sentFrameRate: Int) { - // TODO Not in iOS - } - - override fun onLocalVideoStats(stats: LocalVideoStats?) { - callback(RtcEngineEvents.LocalVideoStats, stats?.toMap()) - } - - override fun onLocalAudioStats(stats: LocalAudioStats?) { - callback(RtcEngineEvents.LocalAudioStats, stats?.toMap()) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStats")) - override fun onRemoteVideoStat(uid: Int, delay: Int, receivedBitrate: Int, receivedFrameRate: Int) { - // TODO Not in iOS - } - - override fun onRemoteVideoStats(stats: RemoteVideoStats?) { - callback(RtcEngineEvents.RemoteVideoStats, stats?.toMap()) - } - - override fun onRemoteAudioStats(stats: RemoteAudioStats?) { - callback(RtcEngineEvents.RemoteAudioStats, stats?.toMap()) - } - - @Deprecated("", ReplaceWith("onAudioMixingStateChanged")) - override fun onAudioMixingFinished() { - callback(RtcEngineEvents.AudioMixingFinished) - } - - override fun onAudioMixingStateChanged(@Annotations.AgoraAudioMixingStateCode state: Int, @Annotations.AgoraAudioMixingErrorCode errorCode: Int) { - callback(RtcEngineEvents.AudioMixingStateChanged, state, errorCode) - } - - override fun onAudioEffectFinished(soundId: Int) { - callback(RtcEngineEvents.AudioEffectFinished, soundId) - } - - override fun onRtmpStreamingStateChanged(url: String?, @Annotations.AgoraRtmpStreamingState state: Int, @Annotations.AgoraRtmpStreamingErrorCode errCode: Int) { - callback(RtcEngineEvents.RtmpStreamingStateChanged, url, state, errCode) - } - - override fun onTranscodingUpdated() { - callback(RtcEngineEvents.TranscodingUpdated) - } - - override fun onStreamInjectedStatus(url: String?, uid: Int, @Annotations.AgoraInjectStreamStatus status: Int) { - callback(RtcEngineEvents.StreamInjectedStatus, url, uid, status) - } - - override fun onStreamMessage(uid: Int, streamId: Int, data: ByteArray?) { - callback(RtcEngineEvents.StreamMessage, uid, streamId, data?.let { String(it, Charsets.UTF_8) }) - } - - override fun onStreamMessageError(uid: Int, streamId: Int, @Annotations.AgoraErrorCode error: Int, missed: Int, cached: Int) { - callback(RtcEngineEvents.StreamMessageError, uid, streamId, error, missed, cached) - } - - override fun onMediaEngineLoadSuccess() { - callback(RtcEngineEvents.MediaEngineLoadSuccess) - } - - override fun onMediaEngineStartCallSuccess() { - callback(RtcEngineEvents.MediaEngineStartCallSuccess) - } - - override fun onChannelMediaRelayStateChanged(@Annotations.AgoraChannelMediaRelayState state: Int, @Annotations.AgoraChannelMediaRelayError code: Int) { - callback(RtcEngineEvents.ChannelMediaRelayStateChanged, state, code) - } - - override fun onChannelMediaRelayEvent(@Annotations.AgoraChannelMediaRelayEvent code: Int) { - callback(RtcEngineEvents.ChannelMediaRelayEvent, code) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) - override fun onFirstRemoteVideoFrame(uid: Int, width: Int, height: Int, elapsed: Int) { - callback(RtcEngineEvents.FirstRemoteVideoFrame, uid, width, height, elapsed) - } - - @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) - override fun onFirstRemoteAudioFrame(uid: Int, elapsed: Int) { - callback(RtcEngineEvents.FirstRemoteAudioFrame, uid, elapsed) - } - - @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) - override fun onFirstRemoteAudioDecoded(uid: Int, elapsed: Int) { - callback(RtcEngineEvents.FirstRemoteAudioDecoded, uid, elapsed) - } - - @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) - override fun onUserMuteAudio(uid: Int, muted: Boolean) { - callback(RtcEngineEvents.UserMuteAudio, uid, muted) - } - - @Deprecated("", ReplaceWith("onRtmpStreamingStateChanged")) - override fun onStreamPublished(url: String?, @Annotations.AgoraErrorCode error: Int) { - callback(RtcEngineEvents.StreamPublished, url, error) - } - - @Deprecated("", ReplaceWith("onRtmpStreamingStateChanged")) - override fun onStreamUnpublished(url: String?) { - callback(RtcEngineEvents.StreamUnpublished, url) - } - - @Deprecated("", ReplaceWith("onRemoteAudioStats")) - override fun onRemoteAudioTransportStats(uid: Int, delay: Int, lost: Int, rxKBitRate: Int) { - callback(RtcEngineEvents.RemoteAudioTransportStats, uid, delay, lost, rxKBitRate) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStats")) - override fun onRemoteVideoTransportStats(uid: Int, delay: Int, lost: Int, rxKBitRate: Int) { - callback(RtcEngineEvents.RemoteVideoTransportStats, uid, delay, lost, rxKBitRate) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) - override fun onUserEnableVideo(uid: Int, enabled: Boolean) { - callback(RtcEngineEvents.UserEnableVideo, uid, enabled) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) - override fun onUserEnableLocalVideo(uid: Int, enabled: Boolean) { - callback(RtcEngineEvents.UserEnableLocalVideo, uid, enabled) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) - override fun onFirstRemoteVideoDecoded(uid: Int, width: Int, height: Int, elapsed: Int) { - callback(RtcEngineEvents.FirstRemoteVideoDecoded, uid, width, height, elapsed) - } - - @Deprecated("", ReplaceWith("onLocalAudioStateChanged")) - override fun onMicrophoneEnabled(enabled: Boolean) { - callback(RtcEngineEvents.MicrophoneEnabled, enabled) - } - - @Deprecated("", ReplaceWith("onConnectionStateChanged")) - override fun onConnectionInterrupted() { - callback(RtcEngineEvents.ConnectionInterrupted) - } - - @Deprecated("", ReplaceWith("onConnectionStateChanged")) - override fun onConnectionBanned() { - callback(RtcEngineEvents.ConnectionBanned) - } - - @Deprecated("", ReplaceWith("onRemoteAudioStats")) - override fun onAudioQuality(uid: Int, @Annotations.AgoraNetworkQuality quality: Int, delay: Short, lost: Short) { - callback(RtcEngineEvents.AudioQuality, uid, quality, delay, lost) - } - - @Deprecated("", ReplaceWith("onLocalVideoStateChanged")) - override fun onCameraReady() { - callback(RtcEngineEvents.CameraReady) - } - - @Deprecated("", ReplaceWith("onLocalVideoStateChanged")) - override fun onVideoStopped() { - callback(RtcEngineEvents.VideoStopped) - } - - override fun onFirstLocalAudioFramePublished(elapsed: Int) { - callback(RtcEngineEvents.FirstLocalAudioFramePublished, elapsed) - } - - override fun onFirstLocalVideoFramePublished(elapsed: Int) { - callback(RtcEngineEvents.FirstLocalVideoFramePublished, elapsed) - } - - override fun onAudioPublishStateChanged(channel: String?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { - callback(RtcEngineEvents.AudioPublishStateChanged, channel, oldState, newState, elapseSinceLastState) - } - - override fun onVideoPublishStateChanged(channel: String?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { - callback(RtcEngineEvents.VideoPublishStateChanged, channel, oldState, newState, elapseSinceLastState) - } - - override fun onAudioSubscribeStateChanged(channel: String?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { - callback(RtcEngineEvents.AudioSubscribeStateChanged, channel, uid, oldState, newState, elapseSinceLastState) - } - - override fun onVideoSubscribeStateChanged(channel: String?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { - callback(RtcEngineEvents.VideoSubscribeStateChanged, channel, uid, oldState, newState, elapseSinceLastState) - } - - override fun onRtmpStreamingEvent(url: String?, @Annotations.AgoraRtmpStreamingEvent error: Int) { - callback(RtcEngineEvents.RtmpStreamingEvent, url, error) - } + companion object { + const val PREFIX = "io.agora.rtc." + } + + private fun callback(methodName: String, vararg data: Any?) { + emitter(methodName, hashMapOf("data" to data.toList())) + } + + override fun onWarning(@Annotations.AgoraWarningCode warn: Int) { + callback(RtcEngineEvents.Warning, warn) + } + + override fun onError(@Annotations.AgoraErrorCode err: Int) { + callback(RtcEngineEvents.Error, err) + } + + override fun onApiCallExecuted(@Annotations.AgoraErrorCode error: Int, api: String?, result: String?) { + callback(RtcEngineEvents.ApiCallExecuted, error, api, result) + } + + override fun onJoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) { + callback(RtcEngineEvents.JoinChannelSuccess, channel, uid, elapsed) + } + + override fun onRejoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) { + callback(RtcEngineEvents.RejoinChannelSuccess, channel, uid, elapsed) + } + + override fun onLeaveChannel(stats: RtcStats?) { + callback(RtcEngineEvents.LeaveChannel, stats?.toMap()) + } + + override fun onLocalUserRegistered(uid: Int, userAccount: String?) { + callback(RtcEngineEvents.LocalUserRegistered, uid, userAccount) + } + + override fun onUserInfoUpdated(uid: Int, userInfo: UserInfo?) { + callback(RtcEngineEvents.UserInfoUpdated, uid, userInfo?.toMap()) + } + + override fun onClientRoleChanged(@Annotations.AgoraClientRole oldRole: Int, @Annotations.AgoraClientRole newRole: Int) { + callback(RtcEngineEvents.ClientRoleChanged, oldRole, newRole) + } + + override fun onUserJoined(uid: Int, elapsed: Int) { + callback(RtcEngineEvents.UserJoined, uid, elapsed) + } + + override fun onUserOffline(uid: Int, @Annotations.AgoraUserOfflineReason reason: Int) { + callback(RtcEngineEvents.UserOffline, uid, reason) + } + + override fun onConnectionStateChanged(@Annotations.AgoraConnectionStateType state: Int, @Annotations.AgoraConnectionChangedReason reason: Int) { + callback(RtcEngineEvents.ConnectionStateChanged, state, reason) + } + + override fun onNetworkTypeChanged(@Annotations.AgoraNetworkType type: Int) { + callback(RtcEngineEvents.NetworkTypeChanged, type) + } + + override fun onConnectionLost() { + callback(RtcEngineEvents.ConnectionLost) + } + + override fun onTokenPrivilegeWillExpire(token: String?) { + callback(RtcEngineEvents.TokenPrivilegeWillExpire, token) + } + + override fun onRequestToken() { + callback(RtcEngineEvents.RequestToken) + } + + override fun onAudioVolumeIndication(speakers: Array?, @IntRange(from = 0, to = 255) totalVolume: Int) { + callback(RtcEngineEvents.AudioVolumeIndication, speakers?.toMapList(), totalVolume) + } + + override fun onActiveSpeaker(uid: Int) { + callback(RtcEngineEvents.ActiveSpeaker, uid) + } + + override fun onFirstLocalAudioFrame(elapsed: Int) { + callback(RtcEngineEvents.FirstLocalAudioFrame, elapsed) + } + + override fun onFirstLocalVideoFrame(width: Int, height: Int, elapsed: Int) { + callback(RtcEngineEvents.FirstLocalVideoFrame, width, height, elapsed) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) + override fun onUserMuteVideo(uid: Int, muted: Boolean) { + callback(RtcEngineEvents.UserMuteVideo, uid, muted) + } + + override fun onVideoSizeChanged(uid: Int, width: Int, height: Int, @IntRange(from = 0, to = 360) rotation: Int) { + callback(RtcEngineEvents.VideoSizeChanged, uid, width, height, rotation) + } + + override fun onRemoteVideoStateChanged(uid: Int, @Annotations.AgoraVideoRemoteState state: Int, @Annotations.AgoraVideoRemoteStateReason reason: Int, elapsed: Int) { + callback(RtcEngineEvents.RemoteVideoStateChanged, uid, state, reason, elapsed) + } + + override fun onLocalVideoStateChanged(@Annotations.AgoraLocalVideoStreamState localVideoState: Int, @Annotations.AgoraLocalVideoStreamError error: Int) { + callback(RtcEngineEvents.LocalVideoStateChanged, localVideoState, error) + } + + override fun onRemoteAudioStateChanged(uid: Int, @Annotations.AgoraAudioRemoteState state: Int, @Annotations.AgoraAudioRemoteStateReason reason: Int, elapsed: Int) { + callback(RtcEngineEvents.RemoteAudioStateChanged, uid, state, reason, elapsed) + } + + override fun onLocalAudioStateChanged(@Annotations.AgoraAudioLocalState state: Int, @Annotations.AgoraAudioLocalError error: Int) { + callback(RtcEngineEvents.LocalAudioStateChanged, state, error) + } + + override fun onLocalPublishFallbackToAudioOnly(isFallbackOrRecover: Boolean) { + callback(RtcEngineEvents.LocalPublishFallbackToAudioOnly, isFallbackOrRecover) + } + + override fun onRemoteSubscribeFallbackToAudioOnly(uid: Int, isFallbackOrRecover: Boolean) { + callback(RtcEngineEvents.RemoteSubscribeFallbackToAudioOnly, uid, isFallbackOrRecover) + } + + override fun onAudioRouteChanged(@Annotations.AgoraAudioOutputRouting routing: Int) { + callback(RtcEngineEvents.AudioRouteChanged, routing) + } + + override fun onCameraFocusAreaChanged(rect: Rect?) { + callback(RtcEngineEvents.CameraFocusAreaChanged, rect?.toMap()) + } + + override fun onCameraExposureAreaChanged(rect: Rect?) { + callback(RtcEngineEvents.CameraExposureAreaChanged, rect?.toMap()) + } + + override fun onFacePositionChanged(imageWidth: Int, imageHeight: Int, faces: Array?) { + callback(RtcEngineEvents.FacePositionChanged, imageWidth, imageHeight, faces?.toMapList()) + } + + override fun onRtcStats(stats: RtcStats?) { + callback(RtcEngineEvents.RtcStats, stats?.toMap()) + } + + override fun onLastmileQuality(@Annotations.AgoraNetworkQuality quality: Int) { + callback(RtcEngineEvents.LastmileQuality, quality) + } + + override fun onNetworkQuality(uid: Int, @Annotations.AgoraNetworkQuality txQuality: Int, @Annotations.AgoraNetworkQuality rxQuality: Int) { + callback(RtcEngineEvents.NetworkQuality, uid, txQuality, rxQuality) + } + + override fun onLastmileProbeResult(result: LastmileProbeResult?) { + callback(RtcEngineEvents.LastmileProbeResult, result?.toMap()) + } + + @Deprecated("", ReplaceWith("onLocalVideoStats")) + override fun onLocalVideoStat(sentBitrate: Int, sentFrameRate: Int) { + // TODO Not in iOS + } + + override fun onLocalVideoStats(stats: LocalVideoStats?) { + callback(RtcEngineEvents.LocalVideoStats, stats?.toMap()) + } + + override fun onLocalAudioStats(stats: LocalAudioStats?) { + callback(RtcEngineEvents.LocalAudioStats, stats?.toMap()) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStats")) + override fun onRemoteVideoStat(uid: Int, delay: Int, receivedBitrate: Int, receivedFrameRate: Int) { + // TODO Not in iOS + } + + override fun onRemoteVideoStats(stats: RemoteVideoStats?) { + callback(RtcEngineEvents.RemoteVideoStats, stats?.toMap()) + } + + override fun onRemoteAudioStats(stats: RemoteAudioStats?) { + callback(RtcEngineEvents.RemoteAudioStats, stats?.toMap()) + } + + @Deprecated("", ReplaceWith("onAudioMixingStateChanged")) + override fun onAudioMixingFinished() { + callback(RtcEngineEvents.AudioMixingFinished) + } + + override fun onAudioMixingStateChanged(@Annotations.AgoraAudioMixingStateCode state: Int, @Annotations.AgoraAudioMixingErrorCode errorCode: Int) { + callback(RtcEngineEvents.AudioMixingStateChanged, state, errorCode) + } + + override fun onAudioEffectFinished(soundId: Int) { + callback(RtcEngineEvents.AudioEffectFinished, soundId) + } + + override fun onRtmpStreamingStateChanged(url: String?, @Annotations.AgoraRtmpStreamingState state: Int, @Annotations.AgoraRtmpStreamingErrorCode errCode: Int) { + callback(RtcEngineEvents.RtmpStreamingStateChanged, url, state, errCode) + } + + override fun onTranscodingUpdated() { + callback(RtcEngineEvents.TranscodingUpdated) + } + + override fun onStreamInjectedStatus(url: String?, uid: Int, @Annotations.AgoraInjectStreamStatus status: Int) { + callback(RtcEngineEvents.StreamInjectedStatus, url, uid, status) + } + + override fun onStreamMessage(uid: Int, streamId: Int, data: ByteArray?) { + callback(RtcEngineEvents.StreamMessage, uid, streamId, data?.let { String(it, Charsets.UTF_8) }) + } + + override fun onStreamMessageError(uid: Int, streamId: Int, @Annotations.AgoraErrorCode error: Int, missed: Int, cached: Int) { + callback(RtcEngineEvents.StreamMessageError, uid, streamId, error, missed, cached) + } + + override fun onMediaEngineLoadSuccess() { + callback(RtcEngineEvents.MediaEngineLoadSuccess) + } + + override fun onMediaEngineStartCallSuccess() { + callback(RtcEngineEvents.MediaEngineStartCallSuccess) + } + + override fun onChannelMediaRelayStateChanged(@Annotations.AgoraChannelMediaRelayState state: Int, @Annotations.AgoraChannelMediaRelayError code: Int) { + callback(RtcEngineEvents.ChannelMediaRelayStateChanged, state, code) + } + + override fun onChannelMediaRelayEvent(@Annotations.AgoraChannelMediaRelayEvent code: Int) { + callback(RtcEngineEvents.ChannelMediaRelayEvent, code) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) + override fun onFirstRemoteVideoFrame(uid: Int, width: Int, height: Int, elapsed: Int) { + callback(RtcEngineEvents.FirstRemoteVideoFrame, uid, width, height, elapsed) + } + + @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) + override fun onFirstRemoteAudioFrame(uid: Int, elapsed: Int) { + callback(RtcEngineEvents.FirstRemoteAudioFrame, uid, elapsed) + } + + @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) + override fun onFirstRemoteAudioDecoded(uid: Int, elapsed: Int) { + callback(RtcEngineEvents.FirstRemoteAudioDecoded, uid, elapsed) + } + + @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) + override fun onUserMuteAudio(uid: Int, muted: Boolean) { + callback(RtcEngineEvents.UserMuteAudio, uid, muted) + } + + @Deprecated("", ReplaceWith("onRtmpStreamingStateChanged")) + override fun onStreamPublished(url: String?, @Annotations.AgoraErrorCode error: Int) { + callback(RtcEngineEvents.StreamPublished, url, error) + } + + @Deprecated("", ReplaceWith("onRtmpStreamingStateChanged")) + override fun onStreamUnpublished(url: String?) { + callback(RtcEngineEvents.StreamUnpublished, url) + } + + @Deprecated("", ReplaceWith("onRemoteAudioStats")) + override fun onRemoteAudioTransportStats(uid: Int, delay: Int, lost: Int, rxKBitRate: Int) { + callback(RtcEngineEvents.RemoteAudioTransportStats, uid, delay, lost, rxKBitRate) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStats")) + override fun onRemoteVideoTransportStats(uid: Int, delay: Int, lost: Int, rxKBitRate: Int) { + callback(RtcEngineEvents.RemoteVideoTransportStats, uid, delay, lost, rxKBitRate) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) + override fun onUserEnableVideo(uid: Int, enabled: Boolean) { + callback(RtcEngineEvents.UserEnableVideo, uid, enabled) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) + override fun onUserEnableLocalVideo(uid: Int, enabled: Boolean) { + callback(RtcEngineEvents.UserEnableLocalVideo, uid, enabled) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) + override fun onFirstRemoteVideoDecoded(uid: Int, width: Int, height: Int, elapsed: Int) { + callback(RtcEngineEvents.FirstRemoteVideoDecoded, uid, width, height, elapsed) + } + + @Deprecated("", ReplaceWith("onLocalAudioStateChanged")) + override fun onMicrophoneEnabled(enabled: Boolean) { + callback(RtcEngineEvents.MicrophoneEnabled, enabled) + } + + @Deprecated("", ReplaceWith("onConnectionStateChanged")) + override fun onConnectionInterrupted() { + callback(RtcEngineEvents.ConnectionInterrupted) + } + + @Deprecated("", ReplaceWith("onConnectionStateChanged")) + override fun onConnectionBanned() { + callback(RtcEngineEvents.ConnectionBanned) + } + + @Deprecated("", ReplaceWith("onRemoteAudioStats")) + override fun onAudioQuality(uid: Int, @Annotations.AgoraNetworkQuality quality: Int, delay: Short, lost: Short) { + callback(RtcEngineEvents.AudioQuality, uid, quality, delay, lost) + } + + @Deprecated("", ReplaceWith("onLocalVideoStateChanged")) + override fun onCameraReady() { + callback(RtcEngineEvents.CameraReady) + } + + @Deprecated("", ReplaceWith("onLocalVideoStateChanged")) + override fun onVideoStopped() { + callback(RtcEngineEvents.VideoStopped) + } + + override fun onFirstLocalAudioFramePublished(elapsed: Int) { + callback(RtcEngineEvents.FirstLocalAudioFramePublished, elapsed) + } + + override fun onFirstLocalVideoFramePublished(elapsed: Int) { + callback(RtcEngineEvents.FirstLocalVideoFramePublished, elapsed) + } + + override fun onAudioPublishStateChanged(channel: String?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { + callback(RtcEngineEvents.AudioPublishStateChanged, channel, oldState, newState, elapseSinceLastState) + } + + override fun onVideoPublishStateChanged(channel: String?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { + callback(RtcEngineEvents.VideoPublishStateChanged, channel, oldState, newState, elapseSinceLastState) + } + + override fun onAudioSubscribeStateChanged(channel: String?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { + callback(RtcEngineEvents.AudioSubscribeStateChanged, channel, uid, oldState, newState, elapseSinceLastState) + } + + override fun onVideoSubscribeStateChanged(channel: String?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { + callback(RtcEngineEvents.VideoSubscribeStateChanged, channel, uid, oldState, newState, elapseSinceLastState) + } + + override fun onRtmpStreamingEvent(url: String?, @Annotations.AgoraRtmpStreamingEvent error: Int) { + callback(RtcEngineEvents.RtmpStreamingEvent, url, error) + } } diff --git a/android/src/main/java/io/agora/rtc/base/RtcSurfaceView.kt b/android/src/main/java/io/agora/rtc/base/RtcSurfaceView.kt index f47b7fc0f..285478162 100644 --- a/android/src/main/java/io/agora/rtc/base/RtcSurfaceView.kt +++ b/android/src/main/java/io/agora/rtc/base/RtcSurfaceView.kt @@ -9,92 +9,92 @@ import io.agora.rtc.video.VideoCanvas import java.lang.ref.WeakReference class RtcSurfaceView( - context: Context + context: Context ) : FrameLayout(context) { - private var surface: SurfaceView - private var canvas: VideoCanvas - private var channel: WeakReference? = null + private var surface: SurfaceView + private var canvas: VideoCanvas + private var channel: WeakReference? = null - init { - try { - surface = RtcEngine.CreateRendererView(context) - } catch (e: UnsatisfiedLinkError) { - throw RuntimeException("Please init RtcEngine first!") - } - canvas = VideoCanvas(surface) - addView(surface) + init { + try { + surface = RtcEngine.CreateRendererView(context) + } catch (e: UnsatisfiedLinkError) { + throw RuntimeException("Please init RtcEngine first!") } + canvas = VideoCanvas(surface) + addView(surface) + } - fun setZOrderMediaOverlay(isMediaOverlay: Boolean) { - try { - removeView(surface) - surface.setZOrderMediaOverlay(isMediaOverlay) - addView(surface) - } catch (e: Exception) { - e.printStackTrace() - } + fun setZOrderMediaOverlay(isMediaOverlay: Boolean) { + try { + removeView(surface) + surface.setZOrderMediaOverlay(isMediaOverlay) + addView(surface) + } catch (e: Exception) { + e.printStackTrace() } + } - fun setZOrderOnTop(onTop: Boolean) { - try { - removeView(surface) - surface.setZOrderOnTop(onTop) - addView(surface) - } catch (e: Exception) { - e.printStackTrace() - } + fun setZOrderOnTop(onTop: Boolean) { + try { + removeView(surface) + surface.setZOrderOnTop(onTop) + addView(surface) + } catch (e: Exception) { + e.printStackTrace() } + } - fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) { - this.channel = if (channel != null) WeakReference(channel) else null - canvas.channelId = this.channel?.get()?.channelId() - canvas.uid = uid - setupVideoCanvas(engine) - } + fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) { + this.channel = if (channel != null) WeakReference(channel) else null + canvas.channelId = this.channel?.get()?.channelId() + canvas.uid = uid + setupVideoCanvas(engine) + } - fun resetVideoCanvas(engine: RtcEngine) { - val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode) - if (canvas.uid == 0) { - engine.setupLocalVideo(canvas) - } else { - engine.setupRemoteVideo(canvas) - } + fun resetVideoCanvas(engine: RtcEngine) { + val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode) + if (canvas.uid == 0) { + engine.setupLocalVideo(canvas) + } else { + engine.setupRemoteVideo(canvas) } + } - private fun setupVideoCanvas(engine: RtcEngine) { - if (canvas.uid == 0) { - engine.setupLocalVideo(canvas) - } else { - engine.setupRemoteVideo(canvas) - } + private fun setupVideoCanvas(engine: RtcEngine) { + if (canvas.uid == 0) { + engine.setupLocalVideo(canvas) + } else { + engine.setupRemoteVideo(canvas) } + } - fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) { - canvas.renderMode = renderMode - setupRenderMode(engine) - } + fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) { + canvas.renderMode = renderMode + setupRenderMode(engine) + } - fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) { - canvas.mirrorMode = mirrorMode - setupRenderMode(engine) - } + fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) { + canvas.mirrorMode = mirrorMode + setupRenderMode(engine) + } - private fun setupRenderMode(engine: RtcEngine) { - if (canvas.uid == 0) { - engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode) - } else { - channel?.get()?.let { - it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) - return@setupRenderMode - } - engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) - } + private fun setupRenderMode(engine: RtcEngine) { + if (canvas.uid == 0) { + engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode) + } else { + channel?.get()?.let { + it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) + return@setupRenderMode + } + engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) } + } - override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - val width: Int = MeasureSpec.getSize(widthMeasureSpec) - val height: Int = MeasureSpec.getSize(heightMeasureSpec) - surface.layout(0, 0, width, height) - super.onMeasure(widthMeasureSpec, heightMeasureSpec) - } + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val width: Int = MeasureSpec.getSize(widthMeasureSpec) + val height: Int = MeasureSpec.getSize(heightMeasureSpec) + surface.layout(0, 0, width, height) + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + } } diff --git a/android/src/main/java/io/agora/rtc/base/RtcTextureView.kt b/android/src/main/java/io/agora/rtc/base/RtcTextureView.kt index 1a64d6fa8..4927e85e0 100644 --- a/android/src/main/java/io/agora/rtc/base/RtcTextureView.kt +++ b/android/src/main/java/io/agora/rtc/base/RtcTextureView.kt @@ -9,72 +9,72 @@ import io.agora.rtc.video.VideoCanvas import java.lang.ref.WeakReference class RtcTextureView( - context: Context + context: Context ) : FrameLayout(context) { - private var texture: TextureView - private var canvas: VideoCanvas - private var channel: WeakReference? = null + private var texture: TextureView + private var canvas: VideoCanvas + private var channel: WeakReference? = null - init { - try { - texture = RtcEngine.CreateTextureView(context) - } catch (e: UnsatisfiedLinkError) { - throw RuntimeException("Please init RtcEngine first!") - } - canvas = VideoCanvas(texture) - addView(texture) + init { + try { + texture = RtcEngine.CreateTextureView(context) + } catch (e: UnsatisfiedLinkError) { + throw RuntimeException("Please init RtcEngine first!") } + canvas = VideoCanvas(texture) + addView(texture) + } - fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) { - this.channel = if (channel != null) WeakReference(channel) else null - canvas.channelId = this.channel?.get()?.channelId() - canvas.uid = uid - setupVideoCanvas(engine) - } + fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) { + this.channel = if (channel != null) WeakReference(channel) else null + canvas.channelId = this.channel?.get()?.channelId() + canvas.uid = uid + setupVideoCanvas(engine) + } - fun resetVideoCanvas(engine: RtcEngine) { - val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode) - if (canvas.uid == 0) { - engine.setupLocalVideo(canvas) - } else { - engine.setupRemoteVideo(canvas) - } + fun resetVideoCanvas(engine: RtcEngine) { + val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode) + if (canvas.uid == 0) { + engine.setupLocalVideo(canvas) + } else { + engine.setupRemoteVideo(canvas) } + } - private fun setupVideoCanvas(engine: RtcEngine) { - if (canvas.uid == 0) { - engine.setupLocalVideo(canvas) - } else { - engine.setupRemoteVideo(canvas) - } + private fun setupVideoCanvas(engine: RtcEngine) { + if (canvas.uid == 0) { + engine.setupLocalVideo(canvas) + } else { + engine.setupRemoteVideo(canvas) } + } - fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) { - canvas.renderMode = renderMode - setupRenderMode(engine) - } + fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) { + canvas.renderMode = renderMode + setupRenderMode(engine) + } - fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) { - canvas.mirrorMode = mirrorMode - setupRenderMode(engine) - } + fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) { + canvas.mirrorMode = mirrorMode + setupRenderMode(engine) + } - private fun setupRenderMode(engine: RtcEngine) { - if (canvas.uid == 0) { - engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode) - } else { - channel?.get()?.let { - it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) - return@setupRenderMode - } - engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) - } + private fun setupRenderMode(engine: RtcEngine) { + if (canvas.uid == 0) { + engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode) + } else { + channel?.get()?.let { + it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) + return@setupRenderMode + } + engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) } + } - override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - val width: Int = MeasureSpec.getSize(widthMeasureSpec) - val height: Int = MeasureSpec.getSize(heightMeasureSpec) - texture.layout(0, 0, width, height) - super.onMeasure(widthMeasureSpec, heightMeasureSpec) - } + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val width: Int = MeasureSpec.getSize(widthMeasureSpec) + val height: Int = MeasureSpec.getSize(heightMeasureSpec) + texture.layout(0, 0, width, height) + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + } } diff --git a/android/src/main/java/io/agora/rtc/react/PromiseCallback.kt b/android/src/main/java/io/agora/rtc/react/PromiseCallback.kt index 642d7a842..15cf544e7 100644 --- a/android/src/main/java/io/agora/rtc/react/PromiseCallback.kt +++ b/android/src/main/java/io/agora/rtc/react/PromiseCallback.kt @@ -5,23 +5,23 @@ import com.facebook.react.bridge.Promise import io.agora.rtc.base.Callback class PromiseCallback( - private val promise: Promise? + private val promise: Promise? ) : Callback() { - override fun success(data: Any?) { - if (data is Map<*, *>) { - val map = mutableMapOf() - data.forEach { - if (it.key is String) { - map[it.key as String] = it.value - } - } - promise?.resolve(Arguments.makeNativeMap(map)) - } else { - promise?.resolve(data) + override fun success(data: Any?) { + if (data is Map<*, *>) { + val map = mutableMapOf() + data.forEach { + if (it.key is String) { + map[it.key as String] = it.value } + } + promise?.resolve(Arguments.makeNativeMap(map)) + } else { + promise?.resolve(data) } + } - override fun failure(code: String, message: String) { - promise?.reject(code, message) - } + override fun failure(code: String, message: String) { + promise?.reject(code, message) + } } diff --git a/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcChannelModule.kt b/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcChannelModule.kt index 4996d4dd1..a2c8da43b 100644 --- a/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcChannelModule.kt +++ b/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcChannelModule.kt @@ -13,59 +13,59 @@ import kotlin.reflect.jvm.javaMethod @ReactModule(name = REACT_CLASS) class RCTAgoraRtcChannelModule( - reactContext: ReactApplicationContext + reactContext: ReactApplicationContext ) : ReactContextBaseJavaModule(reactContext) { - companion object { - const val REACT_CLASS = "RCTAgoraRtcChannelModule" - } + companion object { + const val REACT_CLASS = "RCTAgoraRtcChannelModule" + } - private val manager = RtcChannelManager { methodName, data -> emit(methodName, data) } + private val manager = RtcChannelManager { methodName, data -> emit(methodName, data) } - override fun getName(): String { - return REACT_CLASS - } + override fun getName(): String { + return REACT_CLASS + } - override fun getConstants(): MutableMap { - return mutableMapOf( - "prefix" to RtcChannelEventHandler.PREFIX - ) - } + override fun getConstants(): MutableMap { + return mutableMapOf( + "prefix" to RtcChannelEventHandler.PREFIX + ) + } - override fun onCatalystInstanceDestroy() { - super.onCatalystInstanceDestroy() - manager.release() - } + override fun onCatalystInstanceDestroy() { + super.onCatalystInstanceDestroy() + manager.release() + } - private fun emit(methodName: String, data: Map?) { - reactApplicationContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) - .emit("${RtcChannelEventHandler.PREFIX}$methodName", Arguments.makeNativeMap(data)) - } + private fun emit(methodName: String, data: Map?) { + reactApplicationContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) + .emit("${RtcChannelEventHandler.PREFIX}$methodName", Arguments.makeNativeMap(data)) + } - private fun engine(): RtcEngine? { - return reactApplicationContext.getNativeModule(RCTAgoraRtcEngineModule::class.java).engine() - } + private fun engine(): RtcEngine? { + return reactApplicationContext.getNativeModule(RCTAgoraRtcEngineModule::class.java).engine() + } - fun channel(channelId: String): RtcChannel? { - return manager[channelId] - } + fun channel(channelId: String): RtcChannel? { + return manager[channelId] + } - @ReactMethod - fun callMethod(methodName: String, params: ReadableMap?, callback: Promise?) { - manager::class.declaredMemberFunctions.find { it.name == methodName }?.let { function -> - function.javaMethod?.let { method -> - try { - val parameters = mutableListOf() - params?.toHashMap()?.toMutableMap()?.let { - if (methodName == "create") { - it["engine"] = engine() - } - parameters.add(it) - } - method.invoke(manager, *parameters.toTypedArray(), PromiseCallback(callback)) - } catch (e: Exception) { - e.printStackTrace() - } + @ReactMethod + fun callMethod(methodName: String, params: ReadableMap?, callback: Promise?) { + manager::class.declaredMemberFunctions.find { it.name == methodName }?.let { function -> + function.javaMethod?.let { method -> + try { + val parameters = mutableListOf() + params?.toHashMap()?.toMutableMap()?.let { + if (methodName == "create") { + it["engine"] = engine() } + parameters.add(it) + } + method.invoke(manager, *parameters.toTypedArray(), PromiseCallback(callback)) + } catch (e: Exception) { + e.printStackTrace() } + } } + } } diff --git a/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcEngineModule.kt b/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcEngineModule.kt index 6ac8d4a03..34bb84244 100644 --- a/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcEngineModule.kt +++ b/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcEngineModule.kt @@ -12,55 +12,55 @@ import kotlin.reflect.jvm.javaMethod @ReactModule(name = REACT_CLASS) class RCTAgoraRtcEngineModule( - reactContext: ReactApplicationContext + reactContext: ReactApplicationContext ) : ReactContextBaseJavaModule(reactContext) { - companion object { - const val REACT_CLASS = "RCTAgoraRtcEngineModule" - } + companion object { + const val REACT_CLASS = "RCTAgoraRtcEngineModule" + } - private val manager = RtcEngineManager { methodName, data -> emit(methodName, data) } + private val manager = RtcEngineManager { methodName, data -> emit(methodName, data) } - override fun getName(): String { - return REACT_CLASS - } + override fun getName(): String { + return REACT_CLASS + } - override fun getConstants(): MutableMap { - return mutableMapOf( - "prefix" to RtcEngineEventHandler.PREFIX - ) - } + override fun getConstants(): MutableMap { + return mutableMapOf( + "prefix" to RtcEngineEventHandler.PREFIX + ) + } - override fun onCatalystInstanceDestroy() { - super.onCatalystInstanceDestroy() - manager.release() - } + override fun onCatalystInstanceDestroy() { + super.onCatalystInstanceDestroy() + manager.release() + } - private fun emit(methodName: String, data: Map?) { - reactApplicationContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) - .emit("${RtcEngineEventHandler.PREFIX}$methodName", Arguments.makeNativeMap(data)) - } + private fun emit(methodName: String, data: Map?) { + reactApplicationContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) + .emit("${RtcEngineEventHandler.PREFIX}$methodName", Arguments.makeNativeMap(data)) + } - fun engine(): RtcEngine? { - return manager.engine - } + fun engine(): RtcEngine? { + return manager.engine + } - @ReactMethod - fun callMethod(methodName: String, params: ReadableMap?, callback: Promise?) { - manager::class.declaredMemberFunctions.find { it.name == methodName }?.let { function -> - function.javaMethod?.let { method -> - try { - val parameters = mutableListOf() - params?.toHashMap()?.toMutableMap()?.let { - if (methodName == "create") { - it["context"] = reactApplicationContext.applicationContext - } - parameters.add(it) - } - method.invoke(manager, *parameters.toTypedArray(), PromiseCallback(callback)) - } catch (e: Exception) { - e.printStackTrace() - } + @ReactMethod + fun callMethod(methodName: String, params: ReadableMap?, callback: Promise?) { + manager::class.declaredMemberFunctions.find { it.name == methodName }?.let { function -> + function.javaMethod?.let { method -> + try { + val parameters = mutableListOf() + params?.toHashMap()?.toMutableMap()?.let { + if (methodName == "create") { + it["context"] = reactApplicationContext.applicationContext } + parameters.add(it) + } + method.invoke(manager, *parameters.toTypedArray(), PromiseCallback(callback)) + } catch (e: Exception) { + e.printStackTrace() } + } } + } } diff --git a/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcPackage.kt b/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcPackage.kt index a0748ef30..66153008e 100644 --- a/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcPackage.kt +++ b/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcPackage.kt @@ -7,22 +7,22 @@ import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.uimanager.ViewManager class RCTAgoraRtcPackage : ReactPackage { - override fun createNativeModules(reactContext: ReactApplicationContext): List { - return listOf( - RCTAgoraRtcEngineModule(reactContext), - RCTAgoraRtcChannelModule(reactContext) - ) - } + override fun createNativeModules(reactContext: ReactApplicationContext): List { + return listOf( + RCTAgoraRtcEngineModule(reactContext), + RCTAgoraRtcChannelModule(reactContext) + ) + } - // Deprecated in RN 0.47 - fun createJSModules(): List> { - return emptyList() - } + // Deprecated in RN 0.47 + fun createJSModules(): List> { + return emptyList() + } - override fun createViewManagers(reactContext: ReactApplicationContext): List> { - return listOf( - RCTAgoraRtcSurfaceViewManager(), - RCTAgoraRtcTextureViewManager() - ) - } + override fun createViewManagers(reactContext: ReactApplicationContext): List> { + return listOf( + RCTAgoraRtcSurfaceViewManager(), + RCTAgoraRtcTextureViewManager() + ) + } } diff --git a/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcSurfaceViewManager.kt b/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcSurfaceViewManager.kt index 9aaed148a..42506fbd0 100644 --- a/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcSurfaceViewManager.kt +++ b/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcSurfaceViewManager.kt @@ -9,59 +9,59 @@ import io.agora.rtc.RtcEngine import io.agora.rtc.base.RtcSurfaceView class RCTAgoraRtcSurfaceViewManager : SimpleViewManager() { - companion object { - const val REACT_CLASS = "RCTAgoraRtcSurfaceView" - } + companion object { + const val REACT_CLASS = "RCTAgoraRtcSurfaceView" + } - private var reactContext: ThemedReactContext? = null + private var reactContext: ThemedReactContext? = null - override fun createViewInstance(reactContext: ThemedReactContext): RtcSurfaceView { - this.reactContext = reactContext - return RtcSurfaceView(reactContext) - } + override fun createViewInstance(reactContext: ThemedReactContext): RtcSurfaceView { + this.reactContext = reactContext + return RtcSurfaceView(reactContext) + } - override fun onDropViewInstance(view: RtcSurfaceView) { - // getEngine()?.let { view.resetVideoCanvas(it) } - super.onDropViewInstance(view) - } + override fun onDropViewInstance(view: RtcSurfaceView) { + // getEngine()?.let { view.resetVideoCanvas(it) } + super.onDropViewInstance(view) + } - override fun getName(): String { - return REACT_CLASS - } + override fun getName(): String { + return REACT_CLASS + } - @ReactProp(name = "zOrderMediaOverlay") - fun setZOrderMediaOverlay(view: RtcSurfaceView, isMediaOverlay: Boolean) { - view.setZOrderMediaOverlay(isMediaOverlay) - } + @ReactProp(name = "zOrderMediaOverlay") + fun setZOrderMediaOverlay(view: RtcSurfaceView, isMediaOverlay: Boolean) { + view.setZOrderMediaOverlay(isMediaOverlay) + } - @ReactProp(name = "zOrderOnTop") - fun setZOrderOnTop(view: RtcSurfaceView, onTop: Boolean) { - view.setZOrderOnTop(onTop) - } + @ReactProp(name = "zOrderOnTop") + fun setZOrderOnTop(view: RtcSurfaceView, onTop: Boolean) { + view.setZOrderOnTop(onTop) + } - @ReactProp(name = "data") - fun setData(view: RtcSurfaceView, data: ReadableMap) { - data.toHashMap().let { map -> - val channel = (map["channelId"] as? String)?.let { getChannel(it) } - getEngine()?.let { view.setData(it, channel, (map["uid"] as Number).toInt()) } - } + @ReactProp(name = "data") + fun setData(view: RtcSurfaceView, data: ReadableMap) { + data.toHashMap().let { map -> + val channel = (map["channelId"] as? String)?.let { getChannel(it) } + getEngine()?.let { view.setData(it, channel, (map["uid"] as Number).toInt()) } } + } - @ReactProp(name = "renderMode") - fun setRenderMode(view: RtcSurfaceView, renderMode: Int) { - getEngine()?.let { view.setRenderMode(it, renderMode) } - } + @ReactProp(name = "renderMode") + fun setRenderMode(view: RtcSurfaceView, renderMode: Int) { + getEngine()?.let { view.setRenderMode(it, renderMode) } + } - @ReactProp(name = "mirrorMode") - fun setMirrorMode(view: RtcSurfaceView, mirrorMode: Int) { - getEngine()?.let { view.setMirrorMode(it, mirrorMode) } - } + @ReactProp(name = "mirrorMode") + fun setMirrorMode(view: RtcSurfaceView, mirrorMode: Int) { + getEngine()?.let { view.setMirrorMode(it, mirrorMode) } + } - private fun getEngine(): RtcEngine? { - return reactContext?.getNativeModule(RCTAgoraRtcEngineModule::class.java)?.engine() - } + private fun getEngine(): RtcEngine? { + return reactContext?.getNativeModule(RCTAgoraRtcEngineModule::class.java)?.engine() + } - private fun getChannel(channelId: String): RtcChannel? { - return reactContext?.getNativeModule(RCTAgoraRtcChannelModule::class.java)?.channel(channelId) - } + private fun getChannel(channelId: String): RtcChannel? { + return reactContext?.getNativeModule(RCTAgoraRtcChannelModule::class.java)?.channel(channelId) + } } diff --git a/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcTextureViewManager.kt b/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcTextureViewManager.kt index 5e36072e2..e3bf7f8a0 100644 --- a/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcTextureViewManager.kt +++ b/android/src/main/java/io/agora/rtc/react/RCTAgoraRtcTextureViewManager.kt @@ -9,49 +9,49 @@ import io.agora.rtc.RtcEngine import io.agora.rtc.base.RtcTextureView class RCTAgoraRtcTextureViewManager : SimpleViewManager() { - companion object { - const val REACT_CLASS = "RCTAgoraRtcTextureView" - } - - private var reactContext: ThemedReactContext? = null - - override fun createViewInstance(reactContext: ThemedReactContext): RtcTextureView { - this.reactContext = reactContext - return RtcTextureView(reactContext) - } - - override fun onDropViewInstance(view: RtcTextureView) { - // getEngine()?.let { view.resetVideoRender(it) } - super.onDropViewInstance(view) - } - - override fun getName(): String { - return REACT_CLASS - } - - @ReactProp(name = "data") - fun setData(view: RtcTextureView, data: ReadableMap) { - data.toHashMap().let { map -> - val channel = (map["channelId"] as? String)?.let { getChannel(it) } - getEngine()?.let { view.setData(it, channel, (map["uid"] as Number).toInt()) } - } - } - - @ReactProp(name = "renderMode") - fun setRenderMode(view: RtcTextureView, renderMode: Int) { - getEngine()?.let { view.setRenderMode(it, renderMode) } - } - - @ReactProp(name = "mirrorMode") - fun setMirrorMode(view: RtcTextureView, mirrorMode: Int) { - getEngine()?.let { view.setMirrorMode(it, mirrorMode) } - } - - private fun getEngine(): RtcEngine? { - return reactContext?.getNativeModule(RCTAgoraRtcEngineModule::class.java)?.engine() - } - - private fun getChannel(channelId: String): RtcChannel? { - return reactContext?.getNativeModule(RCTAgoraRtcChannelModule::class.java)?.channel(channelId) - } + companion object { + const val REACT_CLASS = "RCTAgoraRtcTextureView" + } + + private var reactContext: ThemedReactContext? = null + + override fun createViewInstance(reactContext: ThemedReactContext): RtcTextureView { + this.reactContext = reactContext + return RtcTextureView(reactContext) + } + + override fun onDropViewInstance(view: RtcTextureView) { + // getEngine()?.let { view.resetVideoRender(it) } + super.onDropViewInstance(view) + } + + override fun getName(): String { + return REACT_CLASS + } + + @ReactProp(name = "data") + fun setData(view: RtcTextureView, data: ReadableMap) { + data.toHashMap().let { map -> + val channel = (map["channelId"] as? String)?.let { getChannel(it) } + getEngine()?.let { view.setData(it, channel, (map["uid"] as Number).toInt()) } + } + } + + @ReactProp(name = "renderMode") + fun setRenderMode(view: RtcTextureView, renderMode: Int) { + getEngine()?.let { view.setRenderMode(it, renderMode) } + } + + @ReactProp(name = "mirrorMode") + fun setMirrorMode(view: RtcTextureView, mirrorMode: Int) { + getEngine()?.let { view.setMirrorMode(it, mirrorMode) } + } + + private fun getEngine(): RtcEngine? { + return reactContext?.getNativeModule(RCTAgoraRtcEngineModule::class.java)?.engine() + } + + private fun getChannel(channelId: String): RtcChannel? { + return reactContext?.getNativeModule(RCTAgoraRtcChannelModule::class.java)?.channel(channelId) + } } diff --git a/example/agora.config.json b/example/agora.config.json index f95ac6dcc..35a80e7e3 100644 --- a/example/agora.config.json +++ b/example/agora.config.json @@ -1,5 +1,9 @@ { - "appId": YOUR_APP_ID, - "channelId": "APIExample", - "token": YOUR_TOEKN + "//appId": "Get your own App ID at https://dashboard.agora.io/", + "appId": YOUR_APP_ID, + "//token": "Please refer to https://docs.agora.io/en/Agora%20Platform/token", + "token": YOUR_TOEKN, + "channelId": YOUR_CHANNEL_ID, + "uid": YOUR_UID, + "stringUid": YOUR_STRING_UID } diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index e03738298..8257d6e2d 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -76,7 +76,7 @@ import com.android.build.OutputFile */ project.ext.react = [ - enableHermes: false, // clean and rebuild if changing + enableHermes: false, // clean and rebuild if changing ] apply from: "../../node_modules/react-native/react.gradle" @@ -119,105 +119,105 @@ def jscFlavor = 'org.webkit:android-jsc:+' def enableHermes = project.ext.react.get("enableHermes", false); android { - compileSdkVersion rootProject.ext.compileSdkVersion - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - defaultConfig { - applicationId "com.example.reactnativeagora" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - multiDexEnabled true + compileSdkVersion rootProject.ext.compileSdkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + applicationId "com.example.reactnativeagora" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + multiDexEnabled true + } + splits { + abi { + reset() + enable enableSeparateBuildPerCPUArchitecture + universalApk false // If true, also generate a universal APK + include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" } - splits { - abi { - reset() - enable enableSeparateBuildPerCPUArchitecture - universalApk false // If true, also generate a universal APK - include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" - } + } + signingConfigs { + debug { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' } - signingConfigs { - debug { - storeFile file('debug.keystore') - storePassword 'android' - keyAlias 'androiddebugkey' - keyPassword 'android' - } + } + buildTypes { + debug { + signingConfig signingConfigs.debug } - buildTypes { - debug { - signingConfig signingConfigs.debug - } - release { - // Caution! In production, you need to generate your own keystore file. - // see https://facebook.github.io/react-native/docs/signed-apk-android. - signingConfig signingConfigs.debug - minifyEnabled enableProguardInReleaseBuilds - proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - } - } - // applicationVariants are e.g. debug, release - applicationVariants.all { variant -> - variant.outputs.each { output -> - // For each separate APK per architecture, set a unique version code as described here: - // https://developer.android.com/studio/build/configure-apk-splits.html - def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] - def abi = output.getFilter(OutputFile.ABI) - if (abi != null) { // null for the universal-debug, universal-release variants - output.versionCodeOverride = - versionCodes.get(abi) * 1048576 + defaultConfig.versionCode - } - - } + release { + // Caution! In production, you need to generate your own keystore file. + // see https://facebook.github.io/react-native/docs/signed-apk-android. + signingConfig signingConfigs.debug + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } + } + // applicationVariants are e.g. debug, release + applicationVariants.all { variant -> + variant.outputs.each { output -> + // For each separate APK per architecture, set a unique version code as described here: + // https://developer.android.com/studio/build/configure-apk-splits.html + def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] + def abi = output.getFilter(OutputFile.ABI) + if (abi != null) { // null for the universal-debug, universal-release variants + output.versionCodeOverride = + versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + } - packagingOptions { - pickFirst "lib/armeabi-v7a/libc++_shared.so" - pickFirst "lib/arm64-v8a/libc++_shared.so" - pickFirst "lib/x86/libc++_shared.so" - pickFirst "lib/x86_64/libc++_shared.so" } + } + + packagingOptions { + pickFirst "lib/armeabi-v7a/libc++_shared.so" + pickFirst "lib/arm64-v8a/libc++_shared.so" + pickFirst "lib/x86/libc++_shared.so" + pickFirst "lib/x86_64/libc++_shared.so" + } } dependencies { - implementation fileTree(dir: "libs", include: ["*.jar"]) - //noinspection GradleDynamicVersion - implementation "com.facebook.react:react-native:+" // From node_modules - - - implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" - debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { - exclude group: 'com.facebook.fbjni' - } - debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { - exclude group: 'com.facebook.flipper' - } - debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { - exclude group: 'com.facebook.flipper' - } - - if (enableHermes) { - def hermesPath = "../../node_modules/hermes-engine/android/"; - debugImplementation files(hermesPath + "hermes-debug.aar") - releaseImplementation files(hermesPath + "hermes-release.aar") - } else { - implementation jscFlavor - } - - implementation project(':react-native-agora') + implementation fileTree(dir: "libs", include: ["*.jar"]) + //noinspection GradleDynamicVersion + implementation "com.facebook.react:react-native:+" // From node_modules + + + implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" + debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { + exclude group: 'com.facebook.fbjni' + } + debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { + exclude group: 'com.facebook.flipper' + } + debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { + exclude group: 'com.facebook.flipper' + } + + if (enableHermes) { + def hermesPath = "../../node_modules/hermes-engine/android/"; + debugImplementation files(hermesPath + "hermes-debug.aar") + releaseImplementation files(hermesPath + "hermes-release.aar") + } else { + implementation jscFlavor + } + + implementation project(':react-native-agora') } // Run this once to be able to run the application with BUCK // puts all compile dependencies into folder libs for BUCK to use task copyDownloadableDepsToLibs(type: Copy) { - from configurations.compile - into 'libs' + from configurations.compile + into 'libs' } apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) diff --git a/example/android/build.gradle b/example/android/build.gradle index 5d5d188b3..345e101b7 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,38 +1,38 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext { - buildToolsVersion = "28.0.3" - minSdkVersion = 16 - compileSdkVersion = 28 - targetSdkVersion = 28 - } - repositories { - google() - jcenter() - } - dependencies { - classpath("com.android.tools.build:gradle:3.5.2") + ext { + buildToolsVersion = "28.0.3" + minSdkVersion = 16 + compileSdkVersion = 28 + targetSdkVersion = 28 + } + repositories { + google() + jcenter() + } + dependencies { + classpath("com.android.tools.build:gradle:3.5.2") - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } } allprojects { - repositories { - mavenLocal() - maven { - // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm - url("$rootDir/../node_modules/react-native/android") - } - maven { - // Android JSC is installed from npm - url("$rootDir/../node_modules/jsc-android/dist") - } - - google() - jcenter() - maven { url 'https://www.jitpack.io' } + repositories { + mavenLocal() + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url("$rootDir/../node_modules/react-native/android") + } + maven { + // Android JSC is installed from npm + url("$rootDir/../node_modules/jsc-android/dist") } + + google() + jcenter() + maven { url 'https://www.jitpack.io' } + } } diff --git a/example/ios/AgoraExample.xcodeproj/project.pbxproj b/example/ios/AgoraExample.xcodeproj/project.pbxproj index c816ad72e..81125541a 100644 --- a/example/ios/AgoraExample.xcodeproj/project.pbxproj +++ b/example/ios/AgoraExample.xcodeproj/project.pbxproj @@ -200,13 +200,17 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-AgoraExample/Pods-AgoraExample-frameworks.sh", - "${PODS_ROOT}/AgoraRtcEngine_iOS_Crypto/Agora_Native_SDK_for_iOS_FULL/libs/AgoraRtcKit.framework", - "${PODS_ROOT}/AgoraRtcEngine_iOS_Crypto/Agora_Native_SDK_for_iOS_FULL/libs/AgoraRtcCryptoLoader.framework", + "${PODS_ROOT}/AgoraRtcEngine_iOS/AgoraRtcKit.framework", + "${PODS_ROOT}/AgoraRtcEngine_iOS/Agorafdkaac.framework", + "${PODS_ROOT}/AgoraRtcEngine_iOS/Agoraffmpeg.framework", + "${PODS_ROOT}/AgoraRtcEngine_iOS/AgoraSoundTouch.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AgoraRtcKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AgoraRtcCryptoLoader.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Agorafdkaac.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Agoraffmpeg.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AgoraSoundTouch.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; diff --git a/example/src/examples/basic/JoinChannelAudio.tsx b/example/src/examples/basic/JoinChannelAudio.tsx index a53d288b6..f9ee6d185 100644 --- a/example/src/examples/basic/JoinChannelAudio.tsx +++ b/example/src/examples/basic/JoinChannelAudio.tsx @@ -70,7 +70,7 @@ export default class JoinChannelAudio extends Component<{}, State, any> { config.token, this.state.channelId, null, - 0 + config.uid ); }; diff --git a/example/src/examples/basic/JoinChannelVideo.tsx b/example/src/examples/basic/JoinChannelVideo.tsx index b045dd917..b455784b8 100644 --- a/example/src/examples/basic/JoinChannelVideo.tsx +++ b/example/src/examples/basic/JoinChannelVideo.tsx @@ -87,7 +87,7 @@ export default class JoinChannelAudio extends Component<{}, State, any> { config.token, this.state.channelId, null, - 0 + config.uid ); }; diff --git a/example/src/examples/basic/StringUid.tsx b/example/src/examples/basic/StringUid.tsx index 2dc7a45e9..85b5a953e 100644 --- a/example/src/examples/basic/StringUid.tsx +++ b/example/src/examples/basic/StringUid.tsx @@ -18,7 +18,7 @@ export default class StringUid extends Component<{}, State, any> { super(props); this.state = { channelId: config.channelId, - stringUid: '', + stringUid: config.stringUid, isJoined: false, }; } diff --git a/ios/RCTAgora/Base/RtcEngine.swift b/ios/RCTAgora/Base/RtcEngine.swift index 1d40ca5ee..493036d7c 100644 --- a/ios/RCTAgora/Base/RtcEngine.swift +++ b/ios/RCTAgora/Base/RtcEngine.swift @@ -188,8 +188,10 @@ protocol RtcEngineAudioEffectInterface { } protocol RtcEngineVoiceChangerInterface { + @available(*, deprecated) func setLocalVoiceChanger(_ params: NSDictionary, _ callback: Callback) + @available(*, deprecated) func setLocalVoiceReverbPreset(_ params: NSDictionary, _ callback: Callback) func setLocalVoicePitch(_ params: NSDictionary, _ callback: Callback) @@ -197,6 +199,12 @@ protocol RtcEngineVoiceChangerInterface { func setLocalVoiceEqualization(_ params: NSDictionary, _ callback: Callback) func setLocalVoiceReverb(_ params: NSDictionary, _ callback: Callback) + + func setAudioEffectPreset(_ params: NSDictionary, _ callback: Callback) + + func setVoiceBeautifierPreset(_ params: NSDictionary, _ callback: Callback) + + func setAudioEffectParameters(_ params: NSDictionary, _ callback: Callback) } protocol RtcEngineVoicePositionInterface { @@ -282,8 +290,10 @@ protocol RtcEngineWatermarkInterface { } protocol RtcEngineEncryptionInterface { + @available(*, deprecated) func setEncryptionSecret(_ params: NSDictionary, _ callback: Callback) + @available(*, deprecated) func setEncryptionMode(_ params: NSDictionary, _ callback: Callback) func enableEncryption(_ params: NSDictionary, _ callback: Callback) @@ -693,6 +703,18 @@ class RtcEngineManager: NSObject, RtcEngineInterface { @objc func setLocalVoiceReverb(_ params: NSDictionary, _ callback: Callback) { callback.code(engine?.setLocalVoiceReverbOf(AgoraAudioReverbType(rawValue: params["reverbKey"] as! Int)!, withValue: params["value"] as! Int)) } + + @objc func setAudioEffectPreset(_ params: NSDictionary, _ callback: Callback) { + callback.code(engine?.setAudioEffectPreset(AgoraAudioEffectPreset(rawValue: params["preset"] as! Int)!)) + } + + @objc func setVoiceBeautifierPreset(_ params: NSDictionary, _ callback: Callback) { + callback.code(engine?.setVoiceBeautifierPreset(AgoraVoiceBeautifierPreset(rawValue: params["preset"] as! Int)!)) + } + + @objc func setAudioEffectParameters(_ params: NSDictionary, _ callback: Callback) { + callback.code(engine?.setAudioEffectParameters(AgoraAudioEffectPreset(rawValue: params["preset"] as! Int)!, param1: params["param1"] as! Int32, param2: params["param2"] as! Int32)) + } @objc func enableSoundPositionIndication(_ params: NSDictionary, _ callback: Callback) { callback.code(engine?.enableSoundPositionIndication(params["enabled"] as! Bool)) diff --git a/react-native-agora.podspec b/react-native-agora.podspec index 4e605735b..9996377ba 100644 --- a/react-native-agora.podspec +++ b/react-native-agora.podspec @@ -20,5 +20,5 @@ Pod::Spec.new do |s| s.swift_version = "4.0" s.dependency "React" - s.dependency "AgoraRtcEngine_iOS_Crypto", "3.1.2" + s.dependency "AgoraRtcEngine_iOS", "3.2.0" end diff --git a/src/common/Enums.ts b/src/common/Enums.ts index 40bb33011..94fef4806 100644 --- a/src/common/Enums.ts +++ b/src/common/Enums.ts @@ -493,6 +493,14 @@ export enum AudioScenario { * 5: Gaming scenario. */ ChatRoomGaming = 5, + /** + * TODO + */ + IOT = 6, + /** + * TODO + */ + MEETING = 8, } /** @@ -2216,6 +2224,18 @@ export enum WarningCode { * 1053: Audio processing module: A residual echo is detected, which may be caused by the belated scheduling of system threads or the signal overflow. */ ApmResidualEcho = 1053, + /** + * 1610: Super-resolution warning: the original video dimensions of the remote user exceed 640*480. + */ + SuperResolutionStreamOverLimitation = 1610, + /** + * 1611: Super-resolution warning: another user is using super resolution. + */ + SuperResolutionUserCountOverLimitation = 1611, + /** + * 1612: Super-resolution warning: The device is not supported. + */ + SuperResolutionDeviceNotSupported = 1612, } /** @@ -2365,3 +2385,75 @@ export enum AudioSessionOperationRestriction { */ All = 1 << 7, } + +/** + * TODO + */ +export enum AudioEffectPreset { + AudioEffectOff = 0x00000000, + + RoomAcousticsKTV = 0x02010100, + + RoomAcousticsVocalConcert = 0x02010200, + + RoomAcousticsStudio = 0x02010300, + + RoomAcousticsPhonograph = 0x02010400, + + RoomAcousticsVirtualStereo = 0x02010500, + + RoomAcousticsSpacial = 0x02010600, + + RoomAcousticsEthereal = 0x02010700, + + RoomAcoustics3DVoice = 0x02010800, + + VoiceChangerEffectUncle = 0x02020100, + + VoiceChangerEffectOldMan = 0x02020200, + + VoiceChangerEffectBoy = 0x02020300, + + VoiceChangerEffectSister = 0x02020400, + + VoiceChangerEffectGirl = 0x02020500, + + VoiceChangerEffectPigKing = 0x02020600, + + VoiceChangerEffectHulk = 0x02020700, + + StyleTransformationRnB = 0x02030100, + + StyleTransformationPopular = 0x02030200, + + PitchCorrection = 0x02040100, +} + +/** + * TODO + */ +export enum VoiceBeautifierPreset { + VoiceBeautifierOff = 0x00000000, + + ChatBeautifierMagnetic = 0x01010100, + + ChatBeautifierFresh = 0x01010200, + + ChatBeautifierVitality = 0x01010300, + + TimbreTransformationVigorous = 0x01030100, + + TimbreTransformationDeep = 0x01030200, + + TimbreTransformationMellow = 0x01030300, + + TimbreTransformationFalsetto = 0x01030400, + + TimbreTransformationFull = 0x01030500, + + TimbreTransformationClear = 0x01030600, + + TimbreTransformationResounding = 0x01030700, + + TimbreTransformationRinging = 0x01030800, +} diff --git a/src/common/RtcEngine.native.ts b/src/common/RtcEngine.native.ts index ef0419511..6d6022b8a 100644 --- a/src/common/RtcEngine.native.ts +++ b/src/common/RtcEngine.native.ts @@ -2,6 +2,7 @@ import { NativeEventEmitter, NativeModules } from 'react-native'; import { AreaCode, + AudioEffectPreset, AudioEqualizationBandFrequency, AudioProfile, AudioRecordingQuality, @@ -28,6 +29,7 @@ import { UserPriority, VideoEncoderConfiguration, VideoStreamType, + VoiceBeautifierPreset, WatermarkOptions, } from '../Types'; import type { Listener, RtcEngineEvents, Subscription } from './RtcEvents'; @@ -1429,6 +1431,8 @@ export default class RtcEngine implements RtcEngineInterface { /** * Sets the local voice changer option. * + * @deprecated + * * **Note** * * Do not use this method together with [`setLocalVoiceReverbPreset`]{@link setLocalVoiceReverbPreset}, or the method called earlier does not take effect. @@ -1488,6 +1492,8 @@ export default class RtcEngine implements RtcEngineInterface { /** * Sets the preset local voice reverberation effect. * + * @deprecated + * * **Note** * * - Do not use this method together with [`setLocalVoiceReverb`]{@link setLocalVoiceReverb}. @@ -2495,6 +2501,43 @@ export default class RtcEngine implements RtcEngineInterface { getNativeHandle(): Promise { return RtcEngine._callMethod('getNativeHandle'); } + + /** + * TODO + * + * @param preset + * @param param1 + * @param param2 + */ + setAudioEffectParameters( + preset: AudioEffectPreset, + param1: number, + param2: number + ): Promise { + return RtcEngine._callMethod('setAudioEffectParameters', { + preset, + param1, + param2, + }); + } + + /** + * TODO + * + * @param preset + */ + setAudioEffectPreset(preset: AudioEffectPreset): Promise { + return RtcEngine._callMethod('setAudioEffectPreset', { preset }); + } + + /** + * TODO + * + * @param preset + */ + setVoiceBeautifierPreset(preset: VoiceBeautifierPreset): Promise { + return RtcEngine._callMethod('setVoiceBeautifierPreset', { preset }); + } } /** @@ -2751,6 +2794,16 @@ interface RtcVoiceChangerInterface { ): Promise; setLocalVoiceReverb(reverbKey: AudioReverbType, value: number): Promise; + + setAudioEffectPreset(preset: AudioEffectPreset): Promise; + + setVoiceBeautifierPreset(preset: VoiceBeautifierPreset): Promise; + + setAudioEffectParameters( + preset: AudioEffectPreset, + param1: number, + param2: number + ): Promise; } /** From 4ee51a9b405deb17b467f5359f6717033c3961a2 Mon Sep 17 00:00:00 2001 From: HUI Date: Wed, 2 Dec 2020 14:59:38 +0800 Subject: [PATCH 02/20] feat: upgrade to 3.2.0 --- RtcEngine.swift | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/RtcEngine.swift b/RtcEngine.swift index 1d40ca5ee..493036d7c 100644 --- a/RtcEngine.swift +++ b/RtcEngine.swift @@ -188,8 +188,10 @@ protocol RtcEngineAudioEffectInterface { } protocol RtcEngineVoiceChangerInterface { + @available(*, deprecated) func setLocalVoiceChanger(_ params: NSDictionary, _ callback: Callback) + @available(*, deprecated) func setLocalVoiceReverbPreset(_ params: NSDictionary, _ callback: Callback) func setLocalVoicePitch(_ params: NSDictionary, _ callback: Callback) @@ -197,6 +199,12 @@ protocol RtcEngineVoiceChangerInterface { func setLocalVoiceEqualization(_ params: NSDictionary, _ callback: Callback) func setLocalVoiceReverb(_ params: NSDictionary, _ callback: Callback) + + func setAudioEffectPreset(_ params: NSDictionary, _ callback: Callback) + + func setVoiceBeautifierPreset(_ params: NSDictionary, _ callback: Callback) + + func setAudioEffectParameters(_ params: NSDictionary, _ callback: Callback) } protocol RtcEngineVoicePositionInterface { @@ -282,8 +290,10 @@ protocol RtcEngineWatermarkInterface { } protocol RtcEngineEncryptionInterface { + @available(*, deprecated) func setEncryptionSecret(_ params: NSDictionary, _ callback: Callback) + @available(*, deprecated) func setEncryptionMode(_ params: NSDictionary, _ callback: Callback) func enableEncryption(_ params: NSDictionary, _ callback: Callback) @@ -693,6 +703,18 @@ class RtcEngineManager: NSObject, RtcEngineInterface { @objc func setLocalVoiceReverb(_ params: NSDictionary, _ callback: Callback) { callback.code(engine?.setLocalVoiceReverbOf(AgoraAudioReverbType(rawValue: params["reverbKey"] as! Int)!, withValue: params["value"] as! Int)) } + + @objc func setAudioEffectPreset(_ params: NSDictionary, _ callback: Callback) { + callback.code(engine?.setAudioEffectPreset(AgoraAudioEffectPreset(rawValue: params["preset"] as! Int)!)) + } + + @objc func setVoiceBeautifierPreset(_ params: NSDictionary, _ callback: Callback) { + callback.code(engine?.setVoiceBeautifierPreset(AgoraVoiceBeautifierPreset(rawValue: params["preset"] as! Int)!)) + } + + @objc func setAudioEffectParameters(_ params: NSDictionary, _ callback: Callback) { + callback.code(engine?.setAudioEffectParameters(AgoraAudioEffectPreset(rawValue: params["preset"] as! Int)!, param1: params["param1"] as! Int32, param2: params["param2"] as! Int32)) + } @objc func enableSoundPositionIndication(_ params: NSDictionary, _ callback: Callback) { callback.code(engine?.enableSoundPositionIndication(params["enabled"] as! Bool)) From fcb57cc3e2cbb3e16750e9ce8ddca069184ac1c0 Mon Sep 17 00:00:00 2001 From: HUI Date: Wed, 2 Dec 2020 14:59:38 +0800 Subject: [PATCH 03/20] feat: upgrade to 3.2.0 --- Annotations.java | 1629 +++++++++++++++++++++++--------------------- BeanCovertor.kt | 234 +++---- Callback.kt | 52 +- EnumCovertor.kt | 100 +-- Extensions.kt | 224 +++--- MediaObserver.kt | 48 +- RtcChannel.kt | 546 +++++++-------- RtcChannelEvent.kt | 412 +++++------ RtcEngine.kt | 1416 +++++++++++++++++++------------------- RtcEngineEvent.kt | 1004 +++++++++++++-------------- RtcSurfaceView.kt | 142 ++-- RtcTextureView.kt | 110 +-- 12 files changed, 3000 insertions(+), 2917 deletions(-) diff --git a/Annotations.java b/Annotations.java index 3e584a77d..54e7ba9a5 100644 --- a/Annotations.java +++ b/Annotations.java @@ -12,788 +12,849 @@ @SuppressWarnings("deprecation") public class Annotations { - @IntDef({ - AgoraRtcAppType.NATIVE, - AgoraRtcAppType.COCOS, - AgoraRtcAppType.UNITY, - AgoraRtcAppType.ELECTRON, - AgoraRtcAppType.FLUTTER, - AgoraRtcAppType.UNREAL, - AgoraRtcAppType.XAMARIN, - AgoraRtcAppType.APICLOUD, - AgoraRtcAppType.REACTNATIVE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraRtcAppType { - int NATIVE = 0; - int COCOS = 1; - int UNITY = 2; - int ELECTRON = 3; - int FLUTTER = 4; - int UNREAL = 5; - int XAMARIN = 6; - int APICLOUD = 7; - int REACTNATIVE = 8; - } - - @IntDef({ - AgoraAudioCodecProfileType.LC_AAC, - AgoraAudioCodecProfileType.HE_AAC, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioCodecProfileType { - int LC_AAC = 0; - int HE_AAC = 1; - } - - @IntDef({ - Constants.AUDIO_EQUALIZATION_BAND_31, - Constants.AUDIO_EQUALIZATION_BAND_62, - Constants.AUDIO_EQUALIZATION_BAND_125, - Constants.AUDIO_EQUALIZATION_BAND_250, - Constants.AUDIO_EQUALIZATION_BAND_500, - Constants.AUDIO_EQUALIZATION_BAND_1K, - Constants.AUDIO_EQUALIZATION_BAND_2K, - Constants.AUDIO_EQUALIZATION_BAND_4K, - Constants.AUDIO_EQUALIZATION_BAND_8K, - Constants.AUDIO_EQUALIZATION_BAND_16K, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioEqualizationBandFrequency { - } - - @IntDef({ - Constants.LOCAL_AUDIO_STREAM_ERROR_OK, - Constants.LOCAL_AUDIO_STREAM_ERROR_FAILURE, - Constants.LOCAL_AUDIO_STREAM_ERROR_DEVICE_NO_PERMISSION, - Constants.LOCAL_AUDIO_STREAM_ERROR_DEVICE_BUSY, - Constants.LOCAL_AUDIO_STREAM_ERROR_CAPTURE_FAILURE, - Constants.LOCAL_AUDIO_STREAM_ERROR_ENCODE_FAILURE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioLocalError { - } - - @IntDef({ - Constants.LOCAL_AUDIO_STREAM_STATE_STOPPED, - Constants.LOCAL_AUDIO_STREAM_STATE_CAPTURING, - Constants.LOCAL_AUDIO_STREAM_STATE_ENCODING, - Constants.LOCAL_AUDIO_STREAM_STATE_FAILED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioLocalState { - } - - @IntDef({ - Constants.MEDIA_ENGINE_AUDIO_ERROR_MIXING_OPEN, - Constants.MEDIA_ENGINE_AUDIO_ERROR_MIXING_TOO_FREQUENT, - Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_INTERRUPTED_EOF, - AgoraAudioMixingErrorCode.MEDIA_ENGINE_AUDIO_ERROR_OK, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioMixingErrorCode { - int MEDIA_ENGINE_AUDIO_ERROR_OK = 0; - } - - @IntDef({ - Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_PLAY, - Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_PAUSED, - Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_STOPPED, - Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_ERROR, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioMixingStateCode { - } - - @IntDef({ - Constants.AUDIO_ROUTE_DEFAULT, - Constants.AUDIO_ROUTE_HEADSET, - Constants.AUDIO_ROUTE_EARPIECE, - Constants.AUDIO_ROUTE_HEADSETNOMIC, - Constants.AUDIO_ROUTE_SPEAKERPHONE, - Constants.AUDIO_ROUTE_LOUDSPEAKER, - Constants.AUDIO_ROUTE_HEADSETBLUETOOTH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioOutputRouting { - } - - @IntDef({ - Constants.AUDIO_PROFILE_DEFAULT, - Constants.AUDIO_PROFILE_SPEECH_STANDARD, - Constants.AUDIO_PROFILE_MUSIC_STANDARD, - Constants.AUDIO_PROFILE_MUSIC_STANDARD_STEREO, - Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY, - Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioProfile { - } - - @IntDef({ - Constants.AUDIO_RECORDING_QUALITY_LOW, - Constants.AUDIO_RECORDING_QUALITY_MEDIUM, - Constants.AUDIO_RECORDING_QUALITY_HIGH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioRecordingQuality { - } - - @IntDef({ - Constants.REMOTE_AUDIO_STATE_STOPPED, - Constants.REMOTE_AUDIO_STATE_STARTING, - Constants.REMOTE_AUDIO_STATE_DECODING, - Constants.REMOTE_AUDIO_STATE_FROZEN, - Constants.REMOTE_AUDIO_STATE_FAILED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioRemoteState { - } - - @IntDef({ - Constants.REMOTE_AUDIO_REASON_INTERNAL, - Constants.REMOTE_AUDIO_REASON_NETWORK_CONGESTION, - Constants.REMOTE_AUDIO_REASON_NETWORK_RECOVERY, - Constants.REMOTE_AUDIO_REASON_LOCAL_MUTED, - Constants.REMOTE_AUDIO_REASON_LOCAL_UNMUTED, - Constants.REMOTE_AUDIO_REASON_REMOTE_MUTED, - Constants.REMOTE_AUDIO_REASON_REMOTE_UNMUTED, - Constants.REMOTE_AUDIO_REASON_REMOTE_OFFLINE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioRemoteStateReason { - } - - @IntDef({ - Constants.AUDIO_REVERB_OFF, - Constants.AUDIO_REVERB_POPULAR, - Constants.AUDIO_REVERB_RNB, - Constants.AUDIO_REVERB_ROCK, - Constants.AUDIO_REVERB_HIPHOP, - Constants.AUDIO_REVERB_VOCAL_CONCERT, - Constants.AUDIO_REVERB_KTV, - Constants.AUDIO_REVERB_STUDIO, - Constants.AUDIO_REVERB_FX_KTV, - Constants.AUDIO_REVERB_FX_VOCAL_CONCERT, - Constants.AUDIO_REVERB_FX_UNCLE, - Constants.AUDIO_REVERB_FX_SISTER, - Constants.AUDIO_REVERB_FX_STUDIO, - Constants.AUDIO_REVERB_FX_POPULAR, - Constants.AUDIO_REVERB_FX_RNB, - Constants.AUDIO_REVERB_FX_PHONOGRAPH, - Constants.AUDIO_VIRTUAL_STEREO, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioReverbPreset { - } - - @IntDef({ - Constants.AUDIO_REVERB_DRY_LEVEL, - Constants.AUDIO_REVERB_WET_LEVEL, - Constants.AUDIO_REVERB_ROOM_SIZE, - Constants.AUDIO_REVERB_WET_DELAY, - Constants.AUDIO_REVERB_STRENGTH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioReverbType { - } - - @IntDef({ - AgoraAudioSampleRateType.TYPE_32000, - AgoraAudioSampleRateType.TYPE_44100, - AgoraAudioSampleRateType.TYPE_48000, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioSampleRateType { - int TYPE_32000 = 32000; - int TYPE_44100 = 44100; - int TYPE_48000 = 48000; - } - - @IntDef({ - Constants.AUDIO_SCENARIO_DEFAULT, - Constants.AUDIO_SCENARIO_CHATROOM_ENTERTAINMENT, - Constants.AUDIO_SCENARIO_EDUCATION, - Constants.AUDIO_SCENARIO_GAME_STREAMING, - Constants.AUDIO_SCENARIO_SHOWROOM, - Constants.AUDIO_SCENARIO_CHATROOM_GAMING, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioScenario { - } - - @IntDef({ - Constants.VOICE_CHANGER_OFF, - Constants.VOICE_CHANGER_OLDMAN, - Constants.VOICE_CHANGER_BABYBOY, - Constants.VOICE_CHANGER_BABYGIRL, - Constants.VOICE_CHANGER_ZHUBAJIE, - Constants.VOICE_CHANGER_ETHEREAL, - Constants.VOICE_CHANGER_HULK, - Constants.VOICE_BEAUTY_VIGOROUS, - Constants.VOICE_BEAUTY_DEEP, - Constants.VOICE_BEAUTY_MELLOW, - Constants.VOICE_BEAUTY_FALSETTO, - Constants.VOICE_BEAUTY_FULL, - Constants.VOICE_BEAUTY_CLEAR, - Constants.VOICE_BEAUTY_RESOUNDING, - Constants.VOICE_BEAUTY_RINGING, - Constants.VOICE_BEAUTY_SPACIAL, - Constants.GENERAL_BEAUTY_VOICE_MALE_MAGNETIC, - Constants.GENERAL_BEAUTY_VOICE_FEMALE_FRESH, - Constants.GENERAL_BEAUTY_VOICE_FEMALE_VITALITY, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAudioVoiceChanger { - } - - @IntDef({ - AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_AUTO, - AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE, - AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_PREVIEW, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraCameraCaptureOutputPreference { - int CAPTURER_OUTPUT_PREFERENCE_AUTO = 0; - int CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE = 1; - int CAPTURER_OUTPUT_PREFERENCE_PREVIEW = 2; - } - - @IntDef({ - AgoraCameraDirection.CAMERA_REAR, - AgoraCameraDirection.CAMERA_FRONT, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraCameraDirection { - int CAMERA_REAR = 0; - int CAMERA_FRONT = 1; - } - - @IntDef({ - Constants.RELAY_OK, - Constants.RELAY_ERROR_SERVER_ERROR_RESPONSE, - Constants.RELAY_ERROR_SERVER_NO_RESPONSE, - Constants.RELAY_ERROR_NO_RESOURCE_AVAILABLE, - Constants.RELAY_ERROR_FAILED_JOIN_SRC, - Constants.RELAY_ERROR_FAILED_JOIN_DEST, - Constants.RELAY_ERROR_FAILED_PACKET_RECEIVED_FROM_SRC, - Constants.RELAY_ERROR_FAILED_PACKET_SENT_TO_DEST, - Constants.RELAY_ERROR_SERVER_CONNECTION_LOST, - Constants.RELAY_ERROR_INTERNAL_ERROR, - Constants.RELAY_ERROR_SRC_TOKEN_EXPIRED, - Constants.RELAY_ERROR_DEST_TOKEN_EXPIRED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraChannelMediaRelayError { - } - - @IntDef({ - Constants.RELAY_EVENT_NETWORK_DISCONNECTED, - Constants.RELAY_EVENT_NETWORK_CONNECTED, - Constants.RELAY_EVENT_PACKET_JOINED_SRC_CHANNEL, - Constants.RELAY_EVENT_PACKET_JOINED_DEST_CHANNEL, - Constants.RELAY_EVENT_PACKET_SENT_TO_DEST_CHANNEL, - Constants.RELAY_EVENT_PACKET_RECEIVED_VIDEO_FROM_SRC, - Constants.RELAY_EVENT_PACKET_RECEIVED_AUDIO_FROM_SRC, - Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL, - Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED, - Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_NOT_CHANGE, - Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_IS_NULL, - Constants.RELAY_EVENT_VIDEO_PROFILE_UPDATE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraChannelMediaRelayEvent { - } - - @IntDef({ - Constants.RELAY_STATE_IDLE, - Constants.RELAY_STATE_CONNECTING, - Constants.RELAY_STATE_RUNNING, - Constants.RELAY_STATE_FAILURE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraChannelMediaRelayState { - } - - @IntDef({ - Constants.CHANNEL_PROFILE_COMMUNICATION, - Constants.CHANNEL_PROFILE_LIVE_BROADCASTING, - Constants.CHANNEL_PROFILE_GAME, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraChannelProfile { - } - - @IntDef({ - Constants.CLIENT_ROLE_BROADCASTER, - Constants.CLIENT_ROLE_AUDIENCE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraClientRole { - } - - @IntDef({ - Constants.CONNECTION_CHANGED_CONNECTING, - Constants.CONNECTION_CHANGED_JOIN_SUCCESS, - Constants.CONNECTION_CHANGED_INTERRUPTED, - Constants.CONNECTION_CHANGED_BANNED_BY_SERVER, - Constants.CONNECTION_CHANGED_JOIN_FAILED, - Constants.CONNECTION_CHANGED_LEAVE_CHANNEL, - Constants.CONNECTION_CHANGED_INVALID_APP_ID, - Constants.CONNECTION_CHANGED_INVALID_CHANNEL_NAME, - Constants.CONNECTION_CHANGED_INVALID_TOKEN, - Constants.CONNECTION_CHANGED_TOKEN_EXPIRED, - Constants.CONNECTION_CHANGED_REJECTED_BY_SERVER, - Constants.CONNECTION_CHANGED_SETTING_PROXY_SERVER, - Constants.CONNECTION_CHANGED_RENEW_TOKEN, - Constants.CONNECTION_CHANGED_CLIENT_IP_ADDRESS_CHANGED, - Constants.CONNECTION_CHANGED_KEEP_ALIVE_TIMEOUT, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraConnectionChangedReason { - } - - @IntDef({ - Constants.CONNECTION_STATE_DISCONNECTED, - Constants.CONNECTION_STATE_CONNECTING, - Constants.CONNECTION_STATE_CONNECTED, - Constants.CONNECTION_STATE_RECONNECTING, - Constants.CONNECTION_STATE_FAILED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraConnectionStateType { - } - - @IntDef({ - AgoraDegradationPreference.MAINTAIN_QUALITY, - AgoraDegradationPreference.MAINTAIN_FRAMERATE, - AgoraDegradationPreference.MAINTAIN_BALANCED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraDegradationPreference { - int MAINTAIN_QUALITY = 0; - int MAINTAIN_FRAMERATE = 1; - int MAINTAIN_BALANCED = 2; - } - - @IntDef({ - AgoraEncryptionMode.NONE, - AgoraEncryptionMode.AES128XTS, - AgoraEncryptionMode.AES128ECB, - AgoraEncryptionMode.AES256XTS, - AgoraEncryptionMode.SM4128ECB, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraEncryptionMode { - int NONE = 0; - int AES128XTS = 1; - int AES128ECB = 2; - int AES256XTS = 3; - int SM4128ECB = 4; - } - - @IntDef({ - Constants.ERR_OK, - Constants.ERR_FAILED, - Constants.ERR_INVALID_ARGUMENT, - Constants.ERR_NOT_READY, - Constants.ERR_NOT_SUPPORTED, - Constants.ERR_REFUSED, - Constants.ERR_BUFFER_TOO_SMALL, - Constants.ERR_NOT_INITIALIZED, - Constants.ERR_NO_PERMISSION, - Constants.ERR_TIMEDOUT, - Constants.ERR_CANCELED, - Constants.ERR_TOO_OFTEN, - Constants.ERR_BIND_SOCKET, - Constants.ERR_NET_DOWN, - Constants.ERR_NET_NOBUFS, - Constants.ERR_JOIN_CHANNEL_REJECTED, - Constants.ERR_LEAVE_CHANNEL_REJECTED, - Constants.ERR_ALREADY_IN_USE, - Constants.ERR_INVALID_APP_ID, - Constants.ERR_INVALID_CHANNEL_NAME, - Constants.ERR_NO_SERVER_RESOURCES, - Constants.ERR_TOKEN_EXPIRED, - Constants.ERR_INVALID_TOKEN, - Constants.ERR_CONNECTION_INTERRUPTED, - Constants.ERR_CONNECTION_LOST, - Constants.ERR_NOT_IN_CHANNEL, - Constants.ERR_SIZE_TOO_LARGE, - Constants.ERR_BITRATE_LIMIT, - Constants.ERR_TOO_MANY_DATA_STREAMS, - Constants.ERR_DECRYPTION_FAILED, - Constants.ERR_CLIENT_IS_BANNED_BY_SERVER, - Constants.ERR_WATERMARK_PARAM, - Constants.ERR_WATERMARK_PATH, - Constants.ERR_WATERMARK_PNG, - Constants.ERR_WATERMARKR_INFO, - Constants.ERR_WATERMARK_ARGB, - Constants.ERR_WATERMARK_READ, - Constants.ERR_ENCRYPTED_STREAM_NOT_ALLOWED_PUBLISHED, - Constants.ERR_INVALID_USER_ACCOUNT, - Constants.ERR_PUBLISH_STREAM_CDN_ERROR, - Constants.ERR_PUBLISH_STREAM_NUM_REACH_LIMIT, - Constants.ERR_PUBLISH_STREAM_NOT_AUTHORIZED, - Constants.ERR_PUBLISH_STREAM_INTERNAL_SERVER_ERROR, - Constants.ERR_PUBLISH_STREAM_NOT_FOUND, - Constants.ERR_PUBLISH_STREAM_FORMAT_NOT_SUPPORTED, - Constants.ERR_LOAD_MEDIA_ENGINE, - Constants.ERR_START_CALL, - Constants.ERR_START_CAMERA, - Constants.ERR_START_VIDEO_RENDER, - Constants.ERR_ADM_GENERAL_ERROR, - Constants.ERR_ADM_JAVA_RESOURCE, - Constants.ERR_ADM_SAMPLE_RATE, - Constants.ERR_ADM_INIT_PLAYOUT, - Constants.ERR_ADM_START_PLAYOUT, - Constants.ERR_ADM_STOP_PLAYOUT, - Constants.ERR_ADM_INIT_RECORDING, - Constants.ERR_ADM_START_RECORDING, - Constants.ERR_ADM_STOP_RECORDING, - Constants.ERR_ADM_RUNTIME_PLAYOUT_ERROR, - Constants.ERR_ADM_RUNTIME_RECORDING_ERROR, - Constants.ERR_ADM_RECORD_AUDIO_FAILED, - Constants.ERR_ADM_INIT_LOOPBACK, - Constants.ERR_ADM_START_LOOPBACK, - Constants.ERR_AUDIO_BT_SCO_FAILED, - Constants.ERR_ADM_NO_RECORDING_DEVICE, - Constants.ERR_ADM_NO_PLAYOUT_DEVICE, - Constants.ERR_VDM_CAMERA_NOT_AUTHORIZED, - Constants.ERR_VCM_UNKNOWN_ERROR, - Constants.ERR_VCM_ENCODER_INIT_ERROR, - Constants.ERR_VCM_ENCODER_ENCODE_ERROR, - Constants.ERR_VCM_ENCODER_SET_ERROR, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraErrorCode { - } - - @IntDef({ - Constants.INJECT_STREAM_STATUS_START_SUCCESS, - Constants.INJECT_STREAM_STATUS_START_ALREADY_EXISTS, - Constants.INJECT_STREAM_STATUS_START_UNAUTHORIZED, - Constants.INJECT_STREAM_STATUS_START_TIMEDOUT, - Constants.INJECT_STREAM_STATUS_START_FAILED, - Constants.INJECT_STREAM_STATUS_STOP_SUCCESS, - Constants.INJECT_STREAM_STATUS_STOP_NOT_FOUND, - Constants.INJECT_STREAM_STATUS_STOP_UNAUTHORIZED, - Constants.INJECT_STREAM_STATUS_STOP_TIMEDOUT, - Constants.INJECT_STREAM_STATUS_STOP_FAILED, - Constants.INJECT_STREAM_STATUS_BROKEN, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraInjectStreamStatus { - } - - @IntDef({ - Constants.LASTMILE_PROBE_RESULT_COMPLETE, - Constants.LASTMILE_PROBE_RESULT_INCOMPLETE_NO_BWE, - Constants.LASTMILE_PROBE_RESULT_UNAVAILABLE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraLastmileProbeResultState { - } - - @IntDef({ - BeautyOptions.LIGHTENING_CONTRAST_LOW, - BeautyOptions.LIGHTENING_CONTRAST_NORMAL, - BeautyOptions.LIGHTENING_CONTRAST_HIGH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraLighteningContrastLevel { - } - - @IntDef({ - Constants.LOCAL_VIDEO_STREAM_ERROR_OK, - Constants.LOCAL_VIDEO_STREAM_ERROR_FAILURE, - Constants.LOCAL_VIDEO_STREAM_ERROR_DEVICE_NO_PERMISSION, - Constants.LOCAL_VIDEO_STREAM_ERROR_DEVICE_BUSY, - Constants.LOCAL_VIDEO_STREAM_ERROR_CAPTURE_FAILURE, - Constants.LOCAL_VIDEO_STREAM_ERROR_ENCODE_FAILURE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraLocalVideoStreamError { - } - - @IntDef({ - Constants.LOCAL_VIDEO_STREAM_STATE_STOPPED, - Constants.LOCAL_VIDEO_STREAM_STATE_CAPTURING, - Constants.LOCAL_VIDEO_STREAM_STATE_ENCODING, - Constants.LOCAL_VIDEO_STREAM_STATE_FAILED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraLocalVideoStreamState { - } - - @IntDef({ - Constants.LOG_FILTER_OFF, - Constants.LOG_FILTER_DEBUG, - Constants.LOG_FILTER_INFO, - Constants.LOG_FILTER_WARNING, - Constants.LOG_FILTER_ERROR, - Constants.LOG_FILTER_CRITICAL, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraLogFilter { - } - - @IntDef({ - Constants.QUALITY_UNKNOWN, - Constants.QUALITY_EXCELLENT, - Constants.QUALITY_GOOD, - Constants.QUALITY_POOR, - Constants.QUALITY_BAD, - Constants.QUALITY_VBAD, - Constants.QUALITY_DOWN, - Constants.QUALITY_UNSUPPORTED, - Constants.QUALITY_DETECTING, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraNetworkQuality { - } - - @IntDef({ - Constants.NETWORK_TYPE_UNKNOWN, - Constants.NETWORK_TYPE_DISCONNECTED, - Constants.NETWORK_TYPE_LAN, - Constants.NETWORK_TYPE_WIFI, - Constants.NETWORK_TYPE_MOBILE_2G, - Constants.NETWORK_TYPE_MOBILE_3G, - Constants.NETWORK_TYPE_MOBILE_4G, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraNetworkType { - } - - @IntDef({ - Constants.RTMP_STREAM_PUBLISH_ERROR_OK, - Constants.RTMP_STREAM_PUBLISH_ERROR_INVALID_ARGUMENT, - Constants.RTMP_STREAM_PUBLISH_ERROR_ENCRYPTED_STREAM_NOT_ALLOWED, - Constants.RTMP_STREAM_PUBLISH_ERROR_CONNECTION_TIMEOUT, - Constants.RTMP_STREAM_PUBLISH_ERROR_INTERNAL_SERVER_ERROR, - Constants.RTMP_STREAM_PUBLISH_ERROR_RTMP_SERVER_ERROR, - Constants.RTMP_STREAM_PUBLISH_ERROR_TOO_OFTEN, - Constants.RTMP_STREAM_PUBLISH_ERROR_REACH_LIMIT, - Constants.RTMP_STREAM_PUBLISH_ERROR_NOT_AUTHORIZED, - Constants.RTMP_STREAM_PUBLISH_ERROR_STREAM_NOT_FOUND, - Constants.RTMP_STREAM_PUBLISH_ERROR_FORMAT_NOT_SUPPORTED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraRtmpStreamingErrorCode { - } - - @IntDef({ - Constants.RTMP_STREAM_PUBLISH_STATE_IDLE, - Constants.RTMP_STREAM_PUBLISH_STATE_CONNECTING, - Constants.RTMP_STREAM_PUBLISH_STATE_RUNNING, - Constants.RTMP_STREAM_PUBLISH_STATE_RECOVERING, - Constants.RTMP_STREAM_PUBLISH_STATE_FAILURE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraRtmpStreamingState { - } - - @IntDef({ - Constants.STREAM_FALLBACK_OPTION_DISABLED, - Constants.STREAM_FALLBACK_OPTION_VIDEO_STREAM_LOW, - Constants.STREAM_FALLBACK_OPTION_AUDIO_ONLY, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraStreamFallbackOptions { - } - - @IntDef({ - Constants.USER_OFFLINE_QUIT, - Constants.USER_OFFLINE_DROPPED, - Constants.USER_OFFLINE_BECOME_AUDIENCE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraUserOfflineReason { - } - - @IntDef({ - Constants.USER_PRIORITY_HIGH, - Constants.USER_PRIORITY_NORANL, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraUserPriority { - } - - @IntDef({ - AgoraVideoCodecProfileType.BASELINE, - AgoraVideoCodecProfileType.MAIN, - AgoraVideoCodecProfileType.HIGH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoCodecProfileType { - int BASELINE = 66; - int MAIN = 77; - int HIGH = 100; - } - - @IntDef({ - AgoraVideoFrameRate.FRAME_RATE_FPS_1, - AgoraVideoFrameRate.FRAME_RATE_FPS_7, - AgoraVideoFrameRate.FRAME_RATE_FPS_10, - AgoraVideoFrameRate.FRAME_RATE_FPS_15, - AgoraVideoFrameRate.FRAME_RATE_FPS_24, - AgoraVideoFrameRate.FRAME_RATE_FPS_30, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoFrameRate { - int FRAME_RATE_FPS_1 = 1; - int FRAME_RATE_FPS_7 = 7; - int FRAME_RATE_FPS_10 = 10; - int FRAME_RATE_FPS_15 = 15; - int FRAME_RATE_FPS_24 = 24; - int FRAME_RATE_FPS_30 = 30; - } - - @IntDef({ - Constants.VIDEO_MIRROR_MODE_AUTO, - Constants.VIDEO_MIRROR_MODE_ENABLED, - Constants.VIDEO_MIRROR_MODE_DISABLED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoMirrorMode { - } - - @IntDef({ - AgoraVideoOutputOrientationMode.ORIENTATION_MODE_ADAPTIVE, - AgoraVideoOutputOrientationMode.ORIENTATION_MODE_FIXED_LANDSCAPE, - AgoraVideoOutputOrientationMode.ORIENTATION_MODE_FIXED_PORTRAIT, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoOutputOrientationMode { - int ORIENTATION_MODE_ADAPTIVE = 0; - int ORIENTATION_MODE_FIXED_LANDSCAPE = 1; - int ORIENTATION_MODE_FIXED_PORTRAIT = 2; - } - - @IntDef({ - Constants.ADAPT_NONE, - Constants.ADAPT_UP_BANDWIDTH, - Constants.ADAPT_DOWN_BANDWIDTH, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoQualityAdaptIndication { - } - - @IntDef({ - Constants.REMOTE_VIDEO_STATE_STOPPED, - Constants.REMOTE_VIDEO_STATE_STARTING, - Constants.REMOTE_VIDEO_STATE_DECODING, - Constants.REMOTE_VIDEO_STATE_FROZEN, - Constants.REMOTE_VIDEO_STATE_FAILED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoRemoteState { - } - - @IntDef({ - Constants.REMOTE_VIDEO_STATE_REASON_INTERNAL, - Constants.REMOTE_VIDEO_STATE_REASON_NETWORK_CONGESTION, - Constants.REMOTE_VIDEO_STATE_REASON_NETWORK_RECOVERY, - Constants.REMOTE_VIDEO_STATE_REASON_LOCAL_MUTED, - Constants.REMOTE_VIDEO_STATE_REASON_LOCAL_UNMUTED, - Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_MUTED, - Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_UNMUTED, - Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_OFFLINE, - Constants.REMOTE_VIDEO_STATE_REASON_AUDIO_FALLBACK, - Constants.REMOTE_VIDEO_STATE_REASON_AUDIO_FALLBACK_RECOVERY, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoRemoteStateReason { - } - - @IntDef({ - VideoCanvas.RENDER_MODE_HIDDEN, - VideoCanvas.RENDER_MODE_FIT, - VideoCanvas.RENDER_MODE_ADAPTIVE, - VideoCanvas.RENDER_MODE_FILL, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoRenderMode { - } - - @IntDef({ - Constants.VIDEO_STREAM_HIGH, - Constants.VIDEO_STREAM_LOW, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraVideoStreamType { - } - - @IntDef({ - Constants.WARN_INVALID_VIEW, - Constants.WARN_INIT_VIDEO, - Constants.WARN_PENDING, - Constants.WARN_NO_AVAILABLE_CHANNEL, - Constants.WARN_LOOKUP_CHANNEL_TIMEOUT, - Constants.WARN_LOOKUP_CHANNEL_REJECTED, - Constants.WARN_OPEN_CHANNEL_TIMEOUT, - Constants.WARN_OPEN_CHANNEL_REJECTED, - Constants.WARN_SWITCH_LIVE_VIDEO_TIMEOUT, - Constants.WARN_SET_CLIENT_ROLE_TIMEOUT, - Constants.WARN_SET_CLIENT_ROLE_NOT_AUTHORIZED, - Constants.WARN_OPEN_CHANNEL_INVALID_TICKET, - Constants.WARN_OPEN_CHANNEL_TRY_NEXT_VOS, - Constants.WARN_AUDIO_MIXING_OPEN_ERROR, - Constants.WARN_ADM_RUNTIME_PLAYOUT_WARNING, - Constants.WARN_ADM_RUNTIME_RECORDING_WARNING, - Constants.WARN_ADM_RECORD_AUDIO_SILENCE, - Constants.WARN_ADM_PLAYOUT_ABNORMAL_FREQUENCY, - Constants.WARN_ADM_RECORD_ABNORMAL_FREQUENCY, - Constants.WARN_ADM_CALL_INTERRUPTION, - Constants.WARN_ADM_RECORD_AUDIO_LOWLEVEL, - Constants.WARN_ADM_PLAYOUT_AUDIO_LOWLEVEL, - Constants.WARN_ADM_RECORD_IS_OCCUPIED, - Constants.WARN_APM_HOWLING, - Constants.WARN_ADM_GLITCH_STATE, - Constants.WARN_APM_RESIDUAL_ECHO, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraWarningCode { - } - - @IntDef({ - RtcEngineConfig.AreaCode.AREA_CODE_CN, - RtcEngineConfig.AreaCode.AREA_CODE_NA, - RtcEngineConfig.AreaCode.AREA_CODE_EU, - RtcEngineConfig.AreaCode.AREA_CODE_AS, - RtcEngineConfig.AreaCode.AREA_CODE_JP, - RtcEngineConfig.AreaCode.AREA_CODE_IN, - RtcEngineConfig.AreaCode.AREA_CODE_GLOB, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraAreaCode { - } - - @IntDef({ - Constants.SUB_STATE_IDLE, - Constants.SUB_STATE_NO_SUBSCRIBED, - Constants.SUB_STATE_SUBSCRIBING, - Constants.SUB_STATE_SUBSCRIBED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraStreamSubscribeState { - } - - @IntDef({ - Constants.PUB_STATE_IDLE, - Constants.PUB_STATE_NO_PUBLISHED, - Constants.PUB_STATE_PUBLISHING, - Constants.PUB_STATE_PUBLISHED, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraStreamPublishState { - } - - @IntDef({ - Constants.RTMP_STREAMING_EVENT_FAILED_LOAD_IMAGE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AgoraRtmpStreamingEvent { - } + @IntDef({ + AgoraRtcAppType.NATIVE, + AgoraRtcAppType.COCOS, + AgoraRtcAppType.UNITY, + AgoraRtcAppType.ELECTRON, + AgoraRtcAppType.FLUTTER, + AgoraRtcAppType.UNREAL, + AgoraRtcAppType.XAMARIN, + AgoraRtcAppType.API_CLOUD, + AgoraRtcAppType.REACT_NATIVE, + AgoraRtcAppType.PYTHON, + AgoraRtcAppType.COCOS_CREATOR, + AgoraRtcAppType.RUST, + AgoraRtcAppType.C_SHARP, + AgoraRtcAppType.CEF, + AgoraRtcAppType.UNI_APP, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraRtcAppType { + int NATIVE = 0; + int COCOS = 1; + int UNITY = 2; + int ELECTRON = 3; + int FLUTTER = 4; + int UNREAL = 5; + int XAMARIN = 6; + int API_CLOUD = 7; + int REACT_NATIVE = 8; + int PYTHON = 9; + int COCOS_CREATOR = 10; + int RUST = 11; + int C_SHARP = 12; + int CEF = 13; + int UNI_APP = 14; + } + + @IntDef({ + AgoraAudioCodecProfileType.LC_AAC, + AgoraAudioCodecProfileType.HE_AAC, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioCodecProfileType { + int LC_AAC = 0; + int HE_AAC = 1; + } + + @IntDef({ + Constants.AUDIO_EQUALIZATION_BAND_31, + Constants.AUDIO_EQUALIZATION_BAND_62, + Constants.AUDIO_EQUALIZATION_BAND_125, + Constants.AUDIO_EQUALIZATION_BAND_250, + Constants.AUDIO_EQUALIZATION_BAND_500, + Constants.AUDIO_EQUALIZATION_BAND_1K, + Constants.AUDIO_EQUALIZATION_BAND_2K, + Constants.AUDIO_EQUALIZATION_BAND_4K, + Constants.AUDIO_EQUALIZATION_BAND_8K, + Constants.AUDIO_EQUALIZATION_BAND_16K, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioEqualizationBandFrequency { + } + + @IntDef({ + Constants.LOCAL_AUDIO_STREAM_ERROR_OK, + Constants.LOCAL_AUDIO_STREAM_ERROR_FAILURE, + Constants.LOCAL_AUDIO_STREAM_ERROR_DEVICE_NO_PERMISSION, + Constants.LOCAL_AUDIO_STREAM_ERROR_DEVICE_BUSY, + Constants.LOCAL_AUDIO_STREAM_ERROR_CAPTURE_FAILURE, + Constants.LOCAL_AUDIO_STREAM_ERROR_ENCODE_FAILURE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioLocalError { + } + + @IntDef({ + Constants.LOCAL_AUDIO_STREAM_STATE_STOPPED, + Constants.LOCAL_AUDIO_STREAM_STATE_CAPTURING, + Constants.LOCAL_AUDIO_STREAM_STATE_ENCODING, + Constants.LOCAL_AUDIO_STREAM_STATE_FAILED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioLocalState { + } + + @IntDef({ + Constants.MEDIA_ENGINE_AUDIO_ERROR_MIXING_OPEN, + Constants.MEDIA_ENGINE_AUDIO_ERROR_MIXING_TOO_FREQUENT, + Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_INTERRUPTED_EOF, + AgoraAudioMixingErrorCode.MEDIA_ENGINE_AUDIO_ERROR_OK, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioMixingErrorCode { + int MEDIA_ENGINE_AUDIO_ERROR_OK = 0; + } + + @IntDef({ + Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_PLAY, + Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_PAUSED, + Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_STOPPED, + Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_ERROR, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioMixingStateCode { + } + + @IntDef({ + Constants.AUDIO_ROUTE_DEFAULT, + Constants.AUDIO_ROUTE_HEADSET, + Constants.AUDIO_ROUTE_EARPIECE, + Constants.AUDIO_ROUTE_HEADSETNOMIC, + Constants.AUDIO_ROUTE_SPEAKERPHONE, + Constants.AUDIO_ROUTE_LOUDSPEAKER, + Constants.AUDIO_ROUTE_HEADSETBLUETOOTH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioOutputRouting { + } + + @IntDef({ + Constants.AUDIO_PROFILE_DEFAULT, + Constants.AUDIO_PROFILE_SPEECH_STANDARD, + Constants.AUDIO_PROFILE_MUSIC_STANDARD, + Constants.AUDIO_PROFILE_MUSIC_STANDARD_STEREO, + Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY, + Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioProfile { + } + + @IntDef({ + Constants.AUDIO_RECORDING_QUALITY_LOW, + Constants.AUDIO_RECORDING_QUALITY_MEDIUM, + Constants.AUDIO_RECORDING_QUALITY_HIGH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioRecordingQuality { + } + + @IntDef({ + Constants.REMOTE_AUDIO_STATE_STOPPED, + Constants.REMOTE_AUDIO_STATE_STARTING, + Constants.REMOTE_AUDIO_STATE_DECODING, + Constants.REMOTE_AUDIO_STATE_FROZEN, + Constants.REMOTE_AUDIO_STATE_FAILED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioRemoteState { + } + + @IntDef({ + Constants.REMOTE_AUDIO_REASON_INTERNAL, + Constants.REMOTE_AUDIO_REASON_NETWORK_CONGESTION, + Constants.REMOTE_AUDIO_REASON_NETWORK_RECOVERY, + Constants.REMOTE_AUDIO_REASON_LOCAL_MUTED, + Constants.REMOTE_AUDIO_REASON_LOCAL_UNMUTED, + Constants.REMOTE_AUDIO_REASON_REMOTE_MUTED, + Constants.REMOTE_AUDIO_REASON_REMOTE_UNMUTED, + Constants.REMOTE_AUDIO_REASON_REMOTE_OFFLINE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioRemoteStateReason { + } + + @IntDef({ + Constants.AUDIO_REVERB_OFF, + Constants.AUDIO_REVERB_POPULAR, + Constants.AUDIO_REVERB_RNB, + Constants.AUDIO_REVERB_ROCK, + Constants.AUDIO_REVERB_HIPHOP, + Constants.AUDIO_REVERB_VOCAL_CONCERT, + Constants.AUDIO_REVERB_KTV, + Constants.AUDIO_REVERB_STUDIO, + Constants.AUDIO_REVERB_FX_KTV, + Constants.AUDIO_REVERB_FX_VOCAL_CONCERT, + Constants.AUDIO_REVERB_FX_UNCLE, + Constants.AUDIO_REVERB_FX_SISTER, + Constants.AUDIO_REVERB_FX_STUDIO, + Constants.AUDIO_REVERB_FX_POPULAR, + Constants.AUDIO_REVERB_FX_RNB, + Constants.AUDIO_REVERB_FX_PHONOGRAPH, + Constants.AUDIO_VIRTUAL_STEREO, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioReverbPreset { + } + + @IntDef({ + Constants.AUDIO_REVERB_DRY_LEVEL, + Constants.AUDIO_REVERB_WET_LEVEL, + Constants.AUDIO_REVERB_ROOM_SIZE, + Constants.AUDIO_REVERB_WET_DELAY, + Constants.AUDIO_REVERB_STRENGTH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioReverbType { + } + + @IntDef({ + AgoraAudioSampleRateType.TYPE_32000, + AgoraAudioSampleRateType.TYPE_44100, + AgoraAudioSampleRateType.TYPE_48000, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioSampleRateType { + int TYPE_32000 = 32000; + int TYPE_44100 = 44100; + int TYPE_48000 = 48000; + } + + @IntDef({ + Constants.AUDIO_SCENARIO_DEFAULT, + Constants.AUDIO_SCENARIO_CHATROOM_ENTERTAINMENT, + Constants.AUDIO_SCENARIO_EDUCATION, + Constants.AUDIO_SCENARIO_GAME_STREAMING, + Constants.AUDIO_SCENARIO_SHOWROOM, + Constants.AUDIO_SCENARIO_CHATROOM_GAMING, + Constants.AUDIO_SCENARIO_IOT, + Constants.AUDIO_SCENARIO_MEETING, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioScenario { + } + + @IntDef({ + Constants.VOICE_CHANGER_OFF, + Constants.VOICE_CHANGER_OLDMAN, + Constants.VOICE_CHANGER_BABYBOY, + Constants.VOICE_CHANGER_BABYGIRL, + Constants.VOICE_CHANGER_ZHUBAJIE, + Constants.VOICE_CHANGER_ETHEREAL, + Constants.VOICE_CHANGER_HULK, + Constants.VOICE_BEAUTY_VIGOROUS, + Constants.VOICE_BEAUTY_DEEP, + Constants.VOICE_BEAUTY_MELLOW, + Constants.VOICE_BEAUTY_FALSETTO, + Constants.VOICE_BEAUTY_FULL, + Constants.VOICE_BEAUTY_CLEAR, + Constants.VOICE_BEAUTY_RESOUNDING, + Constants.VOICE_BEAUTY_RINGING, + Constants.VOICE_BEAUTY_SPACIAL, + Constants.GENERAL_BEAUTY_VOICE_MALE_MAGNETIC, + Constants.GENERAL_BEAUTY_VOICE_FEMALE_FRESH, + Constants.GENERAL_BEAUTY_VOICE_FEMALE_VITALITY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioVoiceChanger { + } + + @IntDef({ + AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_AUTO, + AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE, + AgoraCameraCaptureOutputPreference.CAPTURER_OUTPUT_PREFERENCE_PREVIEW, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraCameraCaptureOutputPreference { + int CAPTURER_OUTPUT_PREFERENCE_AUTO = 0; + int CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE = 1; + int CAPTURER_OUTPUT_PREFERENCE_PREVIEW = 2; + } + + @IntDef({ + AgoraCameraDirection.CAMERA_REAR, + AgoraCameraDirection.CAMERA_FRONT, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraCameraDirection { + int CAMERA_REAR = 0; + int CAMERA_FRONT = 1; + } + + @IntDef({ + Constants.RELAY_OK, + Constants.RELAY_ERROR_SERVER_ERROR_RESPONSE, + Constants.RELAY_ERROR_SERVER_NO_RESPONSE, + Constants.RELAY_ERROR_NO_RESOURCE_AVAILABLE, + Constants.RELAY_ERROR_FAILED_JOIN_SRC, + Constants.RELAY_ERROR_FAILED_JOIN_DEST, + Constants.RELAY_ERROR_FAILED_PACKET_RECEIVED_FROM_SRC, + Constants.RELAY_ERROR_FAILED_PACKET_SENT_TO_DEST, + Constants.RELAY_ERROR_SERVER_CONNECTION_LOST, + Constants.RELAY_ERROR_INTERNAL_ERROR, + Constants.RELAY_ERROR_SRC_TOKEN_EXPIRED, + Constants.RELAY_ERROR_DEST_TOKEN_EXPIRED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraChannelMediaRelayError { + } + + @IntDef({ + Constants.RELAY_EVENT_NETWORK_DISCONNECTED, + Constants.RELAY_EVENT_NETWORK_CONNECTED, + Constants.RELAY_EVENT_PACKET_JOINED_SRC_CHANNEL, + Constants.RELAY_EVENT_PACKET_JOINED_DEST_CHANNEL, + Constants.RELAY_EVENT_PACKET_SENT_TO_DEST_CHANNEL, + Constants.RELAY_EVENT_PACKET_RECEIVED_VIDEO_FROM_SRC, + Constants.RELAY_EVENT_PACKET_RECEIVED_AUDIO_FROM_SRC, + Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL, + Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_REFUSED, + Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_NOT_CHANGE, + Constants.RELAY_EVENT_PACKET_UPDATE_DEST_CHANNEL_IS_NULL, + Constants.RELAY_EVENT_VIDEO_PROFILE_UPDATE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraChannelMediaRelayEvent { + } + + @IntDef({ + Constants.RELAY_STATE_IDLE, + Constants.RELAY_STATE_CONNECTING, + Constants.RELAY_STATE_RUNNING, + Constants.RELAY_STATE_FAILURE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraChannelMediaRelayState { + } + + @IntDef({ + Constants.CHANNEL_PROFILE_COMMUNICATION, + Constants.CHANNEL_PROFILE_LIVE_BROADCASTING, + Constants.CHANNEL_PROFILE_GAME, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraChannelProfile { + } + + @IntDef({ + Constants.CLIENT_ROLE_BROADCASTER, + Constants.CLIENT_ROLE_AUDIENCE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraClientRole { + } + + @IntDef({ + Constants.CONNECTION_CHANGED_CONNECTING, + Constants.CONNECTION_CHANGED_JOIN_SUCCESS, + Constants.CONNECTION_CHANGED_INTERRUPTED, + Constants.CONNECTION_CHANGED_BANNED_BY_SERVER, + Constants.CONNECTION_CHANGED_JOIN_FAILED, + Constants.CONNECTION_CHANGED_LEAVE_CHANNEL, + Constants.CONNECTION_CHANGED_INVALID_APP_ID, + Constants.CONNECTION_CHANGED_INVALID_CHANNEL_NAME, + Constants.CONNECTION_CHANGED_INVALID_TOKEN, + Constants.CONNECTION_CHANGED_TOKEN_EXPIRED, + Constants.CONNECTION_CHANGED_REJECTED_BY_SERVER, + Constants.CONNECTION_CHANGED_SETTING_PROXY_SERVER, + Constants.CONNECTION_CHANGED_RENEW_TOKEN, + Constants.CONNECTION_CHANGED_CLIENT_IP_ADDRESS_CHANGED, + Constants.CONNECTION_CHANGED_KEEP_ALIVE_TIMEOUT, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraConnectionChangedReason { + } + + @IntDef({ + Constants.CONNECTION_STATE_DISCONNECTED, + Constants.CONNECTION_STATE_CONNECTING, + Constants.CONNECTION_STATE_CONNECTED, + Constants.CONNECTION_STATE_RECONNECTING, + Constants.CONNECTION_STATE_FAILED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraConnectionStateType { + } + + @IntDef({ + AgoraDegradationPreference.MAINTAIN_QUALITY, + AgoraDegradationPreference.MAINTAIN_FRAMERATE, + AgoraDegradationPreference.MAINTAIN_BALANCED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraDegradationPreference { + int MAINTAIN_QUALITY = 0; + int MAINTAIN_FRAMERATE = 1; + int MAINTAIN_BALANCED = 2; + } + + @IntDef({ + AgoraEncryptionMode.NONE, + AgoraEncryptionMode.AES128XTS, + AgoraEncryptionMode.AES128ECB, + AgoraEncryptionMode.AES256XTS, + AgoraEncryptionMode.SM4128ECB, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraEncryptionMode { + int NONE = 0; + int AES128XTS = 1; + int AES128ECB = 2; + int AES256XTS = 3; + int SM4128ECB = 4; + } + + @IntDef({ + Constants.ERR_OK, + Constants.ERR_FAILED, + Constants.ERR_INVALID_ARGUMENT, + Constants.ERR_NOT_READY, + Constants.ERR_NOT_SUPPORTED, + Constants.ERR_REFUSED, + Constants.ERR_BUFFER_TOO_SMALL, + Constants.ERR_NOT_INITIALIZED, + Constants.ERR_NO_PERMISSION, + Constants.ERR_TIMEDOUT, + Constants.ERR_CANCELED, + Constants.ERR_TOO_OFTEN, + Constants.ERR_BIND_SOCKET, + Constants.ERR_NET_DOWN, + Constants.ERR_NET_NOBUFS, + Constants.ERR_JOIN_CHANNEL_REJECTED, + Constants.ERR_LEAVE_CHANNEL_REJECTED, + Constants.ERR_ALREADY_IN_USE, + Constants.ERR_INVALID_APP_ID, + Constants.ERR_INVALID_CHANNEL_NAME, + Constants.ERR_NO_SERVER_RESOURCES, + Constants.ERR_TOKEN_EXPIRED, + Constants.ERR_INVALID_TOKEN, + Constants.ERR_CONNECTION_INTERRUPTED, + Constants.ERR_CONNECTION_LOST, + Constants.ERR_NOT_IN_CHANNEL, + Constants.ERR_SIZE_TOO_LARGE, + Constants.ERR_BITRATE_LIMIT, + Constants.ERR_TOO_MANY_DATA_STREAMS, + Constants.ERR_DECRYPTION_FAILED, + Constants.ERR_CLIENT_IS_BANNED_BY_SERVER, + Constants.ERR_WATERMARK_PARAM, + Constants.ERR_WATERMARK_PATH, + Constants.ERR_WATERMARK_PNG, + Constants.ERR_WATERMARKR_INFO, + Constants.ERR_WATERMARK_ARGB, + Constants.ERR_WATERMARK_READ, + Constants.ERR_ENCRYPTED_STREAM_NOT_ALLOWED_PUBLISHED, + Constants.ERR_INVALID_USER_ACCOUNT, + Constants.ERR_PUBLISH_STREAM_CDN_ERROR, + Constants.ERR_PUBLISH_STREAM_NUM_REACH_LIMIT, + Constants.ERR_PUBLISH_STREAM_NOT_AUTHORIZED, + Constants.ERR_PUBLISH_STREAM_INTERNAL_SERVER_ERROR, + Constants.ERR_PUBLISH_STREAM_NOT_FOUND, + Constants.ERR_PUBLISH_STREAM_FORMAT_NOT_SUPPORTED, + Constants.ERR_LOAD_MEDIA_ENGINE, + Constants.ERR_START_CALL, + Constants.ERR_START_CAMERA, + Constants.ERR_START_VIDEO_RENDER, + Constants.ERR_ADM_GENERAL_ERROR, + Constants.ERR_ADM_JAVA_RESOURCE, + Constants.ERR_ADM_SAMPLE_RATE, + Constants.ERR_ADM_INIT_PLAYOUT, + Constants.ERR_ADM_START_PLAYOUT, + Constants.ERR_ADM_STOP_PLAYOUT, + Constants.ERR_ADM_INIT_RECORDING, + Constants.ERR_ADM_START_RECORDING, + Constants.ERR_ADM_STOP_RECORDING, + Constants.ERR_ADM_RUNTIME_PLAYOUT_ERROR, + Constants.ERR_ADM_RUNTIME_RECORDING_ERROR, + Constants.ERR_ADM_RECORD_AUDIO_FAILED, + Constants.ERR_ADM_INIT_LOOPBACK, + Constants.ERR_ADM_START_LOOPBACK, + Constants.ERR_AUDIO_BT_SCO_FAILED, + Constants.ERR_ADM_NO_RECORDING_DEVICE, + Constants.ERR_ADM_NO_PLAYOUT_DEVICE, + Constants.ERR_VDM_CAMERA_NOT_AUTHORIZED, + Constants.ERR_VCM_UNKNOWN_ERROR, + Constants.ERR_VCM_ENCODER_INIT_ERROR, + Constants.ERR_VCM_ENCODER_ENCODE_ERROR, + Constants.ERR_VCM_ENCODER_SET_ERROR, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraErrorCode { + } + + @IntDef({ + Constants.INJECT_STREAM_STATUS_START_SUCCESS, + Constants.INJECT_STREAM_STATUS_START_ALREADY_EXISTS, + Constants.INJECT_STREAM_STATUS_START_UNAUTHORIZED, + Constants.INJECT_STREAM_STATUS_START_TIMEDOUT, + Constants.INJECT_STREAM_STATUS_START_FAILED, + Constants.INJECT_STREAM_STATUS_STOP_SUCCESS, + Constants.INJECT_STREAM_STATUS_STOP_NOT_FOUND, + Constants.INJECT_STREAM_STATUS_STOP_UNAUTHORIZED, + Constants.INJECT_STREAM_STATUS_STOP_TIMEDOUT, + Constants.INJECT_STREAM_STATUS_STOP_FAILED, + Constants.INJECT_STREAM_STATUS_BROKEN, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraInjectStreamStatus { + } + + @IntDef({ + Constants.LASTMILE_PROBE_RESULT_COMPLETE, + Constants.LASTMILE_PROBE_RESULT_INCOMPLETE_NO_BWE, + Constants.LASTMILE_PROBE_RESULT_UNAVAILABLE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraLastmileProbeResultState { + } + + @IntDef({ + BeautyOptions.LIGHTENING_CONTRAST_LOW, + BeautyOptions.LIGHTENING_CONTRAST_NORMAL, + BeautyOptions.LIGHTENING_CONTRAST_HIGH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraLighteningContrastLevel { + } + + @IntDef({ + Constants.LOCAL_VIDEO_STREAM_ERROR_OK, + Constants.LOCAL_VIDEO_STREAM_ERROR_FAILURE, + Constants.LOCAL_VIDEO_STREAM_ERROR_DEVICE_NO_PERMISSION, + Constants.LOCAL_VIDEO_STREAM_ERROR_DEVICE_BUSY, + Constants.LOCAL_VIDEO_STREAM_ERROR_CAPTURE_FAILURE, + Constants.LOCAL_VIDEO_STREAM_ERROR_ENCODE_FAILURE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraLocalVideoStreamError { + } + + @IntDef({ + Constants.LOCAL_VIDEO_STREAM_STATE_STOPPED, + Constants.LOCAL_VIDEO_STREAM_STATE_CAPTURING, + Constants.LOCAL_VIDEO_STREAM_STATE_ENCODING, + Constants.LOCAL_VIDEO_STREAM_STATE_FAILED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraLocalVideoStreamState { + } + + @IntDef({ + Constants.LOG_FILTER_OFF, + Constants.LOG_FILTER_DEBUG, + Constants.LOG_FILTER_INFO, + Constants.LOG_FILTER_WARNING, + Constants.LOG_FILTER_ERROR, + Constants.LOG_FILTER_CRITICAL, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraLogFilter { + } + + @IntDef({ + Constants.QUALITY_UNKNOWN, + Constants.QUALITY_EXCELLENT, + Constants.QUALITY_GOOD, + Constants.QUALITY_POOR, + Constants.QUALITY_BAD, + Constants.QUALITY_VBAD, + Constants.QUALITY_DOWN, + Constants.QUALITY_UNSUPPORTED, + Constants.QUALITY_DETECTING, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraNetworkQuality { + } + + @IntDef({ + Constants.NETWORK_TYPE_UNKNOWN, + Constants.NETWORK_TYPE_DISCONNECTED, + Constants.NETWORK_TYPE_LAN, + Constants.NETWORK_TYPE_WIFI, + Constants.NETWORK_TYPE_MOBILE_2G, + Constants.NETWORK_TYPE_MOBILE_3G, + Constants.NETWORK_TYPE_MOBILE_4G, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraNetworkType { + } + + @IntDef({ + Constants.RTMP_STREAM_PUBLISH_ERROR_OK, + Constants.RTMP_STREAM_PUBLISH_ERROR_INVALID_ARGUMENT, + Constants.RTMP_STREAM_PUBLISH_ERROR_ENCRYPTED_STREAM_NOT_ALLOWED, + Constants.RTMP_STREAM_PUBLISH_ERROR_CONNECTION_TIMEOUT, + Constants.RTMP_STREAM_PUBLISH_ERROR_INTERNAL_SERVER_ERROR, + Constants.RTMP_STREAM_PUBLISH_ERROR_RTMP_SERVER_ERROR, + Constants.RTMP_STREAM_PUBLISH_ERROR_TOO_OFTEN, + Constants.RTMP_STREAM_PUBLISH_ERROR_REACH_LIMIT, + Constants.RTMP_STREAM_PUBLISH_ERROR_NOT_AUTHORIZED, + Constants.RTMP_STREAM_PUBLISH_ERROR_STREAM_NOT_FOUND, + Constants.RTMP_STREAM_PUBLISH_ERROR_FORMAT_NOT_SUPPORTED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraRtmpStreamingErrorCode { + } + + @IntDef({ + Constants.RTMP_STREAM_PUBLISH_STATE_IDLE, + Constants.RTMP_STREAM_PUBLISH_STATE_CONNECTING, + Constants.RTMP_STREAM_PUBLISH_STATE_RUNNING, + Constants.RTMP_STREAM_PUBLISH_STATE_RECOVERING, + Constants.RTMP_STREAM_PUBLISH_STATE_FAILURE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraRtmpStreamingState { + } + + @IntDef({ + Constants.STREAM_FALLBACK_OPTION_DISABLED, + Constants.STREAM_FALLBACK_OPTION_VIDEO_STREAM_LOW, + Constants.STREAM_FALLBACK_OPTION_AUDIO_ONLY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraStreamFallbackOptions { + } + + @IntDef({ + Constants.USER_OFFLINE_QUIT, + Constants.USER_OFFLINE_DROPPED, + Constants.USER_OFFLINE_BECOME_AUDIENCE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraUserOfflineReason { + } + + @IntDef({ + Constants.USER_PRIORITY_HIGH, + Constants.USER_PRIORITY_NORMAL, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraUserPriority { + } + + @IntDef({ + AgoraVideoCodecProfileType.BASELINE, + AgoraVideoCodecProfileType.MAIN, + AgoraVideoCodecProfileType.HIGH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoCodecProfileType { + int BASELINE = 66; + int MAIN = 77; + int HIGH = 100; + } + + @IntDef({ + AgoraVideoFrameRate.FRAME_RATE_FPS_1, + AgoraVideoFrameRate.FRAME_RATE_FPS_7, + AgoraVideoFrameRate.FRAME_RATE_FPS_10, + AgoraVideoFrameRate.FRAME_RATE_FPS_15, + AgoraVideoFrameRate.FRAME_RATE_FPS_24, + AgoraVideoFrameRate.FRAME_RATE_FPS_30, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoFrameRate { + int FRAME_RATE_FPS_1 = 1; + int FRAME_RATE_FPS_7 = 7; + int FRAME_RATE_FPS_10 = 10; + int FRAME_RATE_FPS_15 = 15; + int FRAME_RATE_FPS_24 = 24; + int FRAME_RATE_FPS_30 = 30; + } + + @IntDef({ + Constants.VIDEO_MIRROR_MODE_AUTO, + Constants.VIDEO_MIRROR_MODE_ENABLED, + Constants.VIDEO_MIRROR_MODE_DISABLED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoMirrorMode { + } + + @IntDef({ + AgoraVideoOutputOrientationMode.ORIENTATION_MODE_ADAPTIVE, + AgoraVideoOutputOrientationMode.ORIENTATION_MODE_FIXED_LANDSCAPE, + AgoraVideoOutputOrientationMode.ORIENTATION_MODE_FIXED_PORTRAIT, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoOutputOrientationMode { + int ORIENTATION_MODE_ADAPTIVE = 0; + int ORIENTATION_MODE_FIXED_LANDSCAPE = 1; + int ORIENTATION_MODE_FIXED_PORTRAIT = 2; + } + + @IntDef({ + Constants.ADAPT_NONE, + Constants.ADAPT_UP_BANDWIDTH, + Constants.ADAPT_DOWN_BANDWIDTH, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoQualityAdaptIndication { + } + + @IntDef({ + Constants.REMOTE_VIDEO_STATE_STOPPED, + Constants.REMOTE_VIDEO_STATE_STARTING, + Constants.REMOTE_VIDEO_STATE_DECODING, + Constants.REMOTE_VIDEO_STATE_FROZEN, + Constants.REMOTE_VIDEO_STATE_FAILED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoRemoteState { + } + + @IntDef({ + Constants.REMOTE_VIDEO_STATE_REASON_INTERNAL, + Constants.REMOTE_VIDEO_STATE_REASON_NETWORK_CONGESTION, + Constants.REMOTE_VIDEO_STATE_REASON_NETWORK_RECOVERY, + Constants.REMOTE_VIDEO_STATE_REASON_LOCAL_MUTED, + Constants.REMOTE_VIDEO_STATE_REASON_LOCAL_UNMUTED, + Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_MUTED, + Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_UNMUTED, + Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_OFFLINE, + Constants.REMOTE_VIDEO_STATE_REASON_AUDIO_FALLBACK, + Constants.REMOTE_VIDEO_STATE_REASON_AUDIO_FALLBACK_RECOVERY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoRemoteStateReason { + } + + @IntDef({ + VideoCanvas.RENDER_MODE_HIDDEN, + VideoCanvas.RENDER_MODE_FIT, + VideoCanvas.RENDER_MODE_ADAPTIVE, + VideoCanvas.RENDER_MODE_FILL, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoRenderMode { + } + + @IntDef({ + Constants.VIDEO_STREAM_HIGH, + Constants.VIDEO_STREAM_LOW, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVideoStreamType { + } + + @IntDef({ + Constants.WARN_INVALID_VIEW, + Constants.WARN_INIT_VIDEO, + Constants.WARN_PENDING, + Constants.WARN_NO_AVAILABLE_CHANNEL, + Constants.WARN_LOOKUP_CHANNEL_TIMEOUT, + Constants.WARN_LOOKUP_CHANNEL_REJECTED, + Constants.WARN_OPEN_CHANNEL_TIMEOUT, + Constants.WARN_OPEN_CHANNEL_REJECTED, + Constants.WARN_SWITCH_LIVE_VIDEO_TIMEOUT, + Constants.WARN_SET_CLIENT_ROLE_TIMEOUT, + Constants.WARN_SET_CLIENT_ROLE_NOT_AUTHORIZED, + Constants.WARN_OPEN_CHANNEL_INVALID_TICKET, + Constants.WARN_OPEN_CHANNEL_TRY_NEXT_VOS, + Constants.WARN_AUDIO_MIXING_OPEN_ERROR, + Constants.WARN_ADM_RUNTIME_PLAYOUT_WARNING, + Constants.WARN_ADM_RUNTIME_RECORDING_WARNING, + Constants.WARN_ADM_RECORD_AUDIO_SILENCE, + Constants.WARN_ADM_PLAYOUT_ABNORMAL_FREQUENCY, + Constants.WARN_ADM_RECORD_ABNORMAL_FREQUENCY, + Constants.WARN_ADM_CALL_INTERRUPTION, + Constants.WARN_ADM_RECORD_AUDIO_LOWLEVEL, + Constants.WARN_ADM_PLAYOUT_AUDIO_LOWLEVEL, + Constants.WARN_ADM_RECORD_IS_OCCUPIED, + Constants.WARN_APM_HOWLING, + Constants.WARN_ADM_GLITCH_STATE, + // TODO(3.3.0) WARN_APM_RESIDUAL_ECHO + Constants.WARN_ADM_IMPROPER_SETTINGS, + Constants.WARN_SUPER_RESOLUTION_STREAM_OVER_LIMITATION, + Constants.WARN_SUPER_RESOLUTION_USER_COUNT_OVER_LIMITATION, + Constants.WARN_SUPER_RESOLUTION_DEVICE_NOT_SUPPORTED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraWarningCode { + } + + @IntDef({ + RtcEngineConfig.AreaCode.AREA_CODE_CN, + RtcEngineConfig.AreaCode.AREA_CODE_NA, + RtcEngineConfig.AreaCode.AREA_CODE_EU, + RtcEngineConfig.AreaCode.AREA_CODE_AS, + RtcEngineConfig.AreaCode.AREA_CODE_JP, + RtcEngineConfig.AreaCode.AREA_CODE_IN, + RtcEngineConfig.AreaCode.AREA_CODE_GLOB, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAreaCode { + } + + @IntDef({ + Constants.SUB_STATE_IDLE, + Constants.SUB_STATE_NO_SUBSCRIBED, + Constants.SUB_STATE_SUBSCRIBING, + Constants.SUB_STATE_SUBSCRIBED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraStreamSubscribeState { + } + + @IntDef({ + Constants.PUB_STATE_IDLE, + Constants.PUB_STATE_NO_PUBLISHED, + Constants.PUB_STATE_PUBLISHING, + Constants.PUB_STATE_PUBLISHED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraStreamPublishState { + } + + @IntDef({ + Constants.RTMP_STREAMING_EVENT_FAILED_LOAD_IMAGE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraRtmpStreamingEvent { + } + + @IntDef({ + Constants.AUDIO_EFFECT_OFF, + Constants.ROOM_ACOUSTICS_KTV, + Constants.ROOM_ACOUSTICS_VOCAL_CONCERT, + Constants.ROOM_ACOUSTICS_STUDIO, + Constants.ROOM_ACOUSTICS_PHONOGRAPH, + Constants.ROOM_ACOUSTICS_VIRTUAL_STEREO, + Constants.ROOM_ACOUSTICS_SPACIAL, + Constants.ROOM_ACOUSTICS_ETHEREAL, + Constants.ROOM_ACOUSTICS_3D_VOICE, + Constants.VOICE_CHANGER_EFFECT_UNCLE, + Constants.VOICE_CHANGER_EFFECT_OLDMAN, + Constants.VOICE_CHANGER_EFFECT_BOY, + Constants.VOICE_CHANGER_EFFECT_SISTER, + Constants.VOICE_CHANGER_EFFECT_GIRL, + Constants.VOICE_CHANGER_EFFECT_PIGKING, + Constants.VOICE_CHANGER_EFFECT_HULK, + Constants.STYLE_TRANSFORMATION_RNB, + Constants.STYLE_TRANSFORMATION_POPULAR, + Constants.PITCH_CORRECTION, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudioEffectPreset { + } + + @IntDef({ + Constants.VOICE_BEAUTIFIER_OFF, + Constants.CHAT_BEAUTIFIER_MAGNETIC, + Constants.CHAT_BEAUTIFIER_FRESH, + Constants.CHAT_BEAUTIFIER_VITALITY, + Constants.TIMBRE_TRANSFORMATION_VIGOROUS, + Constants.TIMBRE_TRANSFORMATION_DEEP, + Constants.TIMBRE_TRANSFORMATION_MELLOW, + Constants.TIMBRE_TRANSFORMATION_FALSETTO, + Constants.TIMBRE_TRANSFORMATION_FULL, + Constants.TIMBRE_TRANSFORMATION_CLEAR, + Constants.TIMBRE_TRANSFORMATION_RESOUNDING, + Constants.TIMBRE_TRANSFORMATION_RINGING, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraVoiceBeautifierPreset { + } } diff --git a/BeanCovertor.kt b/BeanCovertor.kt index bd346c5e1..d7a94fb9a 100644 --- a/BeanCovertor.kt +++ b/BeanCovertor.kt @@ -10,170 +10,170 @@ import io.agora.rtc.models.ChannelMediaOptions import io.agora.rtc.video.* fun mapToVideoDimensions(map: Map<*, *>): VideoEncoderConfiguration.VideoDimensions { - return VideoEncoderConfiguration.VideoDimensions().apply { - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - } + return VideoEncoderConfiguration.VideoDimensions().apply { + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + } } fun mapToVideoEncoderConfiguration(map: Map<*, *>): VideoEncoderConfiguration { - return VideoEncoderConfiguration().apply { - (map["dimensions"] as? Map<*, *>)?.let { dimensions = mapToVideoDimensions(it) } - (map["frameRate"] as? Number)?.let { frameRate = it.toInt() } - (map["minFrameRate"] as? Number)?.let { minFrameRate = it.toInt() } - (map["bitrate"] as? Number)?.let { bitrate = it.toInt() } - (map["minBitrate"] as? Number)?.let { minBitrate = it.toInt() } - (map["orientationMode"] as? Number)?.let { orientationMode = intToOrientationMode(it.toInt()) } - (map["degradationPrefer"] as? Number)?.let { degradationPrefer = intToDegradationPreference(it.toInt()) } - (map["mirrorMode"] as? Number)?.let { mirrorMode = it.toInt() } - } + return VideoEncoderConfiguration().apply { + (map["dimensions"] as? Map<*, *>)?.let { dimensions = mapToVideoDimensions(it) } + (map["frameRate"] as? Number)?.let { frameRate = it.toInt() } + (map["minFrameRate"] as? Number)?.let { minFrameRate = it.toInt() } + (map["bitrate"] as? Number)?.let { bitrate = it.toInt() } + (map["minBitrate"] as? Number)?.let { minBitrate = it.toInt() } + (map["orientationMode"] as? Number)?.let { orientationMode = intToOrientationMode(it.toInt()) } + (map["degradationPrefer"] as? Number)?.let { degradationPrefer = intToDegradationPreference(it.toInt()) } + (map["mirrorMode"] as? Number)?.let { mirrorMode = it.toInt() } + } } fun mapToBeautyOptions(map: Map<*, *>): BeautyOptions { - return BeautyOptions().apply { - (map["lighteningContrastLevel"] as? Number)?.let { lighteningContrastLevel = it.toInt() } - (map["lighteningLevel"] as? Number)?.let { lighteningLevel = it.toFloat() } - (map["smoothnessLevel"] as? Number)?.let { smoothnessLevel = it.toFloat() } - (map["rednessLevel"] as? Number)?.let { rednessLevel = it.toFloat() } - } + return BeautyOptions().apply { + (map["lighteningContrastLevel"] as? Number)?.let { lighteningContrastLevel = it.toInt() } + (map["lighteningLevel"] as? Number)?.let { lighteningLevel = it.toFloat() } + (map["smoothnessLevel"] as? Number)?.let { smoothnessLevel = it.toFloat() } + (map["rednessLevel"] as? Number)?.let { rednessLevel = it.toFloat() } + } } fun mapToAgoraImage(map: Map<*, *>): AgoraImage { - return AgoraImage().apply { - (map["url"] as? String)?.let { url = it } - (map["x"] as? Number)?.let { x = it.toInt() } - (map["y"] as? Number)?.let { y = it.toInt() } - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - } + return AgoraImage().apply { + (map["url"] as? String)?.let { url = it } + (map["x"] as? Number)?.let { x = it.toInt() } + (map["y"] as? Number)?.let { y = it.toInt() } + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + } } fun mapToTranscodingUser(map: Map<*, *>): TranscodingUser { - return TranscodingUser().apply { - (map["uid"] as? Number)?.let { uid = it.toInt() } - (map["x"] as? Number)?.let { x = it.toInt() } - (map["y"] as? Number)?.let { y = it.toInt() } - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - (map["zOrder"] as? Number)?.let { zOrder = it.toInt() } - (map["alpha"] as? Number)?.let { alpha = it.toFloat() } - (map["audioChannel"] as? Number)?.let { audioChannel = it.toInt() } - } + return TranscodingUser().apply { + (map["uid"] as? Number)?.let { uid = it.toInt() } + (map["x"] as? Number)?.let { x = it.toInt() } + (map["y"] as? Number)?.let { y = it.toInt() } + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + (map["zOrder"] as? Number)?.let { zOrder = it.toInt() } + (map["alpha"] as? Number)?.let { alpha = it.toFloat() } + (map["audioChannel"] as? Number)?.let { audioChannel = it.toInt() } + } } fun mapToColor(map: Map<*, *>): Int { - return Color.rgb( - (map["red"] as Number).toInt(), - (map["green"] as Number).toInt(), - (map["blue"] as Number).toInt() - ) + return Color.rgb( + (map["red"] as Number).toInt(), + (map["green"] as Number).toInt(), + (map["blue"] as Number).toInt() + ) } fun mapToLiveTranscoding(map: Map<*, *>): LiveTranscoding { - return LiveTranscoding().apply { - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - (map["videoBitrate"] as? Number)?.let { videoBitrate = it.toInt() } - (map["videoFramerate"] as? Number)?.let { videoFramerate = it.toInt() } - (map["lowLatency"] as? Boolean)?.let { lowLatency = it } - (map["videoGop"] as? Number)?.let { videoGop = it.toInt() } - (map["watermark"] as? Map<*, *>)?.let { watermark = mapToAgoraImage(it) } - (map["backgroundImage"] as? Map<*, *>)?.let { backgroundImage = mapToAgoraImage(it) } - (map["audioSampleRate"] as? Number)?.let { audioSampleRate = intToLiveTranscodingAudioSampleRate(it.toInt()) } - (map["audioBitrate"] as? Number)?.let { audioBitrate = it.toInt() } - (map["audioChannels"] as? Number)?.let { audioChannels = it.toInt() } - (map["audioCodecProfile"] as? Number)?.let { audioCodecProfile = intToAudioCodecProfile(it.toInt()) } - (map["videoCodecProfile"] as? Number)?.let { videoCodecProfile = intToVideoCodecProfile(it.toInt()) } - (map["backgroundColor"] as? Map<*, *>)?.let { backgroundColor = mapToColor(it) } - (map["userConfigExtraInfo"] as? String)?.let { userConfigExtraInfo = it } - (map["transcodingUsers"] as? List<*>)?.let { list -> - list.forEach { item -> - (item as? Map<*, *>)?.let { - addUser(mapToTranscodingUser(it)) - } - } + return LiveTranscoding().apply { + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + (map["videoBitrate"] as? Number)?.let { videoBitrate = it.toInt() } + (map["videoFramerate"] as? Number)?.let { videoFramerate = it.toInt() } + (map["lowLatency"] as? Boolean)?.let { lowLatency = it } + (map["videoGop"] as? Number)?.let { videoGop = it.toInt() } + (map["watermark"] as? Map<*, *>)?.let { watermark = mapToAgoraImage(it) } + (map["backgroundImage"] as? Map<*, *>)?.let { backgroundImage = mapToAgoraImage(it) } + (map["audioSampleRate"] as? Number)?.let { audioSampleRate = intToLiveTranscodingAudioSampleRate(it.toInt()) } + (map["audioBitrate"] as? Number)?.let { audioBitrate = it.toInt() } + (map["audioChannels"] as? Number)?.let { audioChannels = it.toInt() } + (map["audioCodecProfile"] as? Number)?.let { audioCodecProfile = intToAudioCodecProfile(it.toInt()) } + (map["videoCodecProfile"] as? Number)?.let { videoCodecProfile = intToVideoCodecProfile(it.toInt()) } + (map["backgroundColor"] as? Map<*, *>)?.let { backgroundColor = mapToColor(it) } + (map["userConfigExtraInfo"] as? String)?.let { userConfigExtraInfo = it } + (map["transcodingUsers"] as? List<*>)?.let { list -> + list.forEach { item -> + (item as? Map<*, *>)?.let { + addUser(mapToTranscodingUser(it)) } + } } + } } fun mapToChannelMediaInfo(map: Map<*, *>): ChannelMediaInfo { - return ChannelMediaInfo( - map["channelName"] as? String, - map["token"] as? String, - (map["uid"] as Number).toInt() - ) + return ChannelMediaInfo( + map["channelName"] as? String, + map["token"] as? String, + (map["uid"] as Number).toInt() + ) } fun mapToChannelMediaRelayConfiguration(map: Map<*, *>): ChannelMediaRelayConfiguration { - return ChannelMediaRelayConfiguration().apply { - (map["srcInfo"] as? Map<*, *>)?.let { setSrcChannelInfo(mapToChannelMediaInfo(it)) } - (map["destInfos"] as? List<*>)?.let { list -> - list.forEach { item -> - (item as? Map<*, *>)?.let { - val info = mapToChannelMediaInfo(it) - setDestChannelInfo(info.channelName, info) - } - } + return ChannelMediaRelayConfiguration().apply { + (map["srcInfo"] as? Map<*, *>)?.let { setSrcChannelInfo(mapToChannelMediaInfo(it)) } + (map["destInfos"] as? List<*>)?.let { list -> + list.forEach { item -> + (item as? Map<*, *>)?.let { + val info = mapToChannelMediaInfo(it) + setDestChannelInfo(info.channelName, info) } + } } + } } fun mapToLastmileProbeConfig(map: Map<*, *>): LastmileProbeConfig { - return LastmileProbeConfig().apply { - (map["probeUplink"] as? Boolean)?.let { probeUplink = it } - (map["probeDownlink"] as? Boolean)?.let { probeDownlink = it } - (map["expectedUplinkBitrate"] as? Number)?.let { expectedUplinkBitrate = it.toInt() } - (map["expectedDownlinkBitrate"] as? Number)?.let { expectedUplinkBitrate = it.toInt() } - } + return LastmileProbeConfig().apply { + (map["probeUplink"] as? Boolean)?.let { probeUplink = it } + (map["probeDownlink"] as? Boolean)?.let { probeDownlink = it } + (map["expectedUplinkBitrate"] as? Number)?.let { expectedUplinkBitrate = it.toInt() } + (map["expectedDownlinkBitrate"] as? Number)?.let { expectedUplinkBitrate = it.toInt() } + } } fun mapToRectangle(map: Map<*, *>): WatermarkOptions.Rectangle { - return WatermarkOptions.Rectangle().apply { - (map["x"] as? Number)?.let { x = it.toInt() } - (map["y"] as? Number)?.let { y = it.toInt() } - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - } + return WatermarkOptions.Rectangle().apply { + (map["x"] as? Number)?.let { x = it.toInt() } + (map["y"] as? Number)?.let { y = it.toInt() } + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + } } fun mapToWatermarkOptions(map: Map<*, *>): WatermarkOptions { - return WatermarkOptions().apply { - (map["visibleInPreview"] as? Boolean)?.let { visibleInPreview = it } - (map["positionInLandscapeMode"] as? Map<*, *>)?.let { positionInLandscapeMode = mapToRectangle(it) } - (map["positionInPortraitMode"] as? Map<*, *>)?.let { positionInPortraitMode = mapToRectangle(it) } - } + return WatermarkOptions().apply { + (map["visibleInPreview"] as? Boolean)?.let { visibleInPreview = it } + (map["positionInLandscapeMode"] as? Map<*, *>)?.let { positionInLandscapeMode = mapToRectangle(it) } + (map["positionInPortraitMode"] as? Map<*, *>)?.let { positionInPortraitMode = mapToRectangle(it) } + } } fun mapToLiveInjectStreamConfig(map: Map<*, *>): LiveInjectStreamConfig { - return LiveInjectStreamConfig().apply { - (map["width"] as? Number)?.let { width = it.toInt() } - (map["height"] as? Number)?.let { height = it.toInt() } - (map["videoGop"] as? Number)?.let { videoGop = it.toInt() } - (map["videoFramerate"] as? Number)?.let { videoFramerate = it.toInt() } - (map["videoBitrate"] as? Number)?.let { videoBitrate = it.toInt() } - (map["audioSampleRate"] as? Number)?.let { audioSampleRate = intToLiveInjectStreamConfigAudioSampleRate(it.toInt()) } - (map["audioBitrate"] as? Number)?.let { audioBitrate = it.toInt() } - (map["audioChannels"] as? Number)?.let { audioChannels = it.toInt() } - } + return LiveInjectStreamConfig().apply { + (map["width"] as? Number)?.let { width = it.toInt() } + (map["height"] as? Number)?.let { height = it.toInt() } + (map["videoGop"] as? Number)?.let { videoGop = it.toInt() } + (map["videoFramerate"] as? Number)?.let { videoFramerate = it.toInt() } + (map["videoBitrate"] as? Number)?.let { videoBitrate = it.toInt() } + (map["audioSampleRate"] as? Number)?.let { audioSampleRate = intToLiveInjectStreamConfigAudioSampleRate(it.toInt()) } + (map["audioBitrate"] as? Number)?.let { audioBitrate = it.toInt() } + (map["audioChannels"] as? Number)?.let { audioChannels = it.toInt() } + } } fun mapToCameraCapturerConfiguration(map: Map<*, *>): CameraCapturerConfiguration { - return CameraCapturerConfiguration( - intToCapturerOutputPreference((map["preference"] as Number).toInt()), - intToCameraDirection((map["cameraDirection"] as Number).toInt()) - ) + return CameraCapturerConfiguration( + intToCapturerOutputPreference((map["preference"] as Number).toInt()), + intToCameraDirection((map["cameraDirection"] as Number).toInt()) + ) } fun mapToChannelMediaOptions(map: Map<*, *>): ChannelMediaOptions { - return ChannelMediaOptions().apply { - (map["autoSubscribeAudio"] as? Boolean)?.let { autoSubscribeAudio = it } - (map["autoSubscribeVideo"] as? Boolean)?.let { autoSubscribeVideo = it } - } + return ChannelMediaOptions().apply { + (map["autoSubscribeAudio"] as? Boolean)?.let { autoSubscribeAudio = it } + (map["autoSubscribeVideo"] as? Boolean)?.let { autoSubscribeVideo = it } + } } fun mapToEncryptionConfig(map: Map<*, *>): EncryptionConfig { - return EncryptionConfig().apply { - (map["encryptionMode"] as? Number)?.let { encryptionMode = intToEncryptionMode(it.toInt()) } - (map["encryptionKey"] as? String)?.let { encryptionKey = it } - } + return EncryptionConfig().apply { + (map["encryptionMode"] as? Number)?.let { encryptionMode = intToEncryptionMode(it.toInt()) } + (map["encryptionKey"] as? String)?.let { encryptionKey = it } + } } diff --git a/Callback.kt b/Callback.kt index 3394d8303..d2dd152c1 100644 --- a/Callback.kt +++ b/Callback.kt @@ -5,37 +5,37 @@ import io.agora.rtc.RtcEngine import kotlin.math.abs abstract class Callback { - fun code(code: Int?, runnable: ((Int) -> Any?)? = null) { - if (code == null || code < 0) { - val newCode = abs(code ?: Constants.ERR_NOT_INITIALIZED) - failure(newCode.toString(), RtcEngine.getErrorDescription(newCode)) - return - } + fun code(code: Int?, runnable: ((Int) -> Any?)? = null) { + if (code == null || code < 0) { + val newCode = abs(code ?: Constants.ERR_NOT_INITIALIZED) + failure(newCode.toString(), RtcEngine.getErrorDescription(newCode)) + return + } - val res = if (runnable != null) runnable(code) else Unit - if (res is Unit) { - success(null) - } else { - success(res) - } + val res = if (runnable != null) runnable(code) else Unit + if (res is Unit) { + success(null) + } else { + success(res) } + } - fun resolve(source: T?, runnable: (T) -> Any?) { - if (source == null) { - val code = Constants.ERR_NOT_INITIALIZED - failure(code.toString(), RtcEngine.getErrorDescription(code)) - return - } + fun resolve(source: T?, runnable: (T) -> Any?) { + if (source == null) { + val code = Constants.ERR_NOT_INITIALIZED + failure(code.toString(), RtcEngine.getErrorDescription(code)) + return + } - val res = runnable(source) - if (res is Unit) { - success(null) - } else { - success(res) - } + val res = runnable(source) + if (res is Unit) { + success(null) + } else { + success(res) } + } - abstract fun success(data: Any?) + abstract fun success(data: Any?) - abstract fun failure(code: String, message: String) + abstract fun failure(code: String, message: String) } diff --git a/EnumCovertor.kt b/EnumCovertor.kt index a6306629c..ea423ce69 100644 --- a/EnumCovertor.kt +++ b/EnumCovertor.kt @@ -7,91 +7,91 @@ import io.agora.rtc.video.CameraCapturerConfiguration import io.agora.rtc.video.VideoEncoderConfiguration fun intToFrameRate(@Annotations.AgoraVideoFrameRate intValue: Int): VideoEncoderConfiguration.FRAME_RATE { - for (value in VideoEncoderConfiguration.FRAME_RATE.values()) { - if (value.value == intValue) { - return value - } + for (value in VideoEncoderConfiguration.FRAME_RATE.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("VideoEncoderConfiguration.FRAME_RATE not contains $intValue") + } + throw RuntimeException("VideoEncoderConfiguration.FRAME_RATE not contains $intValue") } fun intToOrientationMode(@Annotations.AgoraVideoOutputOrientationMode intValue: Int): VideoEncoderConfiguration.ORIENTATION_MODE { - for (value in VideoEncoderConfiguration.ORIENTATION_MODE.values()) { - if (value.value == intValue) { - return value - } + for (value in VideoEncoderConfiguration.ORIENTATION_MODE.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("VideoEncoderConfiguration.ORIENTATION_MODE not contains $intValue") + } + throw RuntimeException("VideoEncoderConfiguration.ORIENTATION_MODE not contains $intValue") } fun intToDegradationPreference(@Annotations.AgoraDegradationPreference intValue: Int): VideoEncoderConfiguration.DEGRADATION_PREFERENCE { - for (value in VideoEncoderConfiguration.DEGRADATION_PREFERENCE.values()) { - if (value.value == intValue) { - return value - } + for (value in VideoEncoderConfiguration.DEGRADATION_PREFERENCE.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("VideoEncoderConfiguration.DEGRADATION_PREFERENCE not contains $intValue") + } + throw RuntimeException("VideoEncoderConfiguration.DEGRADATION_PREFERENCE not contains $intValue") } fun intToLiveTranscodingAudioSampleRate(@Annotations.AgoraAudioSampleRateType intValue: Int): LiveTranscoding.AudioSampleRateType { - for (value in LiveTranscoding.AudioSampleRateType.values()) { - if (LiveTranscoding.AudioSampleRateType.getValue(value) == intValue) { - return value - } + for (value in LiveTranscoding.AudioSampleRateType.values()) { + if (LiveTranscoding.AudioSampleRateType.getValue(value) == intValue) { + return value } - throw RuntimeException("LiveTranscoding.AudioSampleRateType not contains $intValue") + } + throw RuntimeException("LiveTranscoding.AudioSampleRateType not contains $intValue") } fun intToLiveInjectStreamConfigAudioSampleRate(@Annotations.AgoraAudioSampleRateType intValue: Int): LiveInjectStreamConfig.AudioSampleRateType { - for (value in LiveInjectStreamConfig.AudioSampleRateType.values()) { - if (LiveInjectStreamConfig.AudioSampleRateType.getValue(value) == intValue) { - return value - } + for (value in LiveInjectStreamConfig.AudioSampleRateType.values()) { + if (LiveInjectStreamConfig.AudioSampleRateType.getValue(value) == intValue) { + return value } - throw RuntimeException("LiveInjectStreamConfig.AudioSampleRateType not contains $intValue") + } + throw RuntimeException("LiveInjectStreamConfig.AudioSampleRateType not contains $intValue") } fun intToAudioCodecProfile(@Annotations.AgoraAudioCodecProfileType intValue: Int): LiveTranscoding.AudioCodecProfileType { - for (value in LiveTranscoding.AudioCodecProfileType.values()) { - if (LiveTranscoding.AudioCodecProfileType.getValue(value) == intValue) { - return value - } + for (value in LiveTranscoding.AudioCodecProfileType.values()) { + if (LiveTranscoding.AudioCodecProfileType.getValue(value) == intValue) { + return value } - throw RuntimeException("LiveTranscoding.AudioCodecProfileType not contains $intValue") + } + throw RuntimeException("LiveTranscoding.AudioCodecProfileType not contains $intValue") } fun intToVideoCodecProfile(@Annotations.AgoraVideoCodecProfileType intValue: Int): LiveTranscoding.VideoCodecProfileType { - for (value in LiveTranscoding.VideoCodecProfileType.values()) { - if (LiveTranscoding.VideoCodecProfileType.getValue(value) == intValue) { - return value - } + for (value in LiveTranscoding.VideoCodecProfileType.values()) { + if (LiveTranscoding.VideoCodecProfileType.getValue(value) == intValue) { + return value } - throw RuntimeException("LiveTranscoding.VideoCodecProfileType not contains $intValue") + } + throw RuntimeException("LiveTranscoding.VideoCodecProfileType not contains $intValue") } fun intToCapturerOutputPreference(@Annotations.AgoraCameraCaptureOutputPreference intValue: Int): CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE { - for (value in CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE.values()) { - if (value.value == intValue) { - return value - } + for (value in CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE not contains $intValue") + } + throw RuntimeException("CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE not contains $intValue") } fun intToCameraDirection(@Annotations.AgoraCameraDirection intValue: Int): CameraCapturerConfiguration.CAMERA_DIRECTION { - for (value in CameraCapturerConfiguration.CAMERA_DIRECTION.values()) { - if (value.value == intValue) { - return value - } + for (value in CameraCapturerConfiguration.CAMERA_DIRECTION.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("CameraCapturerConfiguration.CAMERA_DIRECTION not contains $intValue") + } + throw RuntimeException("CameraCapturerConfiguration.CAMERA_DIRECTION not contains $intValue") } fun intToEncryptionMode(@Annotations.AgoraEncryptionMode intValue: Int): EncryptionConfig.EncryptionMode { - for (value in EncryptionConfig.EncryptionMode.values()) { - if (value.value == intValue) { - return value - } + for (value in EncryptionConfig.EncryptionMode.values()) { + if (value.value == intValue) { + return value } - throw RuntimeException("EncryptionConfig.EncryptionMode not contains $intValue") + } + throw RuntimeException("EncryptionConfig.EncryptionMode not contains $intValue") } diff --git a/Extensions.kt b/Extensions.kt index b745ddb7c..13d594918 100644 --- a/Extensions.kt +++ b/Extensions.kt @@ -5,152 +5,152 @@ import io.agora.rtc.IRtcEngineEventHandler.* import io.agora.rtc.models.UserInfo fun UserInfo.toMap(): Map { - return hashMapOf( - "uid" to uid, - "userAccount" to userAccount - ) + return hashMapOf( + "uid" to uid, + "userAccount" to userAccount + ) } fun LocalAudioStats.toMap(): Map { - return hashMapOf( - "numChannels" to numChannels, - "sentSampleRate" to sentSampleRate, - "sentBitrate" to sentBitrate, - "txPacketLossRate" to txPacketLossRate - ) + return hashMapOf( + "numChannels" to numChannels, + "sentSampleRate" to sentSampleRate, + "sentBitrate" to sentBitrate, + "txPacketLossRate" to txPacketLossRate + ) } fun RtcStats.toMap(): Map { - return hashMapOf( - "totalDuration" to totalDuration, - "txBytes" to txBytes, - "rxBytes" to rxBytes, - "txAudioBytes" to txAudioBytes, - "txVideoBytes" to txVideoBytes, - "rxAudioBytes" to rxAudioBytes, - "rxVideoBytes" to rxVideoBytes, - "txKBitRate" to txKBitRate, - "rxKBitRate" to rxKBitRate, - "txAudioKBitRate" to txAudioKBitRate, - "rxAudioKBitRate" to rxAudioKBitRate, - "txVideoKBitRate" to txVideoKBitRate, - "rxVideoKBitRate" to rxVideoKBitRate, - "users" to users, - "lastmileDelay" to lastmileDelay, - "txPacketLossRate" to txPacketLossRate, - "rxPacketLossRate" to rxPacketLossRate, - "cpuTotalUsage" to cpuTotalUsage, - "cpuAppUsage" to cpuAppUsage, - "gatewayRtt" to gatewayRtt, - "memoryAppUsageRatio" to memoryAppUsageRatio, - "memoryTotalUsageRatio" to memoryTotalUsageRatio, - "memoryAppUsageInKbytes" to memoryAppUsageInKbytes - ) + return hashMapOf( + "totalDuration" to totalDuration, + "txBytes" to txBytes, + "rxBytes" to rxBytes, + "txAudioBytes" to txAudioBytes, + "txVideoBytes" to txVideoBytes, + "rxAudioBytes" to rxAudioBytes, + "rxVideoBytes" to rxVideoBytes, + "txKBitRate" to txKBitRate, + "rxKBitRate" to rxKBitRate, + "txAudioKBitRate" to txAudioKBitRate, + "rxAudioKBitRate" to rxAudioKBitRate, + "txVideoKBitRate" to txVideoKBitRate, + "rxVideoKBitRate" to rxVideoKBitRate, + "users" to users, + "lastmileDelay" to lastmileDelay, + "txPacketLossRate" to txPacketLossRate, + "rxPacketLossRate" to rxPacketLossRate, + "cpuTotalUsage" to cpuTotalUsage, + "cpuAppUsage" to cpuAppUsage, + "gatewayRtt" to gatewayRtt, + "memoryAppUsageRatio" to memoryAppUsageRatio, + "memoryTotalUsageRatio" to memoryTotalUsageRatio, + "memoryAppUsageInKbytes" to memoryAppUsageInKbytes + ) } fun Rect.toMap(): Map { - return hashMapOf( - "left" to left, - "top" to top, - "right" to right, - "bottom" to bottom - ) + return hashMapOf( + "left" to left, + "top" to top, + "right" to right, + "bottom" to bottom + ) } fun RemoteAudioStats.toMap(): Map { - return hashMapOf( - "uid" to uid, - "quality" to quality, - "networkTransportDelay" to networkTransportDelay, - "jitterBufferDelay" to jitterBufferDelay, - "audioLossRate" to audioLossRate, - "numChannels" to numChannels, - "receivedSampleRate" to receivedSampleRate, - "receivedBitrate" to receivedBitrate, - "totalFrozenTime" to totalFrozenTime, - "frozenRate" to frozenRate, - "totalActiveTime" to totalActiveTime, - "publishDuration" to publishDuration - ) + return hashMapOf( + "uid" to uid, + "quality" to quality, + "networkTransportDelay" to networkTransportDelay, + "jitterBufferDelay" to jitterBufferDelay, + "audioLossRate" to audioLossRate, + "numChannels" to numChannels, + "receivedSampleRate" to receivedSampleRate, + "receivedBitrate" to receivedBitrate, + "totalFrozenTime" to totalFrozenTime, + "frozenRate" to frozenRate, + "totalActiveTime" to totalActiveTime, + "publishDuration" to publishDuration + ) } fun LocalVideoStats.toMap(): Map { - return hashMapOf( - "sentBitrate" to sentBitrate, - "sentFrameRate" to sentFrameRate, - "encoderOutputFrameRate" to encoderOutputFrameRate, - "rendererOutputFrameRate" to rendererOutputFrameRate, - "targetBitrate" to targetBitrate, - "targetFrameRate" to targetFrameRate, - "qualityAdaptIndication" to qualityAdaptIndication, - "encodedBitrate" to encodedBitrate, - "encodedFrameWidth" to encodedFrameWidth, - "encodedFrameHeight" to encodedFrameHeight, - "encodedFrameCount" to encodedFrameCount, - "codecType" to codecType, - "txPacketLossRate" to txPacketLossRate, - "captureFrameRate" to captureFrameRate - ) + return hashMapOf( + "sentBitrate" to sentBitrate, + "sentFrameRate" to sentFrameRate, + "encoderOutputFrameRate" to encoderOutputFrameRate, + "rendererOutputFrameRate" to rendererOutputFrameRate, + "targetBitrate" to targetBitrate, + "targetFrameRate" to targetFrameRate, + "qualityAdaptIndication" to qualityAdaptIndication, + "encodedBitrate" to encodedBitrate, + "encodedFrameWidth" to encodedFrameWidth, + "encodedFrameHeight" to encodedFrameHeight, + "encodedFrameCount" to encodedFrameCount, + "codecType" to codecType, + "txPacketLossRate" to txPacketLossRate, + "captureFrameRate" to captureFrameRate + ) } fun RemoteVideoStats.toMap(): Map { - return hashMapOf( - "uid" to uid, - "delay" to delay, - "width" to width, - "height" to height, - "receivedBitrate" to receivedBitrate, - "decoderOutputFrameRate" to decoderOutputFrameRate, - "rendererOutputFrameRate" to rendererOutputFrameRate, - "packetLossRate" to packetLossRate, - "rxStreamType" to rxStreamType, - "totalFrozenTime" to totalFrozenTime, - "frozenRate" to frozenRate, - "totalActiveTime" to totalActiveTime, - "publishDuration" to publishDuration - ) + return hashMapOf( + "uid" to uid, + "delay" to delay, + "width" to width, + "height" to height, + "receivedBitrate" to receivedBitrate, + "decoderOutputFrameRate" to decoderOutputFrameRate, + "rendererOutputFrameRate" to rendererOutputFrameRate, + "packetLossRate" to packetLossRate, + "rxStreamType" to rxStreamType, + "totalFrozenTime" to totalFrozenTime, + "frozenRate" to frozenRate, + "totalActiveTime" to totalActiveTime, + "publishDuration" to publishDuration + ) } fun AudioVolumeInfo.toMap(): Map { - return hashMapOf( - "uid" to uid, - "volume" to volume, - "vad" to vad, - "channelId" to channelId - ) + return hashMapOf( + "uid" to uid, + "volume" to volume, + "vad" to vad, + "channelId" to channelId + ) } fun Array.toMapList(): List> { - return List(size) { this[it].toMap() } + return List(size) { this[it].toMap() } } fun LastmileProbeResult.LastmileProbeOneWayResult.toMap(): Map { - return hashMapOf( - "packetLossRate" to packetLossRate, - "jitter" to jitter, - "availableBandwidth" to availableBandwidth - ) + return hashMapOf( + "packetLossRate" to packetLossRate, + "jitter" to jitter, + "availableBandwidth" to availableBandwidth + ) } fun LastmileProbeResult.toMap(): Map { - return hashMapOf( - "state" to state, - "rtt" to rtt, - "uplinkReport" to uplinkReport.toMap(), - "downlinkReport" to downlinkReport.toMap() - ) + return hashMapOf( + "state" to state, + "rtt" to rtt, + "uplinkReport" to uplinkReport.toMap(), + "downlinkReport" to downlinkReport.toMap() + ) } fun AgoraFacePositionInfo.toMap(): Map { - return hashMapOf( - "x" to x, - "y" to y, - "width" to width, - "height" to height, - "distance" to distance - ) + return hashMapOf( + "x" to x, + "y" to y, + "width" to width, + "height" to height, + "distance" to distance + ) } fun Array.toMapList(): List> { - return List(size) { this[it].toMap() } + return List(size) { this[it].toMap() } } diff --git a/MediaObserver.kt b/MediaObserver.kt index 729d7e57f..1983ecfc4 100644 --- a/MediaObserver.kt +++ b/MediaObserver.kt @@ -6,35 +6,35 @@ import java.util.* import java.util.concurrent.atomic.AtomicInteger class MediaObserver( - private val emit: (data: Map?) -> Unit + private val emit: (data: Map?) -> Unit ) : IMetadataObserver { - private var maxMetadataSize = AtomicInteger(0) - private var metadataList = Collections.synchronizedList(mutableListOf()) + private var maxMetadataSize = AtomicInteger(0) + private var metadataList = Collections.synchronizedList(mutableListOf()) - fun addMetadata(metadata: String) { - metadataList.add(metadata) - } + fun addMetadata(metadata: String) { + metadataList.add(metadata) + } - fun setMaxMetadataSize(@IntRange(from = 0, to = 1024) size: Int) { - maxMetadataSize.set(size) - } + fun setMaxMetadataSize(@IntRange(from = 0, to = 1024) size: Int) { + maxMetadataSize.set(size) + } - override fun onReadyToSendMetadata(timeStampMs: Long): ByteArray? { - if (metadataList.size > 0) { - return metadataList.removeAt(0).toByteArray() - } - return null + override fun onReadyToSendMetadata(timeStampMs: Long): ByteArray? { + if (metadataList.size > 0) { + return metadataList.removeAt(0).toByteArray() } + return null + } - override fun getMaxMetadataSize(): Int { - return maxMetadataSize.get() - } + override fun getMaxMetadataSize(): Int { + return maxMetadataSize.get() + } - override fun onMetadataReceived(buffer: ByteArray, uid: Int, timeStampMs: Long) { - emit(hashMapOf( - "buffer" to String(buffer), - "uid" to uid, - "timeStampMs" to timeStampMs - )) - } + override fun onMetadataReceived(buffer: ByteArray, uid: Int, timeStampMs: Long) { + emit(hashMapOf( + "buffer" to String(buffer), + "uid" to uid, + "timeStampMs" to timeStampMs + )) + } } diff --git a/RtcChannel.kt b/RtcChannel.kt index 5d270ca0c..58432cee0 100644 --- a/RtcChannel.kt +++ b/RtcChannel.kt @@ -8,323 +8,323 @@ import io.agora.rtc.internal.EncryptionConfig import java.util.* class IRtcChannel { - interface RtcChannelInterface : RtcAudioInterface, RtcVideoInterface, RtcVoicePositionInterface, - RtcPublishStreamInterface, RtcMediaRelayInterface, RtcDualStreamInterface, - RtcFallbackInterface, RtcMediaMetadataInterface, RtcEncryptionInterface, - RtcInjectStreamInterface, RtcStreamMessageInterface { - fun create(params: Map, callback: Callback) + interface RtcChannelInterface : RtcAudioInterface, RtcVideoInterface, RtcVoicePositionInterface, + RtcPublishStreamInterface, RtcMediaRelayInterface, RtcDualStreamInterface, + RtcFallbackInterface, RtcMediaMetadataInterface, RtcEncryptionInterface, + RtcInjectStreamInterface, RtcStreamMessageInterface { + fun create(params: Map, callback: Callback) - fun destroy(params: Map, callback: Callback) + fun destroy(params: Map, callback: Callback) - fun setClientRole(params: Map, callback: Callback) + fun setClientRole(params: Map, callback: Callback) - fun joinChannel(params: Map, callback: Callback) + fun joinChannel(params: Map, callback: Callback) - fun joinChannelWithUserAccount(params: Map, callback: Callback) + fun joinChannelWithUserAccount(params: Map, callback: Callback) - fun leaveChannel(params: Map, callback: Callback) + fun leaveChannel(params: Map, callback: Callback) - fun renewToken(params: Map, callback: Callback) + fun renewToken(params: Map, callback: Callback) - fun getConnectionState(params: Map, callback: Callback) + fun getConnectionState(params: Map, callback: Callback) - fun publish(params: Map, callback: Callback) + fun publish(params: Map, callback: Callback) - fun unpublish(params: Map, callback: Callback) + fun unpublish(params: Map, callback: Callback) - fun getCallId(params: Map, callback: Callback) - } + fun getCallId(params: Map, callback: Callback) + } - interface RtcAudioInterface { - fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) + interface RtcAudioInterface { + fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) - fun muteRemoteAudioStream(params: Map, callback: Callback) + fun muteRemoteAudioStream(params: Map, callback: Callback) - fun muteAllRemoteAudioStreams(params: Map, callback: Callback) + fun muteAllRemoteAudioStreams(params: Map, callback: Callback) - fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) - } + fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) + } - interface RtcVideoInterface { - fun muteRemoteVideoStream(params: Map, callback: Callback) + interface RtcVideoInterface { + fun muteRemoteVideoStream(params: Map, callback: Callback) - fun muteAllRemoteVideoStreams(params: Map, callback: Callback) + fun muteAllRemoteVideoStreams(params: Map, callback: Callback) - fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) - } + fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) + } - interface RtcVoicePositionInterface { - fun setRemoteVoicePosition(params: Map, callback: Callback) - } + interface RtcVoicePositionInterface { + fun setRemoteVoicePosition(params: Map, callback: Callback) + } - interface RtcPublishStreamInterface { - fun setLiveTranscoding(params: Map, callback: Callback) + interface RtcPublishStreamInterface { + fun setLiveTranscoding(params: Map, callback: Callback) - fun addPublishStreamUrl(params: Map, callback: Callback) + fun addPublishStreamUrl(params: Map, callback: Callback) - fun removePublishStreamUrl(params: Map, callback: Callback) - } + fun removePublishStreamUrl(params: Map, callback: Callback) + } - interface RtcMediaRelayInterface { - fun startChannelMediaRelay(params: Map, callback: Callback) + interface RtcMediaRelayInterface { + fun startChannelMediaRelay(params: Map, callback: Callback) - fun updateChannelMediaRelay(params: Map, callback: Callback) + fun updateChannelMediaRelay(params: Map, callback: Callback) - fun stopChannelMediaRelay(params: Map, callback: Callback) - } + fun stopChannelMediaRelay(params: Map, callback: Callback) + } - interface RtcDualStreamInterface { - fun setRemoteVideoStreamType(params: Map, callback: Callback) + interface RtcDualStreamInterface { + fun setRemoteVideoStreamType(params: Map, callback: Callback) - fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) - } + fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) + } - interface RtcFallbackInterface { - fun setRemoteUserPriority(params: Map, callback: Callback) - } + interface RtcFallbackInterface { + fun setRemoteUserPriority(params: Map, callback: Callback) + } - interface RtcMediaMetadataInterface { - fun registerMediaMetadataObserver(params: Map, callback: Callback) + interface RtcMediaMetadataInterface { + fun registerMediaMetadataObserver(params: Map, callback: Callback) - fun unregisterMediaMetadataObserver(params: Map, callback: Callback) + fun unregisterMediaMetadataObserver(params: Map, callback: Callback) - fun setMaxMetadataSize(params: Map, callback: Callback) + fun setMaxMetadataSize(params: Map, callback: Callback) - fun sendMetadata(params: Map, callback: Callback) - } + fun sendMetadata(params: Map, callback: Callback) + } - interface RtcEncryptionInterface { - fun setEncryptionSecret(params: Map, callback: Callback) + interface RtcEncryptionInterface { + fun setEncryptionSecret(params: Map, callback: Callback) - fun setEncryptionMode(params: Map, callback: Callback) + fun setEncryptionMode(params: Map, callback: Callback) - fun enableEncryption(params: Map, callback: Callback) - } + fun enableEncryption(params: Map, callback: Callback) + } - interface RtcInjectStreamInterface { - fun addInjectStreamUrl(params: Map, callback: Callback) + interface RtcInjectStreamInterface { + fun addInjectStreamUrl(params: Map, callback: Callback) - fun removeInjectStreamUrl(params: Map, callback: Callback) - } + fun removeInjectStreamUrl(params: Map, callback: Callback) + } - interface RtcStreamMessageInterface { - fun createDataStream(params: Map, callback: Callback) + interface RtcStreamMessageInterface { + fun createDataStream(params: Map, callback: Callback) - fun sendStreamMessage(params: Map, callback: Callback) - } + fun sendStreamMessage(params: Map, callback: Callback) + } } class RtcChannelManager( - private val emit: (methodName: String, data: Map?) -> Unit + private val emit: (methodName: String, data: Map?) -> Unit ) : IRtcChannel.RtcChannelInterface { - private val rtcChannelMap = Collections.synchronizedMap(mutableMapOf()) - private val mediaObserverMap = Collections.synchronizedMap(mutableMapOf()) - - fun release() { - rtcChannelMap.forEach { it.value.destroy() } - rtcChannelMap.clear() - mediaObserverMap.clear() - } - - operator fun get(channelId: String): RtcChannel? { - return rtcChannelMap[channelId] - } - - override fun create(params: Map, callback: Callback) { - callback.resolve(params["engine"] as RtcEngine) { e -> - e.createRtcChannel(params["channelId"] as String)?.let { - it.setRtcChannelEventHandler(RtcChannelEventHandler { methodName, data -> emit(methodName, data) }) - rtcChannelMap[it.channelId()] = it - } - Unit - } - } - - override fun destroy(params: Map, callback: Callback) { - var code: Int? = -Constants.ERR_NOT_INITIALIZED - this[params["channelId"] as String]?.let { - code = rtcChannelMap.remove(it.channelId())?.destroy() - } - callback.code(code) - } - - override fun setClientRole(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setClientRole((params["role"] as Number).toInt())) - } - - override fun joinChannel(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.joinChannel(params["token"] as? String, params["optionalInfo"] as? String, (params["optionalUid"] as Number).toInt(), mapToChannelMediaOptions(params["options"] as Map<*, *>))) - } - - override fun joinChannelWithUserAccount(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.joinChannelWithUserAccount(params["token"] as? String, params["userAccount"] as String, mapToChannelMediaOptions(params["options"] as Map<*, *>))) - } - - override fun leaveChannel(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.leaveChannel()) - } - - override fun renewToken(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.renewToken(params["token"] as String)) - } - - override fun getConnectionState(params: Map, callback: Callback) { - callback.resolve(this[params["channelId"] as String]) { it.connectionState } - } - - override fun publish(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.publish()) - } - - override fun unpublish(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.unpublish()) - } - - override fun getCallId(params: Map, callback: Callback) { - callback.resolve(this[params["channelId"] as String]) { it.callId } - } - - override fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.adjustUserPlaybackSignalVolume((params["uid"] as Number).toInt(), (params["volume"] as Number).toInt())) - } - - override fun muteRemoteAudioStream(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.muteRemoteAudioStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) - } - - override fun muteAllRemoteAudioStreams(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.muteAllRemoteAudioStreams(params["muted"] as Boolean)) - } - - override fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setDefaultMuteAllRemoteAudioStreams(params["muted"] as Boolean)) - } - - override fun muteRemoteVideoStream(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.muteRemoteVideoStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) - } - - override fun muteAllRemoteVideoStreams(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.muteAllRemoteVideoStreams(params["muted"] as Boolean)) - } - - override fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setDefaultMuteAllRemoteVideoStreams(params["muted"] as Boolean)) - } - - override fun setRemoteVoicePosition(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setRemoteVoicePosition((params["uid"] as Number).toInt(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble())) - } + private val rtcChannelMap = Collections.synchronizedMap(mutableMapOf()) + private val mediaObserverMap = Collections.synchronizedMap(mutableMapOf()) - override fun setLiveTranscoding(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setLiveTranscoding(mapToLiveTranscoding(params["transcoding"] as Map<*, *>))) - } + fun release() { + rtcChannelMap.forEach { it.value.destroy() } + rtcChannelMap.clear() + mediaObserverMap.clear() + } + + operator fun get(channelId: String): RtcChannel? { + return rtcChannelMap[channelId] + } + + override fun create(params: Map, callback: Callback) { + callback.resolve(params["engine"] as RtcEngine) { e -> + e.createRtcChannel(params["channelId"] as String)?.let { + it.setRtcChannelEventHandler(RtcChannelEventHandler { methodName, data -> emit(methodName, data) }) + rtcChannelMap[it.channelId()] = it + } + Unit + } + } - override fun addPublishStreamUrl(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.addPublishStreamUrl(params["url"] as String, params["transcodingEnabled"] as Boolean)) - } + override fun destroy(params: Map, callback: Callback) { + var code: Int? = -Constants.ERR_NOT_INITIALIZED + this[params["channelId"] as String]?.let { + code = rtcChannelMap.remove(it.channelId())?.destroy() + } + callback.code(code) + } - override fun removePublishStreamUrl(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.removePublishStreamUrl(params["url"] as String)) - } + override fun setClientRole(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setClientRole((params["role"] as Number).toInt())) + } - override fun startChannelMediaRelay(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.startChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) - } - - override fun updateChannelMediaRelay(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.updateChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) - } - - override fun stopChannelMediaRelay(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.stopChannelMediaRelay()) - } - - override fun setRemoteVideoStreamType(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setRemoteVideoStreamType((params["uid"] as Number).toInt(), (params["streamType"] as Number).toInt())) - } - - override fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setRemoteDefaultVideoStreamType((params["streamType"] as Number).toInt())) - } - - override fun setRemoteUserPriority(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setRemoteUserPriority((params["uid"] as Number).toInt(), (params["userPriority"] as Number).toInt())) - } - - override fun registerMediaMetadataObserver(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - this[params["channelId"] as String]?.let { - val mediaObserver = MediaObserver { data -> - emit(RtcChannelEvents.MetadataReceived, data?.toMutableMap()?.apply { put("channelId", it.channelId()) }) - } - code = it.registerMediaMetadataObserver(mediaObserver, IMetadataObserver.VIDEO_METADATA) - if (code == 0) mediaObserverMap[it.channelId()] = mediaObserver - } - callback.code(code) - } - - override fun unregisterMediaMetadataObserver(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - this[params["channelId"] as String]?.let { - code = it.registerMediaMetadataObserver(null, IMetadataObserver.VIDEO_METADATA) - if (code == 0) mediaObserverMap.remove(it.channelId()) - } - callback.code(code) - } - - override fun setMaxMetadataSize(params: Map, callback: Callback) { - callback.resolve(mediaObserverMap[params["channelId"] as String]) { - it.maxMetadataSize = (params["size"] as Number).toInt() - Unit - } - } - - override fun sendMetadata(params: Map, callback: Callback) { - callback.resolve(mediaObserverMap[params["channelId"] as String]) { - it.addMetadata(params["metadata"] as String) - Unit - } - } - - override fun setEncryptionSecret(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setEncryptionSecret(params["secret"] as String)) - } - - override fun setEncryptionMode(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setEncryptionMode(when ((params["encryptionMode"] as Number).toInt()) { - EncryptionConfig.EncryptionMode.AES_128_XTS.value -> "aes-128-xts" - EncryptionConfig.EncryptionMode.AES_128_ECB.value -> "aes-128-ecb" - EncryptionConfig.EncryptionMode.AES_256_XTS.value -> "aes-256-xts" - else -> "" - })) - } - - override fun enableEncryption(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.enableEncryption(params["enabled"] as Boolean, mapToEncryptionConfig(params["config"] as Map<*, *>))) - } - - override fun addInjectStreamUrl(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.addInjectStreamUrl(params["url"] as String, mapToLiveInjectStreamConfig(params["config"] as Map<*, *>))) - } - - override fun removeInjectStreamUrl(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.removeInjectStreamUrl(params["url"] as String)) - } - - override fun createDataStream(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - this[params["channelId"] as String]?.let { - code = it.createDataStream(params["reliable"] as Boolean, params["ordered"] as Boolean) - } - callback.code(code) { it } - } - - override fun sendStreamMessage(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - this[params["channelId"] as String]?.let { - code = it.sendStreamMessage((params["streamId"] as Number).toInt(), (params["message"] as String).toByteArray()) - } - callback.code(code) - } + override fun joinChannel(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.joinChannel(params["token"] as? String, params["optionalInfo"] as? String, (params["optionalUid"] as Number).toInt(), mapToChannelMediaOptions(params["options"] as Map<*, *>))) + } + + override fun joinChannelWithUserAccount(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.joinChannelWithUserAccount(params["token"] as? String, params["userAccount"] as String, mapToChannelMediaOptions(params["options"] as Map<*, *>))) + } + + override fun leaveChannel(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.leaveChannel()) + } + + override fun renewToken(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.renewToken(params["token"] as String)) + } + + override fun getConnectionState(params: Map, callback: Callback) { + callback.resolve(this[params["channelId"] as String]) { it.connectionState } + } + + override fun publish(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.publish()) + } + + override fun unpublish(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.unpublish()) + } + + override fun getCallId(params: Map, callback: Callback) { + callback.resolve(this[params["channelId"] as String]) { it.callId } + } + + override fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.adjustUserPlaybackSignalVolume((params["uid"] as Number).toInt(), (params["volume"] as Number).toInt())) + } + + override fun muteRemoteAudioStream(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.muteRemoteAudioStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) + } + + override fun muteAllRemoteAudioStreams(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.muteAllRemoteAudioStreams(params["muted"] as Boolean)) + } + + override fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setDefaultMuteAllRemoteAudioStreams(params["muted"] as Boolean)) + } + + override fun muteRemoteVideoStream(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.muteRemoteVideoStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) + } + + override fun muteAllRemoteVideoStreams(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.muteAllRemoteVideoStreams(params["muted"] as Boolean)) + } + + override fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setDefaultMuteAllRemoteVideoStreams(params["muted"] as Boolean)) + } + + override fun setRemoteVoicePosition(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setRemoteVoicePosition((params["uid"] as Number).toInt(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble())) + } + + override fun setLiveTranscoding(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setLiveTranscoding(mapToLiveTranscoding(params["transcoding"] as Map<*, *>))) + } + + override fun addPublishStreamUrl(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.addPublishStreamUrl(params["url"] as String, params["transcodingEnabled"] as Boolean)) + } + + override fun removePublishStreamUrl(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.removePublishStreamUrl(params["url"] as String)) + } + + override fun startChannelMediaRelay(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.startChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) + } + + override fun updateChannelMediaRelay(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.updateChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) + } + + override fun stopChannelMediaRelay(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.stopChannelMediaRelay()) + } + + override fun setRemoteVideoStreamType(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setRemoteVideoStreamType((params["uid"] as Number).toInt(), (params["streamType"] as Number).toInt())) + } + + override fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setRemoteDefaultVideoStreamType((params["streamType"] as Number).toInt())) + } + + override fun setRemoteUserPriority(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setRemoteUserPriority((params["uid"] as Number).toInt(), (params["userPriority"] as Number).toInt())) + } + + override fun registerMediaMetadataObserver(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + this[params["channelId"] as String]?.let { + val mediaObserver = MediaObserver { data -> + emit(RtcChannelEvents.MetadataReceived, data?.toMutableMap()?.apply { put("channelId", it.channelId()) }) + } + code = it.registerMediaMetadataObserver(mediaObserver, IMetadataObserver.VIDEO_METADATA) + if (code == 0) mediaObserverMap[it.channelId()] = mediaObserver + } + callback.code(code) + } + + override fun unregisterMediaMetadataObserver(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + this[params["channelId"] as String]?.let { + code = it.registerMediaMetadataObserver(null, IMetadataObserver.VIDEO_METADATA) + if (code == 0) mediaObserverMap.remove(it.channelId()) + } + callback.code(code) + } + + override fun setMaxMetadataSize(params: Map, callback: Callback) { + callback.resolve(mediaObserverMap[params["channelId"] as String]) { + it.maxMetadataSize = (params["size"] as Number).toInt() + Unit + } + } + + override fun sendMetadata(params: Map, callback: Callback) { + callback.resolve(mediaObserverMap[params["channelId"] as String]) { + it.addMetadata(params["metadata"] as String) + Unit + } + } + + override fun setEncryptionSecret(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setEncryptionSecret(params["secret"] as String)) + } + + override fun setEncryptionMode(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.setEncryptionMode(when ((params["encryptionMode"] as Number).toInt()) { + EncryptionConfig.EncryptionMode.AES_128_XTS.value -> "aes-128-xts" + EncryptionConfig.EncryptionMode.AES_128_ECB.value -> "aes-128-ecb" + EncryptionConfig.EncryptionMode.AES_256_XTS.value -> "aes-256-xts" + else -> "" + })) + } + + override fun enableEncryption(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.enableEncryption(params["enabled"] as Boolean, mapToEncryptionConfig(params["config"] as Map<*, *>))) + } + + override fun addInjectStreamUrl(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.addInjectStreamUrl(params["url"] as String, mapToLiveInjectStreamConfig(params["config"] as Map<*, *>))) + } + + override fun removeInjectStreamUrl(params: Map, callback: Callback) { + callback.code(this[params["channelId"] as String]?.removeInjectStreamUrl(params["url"] as String)) + } + + override fun createDataStream(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + this[params["channelId"] as String]?.let { + code = it.createDataStream(params["reliable"] as Boolean, params["ordered"] as Boolean) + } + callback.code(code) { it } + } + + override fun sendStreamMessage(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + this[params["channelId"] as String]?.let { + code = it.sendStreamMessage((params["streamId"] as Number).toInt(), (params["message"] as String).toByteArray()) + } + callback.code(code) + } } diff --git a/RtcChannelEvent.kt b/RtcChannelEvent.kt index fe3dca3b0..f00f9a5fa 100644 --- a/RtcChannelEvent.kt +++ b/RtcChannelEvent.kt @@ -6,234 +6,234 @@ import io.agora.rtc.IRtcEngineEventHandler import io.agora.rtc.RtcChannel class RtcChannelEvents { - companion object { - const val Warning = "Warning" - const val Error = "Error" - const val JoinChannelSuccess = "JoinChannelSuccess" - const val RejoinChannelSuccess = "RejoinChannelSuccess" - const val LeaveChannel = "LeaveChannel" - const val ClientRoleChanged = "ClientRoleChanged" - const val UserJoined = "UserJoined" - const val UserOffline = "UserOffline" - const val ConnectionStateChanged = "ConnectionStateChanged" - const val ConnectionLost = "ConnectionLost" - const val TokenPrivilegeWillExpire = "TokenPrivilegeWillExpire" - const val RequestToken = "RequestToken" - const val ActiveSpeaker = "ActiveSpeaker" - const val VideoSizeChanged = "VideoSizeChanged" - const val RemoteVideoStateChanged = "RemoteVideoStateChanged" - const val RemoteAudioStateChanged = "RemoteAudioStateChanged" - const val LocalPublishFallbackToAudioOnly = "LocalPublishFallbackToAudioOnly" - const val RemoteSubscribeFallbackToAudioOnly = "RemoteSubscribeFallbackToAudioOnly" - const val RtcStats = "RtcStats" - const val NetworkQuality = "NetworkQuality" - const val RemoteVideoStats = "RemoteVideoStats" - const val RemoteAudioStats = "RemoteAudioStats" - const val RtmpStreamingStateChanged = "RtmpStreamingStateChanged" - const val TranscodingUpdated = "TranscodingUpdated" - const val StreamInjectedStatus = "StreamInjectedStatus" - const val StreamMessage = "StreamMessage" - const val StreamMessageError = "StreamMessageError" - const val ChannelMediaRelayStateChanged = "ChannelMediaRelayStateChanged" - const val ChannelMediaRelayEvent = "ChannelMediaRelayEvent" - const val MetadataReceived = "MetadataReceived" - const val AudioPublishStateChanged = "AudioPublishStateChanged" - const val VideoPublishStateChanged = "VideoPublishStateChanged" - const val AudioSubscribeStateChanged = "AudioSubscribeStateChanged" - const val VideoSubscribeStateChanged = "VideoSubscribeStateChanged" - const val RtmpStreamingEvent = "RtmpStreamingEvent" - - fun toMap(): Map { - return hashMapOf( - "Warning" to Warning, - "Error" to Error, - "JoinChannelSuccess" to JoinChannelSuccess, - "RejoinChannelSuccess" to RejoinChannelSuccess, - "LeaveChannel" to LeaveChannel, - "ClientRoleChanged" to ClientRoleChanged, - "UserJoined" to UserJoined, - "UserOffline" to UserOffline, - "ConnectionStateChanged" to ConnectionStateChanged, - "ConnectionLost" to ConnectionLost, - "TokenPrivilegeWillExpire" to TokenPrivilegeWillExpire, - "RequestToken" to RequestToken, - "ActiveSpeaker" to ActiveSpeaker, - "VideoSizeChanged" to VideoSizeChanged, - "RemoteVideoStateChanged" to RemoteVideoStateChanged, - "RemoteAudioStateChanged" to RemoteAudioStateChanged, - "LocalPublishFallbackToAudioOnly" to LocalPublishFallbackToAudioOnly, - "RemoteSubscribeFallbackToAudioOnly" to RemoteSubscribeFallbackToAudioOnly, - "RtcStats" to RtcStats, - "NetworkQuality" to NetworkQuality, - "RemoteVideoStats" to RemoteVideoStats, - "RemoteAudioStats" to RemoteAudioStats, - "RtmpStreamingStateChanged" to RtmpStreamingStateChanged, - "TranscodingUpdated" to TranscodingUpdated, - "StreamInjectedStatus" to StreamInjectedStatus, - "StreamMessage" to StreamMessage, - "StreamMessageError" to StreamMessageError, - "ChannelMediaRelayStateChanged" to ChannelMediaRelayStateChanged, - "ChannelMediaRelayEvent" to ChannelMediaRelayEvent, - "MetadataReceived" to MetadataReceived, - "AudioPublishStateChanged" to AudioPublishStateChanged, - "VideoPublishStateChanged" to VideoPublishStateChanged, - "AudioSubscribeStateChanged" to AudioSubscribeStateChanged, - "VideoSubscribeStateChanged" to VideoSubscribeStateChanged, - "RtmpStreamingEvent" to RtmpStreamingEvent - ) - } - } + companion object { + const val Warning = "Warning" + const val Error = "Error" + const val JoinChannelSuccess = "JoinChannelSuccess" + const val RejoinChannelSuccess = "RejoinChannelSuccess" + const val LeaveChannel = "LeaveChannel" + const val ClientRoleChanged = "ClientRoleChanged" + const val UserJoined = "UserJoined" + const val UserOffline = "UserOffline" + const val ConnectionStateChanged = "ConnectionStateChanged" + const val ConnectionLost = "ConnectionLost" + const val TokenPrivilegeWillExpire = "TokenPrivilegeWillExpire" + const val RequestToken = "RequestToken" + const val ActiveSpeaker = "ActiveSpeaker" + const val VideoSizeChanged = "VideoSizeChanged" + const val RemoteVideoStateChanged = "RemoteVideoStateChanged" + const val RemoteAudioStateChanged = "RemoteAudioStateChanged" + const val LocalPublishFallbackToAudioOnly = "LocalPublishFallbackToAudioOnly" + const val RemoteSubscribeFallbackToAudioOnly = "RemoteSubscribeFallbackToAudioOnly" + const val RtcStats = "RtcStats" + const val NetworkQuality = "NetworkQuality" + const val RemoteVideoStats = "RemoteVideoStats" + const val RemoteAudioStats = "RemoteAudioStats" + const val RtmpStreamingStateChanged = "RtmpStreamingStateChanged" + const val TranscodingUpdated = "TranscodingUpdated" + const val StreamInjectedStatus = "StreamInjectedStatus" + const val StreamMessage = "StreamMessage" + const val StreamMessageError = "StreamMessageError" + const val ChannelMediaRelayStateChanged = "ChannelMediaRelayStateChanged" + const val ChannelMediaRelayEvent = "ChannelMediaRelayEvent" + const val MetadataReceived = "MetadataReceived" + const val AudioPublishStateChanged = "AudioPublishStateChanged" + const val VideoPublishStateChanged = "VideoPublishStateChanged" + const val AudioSubscribeStateChanged = "AudioSubscribeStateChanged" + const val VideoSubscribeStateChanged = "VideoSubscribeStateChanged" + const val RtmpStreamingEvent = "RtmpStreamingEvent" + + fun toMap(): Map { + return hashMapOf( + "Warning" to Warning, + "Error" to Error, + "JoinChannelSuccess" to JoinChannelSuccess, + "RejoinChannelSuccess" to RejoinChannelSuccess, + "LeaveChannel" to LeaveChannel, + "ClientRoleChanged" to ClientRoleChanged, + "UserJoined" to UserJoined, + "UserOffline" to UserOffline, + "ConnectionStateChanged" to ConnectionStateChanged, + "ConnectionLost" to ConnectionLost, + "TokenPrivilegeWillExpire" to TokenPrivilegeWillExpire, + "RequestToken" to RequestToken, + "ActiveSpeaker" to ActiveSpeaker, + "VideoSizeChanged" to VideoSizeChanged, + "RemoteVideoStateChanged" to RemoteVideoStateChanged, + "RemoteAudioStateChanged" to RemoteAudioStateChanged, + "LocalPublishFallbackToAudioOnly" to LocalPublishFallbackToAudioOnly, + "RemoteSubscribeFallbackToAudioOnly" to RemoteSubscribeFallbackToAudioOnly, + "RtcStats" to RtcStats, + "NetworkQuality" to NetworkQuality, + "RemoteVideoStats" to RemoteVideoStats, + "RemoteAudioStats" to RemoteAudioStats, + "RtmpStreamingStateChanged" to RtmpStreamingStateChanged, + "TranscodingUpdated" to TranscodingUpdated, + "StreamInjectedStatus" to StreamInjectedStatus, + "StreamMessage" to StreamMessage, + "StreamMessageError" to StreamMessageError, + "ChannelMediaRelayStateChanged" to ChannelMediaRelayStateChanged, + "ChannelMediaRelayEvent" to ChannelMediaRelayEvent, + "MetadataReceived" to MetadataReceived, + "AudioPublishStateChanged" to AudioPublishStateChanged, + "VideoPublishStateChanged" to VideoPublishStateChanged, + "AudioSubscribeStateChanged" to AudioSubscribeStateChanged, + "VideoSubscribeStateChanged" to VideoSubscribeStateChanged, + "RtmpStreamingEvent" to RtmpStreamingEvent + ) + } + } } class RtcChannelEventHandler( - private val emitter: (methodName: String, data: Map?) -> Unit + private val emitter: (methodName: String, data: Map?) -> Unit ) : IRtcChannelEventHandler() { - companion object { - const val PREFIX = "io.agora.rtc." - } - - private fun callback(methodName: String, channel: RtcChannel?, vararg data: Any?) { - channel?.let { - emitter(methodName, hashMapOf( - "channelId" to it.channelId(), - "data" to data.toList() - )) - } - } - - override fun onChannelWarning(rtcChannel: RtcChannel?, @Annotations.AgoraWarningCode warn: Int) { - callback(RtcChannelEvents.Warning, rtcChannel, warn) - } - - override fun onChannelError(rtcChannel: RtcChannel?, @Annotations.AgoraErrorCode err: Int) { - callback(RtcChannelEvents.Error, rtcChannel, err) - } - - override fun onJoinChannelSuccess(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { - callback(RtcChannelEvents.JoinChannelSuccess, rtcChannel, rtcChannel?.channelId(), uid, elapsed) - } - - override fun onRejoinChannelSuccess(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { - callback(RtcChannelEvents.RejoinChannelSuccess, rtcChannel, rtcChannel?.channelId(), uid, elapsed) - } - - override fun onLeaveChannel(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RtcStats?) { - callback(RtcChannelEvents.LeaveChannel, rtcChannel, stats?.toMap()) - } - - override fun onClientRoleChanged(rtcChannel: RtcChannel?, @Annotations.AgoraClientRole oldRole: Int, @Annotations.AgoraClientRole newRole: Int) { - callback(RtcChannelEvents.ClientRoleChanged, rtcChannel, oldRole, newRole) - } - - override fun onUserJoined(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { - callback(RtcChannelEvents.UserJoined, rtcChannel, uid, elapsed) - } - - override fun onUserOffline(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraUserOfflineReason reason: Int) { - callback(RtcChannelEvents.UserOffline, rtcChannel, uid, reason) - } - - override fun onConnectionStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraConnectionStateType state: Int, @Annotations.AgoraConnectionChangedReason reason: Int) { - callback(RtcChannelEvents.ConnectionStateChanged, rtcChannel, state, reason) - } - - override fun onConnectionLost(rtcChannel: RtcChannel?) { - callback(RtcChannelEvents.ConnectionLost, rtcChannel) - } - - override fun onTokenPrivilegeWillExpire(rtcChannel: RtcChannel?, token: String?) { - callback(RtcChannelEvents.TokenPrivilegeWillExpire, rtcChannel, token) - } - - override fun onRequestToken(rtcChannel: RtcChannel?) { - callback(RtcChannelEvents.RequestToken, rtcChannel) + companion object { + const val PREFIX = "io.agora.rtc." + } + + private fun callback(methodName: String, channel: RtcChannel?, vararg data: Any?) { + channel?.let { + emitter(methodName, hashMapOf( + "channelId" to it.channelId(), + "data" to data.toList() + )) } + } - override fun onActiveSpeaker(rtcChannel: RtcChannel?, uid: Int) { - callback(RtcChannelEvents.ActiveSpeaker, rtcChannel, uid) - } + override fun onChannelWarning(rtcChannel: RtcChannel?, @Annotations.AgoraWarningCode warn: Int) { + callback(RtcChannelEvents.Warning, rtcChannel, warn) + } - override fun onVideoSizeChanged(rtcChannel: RtcChannel?, uid: Int, width: Int, height: Int, @IntRange(from = 0, to = 360) rotation: Int) { - callback(RtcChannelEvents.VideoSizeChanged, rtcChannel, uid, width, height, rotation) - } + override fun onChannelError(rtcChannel: RtcChannel?, @Annotations.AgoraErrorCode err: Int) { + callback(RtcChannelEvents.Error, rtcChannel, err) + } - override fun onRemoteVideoStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraVideoRemoteState state: Int, @Annotations.AgoraVideoRemoteStateReason reason: Int, elapsed: Int) { - callback(RtcChannelEvents.RemoteVideoStateChanged, rtcChannel, uid, state, reason, elapsed) - } + override fun onJoinChannelSuccess(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { + callback(RtcChannelEvents.JoinChannelSuccess, rtcChannel, rtcChannel?.channelId(), uid, elapsed) + } - override fun onRemoteAudioStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraAudioRemoteState state: Int, @Annotations.AgoraAudioRemoteStateReason reason: Int, elapsed: Int) { - callback(RtcChannelEvents.RemoteAudioStateChanged, rtcChannel, uid, state, reason, elapsed) - } + override fun onRejoinChannelSuccess(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { + callback(RtcChannelEvents.RejoinChannelSuccess, rtcChannel, rtcChannel?.channelId(), uid, elapsed) + } - override fun onLocalPublishFallbackToAudioOnly(rtcChannel: RtcChannel?, isFallbackOrRecover: Boolean) { - callback(RtcChannelEvents.LocalPublishFallbackToAudioOnly, rtcChannel, isFallbackOrRecover) - } + override fun onLeaveChannel(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RtcStats?) { + callback(RtcChannelEvents.LeaveChannel, rtcChannel, stats?.toMap()) + } - override fun onRemoteSubscribeFallbackToAudioOnly(rtcChannel: RtcChannel?, uid: Int, isFallbackOrRecover: Boolean) { - callback(RtcChannelEvents.RemoteSubscribeFallbackToAudioOnly, rtcChannel, uid, isFallbackOrRecover) - } - - override fun onRtcStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RtcStats?) { - callback(RtcChannelEvents.RtcStats, rtcChannel, stats?.toMap()) - } - - override fun onNetworkQuality(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraNetworkQuality txQuality: Int, @Annotations.AgoraNetworkQuality rxQuality: Int) { - callback(RtcChannelEvents.NetworkQuality, rtcChannel, uid, txQuality, rxQuality) - } - - override fun onRemoteVideoStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RemoteVideoStats?) { - callback(RtcChannelEvents.RemoteVideoStats, rtcChannel, stats?.toMap()) - } + override fun onClientRoleChanged(rtcChannel: RtcChannel?, @Annotations.AgoraClientRole oldRole: Int, @Annotations.AgoraClientRole newRole: Int) { + callback(RtcChannelEvents.ClientRoleChanged, rtcChannel, oldRole, newRole) + } - override fun onRemoteAudioStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RemoteAudioStats?) { - callback(RtcChannelEvents.RemoteAudioStats, rtcChannel, stats?.toMap()) - } + override fun onUserJoined(rtcChannel: RtcChannel?, uid: Int, elapsed: Int) { + callback(RtcChannelEvents.UserJoined, rtcChannel, uid, elapsed) + } - override fun onRtmpStreamingStateChanged(rtcChannel: RtcChannel?, url: String?, @Annotations.AgoraRtmpStreamingState state: Int, @Annotations.AgoraRtmpStreamingErrorCode errCode: Int) { - callback(RtcChannelEvents.RtmpStreamingStateChanged, rtcChannel, url, state, errCode) - } + override fun onUserOffline(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraUserOfflineReason reason: Int) { + callback(RtcChannelEvents.UserOffline, rtcChannel, uid, reason) + } - override fun onTranscodingUpdated(rtcChannel: RtcChannel?) { - callback(RtcChannelEvents.TranscodingUpdated, rtcChannel) - } + override fun onConnectionStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraConnectionStateType state: Int, @Annotations.AgoraConnectionChangedReason reason: Int) { + callback(RtcChannelEvents.ConnectionStateChanged, rtcChannel, state, reason) + } + + override fun onConnectionLost(rtcChannel: RtcChannel?) { + callback(RtcChannelEvents.ConnectionLost, rtcChannel) + } + + override fun onTokenPrivilegeWillExpire(rtcChannel: RtcChannel?, token: String?) { + callback(RtcChannelEvents.TokenPrivilegeWillExpire, rtcChannel, token) + } + + override fun onRequestToken(rtcChannel: RtcChannel?) { + callback(RtcChannelEvents.RequestToken, rtcChannel) + } + + override fun onActiveSpeaker(rtcChannel: RtcChannel?, uid: Int) { + callback(RtcChannelEvents.ActiveSpeaker, rtcChannel, uid) + } + + override fun onVideoSizeChanged(rtcChannel: RtcChannel?, uid: Int, width: Int, height: Int, @IntRange(from = 0, to = 360) rotation: Int) { + callback(RtcChannelEvents.VideoSizeChanged, rtcChannel, uid, width, height, rotation) + } + + override fun onRemoteVideoStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraVideoRemoteState state: Int, @Annotations.AgoraVideoRemoteStateReason reason: Int, elapsed: Int) { + callback(RtcChannelEvents.RemoteVideoStateChanged, rtcChannel, uid, state, reason, elapsed) + } + + override fun onRemoteAudioStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraAudioRemoteState state: Int, @Annotations.AgoraAudioRemoteStateReason reason: Int, elapsed: Int) { + callback(RtcChannelEvents.RemoteAudioStateChanged, rtcChannel, uid, state, reason, elapsed) + } + + override fun onLocalPublishFallbackToAudioOnly(rtcChannel: RtcChannel?, isFallbackOrRecover: Boolean) { + callback(RtcChannelEvents.LocalPublishFallbackToAudioOnly, rtcChannel, isFallbackOrRecover) + } + + override fun onRemoteSubscribeFallbackToAudioOnly(rtcChannel: RtcChannel?, uid: Int, isFallbackOrRecover: Boolean) { + callback(RtcChannelEvents.RemoteSubscribeFallbackToAudioOnly, rtcChannel, uid, isFallbackOrRecover) + } + + override fun onRtcStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RtcStats?) { + callback(RtcChannelEvents.RtcStats, rtcChannel, stats?.toMap()) + } + + override fun onNetworkQuality(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraNetworkQuality txQuality: Int, @Annotations.AgoraNetworkQuality rxQuality: Int) { + callback(RtcChannelEvents.NetworkQuality, rtcChannel, uid, txQuality, rxQuality) + } + + override fun onRemoteVideoStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RemoteVideoStats?) { + callback(RtcChannelEvents.RemoteVideoStats, rtcChannel, stats?.toMap()) + } + + override fun onRemoteAudioStats(rtcChannel: RtcChannel?, stats: IRtcEngineEventHandler.RemoteAudioStats?) { + callback(RtcChannelEvents.RemoteAudioStats, rtcChannel, stats?.toMap()) + } + + override fun onRtmpStreamingStateChanged(rtcChannel: RtcChannel?, url: String?, @Annotations.AgoraRtmpStreamingState state: Int, @Annotations.AgoraRtmpStreamingErrorCode errCode: Int) { + callback(RtcChannelEvents.RtmpStreamingStateChanged, rtcChannel, url, state, errCode) + } + + override fun onTranscodingUpdated(rtcChannel: RtcChannel?) { + callback(RtcChannelEvents.TranscodingUpdated, rtcChannel) + } - override fun onStreamInjectedStatus(rtcChannel: RtcChannel?, url: String?, uid: Int, @Annotations.AgoraInjectStreamStatus status: Int) { - callback(RtcChannelEvents.StreamInjectedStatus, rtcChannel, url, uid, status) - } + override fun onStreamInjectedStatus(rtcChannel: RtcChannel?, url: String?, uid: Int, @Annotations.AgoraInjectStreamStatus status: Int) { + callback(RtcChannelEvents.StreamInjectedStatus, rtcChannel, url, uid, status) + } - override fun onStreamMessage(rtcChannel: RtcChannel?, uid: Int, streamId: Int, data: ByteArray?) { - callback(RtcChannelEvents.StreamMessage, rtcChannel, uid, streamId, data?.let { String(it, Charsets.UTF_8) }) - } + override fun onStreamMessage(rtcChannel: RtcChannel?, uid: Int, streamId: Int, data: ByteArray?) { + callback(RtcChannelEvents.StreamMessage, rtcChannel, uid, streamId, data?.let { String(it, Charsets.UTF_8) }) + } - override fun onStreamMessageError(rtcChannel: RtcChannel?, uid: Int, streamId: Int, @Annotations.AgoraErrorCode error: Int, missed: Int, cached: Int) { - callback(RtcChannelEvents.StreamMessageError, rtcChannel, uid, streamId, error, missed, cached) - } + override fun onStreamMessageError(rtcChannel: RtcChannel?, uid: Int, streamId: Int, @Annotations.AgoraErrorCode error: Int, missed: Int, cached: Int) { + callback(RtcChannelEvents.StreamMessageError, rtcChannel, uid, streamId, error, missed, cached) + } - override fun onChannelMediaRelayStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraChannelMediaRelayState state: Int, @Annotations.AgoraChannelMediaRelayError code: Int) { - callback(RtcChannelEvents.ChannelMediaRelayStateChanged, rtcChannel, state, code) - } + override fun onChannelMediaRelayStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraChannelMediaRelayState state: Int, @Annotations.AgoraChannelMediaRelayError code: Int) { + callback(RtcChannelEvents.ChannelMediaRelayStateChanged, rtcChannel, state, code) + } - override fun onChannelMediaRelayEvent(rtcChannel: RtcChannel?, @Annotations.AgoraChannelMediaRelayEvent code: Int) { - callback(RtcChannelEvents.ChannelMediaRelayEvent, rtcChannel, code) - } + override fun onChannelMediaRelayEvent(rtcChannel: RtcChannel?, @Annotations.AgoraChannelMediaRelayEvent code: Int) { + callback(RtcChannelEvents.ChannelMediaRelayEvent, rtcChannel, code) + } - override fun onAudioPublishStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { - callback(RtcChannelEvents.AudioPublishStateChanged, rtcChannel, rtcChannel?.channelId(), oldState, newState, elapseSinceLastState) - } + override fun onAudioPublishStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { + callback(RtcChannelEvents.AudioPublishStateChanged, rtcChannel, rtcChannel?.channelId(), oldState, newState, elapseSinceLastState) + } - override fun onVideoPublishStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { - callback(RtcChannelEvents.VideoPublishStateChanged, rtcChannel, rtcChannel?.channelId(), oldState, newState, elapseSinceLastState) - } + override fun onVideoPublishStateChanged(rtcChannel: RtcChannel?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { + callback(RtcChannelEvents.VideoPublishStateChanged, rtcChannel, rtcChannel?.channelId(), oldState, newState, elapseSinceLastState) + } - override fun onAudioSubscribeStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { - callback(RtcChannelEvents.AudioSubscribeStateChanged, rtcChannel, rtcChannel?.channelId(), uid, oldState, newState, elapseSinceLastState) - } + override fun onAudioSubscribeStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { + callback(RtcChannelEvents.AudioSubscribeStateChanged, rtcChannel, rtcChannel?.channelId(), uid, oldState, newState, elapseSinceLastState) + } - override fun onVideoSubscribeStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { - callback(RtcChannelEvents.VideoSubscribeStateChanged, rtcChannel, rtcChannel?.channelId(), uid, oldState, newState, elapseSinceLastState) - } + override fun onVideoSubscribeStateChanged(rtcChannel: RtcChannel?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { + callback(RtcChannelEvents.VideoSubscribeStateChanged, rtcChannel, rtcChannel?.channelId(), uid, oldState, newState, elapseSinceLastState) + } - override fun onRtmpStreamingEvent(rtcChannel: RtcChannel?, url: String?, @Annotations.AgoraRtmpStreamingEvent errCode: Int) { - callback(RtcChannelEvents.RtmpStreamingEvent, rtcChannel, url, errCode) - } + override fun onRtmpStreamingEvent(rtcChannel: RtcChannel?, url: String?, @Annotations.AgoraRtmpStreamingEvent errCode: Int) { + callback(RtcChannelEvents.RtmpStreamingEvent, rtcChannel, url, errCode) + } } diff --git a/RtcEngine.kt b/RtcEngine.kt index 38a3561f3..9249a05f3 100644 --- a/RtcEngine.kt +++ b/RtcEngine.kt @@ -6,901 +6,923 @@ import io.agora.rtc.internal.EncryptionConfig import io.agora.rtc.models.UserInfo class IRtcEngine { - interface RtcEngineInterface : RtcUserInfoInterface, RtcAudioInterface, RtcVideoInterface, - RtcAudioMixingInterface, RtcAudioEffectInterface, RtcVoiceChangerInterface, - RtcVoicePositionInterface, RtcPublishStreamInterface, RtcMediaRelayInterface, - RtcAudioRouteInterface, RtcEarMonitoringInterface, RtcDualStreamInterface, - RtcFallbackInterface, RtcTestInterface, RtcMediaMetadataInterface, - RtcWatermarkInterface, RtcEncryptionInterface, RtcAudioRecorderInterface, - RtcInjectStreamInterface, RtcCameraInterface, RtcStreamMessageInterface { - fun create(params: Map, callback: Callback) + interface RtcEngineInterface : RtcUserInfoInterface, RtcAudioInterface, RtcVideoInterface, + RtcAudioMixingInterface, RtcAudioEffectInterface, RtcVoiceChangerInterface, + RtcVoicePositionInterface, RtcPublishStreamInterface, RtcMediaRelayInterface, + RtcAudioRouteInterface, RtcEarMonitoringInterface, RtcDualStreamInterface, + RtcFallbackInterface, RtcTestInterface, RtcMediaMetadataInterface, + RtcWatermarkInterface, RtcEncryptionInterface, RtcAudioRecorderInterface, + RtcInjectStreamInterface, RtcCameraInterface, RtcStreamMessageInterface { + fun create(params: Map, callback: Callback) - fun destroy(callback: Callback) + fun destroy(callback: Callback) - fun setChannelProfile(params: Map, callback: Callback) + fun setChannelProfile(params: Map, callback: Callback) - fun setClientRole(params: Map, callback: Callback) + fun setClientRole(params: Map, callback: Callback) - fun joinChannel(params: Map, callback: Callback) + fun joinChannel(params: Map, callback: Callback) - fun switchChannel(params: Map, callback: Callback) + fun switchChannel(params: Map, callback: Callback) - fun leaveChannel(callback: Callback) + fun leaveChannel(callback: Callback) - fun renewToken(params: Map, callback: Callback) + fun renewToken(params: Map, callback: Callback) - @Deprecated("") - fun enableWebSdkInteroperability(params: Map, callback: Callback) + @Deprecated("") + fun enableWebSdkInteroperability(params: Map, callback: Callback) - fun getConnectionState(callback: Callback) + fun getConnectionState(callback: Callback) - fun sendCustomReportMessage(params: Map, callback: Callback) + fun sendCustomReportMessage(params: Map, callback: Callback) - fun getCallId(callback: Callback) + fun getCallId(callback: Callback) - fun rate(params: Map, callback: Callback) + fun rate(params: Map, callback: Callback) - fun complain(params: Map, callback: Callback) + fun complain(params: Map, callback: Callback) - fun setLogFile(params: Map, callback: Callback) + fun setLogFile(params: Map, callback: Callback) - fun setLogFilter(params: Map, callback: Callback) + fun setLogFilter(params: Map, callback: Callback) - fun setLogFileSize(params: Map, callback: Callback) + fun setLogFileSize(params: Map, callback: Callback) - fun setParameters(params: Map, callback: Callback) + fun setParameters(params: Map, callback: Callback) - fun getNativeHandle(callback: Callback) - } - - interface RtcUserInfoInterface { - fun registerLocalUserAccount(params: Map, callback: Callback) - - fun joinChannelWithUserAccount(params: Map, callback: Callback) - - fun getUserInfoByUserAccount(params: Map, callback: Callback) - - fun getUserInfoByUid(params: Map, callback: Callback) - } - - interface RtcAudioInterface { - fun enableAudio(callback: Callback) - - fun disableAudio(callback: Callback) - - fun setAudioProfile(params: Map, callback: Callback) - - fun adjustRecordingSignalVolume(params: Map, callback: Callback) - - fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) - - fun adjustPlaybackSignalVolume(params: Map, callback: Callback) - - fun enableLocalAudio(params: Map, callback: Callback) - - fun muteLocalAudioStream(params: Map, callback: Callback) - - fun muteRemoteAudioStream(params: Map, callback: Callback) - - fun muteAllRemoteAudioStreams(params: Map, callback: Callback) - - fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) - - fun enableAudioVolumeIndication(params: Map, callback: Callback) - } - - interface RtcVideoInterface { - fun enableVideo(callback: Callback) - - fun disableVideo(callback: Callback) - - fun setVideoEncoderConfiguration(params: Map, callback: Callback) - - fun startPreview(callback: Callback) - - fun stopPreview(callback: Callback) - - fun enableLocalVideo(params: Map, callback: Callback) - - fun muteLocalVideoStream(params: Map, callback: Callback) - - fun muteRemoteVideoStream(params: Map, callback: Callback) - - fun muteAllRemoteVideoStreams(params: Map, callback: Callback) + fun getNativeHandle(callback: Callback) + } - fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) + interface RtcUserInfoInterface { + fun registerLocalUserAccount(params: Map, callback: Callback) - fun setBeautyEffectOptions(params: Map, callback: Callback) - } - - interface RtcAudioMixingInterface { - fun startAudioMixing(params: Map, callback: Callback) - - fun stopAudioMixing(callback: Callback) - - fun pauseAudioMixing(callback: Callback) - - fun resumeAudioMixing(callback: Callback) - - fun adjustAudioMixingVolume(params: Map, callback: Callback) - - fun adjustAudioMixingPlayoutVolume(params: Map, callback: Callback) + fun joinChannelWithUserAccount(params: Map, callback: Callback) - fun adjustAudioMixingPublishVolume(params: Map, callback: Callback) + fun getUserInfoByUserAccount(params: Map, callback: Callback) - fun getAudioMixingPlayoutVolume(callback: Callback) + fun getUserInfoByUid(params: Map, callback: Callback) + } - fun getAudioMixingPublishVolume(callback: Callback) + interface RtcAudioInterface { + fun enableAudio(callback: Callback) - fun getAudioMixingDuration(callback: Callback) + fun disableAudio(callback: Callback) - fun getAudioMixingCurrentPosition(callback: Callback) + fun setAudioProfile(params: Map, callback: Callback) - fun setAudioMixingPosition(params: Map, callback: Callback) + fun adjustRecordingSignalVolume(params: Map, callback: Callback) - fun setAudioMixingPitch(params: Map, callback: Callback) - } - - interface RtcAudioEffectInterface { - fun getEffectsVolume(callback: Callback) - - fun setEffectsVolume(params: Map, callback: Callback) - - fun setVolumeOfEffect(params: Map, callback: Callback) + fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) - fun playEffect(params: Map, callback: Callback) + fun adjustPlaybackSignalVolume(params: Map, callback: Callback) - fun stopEffect(params: Map, callback: Callback) + fun enableLocalAudio(params: Map, callback: Callback) - fun stopAllEffects(callback: Callback) + fun muteLocalAudioStream(params: Map, callback: Callback) - fun preloadEffect(params: Map, callback: Callback) + fun muteRemoteAudioStream(params: Map, callback: Callback) - fun unloadEffect(params: Map, callback: Callback) + fun muteAllRemoteAudioStreams(params: Map, callback: Callback) - fun pauseEffect(params: Map, callback: Callback) + fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) - fun pauseAllEffects(callback: Callback) + fun enableAudioVolumeIndication(params: Map, callback: Callback) + } - fun resumeEffect(params: Map, callback: Callback) - - fun resumeAllEffects(callback: Callback) - - fun setAudioSessionOperationRestriction(params: Map, callback: Callback) - } + interface RtcVideoInterface { + fun enableVideo(callback: Callback) - interface RtcVoiceChangerInterface { - fun setLocalVoiceChanger(params: Map, callback: Callback) + fun disableVideo(callback: Callback) - fun setLocalVoiceReverbPreset(params: Map, callback: Callback) + fun setVideoEncoderConfiguration(params: Map, callback: Callback) - fun setLocalVoicePitch(params: Map, callback: Callback) + fun startPreview(callback: Callback) - fun setLocalVoiceEqualization(params: Map, callback: Callback) + fun stopPreview(callback: Callback) - fun setLocalVoiceReverb(params: Map, callback: Callback) - } + fun enableLocalVideo(params: Map, callback: Callback) - interface RtcVoicePositionInterface { - fun enableSoundPositionIndication(params: Map, callback: Callback) + fun muteLocalVideoStream(params: Map, callback: Callback) - fun setRemoteVoicePosition(params: Map, callback: Callback) - } + fun muteRemoteVideoStream(params: Map, callback: Callback) - interface RtcPublishStreamInterface { - fun setLiveTranscoding(params: Map, callback: Callback) + fun muteAllRemoteVideoStreams(params: Map, callback: Callback) - fun addPublishStreamUrl(params: Map, callback: Callback) + fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) - fun removePublishStreamUrl(params: Map, callback: Callback) - } + fun setBeautyEffectOptions(params: Map, callback: Callback) + } - interface RtcMediaRelayInterface { - fun startChannelMediaRelay(params: Map, callback: Callback) + interface RtcAudioMixingInterface { + fun startAudioMixing(params: Map, callback: Callback) - fun updateChannelMediaRelay(params: Map, callback: Callback) + fun stopAudioMixing(callback: Callback) - fun stopChannelMediaRelay(callback: Callback) - } + fun pauseAudioMixing(callback: Callback) - interface RtcAudioRouteInterface { - fun setDefaultAudioRoutetoSpeakerphone(params: Map, callback: Callback) + fun resumeAudioMixing(callback: Callback) - fun setEnableSpeakerphone(params: Map, callback: Callback) + fun adjustAudioMixingVolume(params: Map, callback: Callback) - fun isSpeakerphoneEnabled(callback: Callback) - } + fun adjustAudioMixingPlayoutVolume(params: Map, callback: Callback) - interface RtcEarMonitoringInterface { - fun enableInEarMonitoring(params: Map, callback: Callback) + fun adjustAudioMixingPublishVolume(params: Map, callback: Callback) - fun setInEarMonitoringVolume(params: Map, callback: Callback) - } + fun getAudioMixingPlayoutVolume(callback: Callback) - interface RtcDualStreamInterface { - fun enableDualStreamMode(params: Map, callback: Callback) + fun getAudioMixingPublishVolume(callback: Callback) - fun setRemoteVideoStreamType(params: Map, callback: Callback) + fun getAudioMixingDuration(callback: Callback) - fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) - } + fun getAudioMixingCurrentPosition(callback: Callback) - interface RtcFallbackInterface { - fun setLocalPublishFallbackOption(params: Map, callback: Callback) + fun setAudioMixingPosition(params: Map, callback: Callback) - fun setRemoteSubscribeFallbackOption(params: Map, callback: Callback) + fun setAudioMixingPitch(params: Map, callback: Callback) + } - fun setRemoteUserPriority(params: Map, callback: Callback) - } + interface RtcAudioEffectInterface { + fun getEffectsVolume(callback: Callback) - interface RtcTestInterface { - fun startEchoTest(params: Map, callback: Callback) + fun setEffectsVolume(params: Map, callback: Callback) - fun stopEchoTest(callback: Callback) + fun setVolumeOfEffect(params: Map, callback: Callback) - fun enableLastmileTest(callback: Callback) + fun playEffect(params: Map, callback: Callback) - fun disableLastmileTest(callback: Callback) + fun stopEffect(params: Map, callback: Callback) - fun startLastmileProbeTest(params: Map, callback: Callback) + fun stopAllEffects(callback: Callback) - fun stopLastmileProbeTest(callback: Callback) - } + fun preloadEffect(params: Map, callback: Callback) - interface RtcMediaMetadataInterface { - fun registerMediaMetadataObserver(callback: Callback) + fun unloadEffect(params: Map, callback: Callback) - fun unregisterMediaMetadataObserver(callback: Callback) + fun pauseEffect(params: Map, callback: Callback) - fun setMaxMetadataSize(params: Map, callback: Callback) + fun pauseAllEffects(callback: Callback) - fun sendMetadata(params: Map, callback: Callback) - } + fun resumeEffect(params: Map, callback: Callback) - interface RtcWatermarkInterface { - fun addVideoWatermark(params: Map, callback: Callback) + fun resumeAllEffects(callback: Callback) - fun clearVideoWatermarks(callback: Callback) - } + fun setAudioSessionOperationRestriction(params: Map, callback: Callback) + } - interface RtcEncryptionInterface { - fun setEncryptionSecret(params: Map, callback: Callback) + interface RtcVoiceChangerInterface { + @Deprecated("") + fun setLocalVoiceChanger(params: Map, callback: Callback) - fun setEncryptionMode(params: Map, callback: Callback) + @Deprecated("") + fun setLocalVoiceReverbPreset(params: Map, callback: Callback) - fun enableEncryption(params: Map, callback: Callback) - } + fun setLocalVoicePitch(params: Map, callback: Callback) - interface RtcAudioRecorderInterface { - fun startAudioRecording(params: Map, callback: Callback) + fun setLocalVoiceEqualization(params: Map, callback: Callback) - fun stopAudioRecording(callback: Callback) - } + fun setLocalVoiceReverb(params: Map, callback: Callback) - interface RtcInjectStreamInterface { - fun addInjectStreamUrl(params: Map, callback: Callback) + fun setAudioEffectPreset(params: Map, callback: Callback) - fun removeInjectStreamUrl(params: Map, callback: Callback) - } + fun setVoiceBeautifierPreset(params: Map, callback: Callback) - interface RtcCameraInterface { - fun switchCamera(callback: Callback) + fun setAudioEffectParameters(params: Map, callback: Callback) + } - fun isCameraZoomSupported(callback: Callback) + interface RtcVoicePositionInterface { + fun enableSoundPositionIndication(params: Map, callback: Callback) - fun isCameraTorchSupported(callback: Callback) + fun setRemoteVoicePosition(params: Map, callback: Callback) + } - fun isCameraFocusSupported(callback: Callback) + interface RtcPublishStreamInterface { + fun setLiveTranscoding(params: Map, callback: Callback) - fun isCameraExposurePositionSupported(callback: Callback) + fun addPublishStreamUrl(params: Map, callback: Callback) - fun isCameraAutoFocusFaceModeSupported(callback: Callback) + fun removePublishStreamUrl(params: Map, callback: Callback) + } - fun setCameraZoomFactor(params: Map, callback: Callback) + interface RtcMediaRelayInterface { + fun startChannelMediaRelay(params: Map, callback: Callback) - fun getCameraMaxZoomFactor(callback: Callback) + fun updateChannelMediaRelay(params: Map, callback: Callback) - fun setCameraFocusPositionInPreview(params: Map, callback: Callback) + fun stopChannelMediaRelay(callback: Callback) + } - fun setCameraExposurePosition(params: Map, callback: Callback) + interface RtcAudioRouteInterface { + fun setDefaultAudioRoutetoSpeakerphone(params: Map, callback: Callback) - fun enableFaceDetection(params: Map, callback: Callback) + fun setEnableSpeakerphone(params: Map, callback: Callback) - fun setCameraTorchOn(params: Map, callback: Callback) + fun isSpeakerphoneEnabled(callback: Callback) + } - fun setCameraAutoFocusFaceModeEnabled(params: Map, callback: Callback) + interface RtcEarMonitoringInterface { + fun enableInEarMonitoring(params: Map, callback: Callback) - fun setCameraCapturerConfiguration(params: Map, callback: Callback) - } - - interface RtcStreamMessageInterface { - fun createDataStream(params: Map, callback: Callback) - - fun sendStreamMessage(params: Map, callback: Callback) - } -} - -class RtcEngineManager( - private val emit: (methodName: String, data: Map?) -> Unit -) : IRtcEngine.RtcEngineInterface { - var engine: RtcEngine? = null - private set - private var mediaObserver: MediaObserver? = null - - fun release() { - RtcEngine.destroy() - engine = null - mediaObserver = null - } - - override fun create(params: Map, callback: Callback) { - engine = RtcEngineEx.create(RtcEngineConfig().apply { - mContext = params["context"] as Context - mAppId = params["appId"] as String - mAreaCode = (params["areaCode"] as Number).toInt() - mEventHandler = RtcEngineEventHandler { methodName, data -> - emit(methodName, data) - } - }) - callback.code((engine as RtcEngineEx).setAppType((params["appType"] as Number).toInt())) - } - - override fun destroy(callback: Callback) { - callback.resolve(engine) { release() } - } - - override fun setChannelProfile(params: Map, callback: Callback) { - callback.code(engine?.setChannelProfile((params["profile"] as Number).toInt())) - } - - override fun setClientRole(params: Map, callback: Callback) { - callback.code(engine?.setClientRole((params["role"] as Number).toInt())) - } - - override fun joinChannel(params: Map, callback: Callback) { - callback.code(engine?.joinChannel(params["token"] as? String, params["channelName"] as String, params["optionalInfo"] as? String, (params["optionalUid"] as Number).toInt())) - } - - override fun switchChannel(params: Map, callback: Callback) { - callback.code(engine?.switchChannel(params["token"] as? String, params["channelName"] as String)) - } - - override fun leaveChannel(callback: Callback) { - callback.code(engine?.leaveChannel()) - } - - override fun renewToken(params: Map, callback: Callback) { - callback.code(engine?.renewToken(params["token"] as String)) - } - - override fun enableWebSdkInteroperability(params: Map, callback: Callback) { - callback.code(engine?.enableWebSdkInteroperability(params["enabled"] as Boolean)) - } - - override fun getConnectionState(callback: Callback) { - callback.resolve(engine) { it.connectionState } - } - - override fun sendCustomReportMessage(params: Map, callback: Callback) { - callback.code(engine?.sendCustomReportMessage(params["id"] as String, params["category"] as String, params["event"] as String, params["label"] as String, (params["value"] as Number).toInt())) - } - - override fun getCallId(callback: Callback) { - callback.resolve(engine) { it.callId } - } - - override fun rate(params: Map, callback: Callback) { - callback.code(engine?.rate(params["callId"] as String, (params["rating"] as Number).toInt(), params["description"] as? String)) - } - - override fun complain(params: Map, callback: Callback) { - callback.code(engine?.complain(params["callId"] as String, params["description"] as String)) - } - - override fun setLogFile(params: Map, callback: Callback) { - callback.code(engine?.setLogFile(params["filePath"] as String)) - } - - override fun setLogFilter(params: Map, callback: Callback) { - callback.code(engine?.setLogFilter((params["filter"] as Number).toInt())) - } - - override fun setLogFileSize(params: Map, callback: Callback) { - callback.code(engine?.setLogFileSize((params["fileSizeInKBytes"] as Number).toInt())) - } - - override fun setParameters(params: Map, callback: Callback) { - callback.code(engine?.setParameters(params["parameters"] as String)) - } - - override fun getNativeHandle(callback: Callback) { - callback.resolve(engine) { it.nativeHandle } - } - - override fun registerLocalUserAccount(params: Map, callback: Callback) { - callback.code(engine?.registerLocalUserAccount(params["appId"] as String, params["userAccount"] as String)) - } - - override fun joinChannelWithUserAccount(params: Map, callback: Callback) { - callback.code(engine?.joinChannelWithUserAccount(params["token"] as? String, params["channelName"] as String, params["userAccount"] as String)) - } - - override fun getUserInfoByUserAccount(params: Map, callback: Callback) { - callback.resolve(engine) { - val userInfo = UserInfo() - it.getUserInfoByUserAccount(params["userAccount"] as String, userInfo) - userInfo.toMap() - } - } - - override fun getUserInfoByUid(params: Map, callback: Callback) { - callback.resolve(engine) { - val userInfo = UserInfo() - it.getUserInfoByUid((params["uid"] as Number).toInt(), userInfo) - userInfo.toMap() - } - } + fun setInEarMonitoringVolume(params: Map, callback: Callback) + } - override fun enableAudio(callback: Callback) { - callback.code(engine?.enableAudio()) - } + interface RtcDualStreamInterface { + fun enableDualStreamMode(params: Map, callback: Callback) - override fun disableAudio(callback: Callback) { - callback.code(engine?.disableAudio()) - } + fun setRemoteVideoStreamType(params: Map, callback: Callback) - override fun setAudioProfile(params: Map, callback: Callback) { - callback.code(engine?.setAudioProfile((params["profile"] as Number).toInt(), (params["scenario"] as Number).toInt())) - } + fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) + } - override fun adjustRecordingSignalVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustRecordingSignalVolume((params["volume"] as Number).toInt())) - } + interface RtcFallbackInterface { + fun setLocalPublishFallbackOption(params: Map, callback: Callback) - override fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustUserPlaybackSignalVolume((params["uid"] as Number).toInt(), (params["volume"] as Number).toInt())) - } + fun setRemoteSubscribeFallbackOption(params: Map, callback: Callback) - override fun adjustPlaybackSignalVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustPlaybackSignalVolume((params["volume"] as Number).toInt())) - } + fun setRemoteUserPriority(params: Map, callback: Callback) + } - override fun enableLocalAudio(params: Map, callback: Callback) { - callback.code(engine?.enableLocalAudio(params["enabled"] as Boolean)) - } + interface RtcTestInterface { + fun startEchoTest(params: Map, callback: Callback) - override fun muteLocalAudioStream(params: Map, callback: Callback) { - callback.code(engine?.muteLocalAudioStream(params["muted"] as Boolean)) - } + fun stopEchoTest(callback: Callback) - override fun muteRemoteAudioStream(params: Map, callback: Callback) { - callback.code(engine?.muteRemoteAudioStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) - } + fun enableLastmileTest(callback: Callback) - override fun muteAllRemoteAudioStreams(params: Map, callback: Callback) { - callback.code(engine?.muteAllRemoteAudioStreams(params["muted"] as Boolean)) - } + fun disableLastmileTest(callback: Callback) - override fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) { - callback.code(engine?.setDefaultMuteAllRemoteAudioStreams(params["muted"] as Boolean)) - } + fun startLastmileProbeTest(params: Map, callback: Callback) - override fun enableAudioVolumeIndication(params: Map, callback: Callback) { - callback.code(engine?.enableAudioVolumeIndication((params["interval"] as Number).toInt(), (params["smooth"] as Number).toInt(), params["report_vad"] as Boolean)) - } + fun stopLastmileProbeTest(callback: Callback) + } - override fun enableVideo(callback: Callback) { - callback.code(engine?.enableVideo()) - } + interface RtcMediaMetadataInterface { + fun registerMediaMetadataObserver(callback: Callback) - override fun disableVideo(callback: Callback) { - callback.code(engine?.disableVideo()) - } + fun unregisterMediaMetadataObserver(callback: Callback) - override fun setVideoEncoderConfiguration(params: Map, callback: Callback) { - callback.code(engine?.setVideoEncoderConfiguration(mapToVideoEncoderConfiguration(params["config"] as Map<*, *>))) - } + fun setMaxMetadataSize(params: Map, callback: Callback) - override fun startPreview(callback: Callback) { - callback.code(engine?.startPreview()) - } + fun sendMetadata(params: Map, callback: Callback) + } - override fun stopPreview(callback: Callback) { - callback.code(engine?.stopPreview()) - } + interface RtcWatermarkInterface { + fun addVideoWatermark(params: Map, callback: Callback) - override fun enableLocalVideo(params: Map, callback: Callback) { - callback.code(engine?.enableLocalVideo(params["enabled"] as Boolean)) - } + fun clearVideoWatermarks(callback: Callback) + } - override fun muteLocalVideoStream(params: Map, callback: Callback) { - callback.code(engine?.muteLocalVideoStream(params["muted"] as Boolean)) - } + interface RtcEncryptionInterface { + @Deprecated("") + fun setEncryptionSecret(params: Map, callback: Callback) - override fun muteRemoteVideoStream(params: Map, callback: Callback) { - callback.code(engine?.muteRemoteVideoStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) - } + @Deprecated("") + fun setEncryptionMode(params: Map, callback: Callback) - override fun muteAllRemoteVideoStreams(params: Map, callback: Callback) { - callback.code(engine?.muteAllRemoteVideoStreams(params["muted"] as Boolean)) - } + fun enableEncryption(params: Map, callback: Callback) + } - override fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) { - callback.code(engine?.setDefaultMuteAllRemoteVideoStreams(params["muted"] as Boolean)) - } + interface RtcAudioRecorderInterface { + fun startAudioRecording(params: Map, callback: Callback) - override fun setBeautyEffectOptions(params: Map, callback: Callback) { - callback.code(engine?.setBeautyEffectOptions(params["enabled"] as Boolean, mapToBeautyOptions(params["options"] as Map<*, *>))) - } + fun stopAudioRecording(callback: Callback) + } - override fun startAudioMixing(params: Map, callback: Callback) { - callback.code(engine?.startAudioMixing(params["filePath"] as String, params["loopback"] as Boolean, params["replace"] as Boolean, (params["cycle"] as Number).toInt())) - } + interface RtcInjectStreamInterface { + fun addInjectStreamUrl(params: Map, callback: Callback) - override fun stopAudioMixing(callback: Callback) { - callback.code(engine?.stopAudioMixing()) - } + fun removeInjectStreamUrl(params: Map, callback: Callback) + } - override fun pauseAudioMixing(callback: Callback) { - callback.code(engine?.pauseAudioMixing()) - } + interface RtcCameraInterface { + fun switchCamera(callback: Callback) - override fun resumeAudioMixing(callback: Callback) { - callback.code(engine?.resumeAudioMixing()) - } + fun isCameraZoomSupported(callback: Callback) - override fun adjustAudioMixingVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustAudioMixingVolume((params["volume"] as Number).toInt())) - } + fun isCameraTorchSupported(callback: Callback) - override fun adjustAudioMixingPlayoutVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustAudioMixingPlayoutVolume((params["volume"] as Number).toInt())) - } + fun isCameraFocusSupported(callback: Callback) - override fun adjustAudioMixingPublishVolume(params: Map, callback: Callback) { - callback.code(engine?.adjustAudioMixingPublishVolume((params["volume"] as Number).toInt())) - } + fun isCameraExposurePositionSupported(callback: Callback) - override fun getAudioMixingPlayoutVolume(callback: Callback) { - callback.code(engine?.audioMixingPlayoutVolume) { it } - } + fun isCameraAutoFocusFaceModeSupported(callback: Callback) - override fun getAudioMixingPublishVolume(callback: Callback) { - callback.code(engine?.audioMixingPublishVolume) { it } - } + fun setCameraZoomFactor(params: Map, callback: Callback) - override fun getAudioMixingDuration(callback: Callback) { - callback.code(engine?.audioMixingDuration) { it } - } + fun getCameraMaxZoomFactor(callback: Callback) - override fun getAudioMixingCurrentPosition(callback: Callback) { - callback.code(engine?.audioMixingCurrentPosition) { it } - } + fun setCameraFocusPositionInPreview(params: Map, callback: Callback) - override fun setAudioMixingPosition(params: Map, callback: Callback) { - callback.code(engine?.setAudioMixingPosition((params["pos"] as Number).toInt())) - } + fun setCameraExposurePosition(params: Map, callback: Callback) - override fun setAudioMixingPitch(params: Map, callback: Callback) { - callback.code(engine?.setAudioMixingPitch((params["pitch"] as Number).toInt())) - } + fun enableFaceDetection(params: Map, callback: Callback) - override fun getEffectsVolume(callback: Callback) { - callback.resolve(engine) { it.audioEffectManager.effectsVolume } - } + fun setCameraTorchOn(params: Map, callback: Callback) - override fun setEffectsVolume(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.setEffectsVolume((params["volume"] as Number).toDouble())) - } + fun setCameraAutoFocusFaceModeEnabled(params: Map, callback: Callback) - override fun setVolumeOfEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.setVolumeOfEffect((params["soundId"] as Number).toInt(), (params["volume"] as Number).toDouble())) - } + fun setCameraCapturerConfiguration(params: Map, callback: Callback) + } - override fun playEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.playEffect((params["soundId"] as Number).toInt(), params["filePath"] as String, (params["loopCount"] as Number).toInt(), (params["pitch"] as Number).toDouble(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble(), params["publish"] as Boolean)) - } + interface RtcStreamMessageInterface { + fun createDataStream(params: Map, callback: Callback) - override fun stopEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.stopEffect((params["soundId"] as Number).toInt())) - } + fun sendStreamMessage(params: Map, callback: Callback) + } +} - override fun stopAllEffects(callback: Callback) { - callback.code(engine?.audioEffectManager?.stopAllEffects()) - } +class RtcEngineManager( + private val emit: (methodName: String, data: Map?) -> Unit +) : IRtcEngine.RtcEngineInterface { + var engine: RtcEngine? = null + private set + private var mediaObserver: MediaObserver? = null + + fun release() { + RtcEngine.destroy() + engine = null + mediaObserver = null + } + + override fun create(params: Map, callback: Callback) { + engine = RtcEngineEx.create(RtcEngineConfig().apply { + mContext = params["context"] as Context + mAppId = params["appId"] as String + mAreaCode = (params["areaCode"] as Number).toInt() + mEventHandler = RtcEngineEventHandler { methodName, data -> + emit(methodName, data) + } + }) + callback.code((engine as RtcEngineEx).setAppType((params["appType"] as Number).toInt())) + } + + override fun destroy(callback: Callback) { + callback.resolve(engine) { release() } + } + + override fun setChannelProfile(params: Map, callback: Callback) { + callback.code(engine?.setChannelProfile((params["profile"] as Number).toInt())) + } + + override fun setClientRole(params: Map, callback: Callback) { + callback.code(engine?.setClientRole((params["role"] as Number).toInt())) + } + + override fun joinChannel(params: Map, callback: Callback) { + callback.code(engine?.joinChannel(params["token"] as? String, params["channelName"] as String, params["optionalInfo"] as? String, (params["optionalUid"] as Number).toInt())) + } + + override fun switchChannel(params: Map, callback: Callback) { + callback.code(engine?.switchChannel(params["token"] as? String, params["channelName"] as String)) + } + + override fun leaveChannel(callback: Callback) { + callback.code(engine?.leaveChannel()) + } + + override fun renewToken(params: Map, callback: Callback) { + callback.code(engine?.renewToken(params["token"] as String)) + } + + override fun enableWebSdkInteroperability(params: Map, callback: Callback) { + callback.code(engine?.enableWebSdkInteroperability(params["enabled"] as Boolean)) + } + + override fun getConnectionState(callback: Callback) { + callback.resolve(engine) { it.connectionState } + } + + override fun sendCustomReportMessage(params: Map, callback: Callback) { + callback.code(engine?.sendCustomReportMessage(params["id"] as String, params["category"] as String, params["event"] as String, params["label"] as String, (params["value"] as Number).toInt())) + } + + override fun getCallId(callback: Callback) { + callback.resolve(engine) { it.callId } + } + + override fun rate(params: Map, callback: Callback) { + callback.code(engine?.rate(params["callId"] as String, (params["rating"] as Number).toInt(), params["description"] as? String)) + } + + override fun complain(params: Map, callback: Callback) { + callback.code(engine?.complain(params["callId"] as String, params["description"] as String)) + } + + override fun setLogFile(params: Map, callback: Callback) { + callback.code(engine?.setLogFile(params["filePath"] as String)) + } + + override fun setLogFilter(params: Map, callback: Callback) { + callback.code(engine?.setLogFilter((params["filter"] as Number).toInt())) + } + + override fun setLogFileSize(params: Map, callback: Callback) { + callback.code(engine?.setLogFileSize((params["fileSizeInKBytes"] as Number).toInt())) + } + + override fun setParameters(params: Map, callback: Callback) { + callback.code(engine?.setParameters(params["parameters"] as String)) + } + + override fun getNativeHandle(callback: Callback) { + callback.resolve(engine) { it.nativeHandle } + } + + override fun registerLocalUserAccount(params: Map, callback: Callback) { + callback.code(engine?.registerLocalUserAccount(params["appId"] as String, params["userAccount"] as String)) + } + + override fun joinChannelWithUserAccount(params: Map, callback: Callback) { + callback.code(engine?.joinChannelWithUserAccount(params["token"] as? String, params["channelName"] as String, params["userAccount"] as String)) + } + + override fun getUserInfoByUserAccount(params: Map, callback: Callback) { + callback.resolve(engine) { + val userInfo = UserInfo() + it.getUserInfoByUserAccount(params["userAccount"] as String, userInfo) + userInfo.toMap() + } + } + + override fun getUserInfoByUid(params: Map, callback: Callback) { + callback.resolve(engine) { + val userInfo = UserInfo() + it.getUserInfoByUid((params["uid"] as Number).toInt(), userInfo) + userInfo.toMap() + } + } - override fun preloadEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.preloadEffect((params["soundId"] as Number).toInt(), params["filePath"] as String)) - } + override fun enableAudio(callback: Callback) { + callback.code(engine?.enableAudio()) + } - override fun unloadEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.unloadEffect((params["soundId"] as Number).toInt())) - } + override fun disableAudio(callback: Callback) { + callback.code(engine?.disableAudio()) + } - override fun pauseEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.pauseEffect((params["soundId"] as Number).toInt())) - } + override fun setAudioProfile(params: Map, callback: Callback) { + callback.code(engine?.setAudioProfile((params["profile"] as Number).toInt(), (params["scenario"] as Number).toInt())) + } - override fun pauseAllEffects(callback: Callback) { - callback.code(engine?.audioEffectManager?.pauseAllEffects()) - } + override fun adjustRecordingSignalVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustRecordingSignalVolume((params["volume"] as Number).toInt())) + } - override fun resumeEffect(params: Map, callback: Callback) { - callback.code(engine?.audioEffectManager?.resumeEffect((params["soundId"] as Number).toInt())) - } + override fun adjustUserPlaybackSignalVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustUserPlaybackSignalVolume((params["uid"] as Number).toInt(), (params["volume"] as Number).toInt())) + } - override fun resumeAllEffects(callback: Callback) { - callback.code(engine?.audioEffectManager?.resumeAllEffects()) - } + override fun adjustPlaybackSignalVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustPlaybackSignalVolume((params["volume"] as Number).toInt())) + } - override fun setAudioSessionOperationRestriction(params: Map, callback: Callback) { - callback.code(-Constants.ERR_NOT_SUPPORTED) - } + override fun enableLocalAudio(params: Map, callback: Callback) { + callback.code(engine?.enableLocalAudio(params["enabled"] as Boolean)) + } - override fun setLocalVoiceChanger(params: Map, callback: Callback) { - callback.code(engine?.setLocalVoiceChanger((params["voiceChanger"] as Number).toInt())) - } + override fun muteLocalAudioStream(params: Map, callback: Callback) { + callback.code(engine?.muteLocalAudioStream(params["muted"] as Boolean)) + } - override fun setLocalVoiceReverbPreset(params: Map, callback: Callback) { - callback.code(engine?.setLocalVoiceReverbPreset((params["preset"] as Number).toInt())) - } + override fun muteRemoteAudioStream(params: Map, callback: Callback) { + callback.code(engine?.muteRemoteAudioStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) + } - override fun setLocalVoicePitch(params: Map, callback: Callback) { - callback.code(engine?.setLocalVoicePitch((params["pitch"] as Number).toDouble())) - } + override fun muteAllRemoteAudioStreams(params: Map, callback: Callback) { + callback.code(engine?.muteAllRemoteAudioStreams(params["muted"] as Boolean)) + } - override fun setLocalVoiceEqualization(params: Map, callback: Callback) { - callback.code(engine?.setLocalVoiceEqualization((params["bandFrequency"] as Number).toInt(), (params["bandGain"] as Number).toInt())) - } + override fun setDefaultMuteAllRemoteAudioStreams(params: Map, callback: Callback) { + callback.code(engine?.setDefaultMuteAllRemoteAudioStreams(params["muted"] as Boolean)) + } - override fun setLocalVoiceReverb(params: Map, callback: Callback) { - callback.code(engine?.setLocalVoiceReverb((params["reverbKey"] as Number).toInt(), (params["value"] as Number).toInt())) - } + override fun enableAudioVolumeIndication(params: Map, callback: Callback) { + callback.code(engine?.enableAudioVolumeIndication((params["interval"] as Number).toInt(), (params["smooth"] as Number).toInt(), params["report_vad"] as Boolean)) + } - override fun enableSoundPositionIndication(params: Map, callback: Callback) { - callback.code(engine?.enableSoundPositionIndication(params["enabled"] as Boolean)) - } + override fun enableVideo(callback: Callback) { + callback.code(engine?.enableVideo()) + } - override fun setRemoteVoicePosition(params: Map, callback: Callback) { - callback.code(engine?.setRemoteVoicePosition((params["uid"] as Number).toInt(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble())) - } + override fun disableVideo(callback: Callback) { + callback.code(engine?.disableVideo()) + } - override fun setLiveTranscoding(params: Map, callback: Callback) { - callback.code(engine?.setLiveTranscoding(mapToLiveTranscoding(params["transcoding"] as Map<*, *>))) - } + override fun setVideoEncoderConfiguration(params: Map, callback: Callback) { + callback.code(engine?.setVideoEncoderConfiguration(mapToVideoEncoderConfiguration(params["config"] as Map<*, *>))) + } - override fun addPublishStreamUrl(params: Map, callback: Callback) { - callback.code(engine?.addPublishStreamUrl(params["url"] as String, params["transcodingEnabled"] as Boolean)) - } + override fun startPreview(callback: Callback) { + callback.code(engine?.startPreview()) + } - override fun removePublishStreamUrl(params: Map, callback: Callback) { - callback.code(engine?.removePublishStreamUrl(params["url"] as String)) - } + override fun stopPreview(callback: Callback) { + callback.code(engine?.stopPreview()) + } - override fun startChannelMediaRelay(params: Map, callback: Callback) { - callback.code(engine?.startChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) - } + override fun enableLocalVideo(params: Map, callback: Callback) { + callback.code(engine?.enableLocalVideo(params["enabled"] as Boolean)) + } - override fun updateChannelMediaRelay(params: Map, callback: Callback) { - callback.code(engine?.updateChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) - } + override fun muteLocalVideoStream(params: Map, callback: Callback) { + callback.code(engine?.muteLocalVideoStream(params["muted"] as Boolean)) + } - override fun stopChannelMediaRelay(callback: Callback) { - callback.code(engine?.stopChannelMediaRelay()) - } + override fun muteRemoteVideoStream(params: Map, callback: Callback) { + callback.code(engine?.muteRemoteVideoStream((params["uid"] as Number).toInt(), params["muted"] as Boolean)) + } - override fun setDefaultAudioRoutetoSpeakerphone(params: Map, callback: Callback) { - callback.code(engine?.setDefaultAudioRoutetoSpeakerphone(params["defaultToSpeaker"] as Boolean)) - } + override fun muteAllRemoteVideoStreams(params: Map, callback: Callback) { + callback.code(engine?.muteAllRemoteVideoStreams(params["muted"] as Boolean)) + } - override fun setEnableSpeakerphone(params: Map, callback: Callback) { - callback.code(engine?.setEnableSpeakerphone(params["enabled"] as Boolean)) - } + override fun setDefaultMuteAllRemoteVideoStreams(params: Map, callback: Callback) { + callback.code(engine?.setDefaultMuteAllRemoteVideoStreams(params["muted"] as Boolean)) + } - override fun isSpeakerphoneEnabled(callback: Callback) { - callback.resolve(engine) { it.isSpeakerphoneEnabled } - } + override fun setBeautyEffectOptions(params: Map, callback: Callback) { + callback.code(engine?.setBeautyEffectOptions(params["enabled"] as Boolean, mapToBeautyOptions(params["options"] as Map<*, *>))) + } - override fun enableInEarMonitoring(params: Map, callback: Callback) { - callback.code(engine?.enableInEarMonitoring(params["enabled"] as Boolean)) - } + override fun startAudioMixing(params: Map, callback: Callback) { + callback.code(engine?.startAudioMixing(params["filePath"] as String, params["loopback"] as Boolean, params["replace"] as Boolean, (params["cycle"] as Number).toInt())) + } - override fun setInEarMonitoringVolume(params: Map, callback: Callback) { - callback.code(engine?.setInEarMonitoringVolume((params["volume"] as Number).toInt())) - } + override fun stopAudioMixing(callback: Callback) { + callback.code(engine?.stopAudioMixing()) + } - override fun enableDualStreamMode(params: Map, callback: Callback) { - callback.code(engine?.enableDualStreamMode(params["enabled"] as Boolean)) - } + override fun pauseAudioMixing(callback: Callback) { + callback.code(engine?.pauseAudioMixing()) + } - override fun setRemoteVideoStreamType(params: Map, callback: Callback) { - callback.code(engine?.setRemoteVideoStreamType((params["uid"] as Number).toInt(), (params["streamType"] as Number).toInt())) - } + override fun resumeAudioMixing(callback: Callback) { + callback.code(engine?.resumeAudioMixing()) + } - override fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) { - callback.code(engine?.setRemoteDefaultVideoStreamType((params["streamType"] as Number).toInt())) - } + override fun adjustAudioMixingVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustAudioMixingVolume((params["volume"] as Number).toInt())) + } - override fun setLocalPublishFallbackOption(params: Map, callback: Callback) { - callback.code(engine?.setLocalPublishFallbackOption((params["option"] as Number).toInt())) - } + override fun adjustAudioMixingPlayoutVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustAudioMixingPlayoutVolume((params["volume"] as Number).toInt())) + } - override fun setRemoteSubscribeFallbackOption(params: Map, callback: Callback) { - callback.code(engine?.setRemoteSubscribeFallbackOption((params["option"] as Number).toInt())) - } + override fun adjustAudioMixingPublishVolume(params: Map, callback: Callback) { + callback.code(engine?.adjustAudioMixingPublishVolume((params["volume"] as Number).toInt())) + } - override fun setRemoteUserPriority(params: Map, callback: Callback) { - callback.code(engine?.setRemoteUserPriority((params["uid"] as Number).toInt(), (params["userPriority"] as Number).toInt())) - } + override fun getAudioMixingPlayoutVolume(callback: Callback) { + callback.code(engine?.audioMixingPlayoutVolume) { it } + } - override fun startEchoTest(params: Map, callback: Callback) { - callback.code(engine?.startEchoTest((params["intervalInSeconds"] as Number).toInt())) - } + override fun getAudioMixingPublishVolume(callback: Callback) { + callback.code(engine?.audioMixingPublishVolume) { it } + } - override fun stopEchoTest(callback: Callback) { - callback.code(engine?.stopEchoTest()) - } + override fun getAudioMixingDuration(callback: Callback) { + callback.code(engine?.audioMixingDuration) { it } + } - override fun enableLastmileTest(callback: Callback) { - callback.code(engine?.enableLastmileTest()) - } + override fun getAudioMixingCurrentPosition(callback: Callback) { + callback.code(engine?.audioMixingCurrentPosition) { it } + } - override fun disableLastmileTest(callback: Callback) { - callback.code(engine?.disableLastmileTest()) - } + override fun setAudioMixingPosition(params: Map, callback: Callback) { + callback.code(engine?.setAudioMixingPosition((params["pos"] as Number).toInt())) + } - override fun startLastmileProbeTest(params: Map, callback: Callback) { - callback.code(engine?.startLastmileProbeTest(mapToLastmileProbeConfig(params["config"] as Map<*, *>))) - } + override fun setAudioMixingPitch(params: Map, callback: Callback) { + callback.code(engine?.setAudioMixingPitch((params["pitch"] as Number).toInt())) + } - override fun stopLastmileProbeTest(callback: Callback) { - callback.code(engine?.stopLastmileProbeTest()) - } + override fun getEffectsVolume(callback: Callback) { + callback.resolve(engine) { it.audioEffectManager.effectsVolume } + } - override fun registerMediaMetadataObserver(callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - engine?.let { - val mediaObserver = MediaObserver { data -> - emit(RtcEngineEvents.MetadataReceived, data) - } - code = it.registerMediaMetadataObserver(mediaObserver, IMetadataObserver.VIDEO_METADATA) - if (code == 0) this.mediaObserver = mediaObserver - } - callback.code(code) - } + override fun setEffectsVolume(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.setEffectsVolume((params["volume"] as Number).toDouble())) + } - override fun unregisterMediaMetadataObserver(callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - engine?.let { - code = it.registerMediaMetadataObserver(null, IMetadataObserver.VIDEO_METADATA) - if (code == 0) mediaObserver = null - } - callback.code(code) - } + override fun setVolumeOfEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.setVolumeOfEffect((params["soundId"] as Number).toInt(), (params["volume"] as Number).toDouble())) + } - override fun setMaxMetadataSize(params: Map, callback: Callback) { - callback.resolve(mediaObserver) { - it.maxMetadataSize = (params["size"] as Number).toInt() - Unit - } - } + override fun playEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.playEffect((params["soundId"] as Number).toInt(), params["filePath"] as String, (params["loopCount"] as Number).toInt(), (params["pitch"] as Number).toDouble(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble(), params["publish"] as Boolean)) + } - override fun sendMetadata(params: Map, callback: Callback) { - callback.resolve(mediaObserver) { - it.addMetadata(params["metadata"] as String) - } - } + override fun stopEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.stopEffect((params["soundId"] as Number).toInt())) + } - override fun addVideoWatermark(params: Map, callback: Callback) { - callback.code(engine?.addVideoWatermark(params["watermarkUrl"] as String, mapToWatermarkOptions(params["options"] as Map<*, *>))) - } + override fun stopAllEffects(callback: Callback) { + callback.code(engine?.audioEffectManager?.stopAllEffects()) + } - override fun clearVideoWatermarks(callback: Callback) { - callback.code(engine?.clearVideoWatermarks()) - } + override fun preloadEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.preloadEffect((params["soundId"] as Number).toInt(), params["filePath"] as String)) + } - override fun setEncryptionSecret(params: Map, callback: Callback) { - callback.code(engine?.setEncryptionSecret(params["secret"] as String)) - } + override fun unloadEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.unloadEffect((params["soundId"] as Number).toInt())) + } - override fun setEncryptionMode(params: Map, callback: Callback) { - callback.code(engine?.setEncryptionMode(when ((params["encryptionMode"] as Number).toInt()) { - EncryptionConfig.EncryptionMode.AES_128_XTS.value -> "aes-128-xts" - EncryptionConfig.EncryptionMode.AES_128_ECB.value -> "aes-128-ecb" - EncryptionConfig.EncryptionMode.AES_256_XTS.value -> "aes-256-xts" - else -> "" - })) - } + override fun pauseEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.pauseEffect((params["soundId"] as Number).toInt())) + } - override fun enableEncryption(params: Map, callback: Callback) { - callback.code(engine?.enableEncryption(params["enabled"] as Boolean, mapToEncryptionConfig(params["config"] as Map<*, *>))) - } + override fun pauseAllEffects(callback: Callback) { + callback.code(engine?.audioEffectManager?.pauseAllEffects()) + } - override fun startAudioRecording(params: Map, callback: Callback) { - callback.code(engine?.startAudioRecording(params["filePath"] as String, (params["sampleRate"] as Number).toInt(), (params["quality"] as Number).toInt())) - } + override fun resumeEffect(params: Map, callback: Callback) { + callback.code(engine?.audioEffectManager?.resumeEffect((params["soundId"] as Number).toInt())) + } - override fun stopAudioRecording(callback: Callback) { - callback.code(engine?.stopAudioRecording()) - } + override fun resumeAllEffects(callback: Callback) { + callback.code(engine?.audioEffectManager?.resumeAllEffects()) + } - override fun addInjectStreamUrl(params: Map, callback: Callback) { - callback.code(engine?.addInjectStreamUrl(params["url"] as String, mapToLiveInjectStreamConfig(params["config"] as Map<*, *>))) - } + override fun setAudioSessionOperationRestriction(params: Map, callback: Callback) { + callback.code(-Constants.ERR_NOT_SUPPORTED) + } - override fun removeInjectStreamUrl(params: Map, callback: Callback) { - callback.code(engine?.removeInjectStreamUrl(params["url"] as String)) - } + override fun setLocalVoiceChanger(params: Map, callback: Callback) { + callback.code(engine?.setLocalVoiceChanger((params["voiceChanger"] as Number).toInt())) + } - override fun switchCamera(callback: Callback) { - callback.code(engine?.switchCamera()) - } + override fun setLocalVoiceReverbPreset(params: Map, callback: Callback) { + callback.code(engine?.setLocalVoiceReverbPreset((params["preset"] as Number).toInt())) + } - override fun isCameraZoomSupported(callback: Callback) { - callback.resolve(engine) { it.isCameraZoomSupported } - } + override fun setLocalVoicePitch(params: Map, callback: Callback) { + callback.code(engine?.setLocalVoicePitch((params["pitch"] as Number).toDouble())) + } - override fun isCameraTorchSupported(callback: Callback) { - callback.resolve(engine) { it.isCameraTorchSupported } - } + override fun setLocalVoiceEqualization(params: Map, callback: Callback) { + callback.code(engine?.setLocalVoiceEqualization((params["bandFrequency"] as Number).toInt(), (params["bandGain"] as Number).toInt())) + } - override fun isCameraFocusSupported(callback: Callback) { - callback.resolve(engine) { it.isCameraFocusSupported } - } + override fun setLocalVoiceReverb(params: Map, callback: Callback) { + callback.code(engine?.setLocalVoiceReverb((params["reverbKey"] as Number).toInt(), (params["value"] as Number).toInt())) + } - override fun isCameraExposurePositionSupported(callback: Callback) { - callback.resolve(engine) { it.isCameraExposurePositionSupported } - } + override fun setAudioEffectPreset(params: Map, callback: Callback) { + callback.code(engine?.setAudioEffectPreset((params["preset"] as Number).toInt())) + } - override fun isCameraAutoFocusFaceModeSupported(callback: Callback) { - callback.resolve(engine) { it.isCameraAutoFocusFaceModeSupported } - } + override fun setVoiceBeautifierPreset(params: Map, callback: Callback) { + callback.code(engine?.setVoiceBeautifierPreset((params["preset"] as Number).toInt())) + } - override fun setCameraZoomFactor(params: Map, callback: Callback) { - callback.code(engine?.setCameraZoomFactor((params["factor"] as Number).toFloat())) - } + override fun setAudioEffectParameters(params: Map, callback: Callback) { + callback.code(engine?.setAudioEffectParameters((params["preset"] as Number).toInt(), (params["param1"] as Number).toInt(), (params["param2"] as Number).toInt())) + } - override fun getCameraMaxZoomFactor(callback: Callback) { - callback.resolve(engine) { it.cameraMaxZoomFactor } - } + override fun enableSoundPositionIndication(params: Map, callback: Callback) { + callback.code(engine?.enableSoundPositionIndication(params["enabled"] as Boolean)) + } - override fun setCameraFocusPositionInPreview(params: Map, callback: Callback) { - callback.code(engine?.setCameraFocusPositionInPreview((params["positionX"] as Number).toFloat(), (params["positionY"] as Number).toFloat())) - } + override fun setRemoteVoicePosition(params: Map, callback: Callback) { + callback.code(engine?.setRemoteVoicePosition((params["uid"] as Number).toInt(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble())) + } + + override fun setLiveTranscoding(params: Map, callback: Callback) { + callback.code(engine?.setLiveTranscoding(mapToLiveTranscoding(params["transcoding"] as Map<*, *>))) + } - override fun setCameraExposurePosition(params: Map, callback: Callback) { - callback.code(engine?.setCameraExposurePosition((params["positionXinView"] as Number).toFloat(), (params["positionYinView"] as Number).toFloat())) - } + override fun addPublishStreamUrl(params: Map, callback: Callback) { + callback.code(engine?.addPublishStreamUrl(params["url"] as String, params["transcodingEnabled"] as Boolean)) + } + + override fun removePublishStreamUrl(params: Map, callback: Callback) { + callback.code(engine?.removePublishStreamUrl(params["url"] as String)) + } + + override fun startChannelMediaRelay(params: Map, callback: Callback) { + callback.code(engine?.startChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) + } + + override fun updateChannelMediaRelay(params: Map, callback: Callback) { + callback.code(engine?.updateChannelMediaRelay(mapToChannelMediaRelayConfiguration(params["channelMediaRelayConfiguration"] as Map<*, *>))) + } - override fun enableFaceDetection(params: Map, callback: Callback) { - callback.code(engine?.enableFaceDetection(params["enable"] as Boolean)) - } + override fun stopChannelMediaRelay(callback: Callback) { + callback.code(engine?.stopChannelMediaRelay()) + } - override fun setCameraTorchOn(params: Map, callback: Callback) { - callback.code(engine?.setCameraTorchOn(params["isOn"] as Boolean)) - } + override fun setDefaultAudioRoutetoSpeakerphone(params: Map, callback: Callback) { + callback.code(engine?.setDefaultAudioRoutetoSpeakerphone(params["defaultToSpeaker"] as Boolean)) + } - override fun setCameraAutoFocusFaceModeEnabled(params: Map, callback: Callback) { - callback.code(engine?.setCameraAutoFocusFaceModeEnabled(params["enabled"] as Boolean)) - } + override fun setEnableSpeakerphone(params: Map, callback: Callback) { + callback.code(engine?.setEnableSpeakerphone(params["enabled"] as Boolean)) + } - override fun setCameraCapturerConfiguration(params: Map, callback: Callback) { - callback.code(engine?.setCameraCapturerConfiguration(mapToCameraCapturerConfiguration(params["config"] as Map<*, *>))) - } + override fun isSpeakerphoneEnabled(callback: Callback) { + callback.resolve(engine) { it.isSpeakerphoneEnabled } + } - override fun createDataStream(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - engine?.let { - code = it.createDataStream(params["reliable"] as Boolean, params["ordered"] as Boolean) - } - callback.code(code) { it } - } + override fun enableInEarMonitoring(params: Map, callback: Callback) { + callback.code(engine?.enableInEarMonitoring(params["enabled"] as Boolean)) + } - override fun sendStreamMessage(params: Map, callback: Callback) { - var code = -Constants.ERR_NOT_INITIALIZED - engine?.let { - code = it.sendStreamMessage((params["streamId"] as Number).toInt(), (params["message"] as String).toByteArray()) - } - callback.code(code) - } + override fun setInEarMonitoringVolume(params: Map, callback: Callback) { + callback.code(engine?.setInEarMonitoringVolume((params["volume"] as Number).toInt())) + } + + override fun enableDualStreamMode(params: Map, callback: Callback) { + callback.code(engine?.enableDualStreamMode(params["enabled"] as Boolean)) + } + + override fun setRemoteVideoStreamType(params: Map, callback: Callback) { + callback.code(engine?.setRemoteVideoStreamType((params["uid"] as Number).toInt(), (params["streamType"] as Number).toInt())) + } + + override fun setRemoteDefaultVideoStreamType(params: Map, callback: Callback) { + callback.code(engine?.setRemoteDefaultVideoStreamType((params["streamType"] as Number).toInt())) + } + + override fun setLocalPublishFallbackOption(params: Map, callback: Callback) { + callback.code(engine?.setLocalPublishFallbackOption((params["option"] as Number).toInt())) + } + + override fun setRemoteSubscribeFallbackOption(params: Map, callback: Callback) { + callback.code(engine?.setRemoteSubscribeFallbackOption((params["option"] as Number).toInt())) + } + + override fun setRemoteUserPriority(params: Map, callback: Callback) { + callback.code(engine?.setRemoteUserPriority((params["uid"] as Number).toInt(), (params["userPriority"] as Number).toInt())) + } + + override fun startEchoTest(params: Map, callback: Callback) { + callback.code(engine?.startEchoTest((params["intervalInSeconds"] as Number).toInt())) + } + + override fun stopEchoTest(callback: Callback) { + callback.code(engine?.stopEchoTest()) + } + + override fun enableLastmileTest(callback: Callback) { + callback.code(engine?.enableLastmileTest()) + } + + override fun disableLastmileTest(callback: Callback) { + callback.code(engine?.disableLastmileTest()) + } + + override fun startLastmileProbeTest(params: Map, callback: Callback) { + callback.code(engine?.startLastmileProbeTest(mapToLastmileProbeConfig(params["config"] as Map<*, *>))) + } + + override fun stopLastmileProbeTest(callback: Callback) { + callback.code(engine?.stopLastmileProbeTest()) + } + + override fun registerMediaMetadataObserver(callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + engine?.let { + val mediaObserver = MediaObserver { data -> + emit(RtcEngineEvents.MetadataReceived, data) + } + code = it.registerMediaMetadataObserver(mediaObserver, IMetadataObserver.VIDEO_METADATA) + if (code == 0) this.mediaObserver = mediaObserver + } + callback.code(code) + } + + override fun unregisterMediaMetadataObserver(callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + engine?.let { + code = it.registerMediaMetadataObserver(null, IMetadataObserver.VIDEO_METADATA) + if (code == 0) mediaObserver = null + } + callback.code(code) + } + + override fun setMaxMetadataSize(params: Map, callback: Callback) { + callback.resolve(mediaObserver) { + it.maxMetadataSize = (params["size"] as Number).toInt() + Unit + } + } + + override fun sendMetadata(params: Map, callback: Callback) { + callback.resolve(mediaObserver) { + it.addMetadata(params["metadata"] as String) + } + } + + override fun addVideoWatermark(params: Map, callback: Callback) { + callback.code(engine?.addVideoWatermark(params["watermarkUrl"] as String, mapToWatermarkOptions(params["options"] as Map<*, *>))) + } + + override fun clearVideoWatermarks(callback: Callback) { + callback.code(engine?.clearVideoWatermarks()) + } + + override fun setEncryptionSecret(params: Map, callback: Callback) { + callback.code(engine?.setEncryptionSecret(params["secret"] as String)) + } + + override fun setEncryptionMode(params: Map, callback: Callback) { + callback.code(engine?.setEncryptionMode(when ((params["encryptionMode"] as Number).toInt()) { + EncryptionConfig.EncryptionMode.AES_128_XTS.value -> "aes-128-xts" + EncryptionConfig.EncryptionMode.AES_128_ECB.value -> "aes-128-ecb" + EncryptionConfig.EncryptionMode.AES_256_XTS.value -> "aes-256-xts" + else -> "" + })) + } + + override fun enableEncryption(params: Map, callback: Callback) { + callback.code(engine?.enableEncryption(params["enabled"] as Boolean, mapToEncryptionConfig(params["config"] as Map<*, *>))) + } + + override fun startAudioRecording(params: Map, callback: Callback) { + callback.code(engine?.startAudioRecording(params["filePath"] as String, (params["sampleRate"] as Number).toInt(), (params["quality"] as Number).toInt())) + } + + override fun stopAudioRecording(callback: Callback) { + callback.code(engine?.stopAudioRecording()) + } + + override fun addInjectStreamUrl(params: Map, callback: Callback) { + callback.code(engine?.addInjectStreamUrl(params["url"] as String, mapToLiveInjectStreamConfig(params["config"] as Map<*, *>))) + } + + override fun removeInjectStreamUrl(params: Map, callback: Callback) { + callback.code(engine?.removeInjectStreamUrl(params["url"] as String)) + } + + override fun switchCamera(callback: Callback) { + callback.code(engine?.switchCamera()) + } + + override fun isCameraZoomSupported(callback: Callback) { + callback.resolve(engine) { it.isCameraZoomSupported } + } + + override fun isCameraTorchSupported(callback: Callback) { + callback.resolve(engine) { it.isCameraTorchSupported } + } + + override fun isCameraFocusSupported(callback: Callback) { + callback.resolve(engine) { it.isCameraFocusSupported } + } + + override fun isCameraExposurePositionSupported(callback: Callback) { + callback.resolve(engine) { it.isCameraExposurePositionSupported } + } + + override fun isCameraAutoFocusFaceModeSupported(callback: Callback) { + callback.resolve(engine) { it.isCameraAutoFocusFaceModeSupported } + } + + override fun setCameraZoomFactor(params: Map, callback: Callback) { + callback.code(engine?.setCameraZoomFactor((params["factor"] as Number).toFloat())) + } + + override fun getCameraMaxZoomFactor(callback: Callback) { + callback.resolve(engine) { it.cameraMaxZoomFactor } + } + + override fun setCameraFocusPositionInPreview(params: Map, callback: Callback) { + callback.code(engine?.setCameraFocusPositionInPreview((params["positionX"] as Number).toFloat(), (params["positionY"] as Number).toFloat())) + } + + override fun setCameraExposurePosition(params: Map, callback: Callback) { + callback.code(engine?.setCameraExposurePosition((params["positionXinView"] as Number).toFloat(), (params["positionYinView"] as Number).toFloat())) + } + + override fun enableFaceDetection(params: Map, callback: Callback) { + callback.code(engine?.enableFaceDetection(params["enable"] as Boolean)) + } + + override fun setCameraTorchOn(params: Map, callback: Callback) { + callback.code(engine?.setCameraTorchOn(params["isOn"] as Boolean)) + } + + override fun setCameraAutoFocusFaceModeEnabled(params: Map, callback: Callback) { + callback.code(engine?.setCameraAutoFocusFaceModeEnabled(params["enabled"] as Boolean)) + } + + override fun setCameraCapturerConfiguration(params: Map, callback: Callback) { + callback.code(engine?.setCameraCapturerConfiguration(mapToCameraCapturerConfiguration(params["config"] as Map<*, *>))) + } + + override fun createDataStream(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + engine?.let { + code = it.createDataStream(params["reliable"] as Boolean, params["ordered"] as Boolean) + } + callback.code(code) { it } + } + + override fun sendStreamMessage(params: Map, callback: Callback) { + var code = -Constants.ERR_NOT_INITIALIZED + engine?.let { + code = it.sendStreamMessage((params["streamId"] as Number).toInt(), (params["message"] as String).toByteArray()) + } + callback.code(code) + } } diff --git a/RtcEngineEvent.kt b/RtcEngineEvent.kt index 767f2c31a..553446afd 100644 --- a/RtcEngineEvent.kt +++ b/RtcEngineEvent.kt @@ -6,510 +6,510 @@ import io.agora.rtc.IRtcEngineEventHandler import io.agora.rtc.models.UserInfo class RtcEngineEvents { - companion object { - const val Warning = "Warning" - const val Error = "Error" - const val ApiCallExecuted = "ApiCallExecuted" - const val JoinChannelSuccess = "JoinChannelSuccess" - const val RejoinChannelSuccess = "RejoinChannelSuccess" - const val LeaveChannel = "LeaveChannel" - const val LocalUserRegistered = "LocalUserRegistered" - const val UserInfoUpdated = "UserInfoUpdated" - const val ClientRoleChanged = "ClientRoleChanged" - const val UserJoined = "UserJoined" - const val UserOffline = "UserOffline" - const val ConnectionStateChanged = "ConnectionStateChanged" - const val NetworkTypeChanged = "NetworkTypeChanged" - const val ConnectionLost = "ConnectionLost" - const val TokenPrivilegeWillExpire = "TokenPrivilegeWillExpire" - const val RequestToken = "RequestToken" - const val AudioVolumeIndication = "AudioVolumeIndication" - const val ActiveSpeaker = "ActiveSpeaker" - const val FirstLocalAudioFrame = "FirstLocalAudioFrame" - const val FirstLocalVideoFrame = "FirstLocalVideoFrame" - const val UserMuteVideo = "UserMuteVideo" - const val VideoSizeChanged = "VideoSizeChanged" - const val RemoteVideoStateChanged = "RemoteVideoStateChanged" - const val LocalVideoStateChanged = "LocalVideoStateChanged" - const val RemoteAudioStateChanged = "RemoteAudioStateChanged" - const val LocalAudioStateChanged = "LocalAudioStateChanged" - const val LocalPublishFallbackToAudioOnly = "LocalPublishFallbackToAudioOnly" - const val RemoteSubscribeFallbackToAudioOnly = "RemoteSubscribeFallbackToAudioOnly" - const val AudioRouteChanged = "AudioRouteChanged" - const val CameraFocusAreaChanged = "CameraFocusAreaChanged" - const val CameraExposureAreaChanged = "CameraExposureAreaChanged" - const val FacePositionChanged = "FacePositionChanged" - const val RtcStats = "RtcStats" - const val LastmileQuality = "LastmileQuality" - const val NetworkQuality = "NetworkQuality" - const val LastmileProbeResult = "LastmileProbeResult" - const val LocalVideoStats = "LocalVideoStats" - const val LocalAudioStats = "LocalAudioStats" - const val RemoteVideoStats = "RemoteVideoStats" - const val RemoteAudioStats = "RemoteAudioStats" - const val AudioMixingFinished = "AudioMixingFinished" - const val AudioMixingStateChanged = "AudioMixingStateChanged" - const val AudioEffectFinished = "AudioEffectFinished" - const val RtmpStreamingStateChanged = "RtmpStreamingStateChanged" - const val TranscodingUpdated = "TranscodingUpdated" - const val StreamInjectedStatus = "StreamInjectedStatus" - const val StreamMessage = "StreamMessage" - const val StreamMessageError = "StreamMessageError" - const val MediaEngineLoadSuccess = "MediaEngineLoadSuccess" - const val MediaEngineStartCallSuccess = "MediaEngineStartCallSuccess" - const val ChannelMediaRelayStateChanged = "ChannelMediaRelayStateChanged" - const val ChannelMediaRelayEvent = "ChannelMediaRelayEvent" - const val FirstRemoteVideoFrame = "FirstRemoteVideoFrame" - const val FirstRemoteAudioFrame = "FirstRemoteAudioFrame" - const val FirstRemoteAudioDecoded = "FirstRemoteAudioDecoded" - const val UserMuteAudio = "UserMuteAudio" - const val StreamPublished = "StreamPublished" - const val StreamUnpublished = "StreamUnpublished" - const val RemoteAudioTransportStats = "RemoteAudioTransportStats" - const val RemoteVideoTransportStats = "RemoteVideoTransportStats" - const val UserEnableVideo = "UserEnableVideo" - const val UserEnableLocalVideo = "UserEnableLocalVideo" - const val FirstRemoteVideoDecoded = "FirstRemoteVideoDecoded" - const val MicrophoneEnabled = "MicrophoneEnabled" - const val ConnectionInterrupted = "ConnectionInterrupted" - const val ConnectionBanned = "ConnectionBanned" - const val AudioQuality = "AudioQuality" - const val CameraReady = "CameraReady" - const val VideoStopped = "VideoStopped" - const val MetadataReceived = "MetadataReceived" - const val FirstLocalAudioFramePublished = "FirstLocalAudioFramePublished" - const val FirstLocalVideoFramePublished = "FirstLocalVideoFramePublished" - const val AudioPublishStateChanged = "AudioPublishStateChanged" - const val VideoPublishStateChanged = "VideoPublishStateChanged" - const val AudioSubscribeStateChanged = "AudioSubscribeStateChanged" - const val VideoSubscribeStateChanged = "VideoSubscribeStateChanged" - const val RtmpStreamingEvent = "RtmpStreamingEvent" - - fun toMap(): Map { - return hashMapOf( - "Warning" to Warning, - "Error" to Error, - "ApiCallExecuted" to ApiCallExecuted, - "JoinChannelSuccess" to JoinChannelSuccess, - "RejoinChannelSuccess" to RejoinChannelSuccess, - "LeaveChannel" to LeaveChannel, - "LocalUserRegistered" to LocalUserRegistered, - "UserInfoUpdated" to UserInfoUpdated, - "ClientRoleChanged" to ClientRoleChanged, - "UserJoined" to UserJoined, - "UserOffline" to UserOffline, - "ConnectionStateChanged" to ConnectionStateChanged, - "NetworkTypeChanged" to NetworkTypeChanged, - "ConnectionLost" to ConnectionLost, - "TokenPrivilegeWillExpire" to TokenPrivilegeWillExpire, - "RequestToken" to RequestToken, - "AudioVolumeIndication" to AudioVolumeIndication, - "ActiveSpeaker" to ActiveSpeaker, - "FirstLocalAudioFrame" to FirstLocalAudioFrame, - "FirstLocalVideoFrame" to FirstLocalVideoFrame, - "UserMuteVideo" to UserMuteVideo, - "VideoSizeChanged" to VideoSizeChanged, - "RemoteVideoStateChanged" to RemoteVideoStateChanged, - "LocalVideoStateChanged" to LocalVideoStateChanged, - "RemoteAudioStateChanged" to RemoteAudioStateChanged, - "LocalAudioStateChanged" to LocalAudioStateChanged, - "LocalPublishFallbackToAudioOnly" to LocalPublishFallbackToAudioOnly, - "RemoteSubscribeFallbackToAudioOnly" to RemoteSubscribeFallbackToAudioOnly, - "AudioRouteChanged" to AudioRouteChanged, - "CameraFocusAreaChanged" to CameraFocusAreaChanged, - "CameraExposureAreaChanged" to CameraExposureAreaChanged, - "FacePositionChanged" to FacePositionChanged, - "RtcStats" to RtcStats, - "LastmileQuality" to LastmileQuality, - "NetworkQuality" to NetworkQuality, - "LastmileProbeResult" to LastmileProbeResult, - "LocalVideoStats" to LocalVideoStats, - "LocalAudioStats" to LocalAudioStats, - "RemoteVideoStats" to RemoteVideoStats, - "RemoteAudioStats" to RemoteAudioStats, - "AudioMixingFinished" to AudioMixingFinished, - "AudioMixingStateChanged" to AudioMixingStateChanged, - "AudioEffectFinished" to AudioEffectFinished, - "RtmpStreamingStateChanged" to RtmpStreamingStateChanged, - "TranscodingUpdated" to TranscodingUpdated, - "StreamInjectedStatus" to StreamInjectedStatus, - "StreamMessage" to StreamMessage, - "StreamMessageError" to StreamMessageError, - "MediaEngineLoadSuccess" to MediaEngineLoadSuccess, - "MediaEngineStartCallSuccess" to MediaEngineStartCallSuccess, - "ChannelMediaRelayStateChanged" to ChannelMediaRelayStateChanged, - "ChannelMediaRelayEvent" to ChannelMediaRelayEvent, - "FirstRemoteVideoFrame" to FirstRemoteVideoFrame, - "FirstRemoteAudioFrame" to FirstRemoteAudioFrame, - "FirstRemoteAudioDecoded" to FirstRemoteAudioDecoded, - "UserMuteAudio" to UserMuteAudio, - "StreamPublished" to StreamPublished, - "StreamUnpublished" to StreamUnpublished, - "RemoteAudioTransportStats" to RemoteAudioTransportStats, - "RemoteVideoTransportStats" to RemoteVideoTransportStats, - "UserEnableVideo" to UserEnableVideo, - "UserEnableLocalVideo" to UserEnableLocalVideo, - "FirstRemoteVideoDecoded" to FirstRemoteVideoDecoded, - "MicrophoneEnabled" to MicrophoneEnabled, - "ConnectionInterrupted" to ConnectionInterrupted, - "ConnectionBanned" to ConnectionBanned, - "AudioQuality" to AudioQuality, - "CameraReady" to CameraReady, - "VideoStopped" to VideoStopped, - "MetadataReceived" to MetadataReceived, - "FirstLocalAudioFramePublished" to FirstLocalAudioFramePublished, - "FirstLocalVideoFramePublished" to FirstLocalVideoFramePublished, - "AudioPublishStateChanged" to AudioPublishStateChanged, - "VideoPublishStateChanged" to VideoPublishStateChanged, - "AudioSubscribeStateChanged" to AudioSubscribeStateChanged, - "VideoSubscribeStateChanged" to VideoSubscribeStateChanged, - "RtmpStreamingEvent" to RtmpStreamingEvent - ) - } - } + companion object { + const val Warning = "Warning" + const val Error = "Error" + const val ApiCallExecuted = "ApiCallExecuted" + const val JoinChannelSuccess = "JoinChannelSuccess" + const val RejoinChannelSuccess = "RejoinChannelSuccess" + const val LeaveChannel = "LeaveChannel" + const val LocalUserRegistered = "LocalUserRegistered" + const val UserInfoUpdated = "UserInfoUpdated" + const val ClientRoleChanged = "ClientRoleChanged" + const val UserJoined = "UserJoined" + const val UserOffline = "UserOffline" + const val ConnectionStateChanged = "ConnectionStateChanged" + const val NetworkTypeChanged = "NetworkTypeChanged" + const val ConnectionLost = "ConnectionLost" + const val TokenPrivilegeWillExpire = "TokenPrivilegeWillExpire" + const val RequestToken = "RequestToken" + const val AudioVolumeIndication = "AudioVolumeIndication" + const val ActiveSpeaker = "ActiveSpeaker" + const val FirstLocalAudioFrame = "FirstLocalAudioFrame" + const val FirstLocalVideoFrame = "FirstLocalVideoFrame" + const val UserMuteVideo = "UserMuteVideo" + const val VideoSizeChanged = "VideoSizeChanged" + const val RemoteVideoStateChanged = "RemoteVideoStateChanged" + const val LocalVideoStateChanged = "LocalVideoStateChanged" + const val RemoteAudioStateChanged = "RemoteAudioStateChanged" + const val LocalAudioStateChanged = "LocalAudioStateChanged" + const val LocalPublishFallbackToAudioOnly = "LocalPublishFallbackToAudioOnly" + const val RemoteSubscribeFallbackToAudioOnly = "RemoteSubscribeFallbackToAudioOnly" + const val AudioRouteChanged = "AudioRouteChanged" + const val CameraFocusAreaChanged = "CameraFocusAreaChanged" + const val CameraExposureAreaChanged = "CameraExposureAreaChanged" + const val FacePositionChanged = "FacePositionChanged" + const val RtcStats = "RtcStats" + const val LastmileQuality = "LastmileQuality" + const val NetworkQuality = "NetworkQuality" + const val LastmileProbeResult = "LastmileProbeResult" + const val LocalVideoStats = "LocalVideoStats" + const val LocalAudioStats = "LocalAudioStats" + const val RemoteVideoStats = "RemoteVideoStats" + const val RemoteAudioStats = "RemoteAudioStats" + const val AudioMixingFinished = "AudioMixingFinished" + const val AudioMixingStateChanged = "AudioMixingStateChanged" + const val AudioEffectFinished = "AudioEffectFinished" + const val RtmpStreamingStateChanged = "RtmpStreamingStateChanged" + const val TranscodingUpdated = "TranscodingUpdated" + const val StreamInjectedStatus = "StreamInjectedStatus" + const val StreamMessage = "StreamMessage" + const val StreamMessageError = "StreamMessageError" + const val MediaEngineLoadSuccess = "MediaEngineLoadSuccess" + const val MediaEngineStartCallSuccess = "MediaEngineStartCallSuccess" + const val ChannelMediaRelayStateChanged = "ChannelMediaRelayStateChanged" + const val ChannelMediaRelayEvent = "ChannelMediaRelayEvent" + const val FirstRemoteVideoFrame = "FirstRemoteVideoFrame" + const val FirstRemoteAudioFrame = "FirstRemoteAudioFrame" + const val FirstRemoteAudioDecoded = "FirstRemoteAudioDecoded" + const val UserMuteAudio = "UserMuteAudio" + const val StreamPublished = "StreamPublished" + const val StreamUnpublished = "StreamUnpublished" + const val RemoteAudioTransportStats = "RemoteAudioTransportStats" + const val RemoteVideoTransportStats = "RemoteVideoTransportStats" + const val UserEnableVideo = "UserEnableVideo" + const val UserEnableLocalVideo = "UserEnableLocalVideo" + const val FirstRemoteVideoDecoded = "FirstRemoteVideoDecoded" + const val MicrophoneEnabled = "MicrophoneEnabled" + const val ConnectionInterrupted = "ConnectionInterrupted" + const val ConnectionBanned = "ConnectionBanned" + const val AudioQuality = "AudioQuality" + const val CameraReady = "CameraReady" + const val VideoStopped = "VideoStopped" + const val MetadataReceived = "MetadataReceived" + const val FirstLocalAudioFramePublished = "FirstLocalAudioFramePublished" + const val FirstLocalVideoFramePublished = "FirstLocalVideoFramePublished" + const val AudioPublishStateChanged = "AudioPublishStateChanged" + const val VideoPublishStateChanged = "VideoPublishStateChanged" + const val AudioSubscribeStateChanged = "AudioSubscribeStateChanged" + const val VideoSubscribeStateChanged = "VideoSubscribeStateChanged" + const val RtmpStreamingEvent = "RtmpStreamingEvent" + + fun toMap(): Map { + return hashMapOf( + "Warning" to Warning, + "Error" to Error, + "ApiCallExecuted" to ApiCallExecuted, + "JoinChannelSuccess" to JoinChannelSuccess, + "RejoinChannelSuccess" to RejoinChannelSuccess, + "LeaveChannel" to LeaveChannel, + "LocalUserRegistered" to LocalUserRegistered, + "UserInfoUpdated" to UserInfoUpdated, + "ClientRoleChanged" to ClientRoleChanged, + "UserJoined" to UserJoined, + "UserOffline" to UserOffline, + "ConnectionStateChanged" to ConnectionStateChanged, + "NetworkTypeChanged" to NetworkTypeChanged, + "ConnectionLost" to ConnectionLost, + "TokenPrivilegeWillExpire" to TokenPrivilegeWillExpire, + "RequestToken" to RequestToken, + "AudioVolumeIndication" to AudioVolumeIndication, + "ActiveSpeaker" to ActiveSpeaker, + "FirstLocalAudioFrame" to FirstLocalAudioFrame, + "FirstLocalVideoFrame" to FirstLocalVideoFrame, + "UserMuteVideo" to UserMuteVideo, + "VideoSizeChanged" to VideoSizeChanged, + "RemoteVideoStateChanged" to RemoteVideoStateChanged, + "LocalVideoStateChanged" to LocalVideoStateChanged, + "RemoteAudioStateChanged" to RemoteAudioStateChanged, + "LocalAudioStateChanged" to LocalAudioStateChanged, + "LocalPublishFallbackToAudioOnly" to LocalPublishFallbackToAudioOnly, + "RemoteSubscribeFallbackToAudioOnly" to RemoteSubscribeFallbackToAudioOnly, + "AudioRouteChanged" to AudioRouteChanged, + "CameraFocusAreaChanged" to CameraFocusAreaChanged, + "CameraExposureAreaChanged" to CameraExposureAreaChanged, + "FacePositionChanged" to FacePositionChanged, + "RtcStats" to RtcStats, + "LastmileQuality" to LastmileQuality, + "NetworkQuality" to NetworkQuality, + "LastmileProbeResult" to LastmileProbeResult, + "LocalVideoStats" to LocalVideoStats, + "LocalAudioStats" to LocalAudioStats, + "RemoteVideoStats" to RemoteVideoStats, + "RemoteAudioStats" to RemoteAudioStats, + "AudioMixingFinished" to AudioMixingFinished, + "AudioMixingStateChanged" to AudioMixingStateChanged, + "AudioEffectFinished" to AudioEffectFinished, + "RtmpStreamingStateChanged" to RtmpStreamingStateChanged, + "TranscodingUpdated" to TranscodingUpdated, + "StreamInjectedStatus" to StreamInjectedStatus, + "StreamMessage" to StreamMessage, + "StreamMessageError" to StreamMessageError, + "MediaEngineLoadSuccess" to MediaEngineLoadSuccess, + "MediaEngineStartCallSuccess" to MediaEngineStartCallSuccess, + "ChannelMediaRelayStateChanged" to ChannelMediaRelayStateChanged, + "ChannelMediaRelayEvent" to ChannelMediaRelayEvent, + "FirstRemoteVideoFrame" to FirstRemoteVideoFrame, + "FirstRemoteAudioFrame" to FirstRemoteAudioFrame, + "FirstRemoteAudioDecoded" to FirstRemoteAudioDecoded, + "UserMuteAudio" to UserMuteAudio, + "StreamPublished" to StreamPublished, + "StreamUnpublished" to StreamUnpublished, + "RemoteAudioTransportStats" to RemoteAudioTransportStats, + "RemoteVideoTransportStats" to RemoteVideoTransportStats, + "UserEnableVideo" to UserEnableVideo, + "UserEnableLocalVideo" to UserEnableLocalVideo, + "FirstRemoteVideoDecoded" to FirstRemoteVideoDecoded, + "MicrophoneEnabled" to MicrophoneEnabled, + "ConnectionInterrupted" to ConnectionInterrupted, + "ConnectionBanned" to ConnectionBanned, + "AudioQuality" to AudioQuality, + "CameraReady" to CameraReady, + "VideoStopped" to VideoStopped, + "MetadataReceived" to MetadataReceived, + "FirstLocalAudioFramePublished" to FirstLocalAudioFramePublished, + "FirstLocalVideoFramePublished" to FirstLocalVideoFramePublished, + "AudioPublishStateChanged" to AudioPublishStateChanged, + "VideoPublishStateChanged" to VideoPublishStateChanged, + "AudioSubscribeStateChanged" to AudioSubscribeStateChanged, + "VideoSubscribeStateChanged" to VideoSubscribeStateChanged, + "RtmpStreamingEvent" to RtmpStreamingEvent + ) + } + } } class RtcEngineEventHandler( - private val emitter: (methodName: String, data: Map?) -> Unit + private val emitter: (methodName: String, data: Map?) -> Unit ) : IRtcEngineEventHandler() { - companion object { - const val PREFIX = "io.agora.rtc." - } - - private fun callback(methodName: String, vararg data: Any?) { - emitter(methodName, hashMapOf("data" to data.toList())) - } - - override fun onWarning(@Annotations.AgoraWarningCode warn: Int) { - callback(RtcEngineEvents.Warning, warn) - } - - override fun onError(@Annotations.AgoraErrorCode err: Int) { - callback(RtcEngineEvents.Error, err) - } - - override fun onApiCallExecuted(@Annotations.AgoraErrorCode error: Int, api: String?, result: String?) { - callback(RtcEngineEvents.ApiCallExecuted, error, api, result) - } - - override fun onJoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) { - callback(RtcEngineEvents.JoinChannelSuccess, channel, uid, elapsed) - } - - override fun onRejoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) { - callback(RtcEngineEvents.RejoinChannelSuccess, channel, uid, elapsed) - } - - override fun onLeaveChannel(stats: RtcStats?) { - callback(RtcEngineEvents.LeaveChannel, stats?.toMap()) - } - - override fun onLocalUserRegistered(uid: Int, userAccount: String?) { - callback(RtcEngineEvents.LocalUserRegistered, uid, userAccount) - } - - override fun onUserInfoUpdated(uid: Int, userInfo: UserInfo?) { - callback(RtcEngineEvents.UserInfoUpdated, uid, userInfo?.toMap()) - } - - override fun onClientRoleChanged(@Annotations.AgoraClientRole oldRole: Int, @Annotations.AgoraClientRole newRole: Int) { - callback(RtcEngineEvents.ClientRoleChanged, oldRole, newRole) - } - - override fun onUserJoined(uid: Int, elapsed: Int) { - callback(RtcEngineEvents.UserJoined, uid, elapsed) - } - - override fun onUserOffline(uid: Int, @Annotations.AgoraUserOfflineReason reason: Int) { - callback(RtcEngineEvents.UserOffline, uid, reason) - } - - override fun onConnectionStateChanged(@Annotations.AgoraConnectionStateType state: Int, @Annotations.AgoraConnectionChangedReason reason: Int) { - callback(RtcEngineEvents.ConnectionStateChanged, state, reason) - } - - override fun onNetworkTypeChanged(@Annotations.AgoraNetworkType type: Int) { - callback(RtcEngineEvents.NetworkTypeChanged, type) - } - - override fun onConnectionLost() { - callback(RtcEngineEvents.ConnectionLost) - } - - override fun onTokenPrivilegeWillExpire(token: String?) { - callback(RtcEngineEvents.TokenPrivilegeWillExpire, token) - } - - override fun onRequestToken() { - callback(RtcEngineEvents.RequestToken) - } - - override fun onAudioVolumeIndication(speakers: Array?, @IntRange(from = 0, to = 255) totalVolume: Int) { - callback(RtcEngineEvents.AudioVolumeIndication, speakers?.toMapList(), totalVolume) - } - - override fun onActiveSpeaker(uid: Int) { - callback(RtcEngineEvents.ActiveSpeaker, uid) - } - - override fun onFirstLocalAudioFrame(elapsed: Int) { - callback(RtcEngineEvents.FirstLocalAudioFrame, elapsed) - } - - override fun onFirstLocalVideoFrame(width: Int, height: Int, elapsed: Int) { - callback(RtcEngineEvents.FirstLocalVideoFrame, width, height, elapsed) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) - override fun onUserMuteVideo(uid: Int, muted: Boolean) { - callback(RtcEngineEvents.UserMuteVideo, uid, muted) - } - - override fun onVideoSizeChanged(uid: Int, width: Int, height: Int, @IntRange(from = 0, to = 360) rotation: Int) { - callback(RtcEngineEvents.VideoSizeChanged, uid, width, height, rotation) - } - - override fun onRemoteVideoStateChanged(uid: Int, @Annotations.AgoraVideoRemoteState state: Int, @Annotations.AgoraVideoRemoteStateReason reason: Int, elapsed: Int) { - callback(RtcEngineEvents.RemoteVideoStateChanged, uid, state, reason, elapsed) - } - - override fun onLocalVideoStateChanged(@Annotations.AgoraLocalVideoStreamState localVideoState: Int, @Annotations.AgoraLocalVideoStreamError error: Int) { - callback(RtcEngineEvents.LocalVideoStateChanged, localVideoState, error) - } - - override fun onRemoteAudioStateChanged(uid: Int, @Annotations.AgoraAudioRemoteState state: Int, @Annotations.AgoraAudioRemoteStateReason reason: Int, elapsed: Int) { - callback(RtcEngineEvents.RemoteAudioStateChanged, uid, state, reason, elapsed) - } - - override fun onLocalAudioStateChanged(@Annotations.AgoraAudioLocalState state: Int, @Annotations.AgoraAudioLocalError error: Int) { - callback(RtcEngineEvents.LocalAudioStateChanged, state, error) - } - - override fun onLocalPublishFallbackToAudioOnly(isFallbackOrRecover: Boolean) { - callback(RtcEngineEvents.LocalPublishFallbackToAudioOnly, isFallbackOrRecover) - } - - override fun onRemoteSubscribeFallbackToAudioOnly(uid: Int, isFallbackOrRecover: Boolean) { - callback(RtcEngineEvents.RemoteSubscribeFallbackToAudioOnly, uid, isFallbackOrRecover) - } - - override fun onAudioRouteChanged(@Annotations.AgoraAudioOutputRouting routing: Int) { - callback(RtcEngineEvents.AudioRouteChanged, routing) - } - - override fun onCameraFocusAreaChanged(rect: Rect?) { - callback(RtcEngineEvents.CameraFocusAreaChanged, rect?.toMap()) - } - - override fun onCameraExposureAreaChanged(rect: Rect?) { - callback(RtcEngineEvents.CameraExposureAreaChanged, rect?.toMap()) - } - - override fun onFacePositionChanged(imageWidth: Int, imageHeight: Int, faces: Array?) { - callback(RtcEngineEvents.FacePositionChanged, imageWidth, imageHeight, faces?.toMapList()) - } - - override fun onRtcStats(stats: RtcStats?) { - callback(RtcEngineEvents.RtcStats, stats?.toMap()) - } - - override fun onLastmileQuality(@Annotations.AgoraNetworkQuality quality: Int) { - callback(RtcEngineEvents.LastmileQuality, quality) - } - - override fun onNetworkQuality(uid: Int, @Annotations.AgoraNetworkQuality txQuality: Int, @Annotations.AgoraNetworkQuality rxQuality: Int) { - callback(RtcEngineEvents.NetworkQuality, uid, txQuality, rxQuality) - } - - override fun onLastmileProbeResult(result: LastmileProbeResult?) { - callback(RtcEngineEvents.LastmileProbeResult, result?.toMap()) - } - - @Deprecated("", ReplaceWith("onLocalVideoStats")) - override fun onLocalVideoStat(sentBitrate: Int, sentFrameRate: Int) { - // TODO Not in iOS - } - - override fun onLocalVideoStats(stats: LocalVideoStats?) { - callback(RtcEngineEvents.LocalVideoStats, stats?.toMap()) - } - - override fun onLocalAudioStats(stats: LocalAudioStats?) { - callback(RtcEngineEvents.LocalAudioStats, stats?.toMap()) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStats")) - override fun onRemoteVideoStat(uid: Int, delay: Int, receivedBitrate: Int, receivedFrameRate: Int) { - // TODO Not in iOS - } - - override fun onRemoteVideoStats(stats: RemoteVideoStats?) { - callback(RtcEngineEvents.RemoteVideoStats, stats?.toMap()) - } - - override fun onRemoteAudioStats(stats: RemoteAudioStats?) { - callback(RtcEngineEvents.RemoteAudioStats, stats?.toMap()) - } - - @Deprecated("", ReplaceWith("onAudioMixingStateChanged")) - override fun onAudioMixingFinished() { - callback(RtcEngineEvents.AudioMixingFinished) - } - - override fun onAudioMixingStateChanged(@Annotations.AgoraAudioMixingStateCode state: Int, @Annotations.AgoraAudioMixingErrorCode errorCode: Int) { - callback(RtcEngineEvents.AudioMixingStateChanged, state, errorCode) - } - - override fun onAudioEffectFinished(soundId: Int) { - callback(RtcEngineEvents.AudioEffectFinished, soundId) - } - - override fun onRtmpStreamingStateChanged(url: String?, @Annotations.AgoraRtmpStreamingState state: Int, @Annotations.AgoraRtmpStreamingErrorCode errCode: Int) { - callback(RtcEngineEvents.RtmpStreamingStateChanged, url, state, errCode) - } - - override fun onTranscodingUpdated() { - callback(RtcEngineEvents.TranscodingUpdated) - } - - override fun onStreamInjectedStatus(url: String?, uid: Int, @Annotations.AgoraInjectStreamStatus status: Int) { - callback(RtcEngineEvents.StreamInjectedStatus, url, uid, status) - } - - override fun onStreamMessage(uid: Int, streamId: Int, data: ByteArray?) { - callback(RtcEngineEvents.StreamMessage, uid, streamId, data?.let { String(it, Charsets.UTF_8) }) - } - - override fun onStreamMessageError(uid: Int, streamId: Int, @Annotations.AgoraErrorCode error: Int, missed: Int, cached: Int) { - callback(RtcEngineEvents.StreamMessageError, uid, streamId, error, missed, cached) - } - - override fun onMediaEngineLoadSuccess() { - callback(RtcEngineEvents.MediaEngineLoadSuccess) - } - - override fun onMediaEngineStartCallSuccess() { - callback(RtcEngineEvents.MediaEngineStartCallSuccess) - } - - override fun onChannelMediaRelayStateChanged(@Annotations.AgoraChannelMediaRelayState state: Int, @Annotations.AgoraChannelMediaRelayError code: Int) { - callback(RtcEngineEvents.ChannelMediaRelayStateChanged, state, code) - } - - override fun onChannelMediaRelayEvent(@Annotations.AgoraChannelMediaRelayEvent code: Int) { - callback(RtcEngineEvents.ChannelMediaRelayEvent, code) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) - override fun onFirstRemoteVideoFrame(uid: Int, width: Int, height: Int, elapsed: Int) { - callback(RtcEngineEvents.FirstRemoteVideoFrame, uid, width, height, elapsed) - } - - @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) - override fun onFirstRemoteAudioFrame(uid: Int, elapsed: Int) { - callback(RtcEngineEvents.FirstRemoteAudioFrame, uid, elapsed) - } - - @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) - override fun onFirstRemoteAudioDecoded(uid: Int, elapsed: Int) { - callback(RtcEngineEvents.FirstRemoteAudioDecoded, uid, elapsed) - } - - @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) - override fun onUserMuteAudio(uid: Int, muted: Boolean) { - callback(RtcEngineEvents.UserMuteAudio, uid, muted) - } - - @Deprecated("", ReplaceWith("onRtmpStreamingStateChanged")) - override fun onStreamPublished(url: String?, @Annotations.AgoraErrorCode error: Int) { - callback(RtcEngineEvents.StreamPublished, url, error) - } - - @Deprecated("", ReplaceWith("onRtmpStreamingStateChanged")) - override fun onStreamUnpublished(url: String?) { - callback(RtcEngineEvents.StreamUnpublished, url) - } - - @Deprecated("", ReplaceWith("onRemoteAudioStats")) - override fun onRemoteAudioTransportStats(uid: Int, delay: Int, lost: Int, rxKBitRate: Int) { - callback(RtcEngineEvents.RemoteAudioTransportStats, uid, delay, lost, rxKBitRate) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStats")) - override fun onRemoteVideoTransportStats(uid: Int, delay: Int, lost: Int, rxKBitRate: Int) { - callback(RtcEngineEvents.RemoteVideoTransportStats, uid, delay, lost, rxKBitRate) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) - override fun onUserEnableVideo(uid: Int, enabled: Boolean) { - callback(RtcEngineEvents.UserEnableVideo, uid, enabled) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) - override fun onUserEnableLocalVideo(uid: Int, enabled: Boolean) { - callback(RtcEngineEvents.UserEnableLocalVideo, uid, enabled) - } - - @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) - override fun onFirstRemoteVideoDecoded(uid: Int, width: Int, height: Int, elapsed: Int) { - callback(RtcEngineEvents.FirstRemoteVideoDecoded, uid, width, height, elapsed) - } - - @Deprecated("", ReplaceWith("onLocalAudioStateChanged")) - override fun onMicrophoneEnabled(enabled: Boolean) { - callback(RtcEngineEvents.MicrophoneEnabled, enabled) - } - - @Deprecated("", ReplaceWith("onConnectionStateChanged")) - override fun onConnectionInterrupted() { - callback(RtcEngineEvents.ConnectionInterrupted) - } - - @Deprecated("", ReplaceWith("onConnectionStateChanged")) - override fun onConnectionBanned() { - callback(RtcEngineEvents.ConnectionBanned) - } - - @Deprecated("", ReplaceWith("onRemoteAudioStats")) - override fun onAudioQuality(uid: Int, @Annotations.AgoraNetworkQuality quality: Int, delay: Short, lost: Short) { - callback(RtcEngineEvents.AudioQuality, uid, quality, delay, lost) - } - - @Deprecated("", ReplaceWith("onLocalVideoStateChanged")) - override fun onCameraReady() { - callback(RtcEngineEvents.CameraReady) - } - - @Deprecated("", ReplaceWith("onLocalVideoStateChanged")) - override fun onVideoStopped() { - callback(RtcEngineEvents.VideoStopped) - } - - override fun onFirstLocalAudioFramePublished(elapsed: Int) { - callback(RtcEngineEvents.FirstLocalAudioFramePublished, elapsed) - } - - override fun onFirstLocalVideoFramePublished(elapsed: Int) { - callback(RtcEngineEvents.FirstLocalVideoFramePublished, elapsed) - } - - override fun onAudioPublishStateChanged(channel: String?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { - callback(RtcEngineEvents.AudioPublishStateChanged, channel, oldState, newState, elapseSinceLastState) - } - - override fun onVideoPublishStateChanged(channel: String?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { - callback(RtcEngineEvents.VideoPublishStateChanged, channel, oldState, newState, elapseSinceLastState) - } - - override fun onAudioSubscribeStateChanged(channel: String?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { - callback(RtcEngineEvents.AudioSubscribeStateChanged, channel, uid, oldState, newState, elapseSinceLastState) - } - - override fun onVideoSubscribeStateChanged(channel: String?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { - callback(RtcEngineEvents.VideoSubscribeStateChanged, channel, uid, oldState, newState, elapseSinceLastState) - } - - override fun onRtmpStreamingEvent(url: String?, @Annotations.AgoraRtmpStreamingEvent error: Int) { - callback(RtcEngineEvents.RtmpStreamingEvent, url, error) - } + companion object { + const val PREFIX = "io.agora.rtc." + } + + private fun callback(methodName: String, vararg data: Any?) { + emitter(methodName, hashMapOf("data" to data.toList())) + } + + override fun onWarning(@Annotations.AgoraWarningCode warn: Int) { + callback(RtcEngineEvents.Warning, warn) + } + + override fun onError(@Annotations.AgoraErrorCode err: Int) { + callback(RtcEngineEvents.Error, err) + } + + override fun onApiCallExecuted(@Annotations.AgoraErrorCode error: Int, api: String?, result: String?) { + callback(RtcEngineEvents.ApiCallExecuted, error, api, result) + } + + override fun onJoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) { + callback(RtcEngineEvents.JoinChannelSuccess, channel, uid, elapsed) + } + + override fun onRejoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) { + callback(RtcEngineEvents.RejoinChannelSuccess, channel, uid, elapsed) + } + + override fun onLeaveChannel(stats: RtcStats?) { + callback(RtcEngineEvents.LeaveChannel, stats?.toMap()) + } + + override fun onLocalUserRegistered(uid: Int, userAccount: String?) { + callback(RtcEngineEvents.LocalUserRegistered, uid, userAccount) + } + + override fun onUserInfoUpdated(uid: Int, userInfo: UserInfo?) { + callback(RtcEngineEvents.UserInfoUpdated, uid, userInfo?.toMap()) + } + + override fun onClientRoleChanged(@Annotations.AgoraClientRole oldRole: Int, @Annotations.AgoraClientRole newRole: Int) { + callback(RtcEngineEvents.ClientRoleChanged, oldRole, newRole) + } + + override fun onUserJoined(uid: Int, elapsed: Int) { + callback(RtcEngineEvents.UserJoined, uid, elapsed) + } + + override fun onUserOffline(uid: Int, @Annotations.AgoraUserOfflineReason reason: Int) { + callback(RtcEngineEvents.UserOffline, uid, reason) + } + + override fun onConnectionStateChanged(@Annotations.AgoraConnectionStateType state: Int, @Annotations.AgoraConnectionChangedReason reason: Int) { + callback(RtcEngineEvents.ConnectionStateChanged, state, reason) + } + + override fun onNetworkTypeChanged(@Annotations.AgoraNetworkType type: Int) { + callback(RtcEngineEvents.NetworkTypeChanged, type) + } + + override fun onConnectionLost() { + callback(RtcEngineEvents.ConnectionLost) + } + + override fun onTokenPrivilegeWillExpire(token: String?) { + callback(RtcEngineEvents.TokenPrivilegeWillExpire, token) + } + + override fun onRequestToken() { + callback(RtcEngineEvents.RequestToken) + } + + override fun onAudioVolumeIndication(speakers: Array?, @IntRange(from = 0, to = 255) totalVolume: Int) { + callback(RtcEngineEvents.AudioVolumeIndication, speakers?.toMapList(), totalVolume) + } + + override fun onActiveSpeaker(uid: Int) { + callback(RtcEngineEvents.ActiveSpeaker, uid) + } + + override fun onFirstLocalAudioFrame(elapsed: Int) { + callback(RtcEngineEvents.FirstLocalAudioFrame, elapsed) + } + + override fun onFirstLocalVideoFrame(width: Int, height: Int, elapsed: Int) { + callback(RtcEngineEvents.FirstLocalVideoFrame, width, height, elapsed) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) + override fun onUserMuteVideo(uid: Int, muted: Boolean) { + callback(RtcEngineEvents.UserMuteVideo, uid, muted) + } + + override fun onVideoSizeChanged(uid: Int, width: Int, height: Int, @IntRange(from = 0, to = 360) rotation: Int) { + callback(RtcEngineEvents.VideoSizeChanged, uid, width, height, rotation) + } + + override fun onRemoteVideoStateChanged(uid: Int, @Annotations.AgoraVideoRemoteState state: Int, @Annotations.AgoraVideoRemoteStateReason reason: Int, elapsed: Int) { + callback(RtcEngineEvents.RemoteVideoStateChanged, uid, state, reason, elapsed) + } + + override fun onLocalVideoStateChanged(@Annotations.AgoraLocalVideoStreamState localVideoState: Int, @Annotations.AgoraLocalVideoStreamError error: Int) { + callback(RtcEngineEvents.LocalVideoStateChanged, localVideoState, error) + } + + override fun onRemoteAudioStateChanged(uid: Int, @Annotations.AgoraAudioRemoteState state: Int, @Annotations.AgoraAudioRemoteStateReason reason: Int, elapsed: Int) { + callback(RtcEngineEvents.RemoteAudioStateChanged, uid, state, reason, elapsed) + } + + override fun onLocalAudioStateChanged(@Annotations.AgoraAudioLocalState state: Int, @Annotations.AgoraAudioLocalError error: Int) { + callback(RtcEngineEvents.LocalAudioStateChanged, state, error) + } + + override fun onLocalPublishFallbackToAudioOnly(isFallbackOrRecover: Boolean) { + callback(RtcEngineEvents.LocalPublishFallbackToAudioOnly, isFallbackOrRecover) + } + + override fun onRemoteSubscribeFallbackToAudioOnly(uid: Int, isFallbackOrRecover: Boolean) { + callback(RtcEngineEvents.RemoteSubscribeFallbackToAudioOnly, uid, isFallbackOrRecover) + } + + override fun onAudioRouteChanged(@Annotations.AgoraAudioOutputRouting routing: Int) { + callback(RtcEngineEvents.AudioRouteChanged, routing) + } + + override fun onCameraFocusAreaChanged(rect: Rect?) { + callback(RtcEngineEvents.CameraFocusAreaChanged, rect?.toMap()) + } + + override fun onCameraExposureAreaChanged(rect: Rect?) { + callback(RtcEngineEvents.CameraExposureAreaChanged, rect?.toMap()) + } + + override fun onFacePositionChanged(imageWidth: Int, imageHeight: Int, faces: Array?) { + callback(RtcEngineEvents.FacePositionChanged, imageWidth, imageHeight, faces?.toMapList()) + } + + override fun onRtcStats(stats: RtcStats?) { + callback(RtcEngineEvents.RtcStats, stats?.toMap()) + } + + override fun onLastmileQuality(@Annotations.AgoraNetworkQuality quality: Int) { + callback(RtcEngineEvents.LastmileQuality, quality) + } + + override fun onNetworkQuality(uid: Int, @Annotations.AgoraNetworkQuality txQuality: Int, @Annotations.AgoraNetworkQuality rxQuality: Int) { + callback(RtcEngineEvents.NetworkQuality, uid, txQuality, rxQuality) + } + + override fun onLastmileProbeResult(result: LastmileProbeResult?) { + callback(RtcEngineEvents.LastmileProbeResult, result?.toMap()) + } + + @Deprecated("", ReplaceWith("onLocalVideoStats")) + override fun onLocalVideoStat(sentBitrate: Int, sentFrameRate: Int) { + // TODO Not in iOS + } + + override fun onLocalVideoStats(stats: LocalVideoStats?) { + callback(RtcEngineEvents.LocalVideoStats, stats?.toMap()) + } + + override fun onLocalAudioStats(stats: LocalAudioStats?) { + callback(RtcEngineEvents.LocalAudioStats, stats?.toMap()) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStats")) + override fun onRemoteVideoStat(uid: Int, delay: Int, receivedBitrate: Int, receivedFrameRate: Int) { + // TODO Not in iOS + } + + override fun onRemoteVideoStats(stats: RemoteVideoStats?) { + callback(RtcEngineEvents.RemoteVideoStats, stats?.toMap()) + } + + override fun onRemoteAudioStats(stats: RemoteAudioStats?) { + callback(RtcEngineEvents.RemoteAudioStats, stats?.toMap()) + } + + @Deprecated("", ReplaceWith("onAudioMixingStateChanged")) + override fun onAudioMixingFinished() { + callback(RtcEngineEvents.AudioMixingFinished) + } + + override fun onAudioMixingStateChanged(@Annotations.AgoraAudioMixingStateCode state: Int, @Annotations.AgoraAudioMixingErrorCode errorCode: Int) { + callback(RtcEngineEvents.AudioMixingStateChanged, state, errorCode) + } + + override fun onAudioEffectFinished(soundId: Int) { + callback(RtcEngineEvents.AudioEffectFinished, soundId) + } + + override fun onRtmpStreamingStateChanged(url: String?, @Annotations.AgoraRtmpStreamingState state: Int, @Annotations.AgoraRtmpStreamingErrorCode errCode: Int) { + callback(RtcEngineEvents.RtmpStreamingStateChanged, url, state, errCode) + } + + override fun onTranscodingUpdated() { + callback(RtcEngineEvents.TranscodingUpdated) + } + + override fun onStreamInjectedStatus(url: String?, uid: Int, @Annotations.AgoraInjectStreamStatus status: Int) { + callback(RtcEngineEvents.StreamInjectedStatus, url, uid, status) + } + + override fun onStreamMessage(uid: Int, streamId: Int, data: ByteArray?) { + callback(RtcEngineEvents.StreamMessage, uid, streamId, data?.let { String(it, Charsets.UTF_8) }) + } + + override fun onStreamMessageError(uid: Int, streamId: Int, @Annotations.AgoraErrorCode error: Int, missed: Int, cached: Int) { + callback(RtcEngineEvents.StreamMessageError, uid, streamId, error, missed, cached) + } + + override fun onMediaEngineLoadSuccess() { + callback(RtcEngineEvents.MediaEngineLoadSuccess) + } + + override fun onMediaEngineStartCallSuccess() { + callback(RtcEngineEvents.MediaEngineStartCallSuccess) + } + + override fun onChannelMediaRelayStateChanged(@Annotations.AgoraChannelMediaRelayState state: Int, @Annotations.AgoraChannelMediaRelayError code: Int) { + callback(RtcEngineEvents.ChannelMediaRelayStateChanged, state, code) + } + + override fun onChannelMediaRelayEvent(@Annotations.AgoraChannelMediaRelayEvent code: Int) { + callback(RtcEngineEvents.ChannelMediaRelayEvent, code) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) + override fun onFirstRemoteVideoFrame(uid: Int, width: Int, height: Int, elapsed: Int) { + callback(RtcEngineEvents.FirstRemoteVideoFrame, uid, width, height, elapsed) + } + + @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) + override fun onFirstRemoteAudioFrame(uid: Int, elapsed: Int) { + callback(RtcEngineEvents.FirstRemoteAudioFrame, uid, elapsed) + } + + @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) + override fun onFirstRemoteAudioDecoded(uid: Int, elapsed: Int) { + callback(RtcEngineEvents.FirstRemoteAudioDecoded, uid, elapsed) + } + + @Deprecated("", ReplaceWith("onRemoteAudioStateChanged")) + override fun onUserMuteAudio(uid: Int, muted: Boolean) { + callback(RtcEngineEvents.UserMuteAudio, uid, muted) + } + + @Deprecated("", ReplaceWith("onRtmpStreamingStateChanged")) + override fun onStreamPublished(url: String?, @Annotations.AgoraErrorCode error: Int) { + callback(RtcEngineEvents.StreamPublished, url, error) + } + + @Deprecated("", ReplaceWith("onRtmpStreamingStateChanged")) + override fun onStreamUnpublished(url: String?) { + callback(RtcEngineEvents.StreamUnpublished, url) + } + + @Deprecated("", ReplaceWith("onRemoteAudioStats")) + override fun onRemoteAudioTransportStats(uid: Int, delay: Int, lost: Int, rxKBitRate: Int) { + callback(RtcEngineEvents.RemoteAudioTransportStats, uid, delay, lost, rxKBitRate) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStats")) + override fun onRemoteVideoTransportStats(uid: Int, delay: Int, lost: Int, rxKBitRate: Int) { + callback(RtcEngineEvents.RemoteVideoTransportStats, uid, delay, lost, rxKBitRate) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) + override fun onUserEnableVideo(uid: Int, enabled: Boolean) { + callback(RtcEngineEvents.UserEnableVideo, uid, enabled) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) + override fun onUserEnableLocalVideo(uid: Int, enabled: Boolean) { + callback(RtcEngineEvents.UserEnableLocalVideo, uid, enabled) + } + + @Deprecated("", ReplaceWith("onRemoteVideoStateChanged")) + override fun onFirstRemoteVideoDecoded(uid: Int, width: Int, height: Int, elapsed: Int) { + callback(RtcEngineEvents.FirstRemoteVideoDecoded, uid, width, height, elapsed) + } + + @Deprecated("", ReplaceWith("onLocalAudioStateChanged")) + override fun onMicrophoneEnabled(enabled: Boolean) { + callback(RtcEngineEvents.MicrophoneEnabled, enabled) + } + + @Deprecated("", ReplaceWith("onConnectionStateChanged")) + override fun onConnectionInterrupted() { + callback(RtcEngineEvents.ConnectionInterrupted) + } + + @Deprecated("", ReplaceWith("onConnectionStateChanged")) + override fun onConnectionBanned() { + callback(RtcEngineEvents.ConnectionBanned) + } + + @Deprecated("", ReplaceWith("onRemoteAudioStats")) + override fun onAudioQuality(uid: Int, @Annotations.AgoraNetworkQuality quality: Int, delay: Short, lost: Short) { + callback(RtcEngineEvents.AudioQuality, uid, quality, delay, lost) + } + + @Deprecated("", ReplaceWith("onLocalVideoStateChanged")) + override fun onCameraReady() { + callback(RtcEngineEvents.CameraReady) + } + + @Deprecated("", ReplaceWith("onLocalVideoStateChanged")) + override fun onVideoStopped() { + callback(RtcEngineEvents.VideoStopped) + } + + override fun onFirstLocalAudioFramePublished(elapsed: Int) { + callback(RtcEngineEvents.FirstLocalAudioFramePublished, elapsed) + } + + override fun onFirstLocalVideoFramePublished(elapsed: Int) { + callback(RtcEngineEvents.FirstLocalVideoFramePublished, elapsed) + } + + override fun onAudioPublishStateChanged(channel: String?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { + callback(RtcEngineEvents.AudioPublishStateChanged, channel, oldState, newState, elapseSinceLastState) + } + + override fun onVideoPublishStateChanged(channel: String?, @Annotations.AgoraStreamPublishState oldState: Int, @Annotations.AgoraStreamPublishState newState: Int, elapseSinceLastState: Int) { + callback(RtcEngineEvents.VideoPublishStateChanged, channel, oldState, newState, elapseSinceLastState) + } + + override fun onAudioSubscribeStateChanged(channel: String?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { + callback(RtcEngineEvents.AudioSubscribeStateChanged, channel, uid, oldState, newState, elapseSinceLastState) + } + + override fun onVideoSubscribeStateChanged(channel: String?, uid: Int, @Annotations.AgoraStreamSubscribeState oldState: Int, @Annotations.AgoraStreamSubscribeState newState: Int, elapseSinceLastState: Int) { + callback(RtcEngineEvents.VideoSubscribeStateChanged, channel, uid, oldState, newState, elapseSinceLastState) + } + + override fun onRtmpStreamingEvent(url: String?, @Annotations.AgoraRtmpStreamingEvent error: Int) { + callback(RtcEngineEvents.RtmpStreamingEvent, url, error) + } } diff --git a/RtcSurfaceView.kt b/RtcSurfaceView.kt index f47b7fc0f..285478162 100644 --- a/RtcSurfaceView.kt +++ b/RtcSurfaceView.kt @@ -9,92 +9,92 @@ import io.agora.rtc.video.VideoCanvas import java.lang.ref.WeakReference class RtcSurfaceView( - context: Context + context: Context ) : FrameLayout(context) { - private var surface: SurfaceView - private var canvas: VideoCanvas - private var channel: WeakReference? = null + private var surface: SurfaceView + private var canvas: VideoCanvas + private var channel: WeakReference? = null - init { - try { - surface = RtcEngine.CreateRendererView(context) - } catch (e: UnsatisfiedLinkError) { - throw RuntimeException("Please init RtcEngine first!") - } - canvas = VideoCanvas(surface) - addView(surface) + init { + try { + surface = RtcEngine.CreateRendererView(context) + } catch (e: UnsatisfiedLinkError) { + throw RuntimeException("Please init RtcEngine first!") } + canvas = VideoCanvas(surface) + addView(surface) + } - fun setZOrderMediaOverlay(isMediaOverlay: Boolean) { - try { - removeView(surface) - surface.setZOrderMediaOverlay(isMediaOverlay) - addView(surface) - } catch (e: Exception) { - e.printStackTrace() - } + fun setZOrderMediaOverlay(isMediaOverlay: Boolean) { + try { + removeView(surface) + surface.setZOrderMediaOverlay(isMediaOverlay) + addView(surface) + } catch (e: Exception) { + e.printStackTrace() } + } - fun setZOrderOnTop(onTop: Boolean) { - try { - removeView(surface) - surface.setZOrderOnTop(onTop) - addView(surface) - } catch (e: Exception) { - e.printStackTrace() - } + fun setZOrderOnTop(onTop: Boolean) { + try { + removeView(surface) + surface.setZOrderOnTop(onTop) + addView(surface) + } catch (e: Exception) { + e.printStackTrace() } + } - fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) { - this.channel = if (channel != null) WeakReference(channel) else null - canvas.channelId = this.channel?.get()?.channelId() - canvas.uid = uid - setupVideoCanvas(engine) - } + fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) { + this.channel = if (channel != null) WeakReference(channel) else null + canvas.channelId = this.channel?.get()?.channelId() + canvas.uid = uid + setupVideoCanvas(engine) + } - fun resetVideoCanvas(engine: RtcEngine) { - val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode) - if (canvas.uid == 0) { - engine.setupLocalVideo(canvas) - } else { - engine.setupRemoteVideo(canvas) - } + fun resetVideoCanvas(engine: RtcEngine) { + val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode) + if (canvas.uid == 0) { + engine.setupLocalVideo(canvas) + } else { + engine.setupRemoteVideo(canvas) } + } - private fun setupVideoCanvas(engine: RtcEngine) { - if (canvas.uid == 0) { - engine.setupLocalVideo(canvas) - } else { - engine.setupRemoteVideo(canvas) - } + private fun setupVideoCanvas(engine: RtcEngine) { + if (canvas.uid == 0) { + engine.setupLocalVideo(canvas) + } else { + engine.setupRemoteVideo(canvas) } + } - fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) { - canvas.renderMode = renderMode - setupRenderMode(engine) - } + fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) { + canvas.renderMode = renderMode + setupRenderMode(engine) + } - fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) { - canvas.mirrorMode = mirrorMode - setupRenderMode(engine) - } + fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) { + canvas.mirrorMode = mirrorMode + setupRenderMode(engine) + } - private fun setupRenderMode(engine: RtcEngine) { - if (canvas.uid == 0) { - engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode) - } else { - channel?.get()?.let { - it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) - return@setupRenderMode - } - engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) - } + private fun setupRenderMode(engine: RtcEngine) { + if (canvas.uid == 0) { + engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode) + } else { + channel?.get()?.let { + it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) + return@setupRenderMode + } + engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) } + } - override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - val width: Int = MeasureSpec.getSize(widthMeasureSpec) - val height: Int = MeasureSpec.getSize(heightMeasureSpec) - surface.layout(0, 0, width, height) - super.onMeasure(widthMeasureSpec, heightMeasureSpec) - } + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val width: Int = MeasureSpec.getSize(widthMeasureSpec) + val height: Int = MeasureSpec.getSize(heightMeasureSpec) + surface.layout(0, 0, width, height) + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + } } diff --git a/RtcTextureView.kt b/RtcTextureView.kt index 1a64d6fa8..4927e85e0 100644 --- a/RtcTextureView.kt +++ b/RtcTextureView.kt @@ -9,72 +9,72 @@ import io.agora.rtc.video.VideoCanvas import java.lang.ref.WeakReference class RtcTextureView( - context: Context + context: Context ) : FrameLayout(context) { - private var texture: TextureView - private var canvas: VideoCanvas - private var channel: WeakReference? = null + private var texture: TextureView + private var canvas: VideoCanvas + private var channel: WeakReference? = null - init { - try { - texture = RtcEngine.CreateTextureView(context) - } catch (e: UnsatisfiedLinkError) { - throw RuntimeException("Please init RtcEngine first!") - } - canvas = VideoCanvas(texture) - addView(texture) + init { + try { + texture = RtcEngine.CreateTextureView(context) + } catch (e: UnsatisfiedLinkError) { + throw RuntimeException("Please init RtcEngine first!") } + canvas = VideoCanvas(texture) + addView(texture) + } - fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) { - this.channel = if (channel != null) WeakReference(channel) else null - canvas.channelId = this.channel?.get()?.channelId() - canvas.uid = uid - setupVideoCanvas(engine) - } + fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) { + this.channel = if (channel != null) WeakReference(channel) else null + canvas.channelId = this.channel?.get()?.channelId() + canvas.uid = uid + setupVideoCanvas(engine) + } - fun resetVideoCanvas(engine: RtcEngine) { - val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode) - if (canvas.uid == 0) { - engine.setupLocalVideo(canvas) - } else { - engine.setupRemoteVideo(canvas) - } + fun resetVideoCanvas(engine: RtcEngine) { + val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode) + if (canvas.uid == 0) { + engine.setupLocalVideo(canvas) + } else { + engine.setupRemoteVideo(canvas) } + } - private fun setupVideoCanvas(engine: RtcEngine) { - if (canvas.uid == 0) { - engine.setupLocalVideo(canvas) - } else { - engine.setupRemoteVideo(canvas) - } + private fun setupVideoCanvas(engine: RtcEngine) { + if (canvas.uid == 0) { + engine.setupLocalVideo(canvas) + } else { + engine.setupRemoteVideo(canvas) } + } - fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) { - canvas.renderMode = renderMode - setupRenderMode(engine) - } + fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) { + canvas.renderMode = renderMode + setupRenderMode(engine) + } - fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) { - canvas.mirrorMode = mirrorMode - setupRenderMode(engine) - } + fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) { + canvas.mirrorMode = mirrorMode + setupRenderMode(engine) + } - private fun setupRenderMode(engine: RtcEngine) { - if (canvas.uid == 0) { - engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode) - } else { - channel?.get()?.let { - it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) - return@setupRenderMode - } - engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) - } + private fun setupRenderMode(engine: RtcEngine) { + if (canvas.uid == 0) { + engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode) + } else { + channel?.get()?.let { + it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) + return@setupRenderMode + } + engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode) } + } - override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - val width: Int = MeasureSpec.getSize(widthMeasureSpec) - val height: Int = MeasureSpec.getSize(heightMeasureSpec) - texture.layout(0, 0, width, height) - super.onMeasure(widthMeasureSpec, heightMeasureSpec) - } + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val width: Int = MeasureSpec.getSize(widthMeasureSpec) + val height: Int = MeasureSpec.getSize(heightMeasureSpec) + texture.layout(0, 0, width, height) + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + } } From e10a6339339eb75b11c75712509c2a7947eec933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=A9=B7?= Date: Thu, 3 Dec 2020 20:48:18 +0800 Subject: [PATCH 04/20] update en doc --- src/common/Enums.ts | 230 +++++++++++++++++++++++++++++++-- src/common/RtcEngine.native.ts | 132 +++++++++++++++++-- 2 files changed, 339 insertions(+), 23 deletions(-) diff --git a/src/common/Enums.ts b/src/common/Enums.ts index 94fef4806..83bf92ca9 100644 --- a/src/common/Enums.ts +++ b/src/common/Enums.ts @@ -470,35 +470,39 @@ export enum AudioSampleRateType { */ export enum AudioScenario { /** - * 0: Default. + * 0: Default audio scenario. */ Default = 0, /** - * 1: Entertainment scenario, supporting voice during gameplay. + * 1: Entertainment scenario where users need to frequently switch the user role. */ ChatRoomEntertainment = 1, /** - * 2: Education scenario, prioritizing fluency and stability. + * 2: Education scenario where users want smoothness and stability. */ Education = 2, /** - * 3: Live gaming scenario, enabling the gaming audio effects in the speaker mode in a live broadcast scenario. Choose this scenario for high-fidelity music playback. + * 3: High-quality audio chatroom scenario where hosts mainly play music. */ GameStreaming = 3, /** - * 4: Showroom scenario, optimizing the audio quality with external professional equipment. + * 4: Showroom scenario where a single host wants high-quality audio. */ ShowRoom = 4, /** - * 5: Gaming scenario. + * 5: Gaming scenario for group chat that only contains the human voice. */ ChatRoomGaming = 5, /** - * TODO + * IoT (Internet of Things) scenario where users use IoT devices with low power consumption. + * + * @since v3.2.0. */ IOT = 6, /** - * TODO + * Meeting scenario that mainly contains the human voice. + * + * @since v3.2.0. */ MEETING = 8, } @@ -2387,73 +2391,277 @@ export enum AudioSessionOperationRestriction { } /** - * TODO + * The options for SDK preset audio effects. */ export enum AudioEffectPreset { + /** + * Turn off audio effects and use the original voice. + */ AudioEffectOff = 0x00000000, + /** + * An audio effect typical of a KTV venue. + * + * **Note** + * + * To achieve better audio effect quality, Agora recommends calling setAudioProfile and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ RoomAcousticsKTV = 0x02010100, - + /** + * An audio effect typical of a concert hall. + * + * **Note** + * + * To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ RoomAcousticsVocalConcert = 0x02010200, + /** + * An audio effect typical of a recording studio. + * + * **Note** + * + * To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ RoomAcousticsStudio = 0x02010300, + /** + * An audio effect typical of a vintage phonograph. + * + * **Note** + * + * To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ RoomAcousticsPhonograph = 0x02010400, + /** + * A virtual stereo effect that renders monophonic audio as stereo audio. + * + * **Note** + * + * Call `setAudioProfile` and set the profile parameter to `MusicStandardStereo(3)` or `MusicHighQualityStereo(5)` + * before setting this enumerator; otherwise, the enumerator setting does not take effect. + */ RoomAcousticsVirtualStereo = 0x02010500, + /** + * A more spatial audio effect. + * + * **Note** + * + * To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ RoomAcousticsSpacial = 0x02010600, + /** + * A more ethereal audio effect. + * + * **Note** + * + * To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ RoomAcousticsEthereal = 0x02010700, + /** + * A 3D voice effect that makes the voice appear to be moving around the user. + * The default cycle period of the 3D voice effect is 10 seconds. To change the cycle period, call `setAudioEffectParameters` after this method. + * + * **Note** + * + * - Call `setAudioProfile` and set the profile parameter to `MusicStandardStereo(3)` or `MusicHighQualityStereo(5)` before setting this enumerator; + * otherwise, the enumerator setting does not take effect. + * - If the 3D voice effect is enabled, users need to use stereo audio playback devices to hear the anticipated voice effect. + */ RoomAcoustics3DVoice = 0x02010800, + /** + * The voice of an uncle. + * + * **Note** + * + * - Agora recommends using this enumerator to process a male-sounding voice; otherwise, you may not hear the anticipated voice effect. + * - To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ VoiceChangerEffectUncle = 0x02020100, + /** + * The voice of an uncle. + * + * **Note** + * + * - Agora recommends using this enumerator to process a male-sounding voice; otherwise, you may not hear the anticipated voice effect. + * - To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ VoiceChangerEffectOldMan = 0x02020200, + /** + * The voice of a boy. + * + * **Note** + * + * - Agora recommends using this enumerator to process a male-sounding voice; otherwise, you may not hear the anticipated voice effect. + * - To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ VoiceChangerEffectBoy = 0x02020300, + /** + * The voice of a young woman. + * + * **Note** + * + * - Agora recommends using this enumerator to process a male-sounding voice; otherwise, you may not hear the anticipated voice effect. + * - To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ VoiceChangerEffectSister = 0x02020400, + /** + * The voice of a girl. + * + * **Note** + * + * - Agora recommends using this enumerator to process a male-sounding voice; otherwise, you may not hear the anticipated voice effect. + * - To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ VoiceChangerEffectGirl = 0x02020500, + /** + * The voice of Pig King, a character in Journey to the West who has a voice like a growling bear. + * + * **Note** + * + * - Agora recommends using this enumerator to process a male-sounding voice; otherwise, you may not hear the anticipated voice effect. + * - To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ VoiceChangerEffectPigKing = 0x02020600, + /** + * The voice of Hulk. + * + * **Note** + * + * - Agora recommends using this enumerator to process a male-sounding voice; otherwise, you may not hear the anticipated voice effect. + * - To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ VoiceChangerEffectHulk = 0x02020700, + /** + * An audio effect typical of R&B music. + * + * **Note** + * + * Call `setAudioProfile` and set the profile parameter to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator; + * otherwise, the enumerator setting does not take effect. + */ StyleTransformationRnB = 0x02030100, + /** + * An audio effect typical of popular music. + * + * **Note** + * + * Call `setAudioProfile` and set the profile parameter to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator; + * otherwise, the enumerator setting does not take effect. + */ StyleTransformationPopular = 0x02030200, + /** + * A pitch correction effect that corrects the user's pitch based on the pitch of the natural C major scale. + * To change the basic mode and tonic pitch, call `setAudioEffectParameters` after this method. + * + * **Note** + * + * To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. + */ PitchCorrection = 0x02040100, } /** - * TODO + * The options for SDK preset voice beautifier effects. */ export enum VoiceBeautifierPreset { + /** + * Turn off voice beautifier effects and use the original voice. + */ VoiceBeautifierOff = 0x00000000, + /** + * A more magnetic voice. + * + * **Note** + * + * Agora recommends using this enumerator to process a male-sounding voice; otherwise, you may experience vocal distortion. + */ ChatBeautifierMagnetic = 0x01010100, + /** + * A fresher voice. + * + * **Note** + * + * Agora recommends using this enumerator to process a female-sounding voice; otherwise, you may experience vocal distortion. + */ ChatBeautifierFresh = 0x01010200, + /** + * A more vital voice. + * + * **Note** + * + * Agora recommends using this enumerator to process a female-sounding voice; otherwise, you may experience vocal distortion. + */ ChatBeautifierVitality = 0x01010300, + /** + * A more vigorous voice. + */ TimbreTransformationVigorous = 0x01030100, + /** + * A deeper voice. + */ TimbreTransformationDeep = 0x01030200, + /** + * A mellower voice. + */ TimbreTransformationMellow = 0x01030300, + /** + * A falsetto voice. + */ TimbreTransformationFalsetto = 0x01030400, + /** + * A fuller voice. + */ TimbreTransformationFull = 0x01030500, + /** + * A clearer voice. + */ TimbreTransformationClear = 0x01030600, + /** + * A more resounding voice. + */ TimbreTransformationResounding = 0x01030700, + /** + * A more ringing voice. + */ TimbreTransformationRinging = 0x01030800, } diff --git a/src/common/RtcEngine.native.ts b/src/common/RtcEngine.native.ts index 6d6022b8a..f8bfc4c57 100644 --- a/src/common/RtcEngine.native.ts +++ b/src/common/RtcEngine.native.ts @@ -812,11 +812,11 @@ export default class RtcEngine implements RtcEngineInterface { * * - You must call this method before calling [`joinChannel`]{@link joinChannel}. * - In the [`Communication`]{@link ChannelProfile.Communication} and [`LiveBroadcasting`]{@link ChannelProfile.LiveBroadcasting} profiles, the bitrates may be different from your settings due to network self-adaptation. - * - In scenarios requiring high-quality audio, we recommend setting profile as [`MusicHighQuality(4)`]{@link AudioProfile.MusicHighQuality} and scenario as [`GameStreaming(3)`]{@link AudioScenario.GameStreaming}. - * For example, for music education scenarios. + * - In scenarios requiring high-quality audio, we recommend setting profile as `ShowRoom(4)` and scenario as `GameStreaming(3)`. For example, for music education scenarios. * - * @param profile Sets the sample rate, bitrate, encoding mode, and the number of channels. - * @param scenario Sets the audio application scenarios. Under different audio scenarios, the device uses different volume tracks, i.e. either the in-call volume or the media volume. + * @param profile Sets the sample rate, bitrate, encoding mode, and the number of channels. See [`AudioProfile`]{@link AudioProfile}. + * @param scenario Sets the audio application scenarios. See [`AudioScenario`]{@link AudioScenario}. Under different audio scenarios, the device uses different volume tracks, i.e. either the in-call volume or the media volume. + * For details, see [What is the difference between the in-call volume and the media volume?](https://docs.agora.io/en/Voice/faq/system_volume). */ setAudioProfile( profile: AudioProfile, @@ -1431,7 +1431,7 @@ export default class RtcEngine implements RtcEngineInterface { /** * Sets the local voice changer option. * - * @deprecated + * @deprecated Deprecated as of v3.2.0. Use `setAudioEffectPreset` or `setVoiceBeautifierPreset` instead. * * **Note** * @@ -1492,7 +1492,7 @@ export default class RtcEngine implements RtcEngineInterface { /** * Sets the preset local voice reverberation effect. * - * @deprecated + * @deprecated Deprecated as of v3.2.0. Use `setAudioEffectPreset` or `setVoiceBeautifierPreset` instead. * * **Note** * @@ -2503,11 +2503,68 @@ export default class RtcEngine implements RtcEngineInterface { } /** - * TODO + * Sets parameters for SDK preset audio effects. + * + * @since v3.2.0. + * + * Call this method to set the following parameters for the local user who send an audio stream: + * - 3D voice effect: Sets the cycle period of the 3D voice effect. + * - Pitch correction effect: Sets the basic mode and tonic pitch of the pitch correction effect. Different songs have different modes and tonic pitches. + * Agora recommends bounding this method with interface elements to enable users to adjust the pitch correction interactively. + * + * After setting parameters, all users in the channel can hear the relevant effect. + * + * You can call this method directly or after `setAudioEffectPreset`. If you call this method after `setAudioEffectPreset`, ensure that you set the preset parameter of `setAudioEffectPreset` to `RoomAcoustics3DVoice` or `PitchCorrection` and + * then call this method to set the same enumerator; otherwise, this method overrides `setAudioEffectPreset`. + * + * **Note** + * - To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the scenario parameter + * to `GameStreaming(3)` before calling this method. + * - Do not set the profile parameter of `setAudioProfile` to `SpeechStandard(1)` or `AUDIO_PROFILE_IOT(6)`; otherwise, this method call fails. + * - This method works best with the human voice. Agora does not recommend using this method for audio containing music. + * - After calling this method, Agora recommends not calling the following methods, because they can override `setAudioEffectParameters`: + * - `setAudioEffectPreset` + * - `setVoiceBeautifierPreset` + * - `setLocalVoiceReverbPreset` + * - `setLocalVoiceChanger` + * - `setLocalVoicePitch` + * - `setLocalVoiceEqualization` + * - `setLocalVoiceReverb` + * + * @param preset The options for SDK preset audio effects: + * - 3D voice effect: `RoomAcoustics3DVoice`. + * - Call `setAudioProfile` and set the profile parameter to `MusicStandardStereo(3)` or `MusicHighQualityStereo(5)` before setting this enumerator; + * otherwise, the enumerator setting does not take effect. + * - If the 3D voice effect is enabled, users need to use stereo audio playback devices to hear the anticipated voice effect. + * - Pitch correction effect: `PitchCorrection`. To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. * - * @param preset * @param param1 + * - If you set preset to `RoomAcoustics3DVoice`, the `param1` sets the cycle period of the 3D voice effect. + * The value range is [1,60] and the unit is a second. The default value is 10 seconds, indicating that the voice moves around you every 10 seconds. + * - If you set preset to `PitchCorrection`, `param1` sets the basic mode of the pitch correction effect: + * - 1: (Default) Natural major scale. + * - 2: Natural minor scale. + * - 3: Japanese pentatonic scale. + * * @param param2 + * - You need to set `param2` to 0. + * - If you set `preset` to `PitchCorrection`, `param2` sets the tonic pitch of the pitch correction effect: + * - 1: A + * - 2: A# + * - 3: B + * - 4: (Default) C + * - 5: C# + * - 6: D + * - 7: D# + * - 8: E + * - 9: F + * - 10: F# + * - 11: G + * - 12: G# + * + * @returns + * - 0: Success. + * - < 0: Failure. */ setAudioEffectParameters( preset: AudioEffectPreset, @@ -2522,18 +2579,69 @@ export default class RtcEngine implements RtcEngineInterface { } /** - * TODO + * Sets an SDK preset audio effect. + * + * @since v3.2.0. + * + * Call this method to set an SDK preset audio effect for the local user who sends an audio stream. + * This audio effect does not change the gender characteristics of the original voice. After setting an audio effect, all users in the channel can hear the effect. + * + * You can set different audio effects for different scenarios. * - * @param preset + * To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the scenario parameter to `GameStreaming(3)` before calling this method. + * + * **Note** + * - You can call this method either before or after joining a channel. + * - Do not set the profile parameter of `setAudioProfile` to `SpeechStandard(1)`; otherwise, this method call fails. + * - This method works best with the human voice. Agora does not recommend using this method for audio containing music. + * - If you call this method and set the preset parameter to enumerators except `RoomAcoustics3DVoice` or `PitchCorrection`, do not call `setAudioEffectParameters`; otherwise, `setAudioEffectParameters` overrides this method. + * - After calling this method, Agora recommends not calling the following methods, because they can override `setAudioEffectPreset`: + * - `setVoiceBeautifierPreset` + * - `setLocalVoiceReverbPreset` + * - `setLocalVoiceChanger` + * - `setLocalVoicePitch` + * - `setLocalVoiceEqualization` + * - `setLocalVoiceReverb` + * + * @param preset The options for SDK preset audio effects. See [`AudioEffectPreset`]{@link AudioEffectPreset}. + * + * @returns + * - 0: Success. + * - < 0: Failure. */ setAudioEffectPreset(preset: AudioEffectPreset): Promise { return RtcEngine._callMethod('setAudioEffectPreset', { preset }); } /** - * TODO + * Sets an SDK preset voice beautifier effect. + * + * @since v3.2.0. + * + * Call this method to set an SDK preset voice beautifier effect for the local user who sends an audio stream. + * After setting a voice beautifier effect, all users in the channel can hear the effect. * - * @param preset + * You can set different voice beautifier effects for different scenarios. + * + * To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the scenario parameter to `GameStreaming(3)` and the profile parameter to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before calling this method. + * + * **Note** + * - You can call this method either before or after joining a channel. + * - Do not set the profile parameter of `setAudioProfile` to `SpeechStandard(1)`; otherwise, this method call fails. + * - This method works best with the human voice. Agora does not recommend using this method for audio containing music. + * - After calling this method, Agora recommends not calling the following methods, because they can override `setVoiceBeautifierPreset`: + * - `setAudioEffectPreset` + * - `setLocalVoiceReverbPreset` + * - `setLocalVoiceChanger` + * - `setLocalVoicePitch` + * - `setLocalVoiceEqualization` + * - `setLocalVoiceReverb` + * + * @param preset The options for SDK preset voice beautifier effects. See [`VoiceBeautifierPreset`]{@link VoiceBeautifierPreset}. + * + * @returns + * - 0: Success. + * - < 0: Failure. */ setVoiceBeautifierPreset(preset: VoiceBeautifierPreset): Promise { return RtcEngine._callMethod('setVoiceBeautifierPreset', { preset }); From 76c3a0891e8dea6a96ea716d8614a2b8e4ba9e87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=A9=B7?= Date: Tue, 15 Dec 2020 12:09:59 +0800 Subject: [PATCH 05/20] update docs --- src/common/Enums.ts | 16 ++--- src/common/RtcChannel.native.ts | 66 +++++++++++++++++- src/common/RtcEngine.native.ts | 117 +++++++++++++++++++++++++++++--- 3 files changed, 180 insertions(+), 19 deletions(-) diff --git a/src/common/Enums.ts b/src/common/Enums.ts index 83bf92ca9..aa7721b48 100644 --- a/src/common/Enums.ts +++ b/src/common/Enums.ts @@ -2217,11 +2217,11 @@ export enum WarningCode { */ AdmInconsistentDevices = 1042, /** - * 1051: Audio Device Module: howling is detected. + * 1051: Audio Device Module: Howling is detected. */ ApmHowling = 1051, /** - * 1052: Audio Device Module: the device is in the glitch state. + * 1052: Audio Device Module: The device is in the glitch state. */ AdmGlitchState = 1052, /** @@ -2229,15 +2229,15 @@ export enum WarningCode { */ ApmResidualEcho = 1053, /** - * 1610: Super-resolution warning: the original video dimensions of the remote user exceed 640*480. + * 1610: Super-resolution warning: The origin resolution of the remote video is beyond the range where the super-resolution algorithm can be applied. */ SuperResolutionStreamOverLimitation = 1610, /** - * 1611: Super-resolution warning: another user is using super resolution. + * 1611: Super-resolution warning: Another user is already using the super-resolution algorithm. */ SuperResolutionUserCountOverLimitation = 1611, /** - * 1612: Super-resolution warning: The device is not supported. + * 1612: Super-resolution warning: The device does not support the super-resolution algorithm. */ SuperResolutionDeviceNotSupported = 1612, } @@ -2540,8 +2540,7 @@ export enum AudioEffectPreset { * * **Note** * - * - Agora recommends using this enumerator to process a male-sounding voice; otherwise, you may not hear the anticipated voice effect. - * - To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. */ VoiceChangerEffectPigKing = 0x02020600, @@ -2551,8 +2550,7 @@ export enum AudioEffectPreset { * * **Note** * - * - Agora recommends using this enumerator to process a male-sounding voice; otherwise, you may not hear the anticipated voice effect. - * - To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter + * To achieve better audio effect quality, Agora recommends calling `setAudioProfile` and setting the profile parameter * to `MusicHighQuality(4)` or `MusicHighQualityStereo(5)` before setting this enumerator. */ VoiceChangerEffectHulk = 0x02020700, diff --git a/src/common/RtcChannel.native.ts b/src/common/RtcChannel.native.ts index 2eae8c622..1b39a3b5b 100644 --- a/src/common/RtcChannel.native.ts +++ b/src/common/RtcChannel.native.ts @@ -111,6 +111,11 @@ export default class RtcChannel implements RtcChannelInterface { /** * Destroys the [`RtcChannel`]{@link RtcChannel} instance. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 7(NotInitialized): The `RtcChannel` instance is not initialized before calling this method. */ destroy(): Promise { this.removeAllListeners(); @@ -199,6 +204,13 @@ export default class RtcChannel implements RtcChannelInterface { * - The remote client: [`UserJoined`]{@link RtcChannelEvents.UserJoined} * or [`UserOffline(BecomeAudience)`]{@link UserOfflineReason.BecomeAudience}. * @param role The role of the user. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 1(Failed): A general error occurs (no specified reason). + * - 2(InvalidArgument): The parameter is invalid. + * - 7(NotInitialized): The SDK is not initialized. */ setClientRole(role: ClientRole): Promise { return this._callMethod('setClientRole', { role }); @@ -219,6 +231,16 @@ export default class RtcChannel implements RtcChannelInterface { * @param optionalInfo Additional information about the channel. This parameter can be set as null. Other users in the channel do not receive this information. * @param optionalUid The user ID. A 32-bit unsigned integer with a value ranging from 1 to (232-1). This parameter must be unique. If uid is not assigned (or set as 0), the SDK assigns a uid and reports it in the [`JoinChannelSuccess`]{@link RtcChannelEvents.JoinChannelSuccess} callback. The app must maintain this user ID. * @param options The channel media options. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): The parameter is invalid. + * - 3(NotReady): The SDK fails to be initialized. You can try re-initializing the SDK. + * - 5(Refused): The request is rejected. Possible reasons: + * - You have created an `RtcChannel` object with the same channel name. + * - You have joined and published a stream in a channel created by the `RtcChannel` object. + * - 7(NotInitialized): The SDK is not initialized. */ joinChannel( token: string | undefined | null, @@ -253,6 +275,13 @@ export default class RtcChannel implements RtcChannelInterface { * - The space character. * - Punctuation characters and other symbols, including: "!", "#", "$", "%", "&", "(", ")", "+", "-", ":", ";", "<", "=", ".", ">", "?", "@", "[", "]", "^", "_", " {", "}", "|", "~", ",". * @param options The channel media options. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): The parameter is invalid. + * - 3(NotReady): The SDK fails to be initialized. You can try re-initializing the SDK. + * - 5(Refused): The request is rejected. */ joinChannelWithUserAccount( token: string | undefined | null, @@ -272,6 +301,13 @@ export default class RtcChannel implements RtcChannelInterface { * A successful call of this method triggers the following callbacks: * - The local client: [`LeaveChannel`]{@link RtcChannelEvents.LeaveChannel}. * - The remote client: [`UserOffline`]{@link RtcChannelEvents.UserOffline}, if the user leaving the channel is in a `Communication` channel, or is a host in a `LiveBroadcasting` channel. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 1(Failed): A general error occurs (no specified reason). + * - 2(InvalidArgument): The parameter is invalid. + * - 7(NotInitialized): The SDK is not initialized. */ leaveChannel(): Promise { return this._callMethod('leaveChannel'); @@ -286,6 +322,13 @@ export default class RtcChannel implements RtcChannelInterface { * * You should get a new token from your server and call this method to renew it. Failure to do so results in the SDK disconnecting from the Agora server. * @param token The new token. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 1(Failed): A general error occurs (no specified reason). + * - 2(InvalidArgument): The parameter is invalid. + * - 7(NotInitialized): The SDK is not initialized. */ renewToken(token: string): Promise { return this._callMethod('renewToken', { token }); @@ -460,6 +503,12 @@ export default class RtcChannel implements RtcChannelInterface { * ensure that you call the [`setLiveTranscoding`]{@link RtcChannel.setLiveTranscoding} method before this method. * - `true`: Enable transcoding. To transcode the audio or video streams when publishing them to CDN live, often used for combining the audio and video streams of multiple hosts in CDN live. * - `false`: Disable transcoding. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): Invalid parameter, usually because the URL address is null or the string length is 0. + * - 7(NotInitialized): You have not initialized `RtcEngine` when publishing the stream. */ addPublishStreamUrl(url: string, transcodingEnabled: boolean): Promise { return this._callMethod('addPublishStreamUrl', { url, transcodingEnabled }); @@ -675,6 +724,13 @@ export default class RtcChannel implements RtcChannelInterface { * - `true`: Enable the built-in encryption. * - `false`: Disable the built-in encryption. * @param config Configurations of built-in encryption schemas. See [`EncryptionConfig`]{@link EncryptionConfig}. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): An invalid parameter is used. Set the parameter with a valid value. + * - 4(NotSupported): The encryption mode is incorrect or the SDK fails to load the external encryption library. Check the enumeration or reload the external encryption library. + * - 7(NotInitialized): The SDK is not initialized. Initialize the `RtcEngine` instance before calling this method. */ enableEncryption(enabled: boolean, config: EncryptionConfig): Promise { return this._callMethod('enableEncryption', { enabled, config }); @@ -743,6 +799,14 @@ export default class RtcChannel implements RtcChannelInterface { * - Supported FLV audio codec type: AAC. * - Supported FLV video codec type: H264 (AVC). * @param config The [`LiveInjectStreamConfig`]{@link LiveInjectStreamConfig} object, which contains the configuration information for the added voice or video stream. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): The injected URL does not exist. Call this method again to inject the stream and ensure that the URL is valid. + * - 3(NotReady): The user is not in the channel. + * - 4(NotSupported): The channel profile is not `LiveBroadcasting`. Call the `setChannelProfile` method and set the channel profile to `LiveBroadcasting` before calling this method. + * - 7(NotInitialized): The SDK is not initialized. Initialize the `RtcEngine` instance before calling this method. */ addInjectStreamUrl( url: string, @@ -784,7 +848,7 @@ export default class RtcChannel implements RtcChannelInterface { * - `false`: The recipients do not receive the data in the sent order. * @returns * - Returns the stream ID, if the method call is successful. - * - < 0: Failure. The error code is related to the integer displayed in [Error Codes]{@link ErrorCode}. + * - Error codes: Failure. The error code is related to the integer displayed in [Error Codes]{@link ErrorCode}. */ createDataStream(reliable: boolean, ordered: boolean): Promise { return this._callMethod('createDataStream', { reliable, ordered }); diff --git a/src/common/RtcEngine.native.ts b/src/common/RtcEngine.native.ts index f8bfc4c57..4bf2313e7 100644 --- a/src/common/RtcEngine.native.ts +++ b/src/common/RtcEngine.native.ts @@ -110,6 +110,7 @@ export default class RtcEngine implements RtcEngineInterface { * @returns * - The `RtcEngine` instance, if the method call succeeds. * - The error code, if the method call fails. + * - 101(InvalidAppId): The app ID is invalid. Check if it is in the correct format. */ static async create(appId: string): Promise { return RtcEngine.createWithAreaCode(appId, AreaCode.GLOB); @@ -136,6 +137,7 @@ export default class RtcEngine implements RtcEngineInterface { * @returns * - The `RtcEngine` instance, if the method call succeeds. * - The error code, if the method call fails. + * - 101(InvalidAppId): The app ID is invalid. Check if it is in the correct format. */ static async createWithAreaCode( appId: string, @@ -245,6 +247,12 @@ export default class RtcEngine implements RtcEngineInterface { * The Agora [`RtcEngine`]{@link RtcEngine} differentiates channel profiles and applies different optimization algorithms accordingly. * For example, it prioritizes smoothness and low latency for a video call, and prioritizes video quality for live interactive video streaming. * @param profile The channel profile of the Agora [`RtcEngine`]{@link RtcEngine}. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): The parameter is invalid. + * - 7(NotInitialized): The SDK is not initialized. */ setChannelProfile(profile: ChannelProfile): Promise { return RtcEngine._callMethod('setChannelProfile', { profile }); @@ -260,6 +268,13 @@ export default class RtcEngine implements RtcEngineInterface { * - The remote client: [`UserJoined`]{@link RtcEngineEvents.UserJoined} or [`UserOffline`]{@link RtcEngineEvents.UserOffline} ([`BecomeAudience`]{@link UserOfflineReason.BecomeAudience}). * * @param role Sets the role of a user. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 1(Failed): A general error occurs (no specified reason). + * - 2(InvalidArgument): The parameter is invalid. + * - 7(NotInitialized): The SDK is not initialized. */ setClientRole(role: ClientRole): Promise { return RtcEngine._callMethod('setClientRole', { role }); @@ -304,6 +319,16 @@ export default class RtcEngine implements RtcEngineInterface { * * The uid is represented as a 32-bit unsigned integer in the SDK. Since unsigned integers are not supported by Java, the uid is handled as a 32-bit signed integer and larger numbers are interpreted as negative numbers in Java. * If necessary, the uid can be converted to a 64-bit integer through “uid&0xffffffffL”. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): The parameter is invalid. + * - 3(NotReady): The SDK fails to be initialized. You can try re-initializing the SDK. + * - 5(Refused): The request is rejected. Possible reasons: + * - You have created an `RtcChannel` object with the same channel name. + * - You have joined and published a stream in a channel created by the `RtcChannel` object. + * - 7(NotInitialized): The SDK is not initialized. */ joinChannel( token: string | undefined | null, @@ -340,6 +365,16 @@ export default class RtcEngine implements RtcEngineInterface { * - All numeric characters: 0 to 9. * - The space character. * - Punctuation characters and other symbols, including: "!", "#", "$", "%", "&", "(", ")", "+", "-", ":", ";", "<", "=", ".", ">", "?", "@", "[", "]", "^", "_", " {", "}", "|", "~", ",". + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 1(Failed): A general error occurs (no specified reason). + * - 2(InvalidArgument): The parameter is invalid. + * - 5(Refused): The request is rejected, probably because the user is not an audience. + * - 7(NotInitialized): The SDK is not initialized. + * - 102(InvalidChannelId): The channel name is invalid. + * - 113(NotInChannel): The user is not in the channel. */ switchChannel( token: string | undefined | null, @@ -366,6 +401,13 @@ export default class RtcEngine implements RtcEngineInterface { * - If you call [`destroy`]{@link destroy} immediately after calling [`leaveChannel`]{@link leaveChannel}, the [`leaveChannel`]{@link leaveChannel} process interrupts, and the SDK does not trigger the [`LeaveChannel`]{@link RtcEngineEvents.LeaveChannel} callback. * * - If you call [`leaveChannel`]{@link leaveChannel} during CDN live streaming, the SDK triggers the [`removeInjectStreamUrl`]{@link removeInjectStreamUrl} method. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 1(Failed): A general error occurs (no specified reason). + * - 2(InvalidArgument): The parameter is invalid. + * - 7(NotInitialized): The SDK is not initialized. */ leaveChannel(): Promise { return RtcEngine._callMethod('leaveChannel'); @@ -381,6 +423,13 @@ export default class RtcEngine implements RtcEngineInterface { * * The app should retrieve a new token from the server and call this method to renew it. Failure to do so results in the SDK disconnecting from the server. * @param token The new token. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 1(Failed): A general error occurs (no specified reason). + * - 2(InvalidArgument): The parameter is invalid. + * - 7(NotInitialized): The SDK is not initialized. */ renewToken(token: string): Promise { return RtcEngine._callMethod('renewToken', { token }); @@ -431,6 +480,12 @@ export default class RtcEngine implements RtcEngineInterface { * @param rating Rating of the call. The value is between 1 (lowest score) and 5 (highest score). * If you set a value out of this range, the [`InvalidArgument(-2)`]{@link ErrorCode.InvalidArgument} error occurs. * @param description (Optional) The description of the rating. The string length must be less than 800 bytes. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): The parameter is invalid. + * - 3(NotReady): The SDK fails to be initialized. You can try re-initializing the SDK. */ rate(callId: string, rating: Rate, description?: string): Promise { return RtcEngine._callMethod('rate', { callId, rating, description }); @@ -441,6 +496,12 @@ export default class RtcEngine implements RtcEngineInterface { * * @param callId ID of the call retrieved from the [`getCallId`]{@link getCallId} method. * @param description (Optional) The description of the complaint. The string length must be less than 800 bytes. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): The parameter is invalid. + * - 3(NotReady): The SDK fails to be initialized. You can try re-initializing the SDK. */ complain(callId: string, description: string): Promise { return RtcEngine._callMethod('complain', { callId, description }); @@ -552,6 +613,14 @@ export default class RtcEngine implements RtcEngineInterface { * - All numeric characters: 0 to 9. * - The space character. * - Punctuation characters and other symbols, including: "!", "#", "$", "%", "&", "(", ")", "+", "-", ":", ";", "<", "=", ".", ">", "?", "@", "[", "]", "^", "_", " {", "}", "|", "~", ",". + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): The parameter is invalid. + * - 3(NotReady): The SDK fails to be initialized. You can try re-initializing the SDK. + * - 5(Refused): The request is rejected. + * */ joinChannelWithUserAccount( token: string | undefined | null, @@ -995,6 +1064,12 @@ export default class RtcEngine implements RtcEngineInterface { * - `true`: Enable image enhancement. * - `false`: Disable image enhancement. * @param options The image enhancement options. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 4(NotSupported): The system version is earlier than Android 4.4, which does not support this function. + * */ setBeautyEffectOptions( enabled: boolean, @@ -1115,7 +1190,7 @@ export default class RtcEngine implements RtcEngineInterface { * * @returns * - Returns the current playback position of the audio mixing, if the method call is successful. - * - < 0: Failure. + * - Error codes: Failure. */ getAudioMixingCurrentPosition(): Promise { return RtcEngine._callMethod('getAudioMixingCurrentPosition'); @@ -1130,7 +1205,7 @@ export default class RtcEngine implements RtcEngineInterface { * * @returns * - Returns the audio mixing duration, if the method call is successful. - * - < 0: Failure. + * - Error codes: Failure. */ getAudioMixingDuration(): Promise { return RtcEngine._callMethod('getAudioMixingDuration'); @@ -1143,7 +1218,7 @@ export default class RtcEngine implements RtcEngineInterface { * * @returns * - Returns the audio mixing volume for local playback, if the method call is successful. The value range is [0,100]. - * - < 0: Failure. + * - Error codes: Failure. */ getAudioMixingPlayoutVolume(): Promise { return RtcEngine._callMethod('getAudioMixingPlayoutVolume'); @@ -1156,7 +1231,7 @@ export default class RtcEngine implements RtcEngineInterface { * * @returns * - Returns the audio mixing volume for publishing, if the method call is successful. The value range is [0,100]. - * - < 0: Failure. + * - Error codes: Failure. */ getAudioMixingPublishVolume(): Promise { return RtcEngine._callMethod('getAudioMixingPublishVolume'); @@ -1246,6 +1321,7 @@ export default class RtcEngine implements RtcEngineInterface { * @param cycle Sets the number of playback loops: * - Positive integer: Number of playback loops. * - -1: Infinite playback loops. + * */ startAudioMixing( filePath: string, @@ -1277,7 +1353,7 @@ export default class RtcEngine implements RtcEngineInterface { * * @returns * - Returns the volume, if the method call is successful. - * - < 0: Failure. + * - Error codes: Failure. */ getEffectsVolume(): Promise { return RtcEngine._callMethod('getEffectsVolume'); @@ -1568,6 +1644,12 @@ export default class RtcEngine implements RtcEngineInterface { * * - `true`: Enable transcoding. To transcode the audio or video streams when publishing them to CDN live, often used for combining the audio and video streams of multiple hosts in CDN live. * - `false`: Disable transcoding. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): Invalid parameter, usually because the URL address is null or the string length is 0. + * - 7(NotInitialized): You have not initialized `RtcEngine` when publishing the stream. */ addPublishStreamUrl(url: string, transcodingEnabled: boolean): Promise { return RtcEngine._callMethod('addPublishStreamUrl', { @@ -2078,6 +2160,13 @@ export default class RtcEngine implements RtcEngineInterface { * - `true`: Enable the built-in encryption. * - `false`: Disable the built-in encryption. * @param config Configurations of built-in encryption schemas. See [`EncryptionConfig`]{@link EncryptionConfig}. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): An invalid parameter is used. Set the parameter with a valid value. + * - 4(NotSupported): The encryption mode is incorrect or the SDK fails to load the external encryption library. Check the enumeration or reload the external encryption library. + * - 7(NotInitialized): The SDK is not initialized. Initialize the `RtcEngine` instance before calling this method. */ enableEncryption(enabled: boolean, config: EncryptionConfig): Promise { return RtcEngine._callMethod('enableEncryption', { enabled, config }); @@ -2194,6 +2283,14 @@ export default class RtcEngine implements RtcEngineInterface { * - Supported audio codec type: AAC. * - Supported video codec type: H264(AVC). * @param config The `LiveInjectStreamConfig` object which contains the configuration information for the added voice or video stream. + * + * @returns + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): The injected URL does not exist. Call this method again to inject the stream and ensure that the URL is valid. + * - 3(NotReady): The user is not in the channel. + * - 4(NotSupported): The channel profile is not `LiveBroadcasting`. Call the `setChannelProfile` method and set the channel profile to `LiveBroadcasting` before calling this method. + * - 7(NotInitialized): The SDK is not initialized. Initialize the `RtcEngine` instance before calling this method. */ addInjectStreamUrl( url: string, @@ -2420,7 +2517,7 @@ export default class RtcEngine implements RtcEngineInterface { * * @return * - Returns the stream ID, if the method call is successful. - * - < 0: Failure. The error code is related to the integer displayed in [Error Codes]{@link ErrorCode}. + * - Error codes: Failure. The error code is related to the integer displayed in [Error Codes]{@link ErrorCode}. */ createDataStream(reliable: boolean, ordered: boolean): Promise { return RtcEngine._callMethod('createDataStream', { reliable, ordered }); @@ -2476,6 +2573,8 @@ export default class RtcEngine implements RtcEngineInterface { } /** + * The method applies to the iOS platform only. You can call this method either before or after joining a channel. + * * The SDK and the app can both configure the audio session by default. The app may occasionally use other apps or third-party components to manipulate the audio session and restrict the SDK from doing so. This method allows the app to restrict the SDK’s manipulation of the audio session. * * You can call this method at any time to return the control of the audio sessions to the SDK. @@ -2564,7 +2663,7 @@ export default class RtcEngine implements RtcEngineInterface { * * @returns * - 0: Success. - * - < 0: Failure. + * - Error codes: Failure. */ setAudioEffectParameters( preset: AudioEffectPreset, @@ -2607,7 +2706,7 @@ export default class RtcEngine implements RtcEngineInterface { * * @returns * - 0: Success. - * - < 0: Failure. + * - Error codes: Failure. */ setAudioEffectPreset(preset: AudioEffectPreset): Promise { return RtcEngine._callMethod('setAudioEffectPreset', { preset }); @@ -2641,7 +2740,7 @@ export default class RtcEngine implements RtcEngineInterface { * * @returns * - 0: Success. - * - < 0: Failure. + * - Error codes: Failure. */ setVoiceBeautifierPreset(preset: VoiceBeautifierPreset): Promise { return RtcEngine._callMethod('setVoiceBeautifierPreset', { preset }); From 3a55997db81dcd16e68ee551d69b9079ff8052b0 Mon Sep 17 00:00:00 2001 From: HUI Date: Tue, 15 Dec 2020 14:41:11 +0800 Subject: [PATCH 06/20] feat: add `setClientRole(role: ClientRole, options?: ClientRoleOptions): Promise` --- BeanCovertor.swift | 10 ++++++++++ RtcChannel.swift | 7 ++++++- RtcEngine.swift | 7 ++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/BeanCovertor.swift b/BeanCovertor.swift index f50db5808..fb286dfcd 100644 --- a/BeanCovertor.swift +++ b/BeanCovertor.swift @@ -305,3 +305,13 @@ func mapToEncryptionConfig(_ map: Dictionary) -> AgoraEncryptionCon } return encryptionConfig } + +func mapToClientRoleOptions(_ map: Dictionary) -> AgoraClientRoleOptions { + let clientRoleOptions = AgoraClientRoleOptions() + if let audienceLatencyLevel = map["audienceLatencyLevel"] as? Int { + if let audienceLatencyLevel = AgoraAudienceLatencyLevelType(rawValue: audienceLatencyLevel) { + clientRoleOptions.audienceLatencyLevel = audienceLatencyLevel + } + } + return clientRoleOptions +} diff --git a/RtcChannel.swift b/RtcChannel.swift index 376b2632d..b27ab8094 100644 --- a/RtcChannel.swift +++ b/RtcChannel.swift @@ -171,7 +171,12 @@ class RtcChannelManager: NSObject, RtcChannelInterface { } @objc func setClientRole(_ params: NSDictionary, _ callback: Callback) { - callback.code(self[params["channelId"] as! String]?.setClientRole(AgoraClientRole(rawValue: params["role"] as! Int)!)) + let role = AgoraClientRole(rawValue: params["role"] as! Int)! + if let options = params["options"] as? Dictionary { + callback.code(self[params["channelId"] as! String]?.setClientRole(role, options: mapToClientRoleOptions(options))) + return + } + callback.code(self[params["channelId"] as! String]?.setClientRole(role)) } @objc func joinChannel(_ params: NSDictionary, _ callback: Callback) { diff --git a/RtcEngine.swift b/RtcEngine.swift index 493036d7c..08d787163 100644 --- a/RtcEngine.swift +++ b/RtcEngine.swift @@ -387,7 +387,12 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func setClientRole(_ params: NSDictionary, _ callback: Callback) { - callback.code(engine?.setClientRole(AgoraClientRole(rawValue: params["role"] as! Int)!)) + let role = AgoraClientRole(rawValue: params["role"] as! Int)! + if let options = params["options"] as? Dictionary { + callback.code(engine?.setClientRole(role, options: mapToClientRoleOptions(options))) + return + } + callback.code(engine?.setClientRole(role)) } @objc func joinChannel(_ params: NSDictionary, _ callback: Callback) { From 2fef3aee038b31808af53cee80a0fddc8d444fe8 Mon Sep 17 00:00:00 2001 From: HUI Date: Tue, 15 Dec 2020 14:41:11 +0800 Subject: [PATCH 07/20] feat: add `setClientRole(role: ClientRole, options?: ClientRoleOptions): Promise` --- Annotations.java | 8 ++++++++ BeanCovertor.kt | 7 +++++++ RtcChannel.kt | 7 ++++++- RtcEngine.kt | 7 ++++++- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Annotations.java b/Annotations.java index 54e7ba9a5..64361ecc6 100644 --- a/Annotations.java +++ b/Annotations.java @@ -857,4 +857,12 @@ public class Annotations { @Retention(RetentionPolicy.SOURCE) public @interface AgoraVoiceBeautifierPreset { } + + @IntDef({ + Constants.AUDIENCE_LATENCY_LEVEL_LOW_LATENCY, + Constants.AUDIENCE_LATENCY_LEVEL_ULTRA_LOW_LATENCY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudienceLatencyLevelType { + } } diff --git a/BeanCovertor.kt b/BeanCovertor.kt index d7a94fb9a..7001164c8 100644 --- a/BeanCovertor.kt +++ b/BeanCovertor.kt @@ -7,6 +7,7 @@ import io.agora.rtc.live.LiveInjectStreamConfig import io.agora.rtc.live.LiveTranscoding import io.agora.rtc.live.LiveTranscoding.TranscodingUser import io.agora.rtc.models.ChannelMediaOptions +import io.agora.rtc.models.ClientRoleOptions import io.agora.rtc.video.* fun mapToVideoDimensions(map: Map<*, *>): VideoEncoderConfiguration.VideoDimensions { @@ -177,3 +178,9 @@ fun mapToEncryptionConfig(map: Map<*, *>): EncryptionConfig { (map["encryptionKey"] as? String)?.let { encryptionKey = it } } } + +fun mapToClientRoleOptions(map: Map<*, *>): ClientRoleOptions { + return ClientRoleOptions().apply { + (map["audienceLatencyLevel"] as? Number)?.let { audienceLatencyLevel = it.toInt() } + } +} diff --git a/RtcChannel.kt b/RtcChannel.kt index 58432cee0..4734add1c 100644 --- a/RtcChannel.kt +++ b/RtcChannel.kt @@ -149,7 +149,12 @@ class RtcChannelManager( } override fun setClientRole(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setClientRole((params["role"] as Number).toInt())) + val role = (params["role"] as Number).toInt() + (params["options"] as? Map<*, *>)?.let { + callback.code(this[params["channelId"] as String]?.setClientRole(role, mapToClientRoleOptions(it))) + return@setClientRole + } + callback.code(this[params["channelId"] as String]?.setClientRole(role)) } override fun joinChannel(params: Map, callback: Callback) { diff --git a/RtcEngine.kt b/RtcEngine.kt index 9249a05f3..90d9a7343 100644 --- a/RtcEngine.kt +++ b/RtcEngine.kt @@ -364,7 +364,12 @@ class RtcEngineManager( } override fun setClientRole(params: Map, callback: Callback) { - callback.code(engine?.setClientRole((params["role"] as Number).toInt())) + val role = (params["role"] as Number).toInt() + (params["options"] as? Map<*, *>)?.let { + callback.code(engine?.setClientRole(role, mapToClientRoleOptions(it))) + return@setClientRole + } + callback.code(engine?.setClientRole(role)) } override fun joinChannel(params: Map, callback: Callback) { From 721604ee94c3f7e3a0485b5b5db7fb5973e30665 Mon Sep 17 00:00:00 2001 From: HUI Date: Tue, 15 Dec 2020 14:41:11 +0800 Subject: [PATCH 08/20] feat: add `setClientRole(role: ClientRole, options?: ClientRoleOptions): Promise` --- .../java/io/agora/rtc/base/Annotations.java | 8 ++ .../java/io/agora/rtc/base/BeanCovertor.kt | 7 ++ .../main/java/io/agora/rtc/base/RtcChannel.kt | 7 +- .../main/java/io/agora/rtc/base/RtcEngine.kt | 7 +- ios/RCTAgora/Base/BeanCovertor.swift | 10 ++ ios/RCTAgora/Base/RtcChannel.swift | 7 +- ios/RCTAgora/Base/RtcEngine.swift | 7 +- src/common/Classes.ts | 111 +++++++++++------- src/common/Enums.ts | 19 +++ src/common/RtcChannel.native.ts | 17 +-- src/common/RtcEngine.native.ts | 39 +++--- src/common/RtcEvents.ts | 24 ++-- 12 files changed, 181 insertions(+), 82 deletions(-) diff --git a/android/src/main/java/io/agora/rtc/base/Annotations.java b/android/src/main/java/io/agora/rtc/base/Annotations.java index 54e7ba9a5..64361ecc6 100644 --- a/android/src/main/java/io/agora/rtc/base/Annotations.java +++ b/android/src/main/java/io/agora/rtc/base/Annotations.java @@ -857,4 +857,12 @@ public class Annotations { @Retention(RetentionPolicy.SOURCE) public @interface AgoraVoiceBeautifierPreset { } + + @IntDef({ + Constants.AUDIENCE_LATENCY_LEVEL_LOW_LATENCY, + Constants.AUDIENCE_LATENCY_LEVEL_ULTRA_LOW_LATENCY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AgoraAudienceLatencyLevelType { + } } diff --git a/android/src/main/java/io/agora/rtc/base/BeanCovertor.kt b/android/src/main/java/io/agora/rtc/base/BeanCovertor.kt index d7a94fb9a..7001164c8 100644 --- a/android/src/main/java/io/agora/rtc/base/BeanCovertor.kt +++ b/android/src/main/java/io/agora/rtc/base/BeanCovertor.kt @@ -7,6 +7,7 @@ import io.agora.rtc.live.LiveInjectStreamConfig import io.agora.rtc.live.LiveTranscoding import io.agora.rtc.live.LiveTranscoding.TranscodingUser import io.agora.rtc.models.ChannelMediaOptions +import io.agora.rtc.models.ClientRoleOptions import io.agora.rtc.video.* fun mapToVideoDimensions(map: Map<*, *>): VideoEncoderConfiguration.VideoDimensions { @@ -177,3 +178,9 @@ fun mapToEncryptionConfig(map: Map<*, *>): EncryptionConfig { (map["encryptionKey"] as? String)?.let { encryptionKey = it } } } + +fun mapToClientRoleOptions(map: Map<*, *>): ClientRoleOptions { + return ClientRoleOptions().apply { + (map["audienceLatencyLevel"] as? Number)?.let { audienceLatencyLevel = it.toInt() } + } +} diff --git a/android/src/main/java/io/agora/rtc/base/RtcChannel.kt b/android/src/main/java/io/agora/rtc/base/RtcChannel.kt index 58432cee0..4734add1c 100644 --- a/android/src/main/java/io/agora/rtc/base/RtcChannel.kt +++ b/android/src/main/java/io/agora/rtc/base/RtcChannel.kt @@ -149,7 +149,12 @@ class RtcChannelManager( } override fun setClientRole(params: Map, callback: Callback) { - callback.code(this[params["channelId"] as String]?.setClientRole((params["role"] as Number).toInt())) + val role = (params["role"] as Number).toInt() + (params["options"] as? Map<*, *>)?.let { + callback.code(this[params["channelId"] as String]?.setClientRole(role, mapToClientRoleOptions(it))) + return@setClientRole + } + callback.code(this[params["channelId"] as String]?.setClientRole(role)) } override fun joinChannel(params: Map, callback: Callback) { diff --git a/android/src/main/java/io/agora/rtc/base/RtcEngine.kt b/android/src/main/java/io/agora/rtc/base/RtcEngine.kt index 9249a05f3..90d9a7343 100644 --- a/android/src/main/java/io/agora/rtc/base/RtcEngine.kt +++ b/android/src/main/java/io/agora/rtc/base/RtcEngine.kt @@ -364,7 +364,12 @@ class RtcEngineManager( } override fun setClientRole(params: Map, callback: Callback) { - callback.code(engine?.setClientRole((params["role"] as Number).toInt())) + val role = (params["role"] as Number).toInt() + (params["options"] as? Map<*, *>)?.let { + callback.code(engine?.setClientRole(role, mapToClientRoleOptions(it))) + return@setClientRole + } + callback.code(engine?.setClientRole(role)) } override fun joinChannel(params: Map, callback: Callback) { diff --git a/ios/RCTAgora/Base/BeanCovertor.swift b/ios/RCTAgora/Base/BeanCovertor.swift index f50db5808..fb286dfcd 100644 --- a/ios/RCTAgora/Base/BeanCovertor.swift +++ b/ios/RCTAgora/Base/BeanCovertor.swift @@ -305,3 +305,13 @@ func mapToEncryptionConfig(_ map: Dictionary) -> AgoraEncryptionCon } return encryptionConfig } + +func mapToClientRoleOptions(_ map: Dictionary) -> AgoraClientRoleOptions { + let clientRoleOptions = AgoraClientRoleOptions() + if let audienceLatencyLevel = map["audienceLatencyLevel"] as? Int { + if let audienceLatencyLevel = AgoraAudienceLatencyLevelType(rawValue: audienceLatencyLevel) { + clientRoleOptions.audienceLatencyLevel = audienceLatencyLevel + } + } + return clientRoleOptions +} diff --git a/ios/RCTAgora/Base/RtcChannel.swift b/ios/RCTAgora/Base/RtcChannel.swift index 376b2632d..b27ab8094 100644 --- a/ios/RCTAgora/Base/RtcChannel.swift +++ b/ios/RCTAgora/Base/RtcChannel.swift @@ -171,7 +171,12 @@ class RtcChannelManager: NSObject, RtcChannelInterface { } @objc func setClientRole(_ params: NSDictionary, _ callback: Callback) { - callback.code(self[params["channelId"] as! String]?.setClientRole(AgoraClientRole(rawValue: params["role"] as! Int)!)) + let role = AgoraClientRole(rawValue: params["role"] as! Int)! + if let options = params["options"] as? Dictionary { + callback.code(self[params["channelId"] as! String]?.setClientRole(role, options: mapToClientRoleOptions(options))) + return + } + callback.code(self[params["channelId"] as! String]?.setClientRole(role)) } @objc func joinChannel(_ params: NSDictionary, _ callback: Callback) { diff --git a/ios/RCTAgora/Base/RtcEngine.swift b/ios/RCTAgora/Base/RtcEngine.swift index 493036d7c..08d787163 100644 --- a/ios/RCTAgora/Base/RtcEngine.swift +++ b/ios/RCTAgora/Base/RtcEngine.swift @@ -387,7 +387,12 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func setClientRole(_ params: NSDictionary, _ callback: Callback) { - callback.code(engine?.setClientRole(AgoraClientRole(rawValue: params["role"] as! Int)!)) + let role = AgoraClientRole(rawValue: params["role"] as! Int)! + if let options = params["options"] as? Dictionary { + callback.code(engine?.setClientRole(role, options: mapToClientRoleOptions(options))) + return + } + callback.code(engine?.setClientRole(role)) } @objc func joinChannel(_ params: NSDictionary, _ callback: Callback) { diff --git a/src/common/Classes.ts b/src/common/Classes.ts index 3370eeba5..3ee61cc8f 100644 --- a/src/common/Classes.ts +++ b/src/common/Classes.ts @@ -1,4 +1,5 @@ import type { + AudienceLatencyLevelType, AudioChannel, AudioCodecProfileType, AudioSampleRateType, @@ -300,14 +301,16 @@ export class VideoEncoderConfiguration { degradationPrefer?: DegradationPreference; mirrorMode?: VideoMirrorMode; }) { - this.dimensions = params?.dimensions; - this.frameRate = params?.frameRate; - this.minFrameRate = params?.minFrameRate; - this.bitrate = params?.bitrate; - this.minBitrate = params?.minBitrate; - this.orientationMode = params?.orientationMode; - this.degradationPrefer = params?.degradationPrefer; - this.mirrorMode = params?.mirrorMode; + if (params) { + this.dimensions = params.dimensions; + this.frameRate = params.frameRate; + this.minFrameRate = params.minFrameRate; + this.bitrate = params.bitrate; + this.minBitrate = params.minBitrate; + this.orientationMode = params.orientationMode; + this.degradationPrefer = params.degradationPrefer; + this.mirrorMode = params.mirrorMode; + } } } @@ -340,10 +343,12 @@ export class BeautyOptions { smoothnessLevel?: number; rednessLevel?: number; }) { - this.lighteningContrastLevel = params?.lighteningContrastLevel; - this.lighteningLevel = params?.lighteningLevel; - this.smoothnessLevel = params?.smoothnessLevel; - this.rednessLevel = params?.rednessLevel; + if (params) { + this.lighteningContrastLevel = params.lighteningContrastLevel; + this.lighteningLevel = params.lighteningLevel; + this.smoothnessLevel = params.smoothnessLevel; + this.rednessLevel = params.rednessLevel; + } } } @@ -450,11 +455,13 @@ export class TranscodingUser { this.uid = uid; this.x = x; this.y = y; - this.width = params?.width; - this.height = params?.height; - this.zOrder = params?.zOrder; - this.alpha = params?.alpha; - this.audioChannel = params?.audioChannel; + if (params) { + this.width = params.width; + this.height = params.height; + this.zOrder = params.zOrder; + this.alpha = params.alpha; + this.audioChannel = params.audioChannel; + } } } @@ -586,21 +593,23 @@ export class LiveTranscoding { userConfigExtraInfo?: string; } ) { - this.width = params?.width; - this.height = params?.height; - this.videoBitrate = params?.videoBitrate; - this.videoFramerate = params?.videoFramerate; - this.lowLatency = params?.lowLatency; - this.videoGop = params?.videoGop; - this.watermark = params?.watermark; - this.backgroundImage = params?.backgroundImage; - this.audioSampleRate = params?.audioSampleRate; - this.audioBitrate = params?.audioBitrate; - this.audioChannels = params?.audioChannels; - this.audioCodecProfile = params?.audioCodecProfile; - this.videoCodecProfile = params?.videoCodecProfile; - this.backgroundColor = params?.backgroundColor; - this.userConfigExtraInfo = params?.userConfigExtraInfo; + if (params) { + this.width = params.width; + this.height = params.height; + this.videoBitrate = params.videoBitrate; + this.videoFramerate = params.videoFramerate; + this.lowLatency = params.lowLatency; + this.videoGop = params.videoGop; + this.watermark = params.watermark; + this.backgroundImage = params.backgroundImage; + this.audioSampleRate = params.audioSampleRate; + this.audioBitrate = params.audioBitrate; + this.audioChannels = params.audioChannels; + this.audioCodecProfile = params.audioCodecProfile; + this.videoCodecProfile = params.videoCodecProfile; + this.backgroundColor = params.backgroundColor; + this.userConfigExtraInfo = params.userConfigExtraInfo; + } this.transcodingUsers = transcodingUsers; } } @@ -623,8 +632,10 @@ export class ChannelMediaInfo { uid: number; constructor(uid: number, params?: { channelName?: string; token?: string }) { - this.channelName = params?.channelName; - this.token = params?.token; + if (params) { + this.channelName = params.channelName; + this.token = params.token; + } this.uid = uid; } } @@ -814,14 +825,16 @@ export class LiveInjectStreamConfig { audioBitrate?: number; audioChannels?: AudioChannel; }) { - this.width = params?.width; - this.height = params?.height; - this.videoGop = params?.videoGop; - this.videoFramerate = params?.videoFramerate; - this.videoBitrate = params?.videoBitrate; - this.audioSampleRate = params?.audioSampleRate; - this.audioBitrate = params?.audioBitrate; - this.audioChannels = params?.audioChannels; + if (params) { + this.width = params.width; + this.height = params.height; + this.videoGop = params.videoGop; + this.videoFramerate = params.videoFramerate; + this.videoBitrate = params.videoBitrate; + this.audioSampleRate = params.audioSampleRate; + this.audioBitrate = params.audioBitrate; + this.audioChannels = params.audioChannels; + } } } @@ -1348,3 +1361,17 @@ export interface FacePositionInfo { */ distance: number; } + +/** + * The detailed options of a user. + */ +export class ClientRoleOptions { + /** + * The latency level of an audience member in a interactive live streaming. See AgoraAudienceLatencyLevelType. + */ + audienceLatencyLevel: AudienceLatencyLevelType; + + constructor(audienceLatencyLevel: AudienceLatencyLevelType) { + this.audienceLatencyLevel = audienceLatencyLevel; + } +} diff --git a/src/common/Enums.ts b/src/common/Enums.ts index aa7721b48..92bdc83c6 100644 --- a/src/common/Enums.ts +++ b/src/common/Enums.ts @@ -2663,3 +2663,22 @@ export enum VoiceBeautifierPreset { */ TimbreTransformationRinging = 0x01030800, } + +/** + * The latency level of an audience member in a interactive live streaming. + * + * **Note** + * + * Takes effect only when the user role is AgoraClientRoleBroadcaster. + */ +export enum AudienceLatencyLevelType { + /** + * 1: Low latency. + */ + LowLatency = 1, + + /** + * 2: (Default) Ultra low latency. + */ + UltraLowLatency = 2, +} diff --git a/src/common/RtcChannel.native.ts b/src/common/RtcChannel.native.ts index 1b39a3b5b..83c0a17f7 100644 --- a/src/common/RtcChannel.native.ts +++ b/src/common/RtcChannel.native.ts @@ -3,15 +3,18 @@ import { NativeEventEmitter, NativeModules } from 'react-native'; import type { ChannelMediaOptions, ChannelMediaRelayConfiguration, - ClientRole, - ConnectionStateType, + ClientRoleOptions, EncryptionConfig, - EncryptionMode, LiveInjectStreamConfig, LiveTranscoding, +} from './Classes'; +import type { + ClientRole, + ConnectionStateType, + EncryptionMode, UserPriority, VideoStreamType, -} from '../Types'; +} from './Enums'; import type { Listener, RtcChannelEvents, Subscription } from './RtcEvents'; const { @@ -212,8 +215,8 @@ export default class RtcChannel implements RtcChannelInterface { * - 2(InvalidArgument): The parameter is invalid. * - 7(NotInitialized): The SDK is not initialized. */ - setClientRole(role: ClientRole): Promise { - return this._callMethod('setClientRole', { role }); + setClientRole(role: ClientRole, options?: ClientRoleOptions): Promise { + return this._callMethod('setClientRole', { role, options }); } /** @@ -892,7 +895,7 @@ interface RtcChannelInterface RtcStreamMessageInterface { destroy(): Promise; - setClientRole(role: ClientRole): Promise; + setClientRole(role: ClientRole, options?: ClientRoleOptions): Promise; joinChannel( token: string | undefined | null, diff --git a/src/common/RtcEngine.native.ts b/src/common/RtcEngine.native.ts index 4bf2313e7..c1565122a 100644 --- a/src/common/RtcEngine.native.ts +++ b/src/common/RtcEngine.native.ts @@ -1,5 +1,18 @@ import { NativeEventEmitter, NativeModules } from 'react-native'; +import type { + BeautyOptions, + CameraCapturerConfiguration, + ChannelMediaRelayConfiguration, + ClientRoleOptions, + EncryptionConfig, + LastmileProbeConfig, + LiveInjectStreamConfig, + LiveTranscoding, + UserInfo, + VideoEncoderConfiguration, + WatermarkOptions, +} from './Classes'; import { AreaCode, AudioEffectPreset, @@ -12,26 +25,16 @@ import { AudioScenario, AudioSessionOperationRestriction, AudioVoiceChanger, - BeautyOptions, - CameraCapturerConfiguration, - ChannelMediaRelayConfiguration, ChannelProfile, ClientRole, ConnectionStateType, - EncryptionConfig, EncryptionMode, - LastmileProbeConfig, - LiveInjectStreamConfig, - LiveTranscoding, LogFilter, StreamFallbackOptions, - UserInfo, UserPriority, - VideoEncoderConfiguration, VideoStreamType, VoiceBeautifierPreset, - WatermarkOptions, -} from '../Types'; +} from './Enums'; import type { Listener, RtcEngineEvents, Subscription } from './RtcEvents'; import RtcChannel from './RtcChannel.native'; @@ -249,10 +252,10 @@ export default class RtcEngine implements RtcEngineInterface { * @param profile The channel profile of the Agora [`RtcEngine`]{@link RtcEngine}. * * @returns - * - 0(NoError): Success. - * - Error codes: Failure. - * - 2(InvalidArgument): The parameter is invalid. - * - 7(NotInitialized): The SDK is not initialized. + * - 0(NoError): Success. + * - Error codes: Failure. + * - 2(InvalidArgument): The parameter is invalid. + * - 7(NotInitialized): The SDK is not initialized. */ setChannelProfile(profile: ChannelProfile): Promise { return RtcEngine._callMethod('setChannelProfile', { profile }); @@ -276,8 +279,8 @@ export default class RtcEngine implements RtcEngineInterface { * - 2(InvalidArgument): The parameter is invalid. * - 7(NotInitialized): The SDK is not initialized. */ - setClientRole(role: ClientRole): Promise { - return RtcEngine._callMethod('setClientRole', { role }); + setClientRole(role: ClientRole, options?: ClientRoleOptions): Promise { + return RtcEngine._callMethod('setClientRole', { role, options }); } /** @@ -2776,7 +2779,7 @@ interface RtcEngineInterface setChannelProfile(profile: ChannelProfile): Promise; - setClientRole(role: ClientRole): Promise; + setClientRole(role: ClientRole, options?: ClientRoleOptions): Promise; joinChannel( token: string | undefined | null, diff --git a/src/common/RtcEvents.ts b/src/common/RtcEvents.ts index 55197ba82..7f38f2660 100644 --- a/src/common/RtcEvents.ts +++ b/src/common/RtcEvents.ts @@ -1,3 +1,15 @@ +import type { + AudioVolumeInfo, + FacePositionInfo, + LastmileProbeResult, + LocalAudioStats, + LocalVideoStats, + Rect, + RemoteAudioStats, + RemoteVideoStats, + RtcStats, + UserInfo, +} from './Classes'; import type { AudioLocalError, AudioLocalState, @@ -6,7 +18,6 @@ import type { AudioOutputRouting, AudioRemoteState, AudioRemoteStateReason, - AudioVolumeInfo, ChannelMediaRelayError, ChannelMediaRelayEvent, ChannelMediaRelayState, @@ -14,30 +25,21 @@ import type { ConnectionChangedReason, ConnectionStateType, ErrorCode, - FacePositionInfo, InjectStreamStatus, - LastmileProbeResult, - LocalAudioStats, - LocalVideoStats, LocalVideoStreamError, LocalVideoStreamState, NetworkQuality, NetworkType, - Rect, - RemoteAudioStats, - RemoteVideoStats, - RtcStats, RtmpStreamingErrorCode, RtmpStreamingEvent, RtmpStreamingState, StreamPublishState, StreamSubscribeState, - UserInfo, UserOfflineReason, VideoRemoteState, VideoRemoteStateReason, WarningCode, -} from '../Types'; +} from './Enums'; /** * @internal From 7a531349056588aac36dd09bd11b6ab82b307994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=A9=B7?= Date: Wed, 16 Dec 2020 19:21:25 +0800 Subject: [PATCH 09/20] Update doc --- src/common/Classes.ts | 4 +++- src/common/Enums.ts | 4 ++-- src/common/RtcChannel.native.ts | 24 ++++++++++++++++-------- src/common/RtcEngine.native.ts | 21 ++++++++++++++++----- 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/common/Classes.ts b/src/common/Classes.ts index 3ee61cc8f..15438b1e3 100644 --- a/src/common/Classes.ts +++ b/src/common/Classes.ts @@ -1364,10 +1364,12 @@ export interface FacePositionInfo { /** * The detailed options of a user. + * + * @since v3.2.0. */ export class ClientRoleOptions { /** - * The latency level of an audience member in a interactive live streaming. See AgoraAudienceLatencyLevelType. + * The latency level of an audience member in a live interactive streaming. See {@link AudienceLatencyLevelType}. */ audienceLatencyLevel: AudienceLatencyLevelType; diff --git a/src/common/Enums.ts b/src/common/Enums.ts index 92bdc83c6..e6fd63e8a 100644 --- a/src/common/Enums.ts +++ b/src/common/Enums.ts @@ -2665,11 +2665,11 @@ export enum VoiceBeautifierPreset { } /** - * The latency level of an audience member in a interactive live streaming. + * The latency level of an audience member in interactive live streaming. * * **Note** * - * Takes effect only when the user role is AgoraClientRoleBroadcaster. + * Takes effect only when the user role is `Broadcaster`. */ export enum AudienceLatencyLevelType { /** diff --git a/src/common/RtcChannel.native.ts b/src/common/RtcChannel.native.ts index 83c0a17f7..353b0bcc2 100644 --- a/src/common/RtcChannel.native.ts +++ b/src/common/RtcChannel.native.ts @@ -197,16 +197,20 @@ export default class RtcChannel implements RtcChannelInterface { } /** - * Sets the role of a user. + * Sets the role of a user in live interactive streaming. * - * This method sets the role of a user, such as a host or an audience member. In a `LiveBroadcasting` channel, - * only a host can call the [`publish`]{@link publish} method in the [`RtcChannel`]{@link RtcChannel} class. - * - * A successful call of this method triggers the following callbacks: + * You can call this method either before or after joining the channel to set the user role as audience or host. If you call this method to switch the user role after joining the channel, the SDK triggers the following callbacks: * - The local client: [`ClientRoleChanged`]{@link RtcChannelEvents.ClientRoleChanged}. - * - The remote client: [`UserJoined`]{@link RtcChannelEvents.UserJoined} - * or [`UserOffline(BecomeAudience)`]{@link UserOfflineReason.BecomeAudience}. - * @param role The role of the user. + * - The remote client: [`UserJoined`]{@link RtcChannelEvents.UserJoined} or [`UserOffline(BecomeAudience)`]{@link UserOfflineReason.BecomeAudience}. + * + * **Note** + * - This method applies to the `LiveBroadcasting` profile only (when the `profile` parameter in `setChannelProfile` is set as `LiveBroadcasting`). + * - As of v3.2.0, this method can set the user level in addition to the user role. + * - The user role determines the permissions that the SDK grants to a user, such as permission to send local streams, receive remote streams, and push streams to a CDN address. + * - The user level determines the level of services that a user can enjoy within the permissions of the user's role. For example, an audience can choose to receive remote streams with low latency or ultra low latency. **Levels affect prices**. + * + * @param role The role of a user in interactive live streaming. See {@link ClientRole}. + * @param options? The detailed options of a user, including user level. See {@link ClientRoleOptions}. * * @returns * - 0(NoError): Success. @@ -228,6 +232,8 @@ export default class RtcChannel implements RtcChannelInterface { * - If you want to join the same channel from different devices, ensure that the UIDs in all devices are different. * - Ensure that the app ID you use to generate the token is the same with the app ID used when creating the [`RtcEngine`]{@link RtcEngine} instance. * + * Once the user joins the channel (switches to another channel), the user subscribes to the audio and video streams of all the other users in the channel by default, giving rise to usage and billing calculation. If you do not want to subscribe to a specified stream or all remote streams, call the `mute` methods accordingly. + * * @param token The token generated at your server. * - In situations not requiring high security: You can use the temporary token generated at Console. For details, see [Get a temporary token](https://docs.agora.io/en/Agora%20Platform/token?platform=All%20Platforms#get-a-temporary-token). * - In situations requiring high security: Set it as the token generated at your server. For details, see [Generate a token](https://docs.agora.io/en/Agora%20Platform/token?platform=All%20Platforms#generatetoken). @@ -268,6 +274,8 @@ export default class RtcChannel implements RtcChannelInterface { * - If you want to join the same channel from different devices, ensure that the user accounts in all devices are different. * - Ensure that the app ID you use to generate the token is the same with the app ID used when creating the [`RtcEngine`]{@link RtcEngine} instance. * + * Once the user joins the channel (switches to another channel), the user subscribes to the audio and video streams of all the other users in the channel by default, giving rise to usage and billing calculation. If you do not want to subscribe to a specified stream or all remote streams, call the `mute` methods accordingly. + * * @param token The token generated at your server. * - In situations not requiring high security: You can use the temporary token generated at Console. For details, see [Get a temporary token](https://docs.agora.io/en/Agora%20Platform/token?platform=All%20Platforms#get-a-temporary-token). * - In situations requiring high security: Set it as the token generated at your server. For details, see [Generate a token](https://docs.agora.io/en/Agora%20Platform/token?platform=All%20Platforms#generatetoken). diff --git a/src/common/RtcEngine.native.ts b/src/common/RtcEngine.native.ts index c1565122a..61398acdb 100644 --- a/src/common/RtcEngine.native.ts +++ b/src/common/RtcEngine.native.ts @@ -262,15 +262,20 @@ export default class RtcEngine implements RtcEngineInterface { } /** - * Sets the role of a user ([`LiveBroadcasting`]{@link ChannelProfile.LiveBroadcasting} only). + * Sets the role of a user in live interactive streaming. * - * This method sets the role of a user, such as a host or an audience (default), before joining a channel. - * - * This method can be used to switch the user role after a user joins a channel. In the [`LiveBroadcasting`]{@link ChannelProfile.LiveBroadcasting} profile, when a user switches user roles after joining a channel, a successful call of this method triggers the following callbacks: + * You can call this method either before or after joining the channel to set the user role as audience or host. If you call this method to switch the user role after joining the channel, the SDK triggers the following callbacks: * - The local client: [`ClientRoleChanged`]{@link RtcEngineEvents.ClientRoleChanged}. * - The remote client: [`UserJoined`]{@link RtcEngineEvents.UserJoined} or [`UserOffline`]{@link RtcEngineEvents.UserOffline} ([`BecomeAudience`]{@link UserOfflineReason.BecomeAudience}). * - * @param role Sets the role of a user. + * **Note** + * - This method applies to the `LiveBroadcasting` profile only (when the `profile` parameter in `setChannelProfile` is set as `LiveBroadcasting`). + * - As of v3.2.0, this method can set the user level in addition to the user role. + * - The user role determines the permissions that the SDK grants to a user, such as permission to send local streams, receive remote streams, and push streams to a CDN address. + * - The user level determines the level of services that a user can enjoy within the permissions of the user's role. For example, an audience can choose to receive remote streams with low latency or ultra low latency. **Levels affect prices**. + * + * @param role The role of a user in interactive live streaming. See {@link ClientRole}. + * @param options? The detailed options of a user, including user level. See {@link ClientRoleOptions}. * * @returns * - 0(NoError): Success. @@ -299,6 +304,8 @@ export default class RtcEngine implements RtcEngineInterface { * When the connection between the client and Agora server is interrupted due to poor network conditions, * the SDK tries reconnecting to the server. When the local client successfully rejoins the channel, the SDK triggers the [`RejoinChannelSuccess`]{@link RtcEngineEvents.RejoinChannelSuccess} callback on the local client. * + * Once the user joins the channel (switches to another channel), the user subscribes to the audio and video streams of all the other users in the channel by default, giving rise to usage and billing calculation. If you do not want to subscribe to a specified stream or all remote streams, call the `mute` methods accordingly. + * * **Note** * * A channel does not accept duplicate uids, such as two users with the same `uid`. If you set `uid` as `0`, the system automatically assigns a uid. @@ -355,6 +362,8 @@ export default class RtcEngine implements RtcEngineInterface { * After the user successfully switches to another channel, the [`LeaveChannel`]{@link RtcEngineEvents.LeaveChannel} and [`JoinChannelSuccess`]{@link RtcEngineEvents.JoinChannelSuccess} callbacks are triggered to * indicate that the user has left the original channel and joined a new one. * + * Once the user joins the channel (switches to another channel), the user subscribes to the audio and video streams of all the other users in the channel by default, giving rise to usage and billing calculation. If you do not want to subscribe to a specified stream or all remote streams, call the `mute` methods accordingly. + * * **Note** * * This method applies to the [`Audience`]{@link ClientRole.Audience} role in a [`LiveBroadcasting`]{@link ChannelProfile.LiveBroadcasting} channel only. @@ -595,6 +604,8 @@ export default class RtcEngine implements RtcEngineInterface { * * - The remote client: [`UserJoined`]{@link RtcEngineEvents.UserJoined} and [`UserInfoUpdated`]{@link RtcEngineEvents.UserInfoUpdated}, if the user joining the channel is in the [`Communication`]{@link ChannelProfile.Communication} profile, or is a [`Broadcaster`]{@link ClientRole.Broadcaster} in the [`LiveBroadcasting`]{@link ChannelProfile.LiveBroadcasting} profile. * + * Once the user joins the channel (switches to another channel), the user subscribes to the audio and video streams of all the other users in the channel by default, giving rise to usage and billing calculation. If you do not want to subscribe to a specified stream or all remote streams, call the `mute` methods accordingly. + * * **Note** * * To ensure smooth communication, use the same parameter type to identify the user. From 6ebc3a1c1948ef39b0561ec5dc38188861247b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=A9=B7?= Date: Thu, 17 Dec 2020 16:29:16 +0800 Subject: [PATCH 10/20] minor editorial improvement --- src/common/Enums.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/Enums.ts b/src/common/Enums.ts index e6fd63e8a..d1a8939bd 100644 --- a/src/common/Enums.ts +++ b/src/common/Enums.ts @@ -389,7 +389,7 @@ export enum AudioReverbPreset { */ FX_VOCAL_CONCERT = 0x00100002, /** - * The reverberation style typical of an uncle’s voice. + * The reverberation style typical of a middle-aged man’s voice. */ FX_UNCLE = 0x00100003, /** @@ -2481,7 +2481,7 @@ export enum AudioEffectPreset { RoomAcoustics3DVoice = 0x02010800, /** - * The voice of an uncle. + * The voice of a middle-aged man. * * **Note** * @@ -2492,7 +2492,7 @@ export enum AudioEffectPreset { VoiceChangerEffectUncle = 0x02020100, /** - * The voice of an uncle. + * The voice of an old man. * * **Note** * From d73653c1497711f319a7e2716ee04b5c9bc4fe75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=A9=B7?= Date: Fri, 18 Dec 2020 14:05:49 +0800 Subject: [PATCH 11/20] minor changes --- src/common/RtcEngine.native.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/RtcEngine.native.ts b/src/common/RtcEngine.native.ts index 61398acdb..12b51594e 100644 --- a/src/common/RtcEngine.native.ts +++ b/src/common/RtcEngine.native.ts @@ -2660,7 +2660,7 @@ export default class RtcEngine implements RtcEngineInterface { * - 3: Japanese pentatonic scale. * * @param param2 - * - You need to set `param2` to 0. + * - If you set `preset` to `RoomAcoustics3DVoice`, you need to set `param2` to `0`. * - If you set `preset` to `PitchCorrection`, `param2` sets the tonic pitch of the pitch correction effect: * - 1: A * - 2: A# From daefc68fbdcc8db5ce23e33d91c79e80bbe58bc8 Mon Sep 17 00:00:00 2001 From: HUI Date: Fri, 18 Dec 2020 17:28:29 +0800 Subject: [PATCH 12/20] style: use shorthand arguments for lambda --- BeanCovertor.swift | 8 +-- Extensions.swift | 8 +-- RtcChannel.swift | 34 ++++++------ RtcChannelEvent.swift | 10 ++-- RtcEngine.swift | 118 +++++++++++++++++++++--------------------- RtcEngineEvent.swift | 14 ++--- 6 files changed, 96 insertions(+), 96 deletions(-) diff --git a/BeanCovertor.swift b/BeanCovertor.swift index f50db5808..6ffef37e5 100644 --- a/BeanCovertor.swift +++ b/BeanCovertor.swift @@ -179,8 +179,8 @@ func mapToLiveTranscoding(_ map: Dictionary) -> AgoraLiveTranscodin transcoding.transcodingExtraInfo = userConfigExtraInfo } if let transcodingUsers = map["transcodingUsers"] as? Array { - transcodingUsers.forEach { (item) in - if let item = item as? Dictionary { + transcodingUsers.forEach { + if let item = $0 as? Dictionary { transcoding.add(mapToTranscodingUser(item)) } } @@ -208,8 +208,8 @@ func mapToChannelMediaRelayConfiguration(_ map: Dictionary) -> Agor config.sourceInfo = mapToChannelMediaInfo(srcInfo) } if let destInfos = map["destInfos"] as? Array { - destInfos.forEach { (item) in - if let item = item as? Dictionary { + destInfos.forEach { + if let item = $0 as? Dictionary { let info = mapToChannelMediaInfo(item) config.setDestinationInfo(info, forChannelName: info.channelName ?? "") } diff --git a/Extensions.swift b/Extensions.swift index d30ba931d..6f69f1596 100644 --- a/Extensions.swift +++ b/Extensions.swift @@ -144,8 +144,8 @@ extension AgoraRtcAudioVolumeInfo { extension Array where Element: AgoraRtcAudioVolumeInfo { func toMapList() -> Array> { var list = [Dictionary]() - self.forEach { (item) in - list.append(item.toMap()) + self.forEach { + list.append($0.toMap()) } return list } @@ -187,8 +187,8 @@ extension AgoraFacePositionInfo { extension Array where Element: AgoraFacePositionInfo { func toMapList() -> Array> { var list = [Dictionary]() - self.forEach { (item) in - list.append(item.toMap()) + self.forEach { + list.append($0.toMap()) } return list } diff --git a/RtcChannel.swift b/RtcChannel.swift index 376b2632d..60367599d 100644 --- a/RtcChannel.swift +++ b/RtcChannel.swift @@ -134,8 +134,8 @@ class RtcChannelManager: NSObject, RtcChannelInterface { } func Release() { - rtcChannelMap.forEach { key, value in - value.destroy() + rtcChannelMap.forEach { + $1.destroy() } rtcChannelMap.removeAll() rtcChannelDelegateMap.removeAll() @@ -149,10 +149,10 @@ class RtcChannelManager: NSObject, RtcChannelInterface { } @objc func create(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(params["engine"] as? AgoraRtcEngineKit) { [weak self] it in - if let rtcChannel = it.createRtcChannel(params["channelId"] as! String) { - let delegate = RtcChannelEventHandler() { [weak self] methodName, data in - self?.emitter(methodName, data) + callback.resolve(params["engine"] as? AgoraRtcEngineKit) { [weak self] in + if let rtcChannel = $0.createRtcChannel(params["channelId"] as! String) { + let delegate = RtcChannelEventHandler() { [weak self] in + self?.emitter($0, $1) } rtcChannel.setRtcChannelDelegate(delegate) self?.rtcChannelMap[rtcChannel.getId()!] = rtcChannel @@ -191,8 +191,8 @@ class RtcChannelManager: NSObject, RtcChannelInterface { } @objc func getConnectionState(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(self[params["channelId"] as! String]) { it in - it.getConnectionState().rawValue + callback.resolve(self[params["channelId"] as! String]) { + $0.getConnectionState().rawValue } } @@ -205,8 +205,8 @@ class RtcChannelManager: NSObject, RtcChannelInterface { } @objc func getCallId(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(self[params["channelId"] as! String]) { it in - it.getCallId() + callback.resolve(self[params["channelId"] as! String]) { + $0.getCallId() } } @@ -281,8 +281,8 @@ class RtcChannelManager: NSObject, RtcChannelInterface { @objc func registerMediaMetadataObserver(_ params: NSDictionary, _ callback: Callback) { var code = -AgoraErrorCode.notInitialized.rawValue if let it = self[params["channelId"] as! String] { - let mediaObserver = MediaObserver { [weak self] data in - self?.emitter(RtcEngineEvents.MetadataReceived, data) + let mediaObserver = MediaObserver { [weak self] in + self?.emitter(RtcEngineEvents.MetadataReceived, $0) } if it.setMediaMetadataDelegate(mediaObserver, with: .video) { mediaObserverMap[it.getId()!] = mediaObserver @@ -304,14 +304,14 @@ class RtcChannelManager: NSObject, RtcChannelInterface { } @objc func setMaxMetadataSize(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(mediaObserverMap[params["channelId"] as! String]) { it in - it.setMaxMetadataSize(params["size"] as! Int) + callback.resolve(mediaObserverMap[params["channelId"] as! String]) { + $0.setMaxMetadataSize(params["size"] as! Int) } } @objc func sendMetadata(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(mediaObserverMap[params["channelId"] as! String]) { it in - it.addMetadata(params["metadata"] as! String) + callback.resolve(mediaObserverMap[params["channelId"] as! String]) { + $0.addMetadata(params["metadata"] as! String) } } @@ -351,7 +351,7 @@ class RtcChannelManager: NSObject, RtcChannelInterface { if let it = self[params["channelId"] as! String] { code = it.createDataStream(&streamId, reliable: params["reliable"] as! Bool, ordered: params["ordered"] as! Bool) } - callback.code(code) { it in + callback.code(code) { ignore in streamId } } diff --git a/RtcChannelEvent.swift b/RtcChannelEvent.swift index 19b7367cd..47144ae9a 100644 --- a/RtcChannelEvent.swift +++ b/RtcChannelEvent.swift @@ -220,23 +220,23 @@ extension RtcChannelEventHandler: AgoraRtcChannelDelegate { public func rtcChannel(_ rtcChannel: AgoraRtcChannel, didReceive event: AgoraChannelMediaRelayEvent) { callback(RtcChannelEvents.ChannelMediaRelayEvent, rtcChannel, event.rawValue) } - + func rtcChannel(_ rtcChannel: AgoraRtcChannel, didAudioPublishStateChange oldState: AgoraStreamPublishState, newState: AgoraStreamPublishState, elapseSinceLastState: Int) { callback(RtcChannelEvents.AudioPublishStateChanged, rtcChannel, rtcChannel.getId(), oldState.rawValue, newState.rawValue, elapseSinceLastState) } - + func rtcChannel(_ rtcChannel: AgoraRtcChannel, didVideoPublishStateChange oldState: AgoraStreamPublishState, newState: AgoraStreamPublishState, elapseSinceLastState: Int) { callback(RtcChannelEvents.VideoPublishStateChanged, rtcChannel, rtcChannel.getId(), oldState.rawValue, newState.rawValue, elapseSinceLastState) } - + func rtcChannel(_ rtcChannel: AgoraRtcChannel, didAudioSubscribeStateChange uid: UInt, oldState: AgoraStreamSubscribeState, newState: AgoraStreamSubscribeState, elapseSinceLastState: Int) { callback(RtcChannelEvents.AudioSubscribeStateChanged, rtcChannel, rtcChannel.getId(), uid, oldState.rawValue, newState.rawValue, elapseSinceLastState) } - + func rtcChannel(_ rtcChannel: AgoraRtcChannel, didVideoSubscribeStateChange uid: UInt, oldState: AgoraStreamSubscribeState, newState: AgoraStreamSubscribeState, elapseSinceLastState: Int) { callback(RtcChannelEvents.VideoSubscribeStateChanged, rtcChannel, rtcChannel.getId(), uid, oldState.rawValue, newState.rawValue, elapseSinceLastState) } - + func rtcChannel(_ rtcChannel: AgoraRtcChannel, rtmpStreamingEventWithUrl url: String, eventCode: AgoraRtmpStreamingEvent) { callback(RtcChannelEvents.RtmpStreamingEvent, rtcChannel, url, eventCode.rawValue) } diff --git a/RtcEngine.swift b/RtcEngine.swift index 1d40ca5ee..e8bf9c70d 100644 --- a/RtcEngine.swift +++ b/RtcEngine.swift @@ -51,7 +51,7 @@ protocol RtcEngineInterface: func enableWebSdkInteroperability(_ params: NSDictionary, _ callback: Callback) func getConnectionState(_ callback: Callback) - + func sendCustomReportMessage(_ params: NSDictionary, _ callback: Callback) func getCallId(_ callback: Callback) @@ -67,7 +67,7 @@ protocol RtcEngineInterface: func setLogFileSize(_ params: NSDictionary, _ callback: Callback) func setParameters(_ params: NSDictionary, _ callback: Callback) - + func getNativeHandle(_ callback: Callback) } @@ -356,8 +356,8 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func create(_ params: NSDictionary, _ callback: Callback) { - delegate = RtcEngineEventHandler() { [weak self] methodName, data in - self?.emitter(methodName, data) + delegate = RtcEngineEventHandler() { [weak self] in + self?.emitter($0, $1) } let config = AgoraRtcEngineConfig() config.appId = params["appId"] as? String @@ -367,7 +367,7 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func destroy(_ callback: Callback) { - callback.resolve(engine) { [weak self] it in + callback.resolve(engine) { [weak self] ignore in self?.Release() } } @@ -401,18 +401,18 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func getConnectionState(_ callback: Callback) { - callback.resolve(engine) { it in - it.getConnectionState().rawValue + callback.resolve(engine) { + $0.getConnectionState().rawValue } } - + @objc func sendCustomReportMessage(_ params: NSDictionary, _ callback: Callback) { callback.code(engine?.sendCustomReportMessage(params["id"] as! String, category: params["category"] as! String, event: params["event"] as! String, label: params["label"] as! String, value: params["value"] as! Int)) } @objc func getCallId(_ callback: Callback) { - callback.resolve(engine) { it in - it.getCallId() + callback.resolve(engine) { + $0.getCallId() } } @@ -435,10 +435,10 @@ class RtcEngineManager: NSObject, RtcEngineInterface { @objc func setLogFileSize(_ params: NSDictionary, _ callback: Callback) { callback.code(engine?.setLogFileSize((params["fileSizeInKBytes"] as! UInt))) } - + @objc func getNativeHandle(_ callback: Callback) { - callback.resolve(engine) { it in - Int(bitPattern: it.getNativeHandle()) + callback.resolve(engine) { + Int(bitPattern: $0.getNativeHandle()) } } @@ -455,14 +455,14 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func getUserInfoByUserAccount(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(engine) { it in - it.getUserInfo(byUserAccount: params["userAccount"] as! String, withError: nil)?.toMap() + callback.resolve(engine) { + $0.getUserInfo(byUserAccount: params["userAccount"] as! String, withError: nil)?.toMap() } } @objc func getUserInfoByUid(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(engine) { it in - it.getUserInfo(byUid: params["uid"] as! UInt, withError: nil)?.toMap() + callback.resolve(engine) { + $0.getUserInfo(byUid: params["uid"] as! UInt, withError: nil)?.toMap() } } @@ -587,26 +587,26 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func getAudioMixingPlayoutVolume(_ callback: Callback) { - callback.code(engine?.getAudioMixingPlayoutVolume()) { it in - it + callback.code(engine?.getAudioMixingPlayoutVolume()) { + $0 } } @objc func getAudioMixingPublishVolume(_ callback: Callback) { - callback.code(engine?.getAudioMixingPublishVolume()) { it in - it + callback.code(engine?.getAudioMixingPublishVolume()) { + $0 } } @objc func getAudioMixingDuration(_ callback: Callback) { - callback.code(engine?.getAudioMixingDuration()) { it in - it + callback.code(engine?.getAudioMixingDuration()) { + $0 } } @objc func getAudioMixingCurrentPosition(_ callback: Callback) { - callback.code(engine?.getAudioMixingCurrentPosition()) { it in - it + callback.code(engine?.getAudioMixingCurrentPosition()) { + $0 } } @@ -619,8 +619,8 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func getEffectsVolume(_ callback: Callback) { - callback.resolve(engine) { it in - it.getEffectsVolume() + callback.resolve(engine) { + $0.getEffectsVolume() } } @@ -667,10 +667,10 @@ class RtcEngineManager: NSObject, RtcEngineInterface { @objc func resumeAllEffects(_ callback: Callback) { callback.code(engine?.resumeAllEffects()) } - + @objc func setAudioSessionOperationRestriction(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(engine) { it in - it.setAudioSessionOperationRestriction(AgoraAudioSessionOperationRestriction(rawValue: params["restriction"] as! UInt)) + callback.resolve(engine) { + $0.setAudioSessionOperationRestriction(AgoraAudioSessionOperationRestriction(rawValue: params["restriction"] as! UInt)) } } @@ -735,8 +735,8 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func isSpeakerphoneEnabled(_ callback: Callback) { - callback.resolve(engine) { it in - it.isSpeakerphoneEnabled() + callback.resolve(engine) { + $0.isSpeakerphoneEnabled() } } @@ -798,11 +798,11 @@ class RtcEngineManager: NSObject, RtcEngineInterface { @objc func registerMediaMetadataObserver(_ callback: Callback) { var code = -AgoraErrorCode.notInitialized.rawValue - if let it = engine { - let mediaObserver = MediaObserver { [weak self] data in - self?.emitter(RtcEngineEvents.MetadataReceived, data) + if let `engine` = engine { + let mediaObserver = MediaObserver { [weak self] in + self?.emitter(RtcEngineEvents.MetadataReceived, $0) } - if it.setMediaMetadataDelegate(mediaObserver, with: .video) { + if engine.setMediaMetadataDelegate(mediaObserver, with: .video) { self.mediaObserver = mediaObserver code = AgoraErrorCode.noError.rawValue } @@ -822,14 +822,14 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func setMaxMetadataSize(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(mediaObserver) { it in - it.setMaxMetadataSize(params["size"] as! Int) + callback.resolve(mediaObserver) { + $0.setMaxMetadataSize(params["size"] as! Int) } } @objc func sendMetadata(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(mediaObserver) { it in - it.addMetadata(params["metadata"] as! String) + callback.resolve(mediaObserver) { + $0.addMetadata(params["metadata"] as! String) } } @@ -884,14 +884,14 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func isCameraZoomSupported(_ callback: Callback) { - callback.resolve(engine) { it in - it.isCameraZoomSupported() + callback.resolve(engine) { + $0.isCameraZoomSupported() } } @objc func isCameraTorchSupported(_ callback: Callback) { - callback.resolve(engine) { it in - it.isCameraTorchSupported() + callback.resolve(engine) { + $0.isCameraTorchSupported() } } @@ -900,20 +900,20 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func isCameraExposurePositionSupported(_ callback: Callback) { - callback.resolve(engine) { it in - it.isCameraExposurePositionSupported() + callback.resolve(engine) { + $0.isCameraExposurePositionSupported() } } @objc func isCameraAutoFocusFaceModeSupported(_ callback: Callback) { - callback.resolve(engine) { it in - it.isCameraAutoFocusFaceModeSupported() + callback.resolve(engine) { + $0.isCameraAutoFocusFaceModeSupported() } } @objc func setCameraZoomFactor(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(engine) { it in - it.setCameraZoomFactor(CGFloat(params["factor"] as! Float)) + callback.resolve(engine) { + $0.setCameraZoomFactor(CGFloat(params["factor"] as! Float)) return nil } } @@ -923,15 +923,15 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func setCameraFocusPositionInPreview(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(engine) { it in - engine?.setCameraFocusPositionInPreview(CGPoint(x: params["positionX"] as! Double, y: params["positionY"] as! Double)) + callback.resolve(engine) { + $0.setCameraFocusPositionInPreview(CGPoint(x: params["positionX"] as! Double, y: params["positionY"] as! Double)) return nil } } @objc func setCameraExposurePosition(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(engine) { it in - it.setCameraExposurePosition(CGPoint(x: params["positionXinView"] as! Double, y: params["positionYinView"] as! Double)) + callback.resolve(engine) { + $0.setCameraExposurePosition(CGPoint(x: params["positionXinView"] as! Double, y: params["positionYinView"] as! Double)) return nil } } @@ -941,15 +941,15 @@ class RtcEngineManager: NSObject, RtcEngineInterface { } @objc func setCameraTorchOn(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(engine) { it in - it.setCameraTorchOn(params["isOn"] as! Bool) + callback.resolve(engine) { + $0.setCameraTorchOn(params["isOn"] as! Bool) return nil } } @objc func setCameraAutoFocusFaceModeEnabled(_ params: NSDictionary, _ callback: Callback) { - callback.resolve(engine) { it in - it.setCameraAutoFocusFaceModeEnabled(params["enabled"] as! Bool) + callback.resolve(engine) { + $0.setCameraAutoFocusFaceModeEnabled(params["enabled"] as! Bool) } } @@ -963,7 +963,7 @@ class RtcEngineManager: NSObject, RtcEngineInterface { if let it = engine { code = it.createDataStream(&streamId, reliable: params["reliable"] as! Bool, ordered: params["ordered"] as! Bool) } - callback.code(code) { it in + callback.code(code) { ignore in streamId } } diff --git a/RtcEngineEvent.swift b/RtcEngineEvent.swift index f303ef5a1..ed926d7d0 100644 --- a/RtcEngineEvent.swift +++ b/RtcEngineEvent.swift @@ -469,31 +469,31 @@ extension RtcEngineEventHandler: AgoraRtcEngineDelegate { public func rtcEngineVideoDidStop(_ engine: AgoraRtcEngineKit) { callback(RtcEngineEvents.VideoStopped) } - + func rtcEngine(_ engine: AgoraRtcEngineKit, firstLocalAudioFramePublished elapsed: Int) { callback(RtcEngineEvents.FirstLocalAudioFramePublished, elapsed) } - + func rtcEngine(_ engine: AgoraRtcEngineKit, firstLocalVideoFramePublished elapsed: Int) { callback(RtcEngineEvents.FirstLocalVideoFramePublished, elapsed) } - + func rtcEngine(_ engine: AgoraRtcEngineKit, didAudioPublishStateChange channel: String, oldState: AgoraStreamPublishState, newState: AgoraStreamPublishState, elapseSinceLastState: Int) { callback(RtcEngineEvents.AudioPublishStateChanged, channel, oldState.rawValue, newState.rawValue, elapseSinceLastState) } - + func rtcEngine(_ engine: AgoraRtcEngineKit, didVideoPublishStateChange channel: String, oldState: AgoraStreamPublishState, newState: AgoraStreamPublishState, elapseSinceLastState: Int) { callback(RtcEngineEvents.VideoPublishStateChanged, channel, oldState.rawValue, newState.rawValue, elapseSinceLastState) } - + func rtcEngine(_ engine: AgoraRtcEngineKit, didAudioSubscribeStateChange channel: String, withUid uid: UInt, oldState: AgoraStreamSubscribeState, newState: AgoraStreamSubscribeState, elapseSinceLastState: Int) { callback(RtcEngineEvents.AudioSubscribeStateChanged, channel, uid, oldState.rawValue, newState.rawValue, elapseSinceLastState) } - + func rtcEngine(_ engine: AgoraRtcEngineKit, didVideoSubscribeStateChange channel: String, withUid uid: UInt, oldState: AgoraStreamSubscribeState, newState: AgoraStreamSubscribeState, elapseSinceLastState: Int) { callback(RtcEngineEvents.VideoSubscribeStateChanged, channel, uid, oldState.rawValue, newState.rawValue, elapseSinceLastState) } - + func rtcEngine(_ engine: AgoraRtcEngineKit, rtmpStreamingEventWithUrl url: String, eventCode: AgoraRtmpStreamingEvent) { callback(RtcEngineEvents.RtmpStreamingEvent, url, eventCode.rawValue) } From 56ab25bcf41b9b7034049fb307cca95fdfae3e4c Mon Sep 17 00:00:00 2001 From: HUI Date: Fri, 18 Dec 2020 17:29:41 +0800 Subject: [PATCH 13/20] fix: `MetadataReceived` event parameters bug --- Callback.swift | 4 ++-- MediaObserver.swift | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Callback.swift b/Callback.swift index bf97af5c7..b911dfff8 100644 --- a/Callback.swift +++ b/Callback.swift @@ -17,14 +17,14 @@ protocol Callback: class { } extension Callback { - func code(_ code: Int32?, _ runnable: ((Int32) -> Any?)? = nil) { + func code(_ code: Int32?, _ runnable: ((Int32?) -> Any?)? = nil) { if code == nil || code! < 0 { let newCode = abs(Int(code ?? Int32(AgoraErrorCode.notInitialized.rawValue))) failure(String(newCode), AgoraRtcEngineKit.getErrorDescription(newCode) ?? "") return } - let res = runnable?(code!) + let res = runnable?(code) if res is Void { success(nil) } else { diff --git a/MediaObserver.swift b/MediaObserver.swift index d90734e4b..0e853048f 100644 --- a/MediaObserver.swift +++ b/MediaObserver.swift @@ -43,9 +43,7 @@ extension MediaObserver: AgoraMediaMetadataDataSource { extension MediaObserver: AgoraMediaMetadataDelegate { func receiveMetadata(_ data: Data, fromUser uid: Int, atTimestamp timestamp: TimeInterval) { emitter([ - "buffer": String(data: data, encoding: .utf8), - "uid": uid, - "timeStampMs": timestamp + "data": [String(data: data, encoding: .utf8) ?? "", uid, timestamp] ]) } } From 9ab28a7ae559f3bd5ce8ab8e0455860d9de89977 Mon Sep 17 00:00:00 2001 From: HUI Date: Fri, 18 Dec 2020 17:29:41 +0800 Subject: [PATCH 14/20] fix: `MetadataReceived` event parameters bug --- Callback.kt | 2 +- MediaObserver.kt | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Callback.kt b/Callback.kt index d2dd152c1..0d9b69378 100644 --- a/Callback.kt +++ b/Callback.kt @@ -5,7 +5,7 @@ import io.agora.rtc.RtcEngine import kotlin.math.abs abstract class Callback { - fun code(code: Int?, runnable: ((Int) -> Any?)? = null) { + fun code(code: Int?, runnable: ((Int?) -> Any?)? = null) { if (code == null || code < 0) { val newCode = abs(code ?: Constants.ERR_NOT_INITIALIZED) failure(newCode.toString(), RtcEngine.getErrorDescription(newCode)) diff --git a/MediaObserver.kt b/MediaObserver.kt index 1983ecfc4..fef7214f1 100644 --- a/MediaObserver.kt +++ b/MediaObserver.kt @@ -32,9 +32,7 @@ class MediaObserver( override fun onMetadataReceived(buffer: ByteArray, uid: Int, timeStampMs: Long) { emit(hashMapOf( - "buffer" to String(buffer), - "uid" to uid, - "timeStampMs" to timeStampMs + "data" to arrayListOf(String(buffer), uid, timeStampMs) )) } } From a290e7313e3d189dc9ea69e49c0c3be4799a7933 Mon Sep 17 00:00:00 2001 From: HUI Date: Fri, 18 Dec 2020 17:32:47 +0800 Subject: [PATCH 15/20] fix: use the better way to fix rendering problems --- RtcSurfaceView.swift | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/RtcSurfaceView.swift b/RtcSurfaceView.swift index cd69a26b7..9ae740cab 100644 --- a/RtcSurfaceView.swift +++ b/RtcSurfaceView.swift @@ -14,23 +14,27 @@ class RtcSurfaceView: UIView { private var surface: UIView private var canvas: AgoraRtcVideoCanvas private weak var channel: AgoraRtcChannel? - + override init(frame: CGRect) { - surface = UIView(frame: frame) + surface = UIView(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: frame.size)) canvas = AgoraRtcVideoCanvas() canvas.view = surface super.init(frame: frame) addSubview(surface) - addObserver(self, forKeyPath: "frame", options: .new, context: nil) + addObserver(self, forKeyPath: observerForKeyPath(), options: .new, context: nil) + } + + func observerForKeyPath() -> String { + return "frame" } - + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - + deinit { canvas.view = nil - removeObserver(self, forKeyPath: "frame", context: nil) + removeObserver(self, forKeyPath: observerForKeyPath(), context: nil) } func setData(_ engine: AgoraRtcEngineKit, _ channel: AgoraRtcChannel?, _ uid: Int) { @@ -56,8 +60,10 @@ class RtcSurfaceView: UIView { } private func setupVideoCanvas(_ engine: AgoraRtcEngineKit) { - subviews.forEach { $0.removeFromSuperview() } - surface = UIView(frame: self.frame) + subviews.forEach { + $0.removeFromSuperview() + } + surface = UIView(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: bounds.size)) addSubview(surface) canvas.view = surface if canvas.uid == 0 { @@ -88,10 +94,12 @@ class RtcSurfaceView: UIView { } } } - - override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { - if keyPath == "frame" { - surface.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height) + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == observerForKeyPath() { + if let rect = change?[.newKey] as? CGRect { + surface.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: rect.size) + } } } } From 75f572df2afed36a4bbd3ccffd0baad7bace2eae Mon Sep 17 00:00:00 2001 From: HUI Date: Fri, 18 Dec 2020 17:32:47 +0800 Subject: [PATCH 16/20] fix: use the better way to fix rendering problems --- RtcSurfaceView.kt | 1 + RtcTextureView.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/RtcSurfaceView.kt b/RtcSurfaceView.kt index ba2a292ef..536f7ddaf 100644 --- a/RtcSurfaceView.kt +++ b/RtcSurfaceView.kt @@ -71,6 +71,7 @@ class RtcSurfaceView( surface.setZOrderMediaOverlay(isMediaOverlay) surface.setZOrderOnTop(onTop) addView(surface) + surface.layout(0, 0, width, height) canvas.view = surface if (canvas.uid == 0) { engine.setupLocalVideo(canvas) diff --git a/RtcTextureView.kt b/RtcTextureView.kt index 7dfc4f28e..2ebecae67 100644 --- a/RtcTextureView.kt +++ b/RtcTextureView.kt @@ -45,6 +45,7 @@ class RtcTextureView( removeAllViews() texture = RtcEngine.CreateTextureView(context.applicationContext) addView(texture) + texture.layout(0, 0, width, height) canvas.view = texture if (canvas.uid == 0) { engine.setupLocalVideo(canvas) From f301dc40527a246f0cdd58e40dcc88c8ee395d7c Mon Sep 17 00:00:00 2001 From: HUI Date: Mon, 21 Dec 2020 12:25:46 +0800 Subject: [PATCH 17/20] chore: release 3.2.0-rc.0 --- CHANGELOG.md | 12 ++++++++++++ package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72ae4b13f..a8f9883fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [3.2.0-rc.0](https://github.com/AgoraIO-Community/react-native-agora/compare/v3.1.6...v3.2.0-rc.0) (2020-12-21) + + +### Features + +* add `setClientRole(role: ClientRole, options?: ClientRoleOptions): Promise` ([721604e](https://github.com/AgoraIO-Community/react-native-agora/commit/721604ee94c3f7e3a0485b5b5db7fb5973e30665)) +* add `setClientRole(role: ClientRole, options?: ClientRoleOptions): Promise` ([2fef3ae](https://github.com/AgoraIO-Community/react-native-agora/commit/2fef3aee038b31808af53cee80a0fddc8d444fe8)) +* add `setClientRole(role: ClientRole, options?: ClientRoleOptions): Promise` ([3a55997](https://github.com/AgoraIO-Community/react-native-agora/commit/3a55997db81dcd16e68ee551d69b9079ff8052b0)) +* upgrade to 3.2.0 ([fcb57cc](https://github.com/AgoraIO-Community/react-native-agora/commit/fcb57cc3e2cbb3e16750e9ce8ddca069184ac1c0)) +* upgrade to 3.2.0 ([4ee51a9](https://github.com/AgoraIO-Community/react-native-agora/commit/4ee51a9b405deb17b467f5359f6717033c3961a2)) +* upgrade to 3.2.0 ([680048f](https://github.com/AgoraIO-Community/react-native-agora/commit/680048f7836940f586ce7228559ba2cde9e0de62)) + ## [3.1.6](https://github.com/AgoraIO-Community/react-native-agora/compare/v3.1.5...v3.1.6) (2020-12-21) diff --git a/package.json b/package.json index 4dc466a0d..bcbbf61e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-agora", - "version": "3.1.6", + "version": "3.2.0-rc.0", "description": "Agora RTC SDK For React Native", "main": "lib/commonjs/index", "module": "lib/module/index", From 503c14dc6c44665aaab05c8d0dd8b29b7ee2a1dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=A9=B7?= Date: Mon, 21 Dec 2020 19:09:23 +0800 Subject: [PATCH 18/20] Add doc changes between v3.1.2 and v3.2.0 --- src/common/Classes.ts | 4 +++ src/common/Enums.ts | 38 ++++++++++++------------ src/common/RtcChannel.native.ts | 22 ++++++++------ src/common/RtcEngine.native.ts | 51 ++++++++++++++++++++------------- src/common/RtcEvents.ts | 26 ++++++++--------- 5 files changed, 80 insertions(+), 61 deletions(-) diff --git a/src/common/Classes.ts b/src/common/Classes.ts index 15438b1e3..babfb5f4b 100644 --- a/src/common/Classes.ts +++ b/src/common/Classes.ts @@ -1227,6 +1227,10 @@ export interface RemoteAudioStats { networkTransportDelay: number; /** * Network delay (ms) from the receiver to the jitter buffer. + * + * **Note** + * + * When the receiver is an audience member and `AudienceLatencyLevelType` is `1`, this parameter does not take effect. */ jitterBufferDelay: number; /** diff --git a/src/common/Enums.ts b/src/common/Enums.ts index d1a8939bd..dc16f0ae9 100644 --- a/src/common/Enums.ts +++ b/src/common/Enums.ts @@ -1162,7 +1162,7 @@ export enum ErrorCode { */ PublishStreamNotFound = 155, /** - * 156: The format of the RTMP stream URL is not supported. Check whether the URL format is correct. + * 156: The format of the RTMP or RTMPS stream URL is not supported. Check whether the URL format is correct. */ PublishStreamFormatNotSuppported = 156, /** @@ -1537,7 +1537,7 @@ export enum NetworkType { */ export enum RtmpStreamingErrorCode { /** - * 0: The RTMP streaming publishes successfully. + * 0: The RTMP or RTMPS streaming publishes successfully. */ OK = 0, /** @@ -1547,11 +1547,11 @@ export enum RtmpStreamingErrorCode { */ InvalidParameters = 1, /** - * 2: The RTMP streaming is encrypted and cannot be published. + * 2: The RTMP or RTMPS streaming is encrypted and cannot be published. */ EncryptedStreamNotAllowed = 2, /** - * 3: Timeout for the RTMP streaming. Call the [`addPublishStreamUrl`]{@link RtcEngine.addPublishStreamUrl} method to publish the streaming again. + * 3: Timeout for the RTMP or RTMPS streaming. Call the [`addPublishStreamUrl`]{@link RtcEngine.addPublishStreamUrl} method to publish the streaming again. */ ConnectionTimeout = 3, /** @@ -1559,11 +1559,11 @@ export enum RtmpStreamingErrorCode { */ InternalServerError = 4, /** - * 5: An error occurs in the RTMP server. + * 5: An error occurs in the CDN server. */ RtmpServerError = 5, /** - * 6: The RTMP streaming publishes too frequently. + * 6: The RTMP or RTMPS streaming publishes too frequently. */ TooOften = 6, /** @@ -1575,36 +1575,36 @@ export enum RtmpStreamingErrorCode { */ NotAuthorized = 8, /** - * 9: Agora’s server fails to find the RTMP streaming. + * 9: Agora’s server fails to find the RTMP or RTMPS streaming. */ StreamNotFound = 9, /** - * 10: The format of the RTMP streaming URL is not supported. Check whether the URL format is correct. + * 10: The format of the RTMP or RTMPS streaming URL is not supported. Check whether the URL format is correct. */ FormatNotSupported = 10, } /** - * The RTMP streaming state. + * The RTMP or RTMPS streaming state. */ export enum RtmpStreamingState { /** - * 0: The RTMP streaming has not started or has ended. This state is also triggered after you - * remove an RTMP address from the CDN by calling [`removePublishStreamUrl`]{@link RtcEngine.removePublishStreamUrl}. + * 0: The RTMP or RTMPS streaming has not started or has ended. This state is also triggered after you + * remove an RTMP or RTMPS stream* from the CDN by calling [`removePublishStreamUrl`]{@link RtcEngine.removePublishStreamUrl}. */ Idle = 0, /** - * 1: The SDK is connecting to Agora’s streaming server and the RTMP server. + * 1: The SDK is connecting to Agora’s streaming server and the CDN server. * This state is triggered after you call the [`addPublishStreamUrl`]{@link RtcEngine.addPublishStreamUrl} method. */ Connecting = 1, /** - * 2: The RTMP streaming is being published. The SDK successfully publishes the RTMP streaming and returns this state. + * 2: The RTMP or RTMPS streaming is being published. The SDK successfully publishes the RTMP or RTMPS streaming and returns this state. */ Running = 2, /** - * 3: The RTMP streaming is recovering. When exceptions occur to the CDN, or the streaming is interrupted, - * the SDK attempts to resume RTMP streaming and returns this state. + * 3: The RTMP or RTMPS streaming is recovering. When exceptions occur to the CDN, or the streaming is interrupted, + * the SDK attempts to resume RTMP or RTMPS streaming and returns this state. * * - If the SDK successfully resumes the streaming, [`Running`]{@link RtmpStreamingState.Running} returns. * - If the streaming does not resume within 60 seconds or server errors occur, @@ -1614,8 +1614,8 @@ export enum RtmpStreamingState { */ Recovering = 3, /** - * 4: The RTMP streaming fails. See the errorCode parameter for the detailed error information. - * You can also call the [`addPublishStreamUrl`]{@link RtcEngine.addPublishStreamUrl} method to publish the RTMP streaming again. + * 4: The RTMP or RTMPS streaming fails. See the errorCode parameter for the detailed error information. + * You can also call the [`addPublishStreamUrl`]{@link RtcEngine.addPublishStreamUrl} method to publish the RTMP or RTMPS streaming again. */ Failure = 4, } @@ -2355,11 +2355,11 @@ export enum StreamSubscribeState { } /** - * Events during the RTMP streaming. + * Events during the RTMP or RTMPS streaming. */ export enum RtmpStreamingEvent { /** - * 1: An error occurs when you add a background image or a watermark image to the RTMP stream. + * 1: An error occurs when you add a background image or a watermark image to the RTMP or RTMPS stream. */ FailedLoadImage = 1, } diff --git a/src/common/RtcChannel.native.ts b/src/common/RtcChannel.native.ts index 353b0bcc2..b31c562dd 100644 --- a/src/common/RtcChannel.native.ts +++ b/src/common/RtcChannel.native.ts @@ -498,7 +498,9 @@ export default class RtcChannel implements RtcChannelInterface { } /** - * Publishes the local stream to the CDN. + * Publishes the local stream to a specified CDN streaming URL. + * + * After calling this method, you can push media streams in RTMP or RTMPS protocol to the CDN. * * This method call triggers the [`RtmpStreamingStateChanged`]{@link RtcChannelEvents.RtmpStreamingStateChanged} * callback on the local client to report the state of adding a local stream to the CDN. @@ -507,10 +509,11 @@ export default class RtcChannel implements RtcChannelInterface { * - Ensure that you enable the RTMP Converter service before using this function. See Prerequisites in *Push Streams to CDN*. * - Ensure that the user joins a channel before calling this method. * - This method can only be called by a host in a `LiveBroadcasting` channel. - * - This method adds only one stream HTTP/HTTPS URL address each time it is called. + * - This method adds only one CDN streaming URL each time it is called. + * - Agora supports pushing media streams in RTMPS protocol to the CDN only when you enable transcoding. * - * @param url The CDN streaming URL in the RTMP format. The maximum length of this parameter is 1024 bytes. The URL address must not contain special characters, such as Chinese language characters. - * @param transcodingEnabled Sets whether transcoding is enabled/disabled. If you set this parameter as true, + * @param url The CDN streaming URL in the RTMP or RTMPS format. The maximum length of this parameter is 1024 bytes. The URL address must not contain special characters, such as Chinese language characters. + * @param transcodingEnabled Whether to enable transcoding. If you set this parameter as true, * ensure that you call the [`setLiveTranscoding`]{@link RtcChannel.setLiveTranscoding} method before this method. * - `true`: Enable transcoding. To transcode the audio or video streams when publishing them to CDN live, often used for combining the audio and video streams of multiple hosts in CDN live. * - `false`: Disable transcoding. @@ -526,17 +529,17 @@ export default class RtcChannel implements RtcChannelInterface { } /** - * Removes an RTMP stream from the CDN. + * Removes an RTMP or RTMPS stream from the CDN. * - * This method removes the RTMP URL address (added by [`addPublishStreamUrl`]{@link RtcChannel.addPublishStreamUrl}) from a CDN live stream. + * This method removes the CDN streaming URL (added by [`addPublishStreamUrl`]{@link RtcChannel.addPublishStreamUrl}) from a CDN live stream. * The SDK reports the result of this method call in the [`RtmpStreamingStateChanged`]{@link RtcChannelEvents.RtmpStreamingStateChanged} callback. * * **Note** * - Ensure that you enable the RTMP Converter service before using this function. See Prerequisites in *Push Streams to CDN*. * - This method can only be called by a host in a `LiveBroadcasting` channel. - * - This method removes only one stream HTTP/HTTPS URL address each time it is called. + * - This method removes only one CDN streaming URL each time it is called. * - * @param url The RTMP URL address to be removed. The maximum length of this parameter is 1024 bytes. The URL address must not contain special characters, + * @param url The CDN streaming URL to be removed. The maximum length of this parameter is 1024 bytes. The URL address must not contain special characters, * such as Chinese language characters. */ removePublishStreamUrl(url: string): Promise { @@ -555,6 +558,7 @@ export default class RtcChannel implements RtcChannelInterface { * - Ensure that the user joins a channel before calling this method. * - This method can only be called by a host in a `LiveBroadcasting` channel. * - Ensure that you call this method before calling the [`addPublishStreamUrl`]{@link RtcChannel.addPublishStreamUrl} method. + * - Agora supports pushing media streams in RTMPS protocol to the CDN only when you enable transcoding. * * @param transcoding Sets the CDN live audio/video transcoding settings. */ @@ -727,7 +731,7 @@ export default class RtcChannel implements RtcChannelInterface { * All users in the same channel must use the same encryption mode and encryption key. Once all users leave the channel, the encryption key of this channel is automatically cleared. * * **Note** - * - If you enable the built-in encryption, you cannot use the RTMP streaming function. + * - If you enable the built-in encryption, you cannot use the RTMP or RTMPS streaming function. * - Agora supports four encryption modes. If you choose an encryption mode (excepting `SM4128ECB` mode), you need to add an external encryption library when integrating the SDK. For details, see the advanced guide *Channel Encryption*. * * diff --git a/src/common/RtcEngine.native.ts b/src/common/RtcEngine.native.ts index 12b51594e..1b57efb5d 100644 --- a/src/common/RtcEngine.native.ts +++ b/src/common/RtcEngine.native.ts @@ -412,7 +412,7 @@ export default class RtcEngine implements RtcEngineInterface { * **Note** * - If you call [`destroy`]{@link destroy} immediately after calling [`leaveChannel`]{@link leaveChannel}, the [`leaveChannel`]{@link leaveChannel} process interrupts, and the SDK does not trigger the [`LeaveChannel`]{@link RtcEngineEvents.LeaveChannel} callback. * - * - If you call [`leaveChannel`]{@link leaveChannel} during CDN live streaming, the SDK triggers the [`removeInjectStreamUrl`]{@link removeInjectStreamUrl} method. + * - If you call [`leaveChannel`]{@link leaveChannel} during CDN live streaming, the SDK triggers the [`removePublishStreamUrl`]{@link removePublishStreamUrl} method. * * @returns * - 0(NoError): Success. @@ -741,11 +741,11 @@ export default class RtcEngine implements RtcEngineInterface { * * **Note** * - * - This method affects the internal engine and can be called after calling [`leaveChannel`]{@link leaveChannel}. + * - This method affects the audio module and can be called after calling [`leaveChannel`]{@link leaveChannel}. * You can call this method either before or after joining a channel. * - * - This method resets the engine and takes some time to take effect. - * We recommend using the following API methods to control the audio engine modules separately: + * - This method enables/disables the audio module and takes some time to take effect. + * We recommend using the following API methods to control the audio module separately: * * - [`enableLocalAudio`]{@link enableLocalAudio}: Whether to enable the microphone to create the local audio stream. * @@ -766,11 +766,11 @@ export default class RtcEngine implements RtcEngineInterface { * * **Note** * - * - This method affects the internal engine and can be called after calling [`leaveChannel`]{@link leaveChannel}. + * - This method affects the audio module and can be called after calling [`leaveChannel`]{@link leaveChannel}. * You can call this method either before or after joining a channel. * - * - This method resets the internal engine and takes some time to take effect. - * We recommend using the following API methods to control the audio engine modules separately: + * - This method enables/disables the audio module and takes some time to take effect. + * We recommend using the following API methods to control the audio module separately: * * - [`enableLocalAudio`]{@link enableLocalAudio}: Whether to enable the microphone to create the local audio stream. * @@ -797,7 +797,7 @@ export default class RtcEngine implements RtcEngineInterface { * The recommended value is 3. * @param report_vad * - `true`: Enable the voice activity detection of the local user. Once it is enabled, the `vad` parameter of the [`AudioVolumeIndication`]{@link RtcEngineEvents.AudioVolumeIndication} callback reports the voice activity status of the local user. - * - `false`: (Default) Disable the voice activity detection of the local user. Once it is enabled, the `vad` parameter of the [`AudioVolumeIndication`]{@link RtcEngineEvents.AudioVolumeIndication} callback does not report the voice activity status of the local user, + * - `false`: (Default) Disable the voice activity detection of the local user. Once it is disabled, the `vad` parameter of the [`AudioVolumeIndication`]{@link RtcEngineEvents.AudioVolumeIndication} callback does not report the voice activity status of the local user, * except for scenarios where the engine automatically detects the voice activity of the local user. */ enableAudioVolumeIndication( @@ -826,7 +826,7 @@ export default class RtcEngine implements RtcEngineInterface { * * **Note** * - * - This method is different from the [`muteLocalAudioStream`]{@link muteLocalAudioStream} method: + * This method is different from the [`muteLocalAudioStream`]{@link muteLocalAudioStream} method: * * - [`enableLocalAudio`]{@link enableLocalAudio}: Disables/Re-enables the local audio capture and processing. * If you disable or re-enable local audio recording using [`enableLocalAudio`]{@link enableLocalAudio}, the local user may hear a pause in the remote audio playback. @@ -1642,18 +1642,22 @@ export default class RtcEngine implements RtcEngineInterface { } /** - * Publishes the local stream to the CDN. + * Publishes the local stream to a specified CDN streaming URL. + * + * After calling this method, you can push media streams in RTMP or RTMPS protocol to the CDN. * - * This method call triggers the [`RtmpStreamingStateChanged`]{@link RtcEngineEvents.RtmpStreamingStateChanged} callback on the local client to report the state of adding a local stream to the CDN. + * This SDK triggers the [`RtmpStreamingStateChanged`]{@link RtcEngineEvents.RtmpStreamingStateChanged} callback on the local client to report the state of adding a local stream to the CDN. * * **Note** * - Ensure that you enable the RTMP Converter service before using this function. See Prerequisites in *Push Streams to CDN*. * - This method applies to [`LiveBroadcasting`]{@link ChannelProfile.LiveBroadcasting} only. * - Ensure that the user joins a channel before calling this method. - * - This method adds only one stream HTTP/HTTPS URL address each time it is called. - * @param url The CDN streaming URL in the RTMP format. The maximum length of this parameter is 1024 bytes. + * - This method adds only one CDN streaming URL each time it is called. + * - Agora supports pushing media streams in RTMPS protocol to the CDN only when you enable transcoding. + * + * @param url The CDN streaming URL in the RTMP or RTMPS format. The maximum length of this parameter is 1024 bytes. * The URL address must not contain special characters, such as Chinese language characters. - * @param transcodingEnabled Sets whether transcoding is enabled/disabled. + * @param transcodingEnabled Whether to enable transcoding. * If you set this parameter as `true`, ensure that you call [`setLiveTranscoding`]{@link setLiveTranscoding} before this method. * * - `true`: Enable transcoding. To transcode the audio or video streams when publishing them to CDN live, often used for combining the audio and video streams of multiple hosts in CDN live. @@ -1673,17 +1677,18 @@ export default class RtcEngine implements RtcEngineInterface { } /** - * Removes an RTMP stream from the CDN. + * Removes an RTMP or RTMPS stream from the CDN. * - * This method removes the RTMP URL address (added by [`addPublishStreamUrl`]{@link addPublishStreamUrl}) from a CDN live stream. + * This method removes the CDN streaming URL (added by [`addPublishStreamUrl`]{@link addPublishStreamUrl}) from a CDN live stream. * The SDK reports the result of this method call in the [`RtmpStreamingStateChanged`]{@link RtcEngineEvents.RtmpStreamingStateChanged} callback. * * **Note** * - Ensure that you enable the RTMP Converter service before using this function. See Prerequisites in *Push Streams to CDN*. * - Ensure that the user joins a channel before calling this method. * - This method applies to [`LiveBroadcasting`]{@link ChannelProfile.LiveBroadcasting} only. - * - This method removes only one stream RTMP URL address each time it is called. - * @param url The RTMP URL address to be removed. The maximum length of this parameter is 1024 bytes. + * - This method removes only one CDN streaming URL each time it is called. + * + * @param url The CDN streaming URL to be removed. The maximum length of this parameter is 1024 bytes. * The URL address must not contain special characters, such as Chinese language characters. */ removePublishStreamUrl(url: string): Promise { @@ -1703,6 +1708,7 @@ export default class RtcEngine implements RtcEngineInterface { * - Ensure that you enable the RTMP Converter service before using this function. See Prerequisites in Push Streams to CDN. * - Ensure that you call [`setClientRole`]{@link setClientRole} and set the user role as the host. * - Ensure that you call [`setLiveTranscoding`]{@link setLiveTranscoding} before calling [`addPublishStreamUrl`]{@link addPublishStreamUrl}. + * - Agora supports pushing media streams in RTMPS protocol to the CDN only when you enable transcoding. * * @param transcoding Sets the CDN live audio/video transcoding settings. */ @@ -1834,8 +1840,13 @@ export default class RtcEngine implements RtcEngineInterface { * * - This method is invalid for audience users in the [`LiveBroadcasting`]{@link ChannelProfile.LiveBroadcasting} profile. * + * - Settings of `setAudioProfile` and `setChannelProfile` affect the call result of `setEnableSpeakerphone`. The following are scenarios where `setEnableSpeakerphone` does not take effect: + * - If you set `scenario` as `GameStreaming`, no user can change the audio playback route. + * - If you set `scenario` as `Default` or `ShowRoom`, the audience cannot change the audio playback route. If there is only one host is in the channel, the host cannot change the audio playback route either. + * - If you set `scenario` as `Education`, the audience cannot change the audio playback route. + * * @param enabled Sets whether to route the audio to the speakerphone or earpiece: - * - `true`: Route the audio to the speakerphone. + * - `true`: Route the audio to the speakerphone. If the playback device connects to the earpiece or Bluetooth, the audio cannot be routed to the speakerphone. * - `false`: Route the audio to the earpiece. If the headset is plugged in, the audio is routed to the headset. */ setEnableSpeakerphone(enabled: boolean): Promise { @@ -2166,7 +2177,7 @@ export default class RtcEngine implements RtcEngineInterface { * All users in the same channel must use the same encryption mode and encryption key. Once all users leave the channel, the encryption key of this channel is automatically cleared. * * **Note** - * - If you enable the built-in encryption, you cannot use the RTMP streaming function. + * - If you enable the built-in encryption, you cannot use the RTMP or RTMPS streaming function. * - Agora supports four encryption modes. If you choose an encryption mode (excepting `SM4128ECB` mode), you need to add an external encryption library when integrating the SDK. For details, see the advanced guide *Channel Encryption*. * * diff --git a/src/common/RtcEvents.ts b/src/common/RtcEvents.ts index 7f38f2660..28f6f82b0 100644 --- a/src/common/RtcEvents.ts +++ b/src/common/RtcEvents.ts @@ -332,8 +332,8 @@ export type SoundIdCallback = (soundId: number) => void; export type RtmpStreamingStateCallback = /** - * @param url The RTMP URL address. - * @param state The RTMP streaming state. + * @param url The CDN streaming URL. + * @param state The RTMP or RTMPS streaming state. * @param errCode The detailed error information for streaming. */ ( @@ -392,13 +392,13 @@ export type VideoFrameWithUidCallback = (uid: number, width: number, height: number, elapsed: number) => void; export type UrlWithErrorCallback = /** - * @param url The RTMP streaming URL. + * @param url The RTMP or RTMPS streaming URL. * @param error The detailed error information. */ (url: string, error: ErrorCode) => void; export type UrlCallback = /** - * @param url The RTMP URL address. + * @param url The CDN streaming URL. */ (url: string) => void; export type TransportStatsCallback = @@ -481,7 +481,7 @@ export type StreamSubscribeStateCallback = ) => void; export type RtmpStreamingEventCallback = /** - * @param url The RTMP streaming URL. + * @param url The RTMP or RTMPS streaming URL. * @param eventCode The event code. See [`RtmpStreamingEvent`]{@link RtmpStreamingEvent}. */ (url: string, eventCode: RtmpStreamingEvent) => void; @@ -963,12 +963,12 @@ export interface RtcEngineEvents { AudioEffectFinished: SoundIdCallback; /** - * Occurs when the state of the RTMP streaming changes. + * Occurs when the state of the RTMP or RTMPS streaming changes. * * The SDK triggers this callback to report the result of the local user calling [`addPublishStreamUrl`]{@link RtcEngine.addPublishStreamUrl} or [`removePublishStreamUrl`]{@link RtcEngine.removePublishStreamUrl}. * This callback returns the URL and its current streaming state. When the streaming state is [`Failure`]{@link RtmpStreamingState.Failure}, see the errCode parameter for details. * - * This callback indicates the state of the RTMP streaming. When exceptions occur, you can troubleshoot issues by referring to the detailed error descriptions in the `errCode` parameter. + * This callback indicates the state of the RTMP or RTMPS streaming. When exceptions occur, you can troubleshoot issues by referring to the detailed error descriptions in the `errCode` parameter. * * @event RtmpStreamingStateChanged */ @@ -1111,7 +1111,7 @@ export interface RtcEngineEvents { * * Use [`RtmpStreamingStateChanged`]{@link RtmpStreamingStateChanged} instead. * - * This callback indicates whether you have successfully added an RTMP stream to the CDN. + * This callback indicates whether you have successfully added an RTMP or RTMPS stream to the CDN. * * @event StreamPublished */ @@ -1124,7 +1124,7 @@ export interface RtcEngineEvents { * * Use [`RtmpStreamingStateChanged`]{@link RtmpStreamingStateChanged} instead. * - * This callback indicates whether you have successfully removed an RTMP stream from the CDN. + * This callback indicates whether you have successfully removed an RTMP or RTMPS stream from the CDN. * * @event StreamUnpublished */ @@ -1378,7 +1378,7 @@ export interface RtcEngineEvents { VideoSubscribeStateChanged: StreamSubscribeStateCallback; /** - * Reports events during the RTMP streaming. + * Reports events during the RTMP or RTMPS streaming. * * @since v3.1.2. * @@ -1614,11 +1614,11 @@ export interface RtcChannelEvents { RemoteAudioStats: RemoteAudioStatsCallback; /** - * Occurs when the state of the RTMP streaming changes. + * Occurs when the state of the RTMP or RTMPS streaming changes. * * The SDK triggers this callback to report the result of the local user calling the [`addPublishStreamUrl`]{@link RtcChannel.addPublishStreamUrl} or [`removePublishStreamUrl`]{@link RtcChannel.removePublishStreamUrl} method. This callback returns the URL and its current streaming state. When the streaming state is [`Failure`]{@link RtmpStreamingState.Failure}, see the errCode parameter for details. * - * This callback indicates the state of the RTMP streaming. When exceptions occur, you can troubleshoot issues by referring to the detailed error descriptions in the errCode parameter. + * This callback indicates the state of the RTMP or RTMPS streaming. When exceptions occur, you can troubleshoot issues by referring to the detailed error descriptions in the errCode parameter. * * @event RtmpStreamingStateChanged */ @@ -1730,7 +1730,7 @@ export interface RtcChannelEvents { VideoSubscribeStateChanged: StreamSubscribeStateCallback; /** - * Reports events during the RTMP streaming. + * Reports events during the RTMP or RTMPS streaming. * * @since v3.1.2. * From 3dcc489bb52daaf8a794554f6048f343cbff5d8f Mon Sep 17 00:00:00 2001 From: HUI Date: Wed, 23 Dec 2020 18:21:41 +0800 Subject: [PATCH 19/20] feat: upgrade native SDK to 3.2.1 --- android/build.gradle | 2 +- react-native-agora.podspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 0b2f90dbc..c58fca2e9 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -128,7 +128,7 @@ def kotlin_version = getExtOrDefault('kotlinVersion') dependencies { // noinspection GradleDynamicVersion api 'com.facebook.react:react-native:+' - api "io.agora.rtc:full-sdk:3.2.0" + api "io.agora.rtc:full-sdk:3.2.1" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" } diff --git a/react-native-agora.podspec b/react-native-agora.podspec index 9996377ba..2fbbd0ea2 100644 --- a/react-native-agora.podspec +++ b/react-native-agora.podspec @@ -20,5 +20,5 @@ Pod::Spec.new do |s| s.swift_version = "4.0" s.dependency "React" - s.dependency "AgoraRtcEngine_iOS", "3.2.0" + s.dependency "AgoraRtcEngine_iOS", "3.2.1" end From a98f6bdb5fe11e199c65e9f397c3c4acbbd74336 Mon Sep 17 00:00:00 2001 From: HUI Date: Wed, 23 Dec 2020 19:25:56 +0800 Subject: [PATCH 20/20] chore: release 3.2.0 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8f9883fa..433229e61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [3.2.0](https://github.com/AgoraIO-Community/react-native-agora/compare/v3.2.0-rc.0...v3.2.0) (2020-12-23) + + +### Features + +* upgrade native SDK to 3.2.1 ([3dcc489](https://github.com/AgoraIO-Community/react-native-agora/commit/3dcc489bb52daaf8a794554f6048f343cbff5d8f)) + # [3.2.0-rc.0](https://github.com/AgoraIO-Community/react-native-agora/compare/v3.1.6...v3.2.0-rc.0) (2020-12-21) diff --git a/package.json b/package.json index bcbbf61e6..12b078a9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-agora", - "version": "3.2.0-rc.0", + "version": "3.2.0", "description": "Agora RTC SDK For React Native", "main": "lib/commonjs/index", "module": "lib/module/index",