/**
 * @file defs.ts
 * @brief NERtc SDK 的 TS 接口定义
 */

import { type } from "os";

export interface RendererOptions
{
    append: boolean
}

/** 日志级别。*/
export enum NERtcLogLevel{
    kNERtcLogLevelFatal    = 0,        /**< Fatal 级别日志信息。 */
    kNERtcLogLevelError    = 1,        /**< Error 级别日志信息。 */
    kNERtcLogLevelWarning  = 2,        /**< Warning 级别日志信息。 */
    kNERtcLogLevelInfo     = 3,        /**< Info 级别日志信息。默认级别 */
    kNERtcLogLevelDetailInfo   = 4,    /**< Detail Info 级别日志信息。 */
    kNERtcLogLevelVerbos   = 5,        /**< Verbos 级别日志信息。 */
    kNERtcLogLevelDebug    = 6,        /**< Debug 级别日志信息。如果你想获取最完整的日志，可以将日志级别设为该等级。*/
    kNERtcLogLevelOff      = 7,        /**< 不输出日志信息。*/
}

export interface NERtcLowLatencyOptions {
    enable_low_latency?: boolean;
    play_timeout?: number;
}

export interface NERtcJoinChannelOptions {
    custom_info?: string; /**< 自定义信息，最长支持 127 个字符。 <127chars */
    permission_key?: string; /**< 权限密钥。能控制通话时长及媒体权限能力。*/
    low_latency_options?: NERtcLowLatencyOptions;
}

export const kNERtcKeyChannel1V1ModeEnabled = "channel_1v1_mode_enabled";

/** 范围语音模式。*/
export enum NERtcRangeAudioMode{
    NERtcRangeAudioModeDefault    = 0, /**< 默认模式。设置后玩家附近一定范围的人都能听到该玩家讲话，如果范围内也有玩家设置为此模式，则也可以互相通话。 */
    NERtcRangeAudioModeTeam    = 1,        /**< 小组模式。仅TeamID相同的队友可以互相听到 */
}

export interface NERtcJoinChannelOptionsEx {
    custom_info: string; /**< 自定义信息，最长支持 127 个字符。 <127chars */
    permission_key: string; /**< 权限密钥。能控制通话时长及媒体权限能力。*/
    team_id: number; /**< 小队号。*/
    mode: NERtcRangeAudioMode; /**<  语音模式。 */
    audible_distance: number; /**< 语音接收范围。*/
}

/** 音频帧请求格式。*/
export interface NERtcAudioFrameRequestFormat {
    channels: number; /**< 音频声道数量。如果是立体声，数据是交叉的。单声道: 1；双声道 : 2。*/
    sample_rate: number; /**< 采样率。*/
    mode: NERtcRawAudioFrameOpModeType;/**< 读写模式*/
}

/** 私有化服务器配置项 */
export interface NERtcServerAddresses {
    channel_server: string; /**< 获取通道信息服务器, <256chars */
    statistics_server: string; /**< 统计上报服务器, <256chars */
    room_server: string;       /**< roomServer服务器, <256chars */
    compat_server: string;     /**< 兼容性配置服务器, <256chars */
    nos_lbs_server: string;     /**< nos 域名解析服务器, <256chars */
    nos_upload_sever: string;   /**< 默认nos 上传服务器, <256chars */
    nos_token_server: string;   /**< 获取NOS token 服务器, <256chars */
    use_ipv6: Boolean;               /**< 是否使用IPv6（默认false) */
}

export enum NERtcIPAddrMode {
    kNERtcIPAddrV4Only = 0,
    kNERtcIPAddrV4AndV6 = 1,
}

export interface NERtcEngineContext {
    app_key: string;		/**< 用户注册云信的APP Key。如果你的开发包里面缺少 APP Key，请申请注册一个新的 APP Key。*/
    log_dir_path: string;	/**< 日志目录的完整路径，采用UTF-8 编码。*/
    log_level: NERtcLogLevel;	/**< 日志级别，默认级别为 kNERtcLogLevelInfo。*/
    log_file_max_size_KBytes: number;	/**< 指定 SDK 输出日志文件的大小上限，单位为 KB。如果设置为 0，则默认为 20 M。*/
    server_config: NERtcServerAddresses;   /**< 私有化服务器地址 */
    ip_addr_mode?: NERtcIPAddrMode;        /**< IP地址类型：0=仅IPv4，1=IPv4+IPv6（默认） */
    area_code_type?: number;               /**< 区域类型：0=默认，1=中国大陆，2=海外通用 */
    video_use_exnternal_render?: boolean;  /**< 是否使用外部渲染（Mac有效，默认true；JS渲染层依赖此选项） */
}

/** 场景模式 */
export enum NERtcChannelProfileType
{
    kNERtcChannelProfileCommunication       = 0,    /**< 通话场景 */
    kNERtcChannelProfileLiveBroadcasting    = 1,    /**< 直播推流场景 */
}

/** 视频流类型。*/
export enum NERtcRemoteVideoStreamType{
    kNERtcRemoteVideoStreamTypeHigh     = 0, /**< 默认大流 */
    kNERtcRemoteVideoStreamTypeLow      = 1, /**< 小流 */
    kNERtcRemoteVideoStreamTypeNone     = 2, /**< 不订阅 */
}

/** 错误代码。

错误代码意味着 SDK 遇到不可恢复的错误，需要应用程序干预。
*/
export enum NERtcErrorCode
{
	kNERtcNoError = 0,		/**< 没有错误 */
	//资源分配错误 （正常请求时不会有此类错误返回）
	kNERtcErrChannelReservePermissionDenied = 403,	/**< 没有权限，包括没有开通音视频功能、没有开通非安全但是请求了非安全等 */
	kNERtcErrChannelReserveTimeOut = 408,			/**< 请求超时 */
	kNERtcErrChannelReserveErrorParam = 414,		/**< 服务器请求参数错误 */
	kNERtcErrChannelReserveServerFail = 500,		/**< 分配频道服务器未知错误 */
	kNERtcErrChannelReserveMoreThanTwoUser = 600,	/**< 只支持两个用户, 有第三个人试图使用相同的频道名分配频道 */

    //livestream task
    kNERtcErrLsTaskRequestInvalid = 1301,	        /**< task请求无效，被后续操作覆盖 */
    kNERtcErrLsTaskIsInvaild = 1400,	            /**< task参数格式错误 */
    kNERtcErrLsTaskRoomExited = 1401,	            /**< 房间已经退出 */
    kNERtcErrLsTaskNumLimit = 1402,	                /**< 推流任务超出上限 */
    kNERtcErrLsTaskDuplicateId = 1403,	            /**< 推流ID重复 */
    kNERtcErrLsTaskNotFound = 1404,	                /**< taskId任务不存在，或频道不存在 */
    kNERtcErrLsTaskRequestErr = 1417,	            /**< 请求失败 */
    kNERtcErrLsTaskInternalServerErr = 1500,	    /**< 服务器内部错误 */
    kNERtcErrLsTaskInvalidLayout = 1501,	        /**< 布局参数错误 */
    kNERtcErrLsTaskUserPicErr = 1512,	            /**< 用户图片错误 */


	//其他错误
	kNERtcErrChannelStartFail = 11000,				/**< 通道发起失败 */
	kNERtcErrChannelDisconnected = 11001,			/**< 断开连接 */
	kNERtcErrVersionSelfLow = 11002,				/**< 本人SDK版本太低不兼容 */
	kNERtcErrVersionRemoteLow = 11003,				/**< 对方SDK版本太低不兼容 */
	kNERtcErrChannelClosed = 11004,					/**< 通道被关闭 */
	kNERtcErrChannelKicked = 11005,					/**< 账号被踢 */
	kNERtcErrDataError = 11400,						/**< 数据错误 */
	kNERtcErrInvalid = 11403,						/**< 无效的操作 */
	//连接服务器错误
	kNERtcErrChannelJoinTimeOut = 20101,			/**< 请求超时 */
	kNERtcErrChannelJoinMeetingModeError = 20102,	/**< 会议模式错误 */
	kNERtcErrChannelJoinRtmpModeError = 20103,		/**< rtmp用户加入非rtmp频道 */
	kNERtcErrChannelJoinRtmpNodesError = 20104,		/**< 超过频道最多rtmp人数限制 */
	kNERtcErrChannelJoinRtmpHostError = 20105,		/**< 已经存在一个主播 */
	kNERtcErrChannelJoinRtmpCreateError = 20106,	/**< 需要旁路直播, 但频道创建者非主播 */
	kNERtcErrChannelJoinLayoutError = 20208,		/**< 主播自定义布局错误 */
	kNERtcErrChannelJoinInvalidParam = 20400,		/**< 错误参数 */
	kNERtcErrChannelJoinDesKey = 20401,				/**< 密码加密错误 */
	kNERtcErrChannelJoinInvalidRequst = 20417,		/**< 错误请求 */
	kNERtcErrChannelServerUnknown = 20500,			/**< 服务器内部错误 */
	//Engine error code
	kNERtcErrFatal = 30001,               /**< 通用错误 */
	kNERtcErrOutOfMemory = 30002,         /**< 内存耗尽 */
	kNERtcErrInvalidParam = 30003,        /**< 错误的参数 */
	kNERtcErrNotSupported = 30004,        /**< 不支持的操作 */
	kNERtcErrInvalidState = 30005,        /**< 当前状态不支持的操作 */
	kNERtcErrLackOfResource = 30006,      /**< 资源耗尽 */
	kNERtcErrInvalidIndex = 30007,        /**< 非法 index */
	kNERtcErrDeviceNotFound = 30008,      /**< 设备未找到 */
	kNERtcErrInvalidDeviceSourceID = 30009,/**< 非法设备 ID */
	kNERtcErrInvalidVideoProfile = 30010, /**< 非法的视频 profile type */
	kNERtcErrCreateDeviceSourceFail = 30011,  /**< 设备创建错误 */
	kNERtcErrInvalidRender = 30012,       /**< 非法的渲染容器 */
	kNERtcErrDevicePreviewAlreadyStarted = 30013,/**< 设备已经打开 */
	kNERtcErrTransmitPendding = 30014,    /**< 传输错误 */
	kNERtcErrConnectFail = 30015,         /**< 连接服务器错误 */
    kNERtcErrCreateDumpFileFail = 30016,    /**< 创建Audio dump文件失败 */
    kNERtcErrStartDumpFail = 30017,         /**< 开启Audio dump失败 */
    kNERtcErrDesktopCaptureInvalidState = 30020,    /**< 启动桌面录屏失败，不能与camera同时启动 */
    kNERtcErrDesktopCaptureInvalidParam = 30021,    /**< 桌面录屏传入参数无效 */
    kNERtcErrDesktopCaptureNotReady     = 30022,    /**< 桌面录屏未就绪 */

	kNERtcErrChannelAlreadyJoined = 30100,    /**< 重复加入频道 */
	kNERtcErrChannelNotJoined = 30101,        /**< 尚未加入频道 */
	kNERtcErrChannelRepleatedlyLeave = 30102, /**< 重复离开频道 */
	kNERtcErrRequestJoinChannelFail = 30103,  /**< 加入频道操作失败 */
	kNERtcErrSessionNotFound = 30104,         /**< 会话未找到 */
	kNERtcErrUserNotFound = 30105,            /**< 用户未找到 */
	kNERtcErrInvalidUserID = 30106,           /**< 非法的用户 ID */
	kNERtcErrMediaNotStarted = 30107,         /**< 用户多媒体数据未连接 */
	kNERtcErrSourceNotFound = 30108,          /**< source 未找到 */

	kNERtcErrConnectionNotFound = 30200,      /**< 连接未找到 */
	kNERtcErrStreamNotFound = 30201,          /**< 媒体流未找到 */
	kNERtcErrAddTrackFail = 30202,            /**< 加入 track 失败 */
	kNERtcErrTrackNotFound = 30203,           /**< track 未找到 */
	kNERtcErrMediaConnectionDisconnected = 30204, /**< 媒体连接断开 */
	kNERtcErrSignalDisconnected = 30205,      /**< 信令连接断开 */
	kNERtcErrServerKicked = 30206,            /**< 被踢出频道 */
    kNERtcErrKickedForRoomClosed = 30207,     /**< 因频道已关闭而被踢出 */
    
    kNERtcRuntimeErrADMNoAuthorize = 40000,    /**< 没有音频设备权限 */
    
    kNERtcRuntimeErrVDMNoAuthorize = 50000,    /**< 没有视频设备权限 */
    
    kNERtcRuntimeErrScreenCaptureNoAuthorize = 60000,    /**< 没有录制视频权限 */
}

/** 用户离开原因。*/
export enum NERtcSessionLeaveReason
{
    kNERtcSessionLeaveNormal = 0,       /**< 正常离开。*/
    kNERtcSessionLeaveForFailOver = 1,  /**< 用户断线导致离开。*/
    kNERtcSessionLeaveUpdate = 2,       /**< 用户 Failover 过程中产生的 leave。*/
    kNERtcSessionLeaveForKick = 3,      /**< 用户被踢导致离开。*/
    kNERtcSessionLeaveTimeOut = 4,      /**< 用户超时导致离开。*/
}

/** 视频编码配置。用于衡量编码质量。*/
export enum NERtcVideoProfileType
{
    kNERtcVideoProfileLowest = 0,       /**< 160x90/120, 15fps */
    kNERtcVideoProfileLow = 1,          /**< 320x180/240, 15fps */
    kNERtcVideoProfileStandard = 2,     /**< 640x360/480, 30fps */
    kNERtcVideoProfileHD720P = 3,       /**< 1280x720, 30fps */
    kNERtcVideoProfileHD1080P = 4,      /**< 1920x1080, 30fps */
    kNERtcVideoProfileNone = 5,
    kNERtcVideoProfileMAX = kNERtcVideoProfileHD1080P,
    kNERtcVideoProfileFake = 6, /**< FakeVideo标识，仅在回调中显示。请勿主动设置，否则 SDK 会按照STANDARD处理。 当远端在纯音频状态发送 SEI 时，本端将会收到远端的onUserVideoStart回调，其中 max_profile 参数为kNERtcVideoProfileFake ， 表示对端发送 16*16 的FakeVideo，此时如果本端需要接收远端的SEI信息，只需要订阅一下远端的视频即可，无须设置远端画布。*/
}

export enum NERtcVideoScalingMode {
    kNERtcVideoScaleFit      = 0,   /**< 0: 视频尺寸等比缩放。优先保证视频内容全部显示。因视频尺寸与显示视窗尺寸不一致造成的视窗未被填满的区域填充黑色。*/
    kNERtcVideoScaleFullFill = 1,   /**< 1: 视频尺寸非等比缩放。保证视频内容全部显示，且填满视窗。*/
    kNERtcVideoScaleCropFill = 2,   /**< 2: 视频尺寸等比缩放。优先保证视窗被填满。因视频尺寸与显示视窗尺寸不一致而多出的视频将被截掉。*/    
}

/** @enum NERtcVideoMirrorMode 设置镜像模式。*/
export enum NERtcVideoMirrorMode
{
    kNERtcVideoMirrorModeAuto       = 0,    /**< 0: Windows/macOS SDK 启用镜像模式。在 iOS/Android 平台中：如果你使用前置摄像头，SDK 默认启用镜像模式；如果你使用后置摄像头，SDK 默认关闭镜像模式。*/
    kNERtcVideoMirrorModeEnabled    = 1,    /**< 1: 启用镜像模式。*/
    kNERtcVideoMirrorModeDisabled   = 2,    /**< 2: （默认）关闭镜像模式。*/
}

/** @enum NERtcVideoOutputOrientationMode 设置镜像模式。*/
export enum NERtcVideoOutputOrientationMode
{
    kNERtcVideoOutputOrientationModeAdaptative       = 0,    /**< 0: （默认）该模式下 SDK 输出的视频方向与采集到的视频方向一致。接收端会根据收到的视频旋转信息对视频进行旋转。*/
    kNERtcVideoOutputOrientationModeFixedLandscape    = 1,    /**< 1:该模式下 SDK 固定输出横屏模式的视频。如果采集到的视频是竖屏模式，则视频编码器会对其进行裁剪。*/
    kNERtcVideoOutputOrientationModeFixedPortrait   = 2,    /**< 2: 该模式下 SDK 固定输出竖屏模式的视频，如果采集到的视频是横屏模式，则视频编码器会对其进行裁剪。*/
}

/** @enum NERtcRawAudioFrameOpModeType 读写模式*/
export enum NERtcRawAudioFrameOpModeType
{
    kNERtcRawAudioFrameOpModeReadOnly       = 0,    /**< 0: 返回数据只读模式。*/
    kNERtcRawAudioFrameOpModeReadWrite    = 1,    /**< 1:返回数据可读写。*/
}

/** @enum NERtcAudioType 音频类型*/
export enum NERtcAudioType
{
    kNERtcAudioTypePCM16    = 0,    /**< 0: PCM 16 位音频格式。*/
}

/** 音频格式。*/
export interface NERtcAudioFormat {
    type: NERtcAudioType;           /**< 音频类型，默认 PCM。*/
    channels: number;               /**< 音频声道数量。单声道: 1；双声道: 2。*/
    sample_rate: number;            /**< 采样率。*/
    bytes_per_sample: number;       /**< 每个采样点的字节数。对于 PCM 来说，一般使用 16 bit，即两个字节。*/
    samples_per_channel: number;    /**< 每个声道的采样数量。*/
}

/** 音频帧。*/
export interface NERtcAudioFrame {
    format: NERtcAudioFormat;       /**< 音频格式。*/
    data: ArrayBuffer;              /**< 音频数据缓冲区。有效数据长度为：samples_per_channel * channels * bytes_per_sample。*/
    sync_timestamp: number;         /**< 同步音频主辅流的时间戳。*/
}

export interface NERtcVideoCanvas {
    mode: NERtcVideoScalingMode;
    view: Element;
    mirror_mode?: NERtcVideoMirrorMode;  /**< 镜像模式，0=Auto, 1=Enabled, 2=Disabled；远端 canvas 通过此字段控制本地显示镜像 */
}

export enum NERtcAudioProfileType {
    kNERtcAudioProfileDefault = 0,			    /**< 0: 默认设置。Speech场景下为 kNERtcAudioProfileStandardExtend，Music场景下为 kNERtcAudioProfileHighQuality */
    kNERtcAudioProfileStandard = 1,			    /**< 1: 普通质量的音频编码，16000Hz，20Kbps */
    kNERtcAudioProfileStandardExtend = 2,       /**< 2: 普通质量的音频编码，16000Hz，32Kbps */
    kNERtcAudioProfileMiddleQuality = 3,		/**< 3: 中等质量的音频编码，48000Hz，32Kbps */
    kNERtcAudioProfileMiddleQualityStereo = 4,  /**< 4: 中等质量的立体声编码，48000Hz * 2，64Kbps  */
    kNERtcAudioProfileHighQuality = 5,          /**< 5: 高质量的音频编码，48000Hz，64Kbps  */
    kNERtcAudioProfileHighQualityStereo = 6,    /**< 6: 高质量的立体声编码，48000Hz * 2，128Kbps  */
}

export enum NERtcAudioScenarioType {
    kNERtcAudioScenarioDefault  = 0,    /** 0: 默认设置:kNERtcChannelProfileCommunication下为kNERtcAudioScenarioSpeech，kNERtcChannelProfileLiveBroadcasting下为kNERtcAudioScenarioMusic。 */
    kNERtcAudioScenarioSpeech   = 1,    /** 1: 语音场景. NERtcAudioProfileType 推荐使用 kNERtcAudioProfileMiddleQuality 及以下 */
    kNERtcAudioScenarioMusic    = 2,    /** 2: 音乐场景。NERtcAudioProfileType 推荐使用 kNERtcAudioProfileMiddleQualityStereo 及以上 */
}

/** RTMP 流推的推流房间信息。*/
export interface NERtcStreamingRoomInfo {
    /** 用户的唯一标识 ID，为数字串，房间内每个用户的 uid 必须是唯一的。此 uid 为用户在您应用中的 ID，请在您的业务服务器上自行管理并维护。*/
    uid: string;
    /** 房间名。长度为 1 ~ 64 字节。支持以下 89 个字符：a-z, A-Z, 0-9, space, !#$%&()+-:;≤.,>? @[]^_{|}~” */
    channel_name: string;
    /** 安全认证签名（NERTC Token）。*/
    token?: string;
}

/** RTMP 流推的推流参数。*/
export interface NERtcPushStreamingConfig {
    /** 指定该音视频流的 CDN 推流地址，即直播 CDN 上的播放地址。*/
    streaming_url: string;
    /** 推流的房间信息。*/
    streaming_room_info: NERtcStreamingRoomInfo;
}

/** RTMP 拉流播放参数。*/
export interface NERtcPlayStreamingConfig {
    /** 直播拉流地址，例如 rtmp://test.url。此处的拉流地址可设置为云信直播产品中服务端 API 创建房间的返回参数 playUrl。*/
    streaming_url: string;
    /** 播放延时，单位为毫秒。默认值为 2000，表示无延时。*/
    playout_delay?: number;
    /** 重连超时时间，单位为毫秒。默认为 30000（即 30s）。*/
    reconnect_timeout?: number;
    /** 是否停止音频播放。*/
    mute_audio_play?: boolean;
    /** 是否停止视频播放。*/
    mute_video_play?: boolean;
    /** 是否暂停拉流。*/
    pause_play_streaming?: boolean;
}

/** @enum NERtcPlayStreamState 播放流的状态。*/
export enum NERtcPlayStreamState {
    kNERtcPlayStreamStateIdle = 0,    /**< 初始状态。*/
    kNERtcPlayStreamStatePlaying = 1, /**< 正在播放中。*/
    kNERtcPlayStreamStatePaused = 2,  /**< 播放暂停。*/
    kNERtcPlayStreamStateReconnecting = 3, /**< 正在拉流重连。*/
    kNERtcPlayStreamStateStopped = 4  /**< 停止播放。*/
}

/** 实时字幕配置信息。*/
export interface NERtcASRCaptionConfig {
    /** 字幕的源语言，默认为 AUTO。*/
    src_language?: string;
    /** @deprecated 已废弃参数，请使用 dst_languages。*/
    dst_language?: string;
    /** 字幕的多源语言。支持如 "zh"（中文）、"en"（英文）等缩写。*/
    src_languages?: Array<string>;
    /** 字幕的目标翻译语言。不传则不翻译。*/
    dst_languages?: Array<string>;
    /** 当源语言与设置的目标语言相同时，是否仍要翻译，默认为 false。*/
    need_translate_same_language?: boolean;
}

/** 实时字幕状态。*/
export enum NERtcAsrCaptionState {
    kNERtcAsrCaptionStartFailed = 0,    /**< 启动失败。*/
    kNERtcAsrCaptionStateStopFailed = 1,/**< 停止失败。*/
    kNERtcAsrCaptionStateStarted = 2,   /**< 已经启动。*/
    kNERtcAsrCaptionStateStopped = 3    /**< 已经停止。*/
}

/** 实时字幕信息。*/
export interface NERtcAsrCaptionResult {
    /** 来源的用户 ID。*/
    user_id: number;
    /** 是否为本地用户。*/
    is_local_user: boolean;
    /** 实时字幕时间戳。*/
    timestamp: number;
    /** 实时字幕内容。*/
    content: string;
    /** 实时字幕语言。*/
    language: string;
    /** 是否带有翻译。*/
    have_translation: boolean;
    /** 翻译后的字幕内容。*/
    translated_text: string;
    /** 翻译后的字幕语言。*/
    translation_language: string;
    /** 是否为最终结果。*/
    is_final: boolean;
}

/** @struct NERtcFrameNormalizedRect 矩形相对坐标信息。*/
export interface NERtcFrameNormalizedRect {
    x: number; /**< 矩形的左上角顶点的 x 坐标，在相对坐标系中取值范围为[0.0, 1.0]。*/
    y: number; /**< 矩形的左上角顶点的 y 坐标，在相对坐标系中取值范围为[0.0, 1.0]。*/
    w: number; /**< 矩形的宽，在相对坐标系中取值范围为[0.0, 1.0]。*/
    h: number; /**< 矩形的高，在相对坐标系中取值范围为[0.0, 1.0]。*/
}

/** 混合外部视频配置。*/
export interface NERtcVideoExternalBlendConfig {
    /** 混合区域左上角 x 坐标 范围[0.0f, 1.0f]。*/
    x: number;
    /** 混合区域左上角 y 坐标 范围[0.0f, 1.0f]。*/
    y: number;
    /** 混合区域宽度比例 范围[0.0f, 1.0f]。x + w 不能超过 1.0。*/
    w: number;
    /** 混合区域高度比例 范围[0.0f, 1.0f]。y + h 不能超过 1.0。*/
    h: number;
    /** 是否镜像。*/
    mirror?: boolean;
    /** 混合区域缩放模式，保持比例/裁切/全填充。*/
    scaling_mode?: NERtcVideoScalingMode;
    /** 混合区域的背景颜色 ARGB 格式，其中 A 无效，默认渲染为黑色，0 为不设置背景。*/
    bg_color?: number;
    /** 是否叠加在原有视频上，默认 false（Blend 方式），设置为 true 时采用 Overlay 方式。*/
    overlay?: boolean;
}

/** 声纹信息数据。*/
export interface NERtcVoiceprintInfo {
    /** 设备 ID。*/
    device_id: string;
    /** 声纹数据。*/
    voiceprint: ArrayBuffer | string;
    /** 声纹数据长度。*/
    size?: number;
}

/** 视频水印类型枚举。*/
export enum NERtcWatermarkType {
    kNERtcWatermarkTypeImage = 0, /**< 图片水印。图片水印的图片大小不能超过 640*360 px。*/
    kNERtcWatermarkTypeText = 1,  /**< 文字水印。*/
    kNERtcWatermarkTypeTimestamp = 2 /**< 时间戳水印。*/
}

/** 图片水印配置，watermarkType = kNERtcWatermarkTypeImage 时生效。*/
export interface NERtcVideoWatermarkImageConfig {
    image_paths?: Array<string>; /**< 视频水印图片的一组本地绝对路径或 URL。仅支持 png。*/
    wm_alpha?: number;           /**< 图片水印的透明度，透明度范围：[0, 1]。默认值：1，即不透明。*/
    wm_width?: number;           /**< 图片水印的高度。不能超过 640 * 360 px。*/
    wm_height?: number;          /**< 图片水印的宽度。不能超过 640 * 360 px。*/
    offset_x?: number;           /**< 水印在当前视频帧的偏移值。距视频左上角的水平距离。*/
    offset_y?: number;           /**< 水印在当前视频帧的偏移值。距视频左上角的垂直距离。*/
    fps?: number;                /**< 按帧播放：设置图片的水印播放帧率（fps）。范围 1 到 30 fps。默认：0。*/
    loop?: boolean;              /**< 水印是否循环播放。默认值为 false。*/
}

/** 文字水印配置，watermarkType = kNERtcWatermarkTypeText 时生效。*/
export interface NERtcVideoWatermarkTextConfig {
    content?: string;            /**< 水印文字的内容。*/
    font_name?: string;          /**< 水印字体。默认值空（代表使用平台默认字体）。*/
    font_color?: string;         /**< 水印字体颜色。16 进制数的 ARGB 值，默认值为 0xFF888888。*/
    font_size?: number;          /**< 水印字体大小。默认值：10 个像素值。*/
    wm_color?: string;           /**< 字体背景色，可以不填。*/
    wm_alpha?: number;           /**< 文字水印背景颜色对应的透明度。默认值为 1，即不透明。*/
    wm_width?: number;           /**< 水印框宽度。*/
    wm_height?: number;          /**< 水印框高度。*/
    offset_x?: number;           /**< 水印在当前视频帧的偏移值。距视频左上角的水平距离。*/
    offset_y?: number;           /**< 水印在当前视频帧的偏移值。距视频左上角的垂直距离。*/
}

/** 时间戳水印配置，watermarkType = kNERtcWatermarkTypeTimestamp 时生效。*/
export interface NERtcVideoWatermarkTimestampConfig {
    font_name?: string;          /**< 水印字体。默认值空（代表使用平台默认字体）。*/
    font_color?: string;         /**< 水印字体颜色。不支持透明效果。16 进制数的 ARGB。默认值为 0xFF888888。*/
    font_size?: number;          /**< 水印字体大小。默认值：10。*/
    wm_color?: string;           /**< 水印背景颜色。支持透明效果。16 进制数的 ARGB，默认不配置。*/
    wm_alpha?: number;           /**< 文字水印背景颜色对应的透明度。范围：[0, 1]。默认值为 1，即不透明。*/
    wm_width?: number;           /**< 水印宽度。如果没有指定，内部会根据水印内容自动计算。*/
    wm_height?: number;          /**< 水印高度。如果没有指定，内部会根据文本内容自动计算。*/
    offset_x?: number;           /**< 水印在当前视频帧的偏移值。距视频左上角的水平距离。*/
    offset_y?: number;           /**< 水印在当前视频帧的偏移值。距视频左上角的垂直距离。*/
}

/** 系统本端视频水印配置。*/
export interface NERtcVideoWatermarkConfig {
    watermark_type?: NERtcWatermarkType; /**< 视频水印类型。*/
    image_watermarks?: NERtcVideoWatermarkImageConfig; /**< 图片水印配置参数。*/
    text_watermarks?: NERtcVideoWatermarkTextConfig;   /**< 文字水印配置参数。*/
    timestamp_watermark?: NERtcVideoWatermarkTimestampConfig; /**< 时间戳水印配置参数。*/
}

/** 本地录制配置项。*/
export interface NERtcLocalRecordingConfig {
    file_path: string;           /**< 录制文件在本地保存的绝对路径。精确到文件名及格式且不能为空。包含格式类型不能超过 512，目前只支持 .mp4，必须要有读写权限。*/
    file_name: string;           /**< 录制文件保存名称。不能大于 128 chars。如果不为空，保存文件的实际名称为 fileName_{uid}_(n).mp4 或者 fileName.mp4。*/
    width?: number;              /**< 生成的 mp4 等画面的宽。*/
    height?: number;             /**< 生成的 mp4 等画面的高。*/
    framerate?: number;          /**< 设置所录视频的文件帧率，取值范围：1 - 60，默认 30。*/
    record_file_type?: number;   /**< 录制类型，0：flv，1：音视频混流，2：flv 转 mp4，3：录制默认 flv 然后转切 mp4。默认值为空。*/
    remux_to_mp4?: boolean;      /**< 录像文件合并参数 mp4 或 flv。默认 false(合并为 flv)。*/
    video_merge?: boolean;       /**< true：音视频混流。false：单视频流加音视频混流。建议设置为 true。*/
    record_audio?: boolean;      /**< 是否录制音频流。*/
    audio_format?: number;       /**< 如果配置了采集音频此参数才起效，0 代表采集 aac 数据。*/
    record_video?: boolean;      /**< 是否录制视频流。*/
    video_record_mode?: number;  /**< 录制视频使用模式，1 为录制本地流文件模式。*/
    watermark_list?: Array<NERtcVideoWatermarkConfig>;     /**< 水印配置数组。*/
    cover_file_path?: string;                              /**< 本地录制文件的封面图的绝对路径，如果不设置默认全黑或者按照默认布局规则计算封面图。*/
    cover_watermark_list?: Array<NERtcVideoWatermarkConfig>; /**< 本地录制封面图水印配置数组。*/
    default_cover_file_path?: string;                      /**< 本地录制文件默认封面图的绝对路径，目前暂不支持传入 URL 或 Asset。*/
}

/** 本地录制的布局配置。*/
export interface NERtcLocalRecordingLayoutConfig {
    offset_x?: number;           /**< 视频显示区域左上角的横坐标。*/
    offset_y?: number;           /**< 视频显示区域左上角的纵坐标。*/
    width?: number;              /**< 画面在主画面的显示宽度，画面右边超出主画面会报错。*/
    height?: number;             /**< 画面在主画面的显示高度，画面底边超出主画面会报错。*/
    scaling_mode?: NERtcVideoScalingMode; /**< 视频比例伸缩缩放模式。*/
    watermark_list?: Array<NERtcVideoWatermarkConfig>; /**< 录制视频水印相关的定制参数。*/
    is_screen_share?: boolean;   /**< 是否是屏幕共享流。*/
    bg_color?: number;           /**< 用户画面缺省背景色。如果不传则按照默认纯黑。*/
}

/** 参与本次本地录制的各个本地远端流（屏幕或摄像和音频流信息）。*/
export interface NERtcLocalRecordingStreamInfo {
    uid: string;                 /**< 用户 ID。不能为缺省参数，代表着此一路流所从属的 uid。*/
    stream_type: NERtcVideoStreamType; /**< 视频通道类型，主流或辅流。*/
    stream_layer: number;        /**< 自定义的各个流分层信息通道号。*/
    layout_config: NERtcLocalRecordingLayoutConfig; /**< 流布局配置信息。*/
}

/** @enum NERtcVideoCropMode 视频画面裁剪模式。*/
export enum NERtcVideoCropMode {
    kNERtcVideoCropModeDefault = 0,     /**< Device Defalut */
    kNERtcVideoCropMode16x9    = 1,     /**< 16:9 */
    kNERtcVideoCropMode4x3     = 2,     /**< 4:3 */
    kNERtcVideoCropMode1x1     = 3,     /**< 1:1 */
}

/** @enum NERtcVideoFramerateType 视频帧率。*/
export enum NERtcVideoFramerateType {
    kNERtcVideoFramerateFpsDefault  = 0,    /**< 默认帧率 */
    kNERtcVideoFramerateFps_7       = 7,    /**< 7帧每秒 */
    kNERtcVideoFramerateFps_10      = 10,   /**< 10帧每秒 */
    kNERtcVideoFramerateFps_15      = 15,   /**< 15帧每秒 */
    kNERtcVideoFramerateFps_24      = 24,   /**< 24帧每秒 */
    kNERtcVideoFramerateFps_30      = 30,   /**< 30帧每秒 */
    kNERtcVideoFramerateFps_60      = 60,   /**< 60帧每秒 */
}

/** @enum NERtcDegradationPreference 视频编码策略。*/
export enum NERtcDegradationPreference {
    kNERtcDegradationDefault            = 0,  /**< 使用引擎推荐值。通话场景使用平衡模式，直播推流场景使用清晰优先 */
    kNERtcDegradationMaintainFramerate  = 1,  /**< 帧率优先 */
    kNERtcDegradationMaintainQuality    = 2,  /**< 清晰度优先 */
    kNERtcDegradationBalanced           = 3,  /**< 平衡模式 */
}

/** @enum NERtcAudioStreamType 伴音跟随音频主流还是辅流，默认跟随主流。*/
export enum NERtcAudioStreamType {
    kNERtcAudioStreamTypeMain            = 0,  /**< 主流 */
    kNERtcAudioStreamTypeSub             = 1,  /**< 辅流 */
}

/** @enum NERtcDistanceRolloffModel 空间音效衰减模式 */
export enum NERtcDistanceRolloffModel {
    kNERtcDistanceRolloffLogarithmic            = 0,  /**< 指数模式 */
    kNERtcDistanceRolloffLinear  = 1,  /**< 线性模式 */
    kNERtcDistanceRolloffNone = 2,/**< 无衰减 */
    kNERtcDistanceRolloffLinearOnly = 3,/**< 仅线性衰减,没有方位效果 */
}

/** 视频配置属性。*/
export interface NERtcVideoConfig {
    max_profile: NERtcVideoProfileType;	/**< 视频编码的分辨率，用于衡量编码质量。*/
    width: number;                     /**< 视频编码自定义分辨率之宽度。width为0表示使用max_profile*/
    height: number;                    /**< 视频编码自定义分辨率之高度。height为0表示使用max_profile*/
    crop_mode: NERtcVideoCropMode;      /**< 视频画面裁剪模式，默认kNERtcVideoCropModeDefault。*/
    framerate: NERtcVideoFramerateType;  /**< 视频帧率 */
    min_framerate: NERtcVideoFramerateType;  /**< 视频最小帧率 */
    bitrate: number;                   /**< 视频编码码率kbps，取0时使用默认值 */
    min_bitrate: number;               /**< 视频编码码率下限kbps，取0时使用默认值 */
    degradation_preference: NERtcDegradationPreference;   /**< 编码策略 */
    mirror_mode: NERtcVideoMirrorMode; /**< 设置本地视频编码的镜像模式，即本地发送视频的镜像模式，只影响远端用户看到的视频画面。 */
    orientation_mode: NERtcVideoOutputOrientationMode; /**< 设置本地视频编码的方向模式，即本地发送视频的方向模式，同时影响本端用户的预览画面和远端用户看到的视频画面。*/
}

/** 创建混音流配置项 */
export interface NERtcCreateAudioMixingOption {
    path: string;  /**< 本地文件全路径或URL < 256 chars */
    loop_count: number;                    /**< 循环次数， <= 0, 表示无限循环，默认 1 */
    send_enabled: boolean;              /**< 是否可发送，默认为 true */
    send_volume: number;           /**< 发送音量。最大为 100（默认）含义（0%-100%）*/
    playback_enabled: boolean;          /**< 是否可回放，默认为 true */
    playback_volume: number;       /**< 回放音量。最大为 100（默认）*/
    start_timestamp: number; /**< 音乐文件开始播放的时间，UTC 时间戳，即从1970 年 1 月 1 日 0 点 0 分 0 秒开始到事件发生时的毫秒数。默认值为 0，表示立即播放。*/
    send_with_audio_type: NERtcAudioStreamType; /**< 伴音跟随音频主流还是辅流，默认跟随主流。*/
    progress_interval: number; /**< 伴音播放进度回调间隔，单位ms，取值范围为 100~10000, 默认1000ms*/
}

/** 创建音效配置项 */
export interface NERtcCreateAudioEffectOption {
    path: string;  /**< 本地文件全路径或URL < 256 chars */
    loop_count: number;                    /**< 循环次数， <= 0, 表示无限循环，默认 1 */
    send_enabled: boolean;              /**< 是否可发送，默认为 true */
    send_volume: number;           /**< 发送音量。最大为 100（默认）含义（0%-100%）*/
    playback_enabled: boolean;          /**< 是否可回放，默认为 true */
    playback_volume: number;       /**< 回放音量。最大为 100（默认）*/
    start_timestamp: number; /**< 音乐文件开始播放的时间，UTC 时间戳，即从1970 年 1 月 1 日 0 点 0 分 0 秒开始到事件发生时的毫秒数。默认值为 0，表示立即播放。*/
    send_with_audio_type: NERtcAudioStreamType; /**< 伴音跟随音频主流还是辅流，默认跟随主流。*/
    progress_interval: number; /**< 伴音播放进度回调间隔，单位ms，取值范围为 100~10000, 默认1000ms*/
}

/** 待共享区域相对于整个屏幕或窗口的位置，如不填，则表示共享整个屏幕或窗口。*/
export interface NERtcRectangle {
    x: number;      /**< 左上角的横向偏移。*/
    y: number;      /**< 左上角的纵向偏移。*/
    width: number;  /**< 待共享区域的宽。*/
    height: number; /**< 待共享区域的高。*/
}

/** 屏幕共享编码参数配置。*/
export enum NERtcScreenProfileType
{
    kNERtcScreenProfile480P     = 0,    /**< 640x480, 5fps */
    kNERtcScreenProfileHD720P   = 1,    /**< 1280x720, 5fps */
    kNERtcScreenProfileHD1080P  = 2,    /**< 1920x1080, 5fps。默认 */
    kNERtcScreenProfileCustom   = 3,    /**< 自定义 */
    kNERtcScreenProfileNone     = 4,
    kNERtcScreenProfileMAX = kNERtcScreenProfileHD1080P,
}

/** 视频尺寸。*/
export interface NERtcVideoDimensions
{
    width: number;     /**< 宽度 */
    height: number;    /**< 高度 */
}

/** 屏幕共享功能的编码策略倾向
- kNERtcSubStreamContentPreferMotion: 内容类型为动画;当共享的内容是视频、电影或游戏时，推荐选择该内容类型
当用户设置内容类型为动画时，按用户设置的帧率处理
- kNERtcSubStreamContentPreferDetails: 内容类型为细节;当共享的内容是图片或文字时，推荐选择该内容类型
当用户设置内容类型为细节时，最高允许用户设置到 10 帧，设置超过 10 帧时，不生效，按 10 帧处理
 */
export enum NERtcSubStreamContentPrefer
{
    kNERtcSubStreamContentPreferMotion  = 0,    /**< 动画模式。*/
    kNERtcSubStreamContentPreferDetails = 1,    /**< 细节模式。*/
}

/** 视频颜色范围。*/
export enum NERtcVideoColorSpaceRange
{
    kNERtcVideoColorSpaceRangeInvalid = 0, /**< Unspecified / Auto */
    kNERtcVideoColorSpaceRangeLimited = 1, /**< Limited range */
    kNERtcVideoColorSpaceRangeFull = 2,    /**< Full range */
    kNERtcVideoColorSpaceRangeDerived = 3, /**< Derived range */
}

/** 屏幕共享编码参数配置。用于衡量编码质量。一期只支持profile设置。*/
export interface NERtcScreenCaptureParameters {
    profile: NERtcScreenProfileType;     /**< 屏幕共享编码参数配置。*/
    dimensions: NERtcVideoDimensions;    /**< 屏幕共享视频发送的最大像素值，kNERtcScreenProfileCustom下生效。*/
    frame_rate: number;                     /**< 共享视频的帧率，kNERtcScreenProfileCustom下生效，单位为 fps；默认值为 5，建议不要超过 15。*/
    bitrate: number;                        /**< 共享视频的码率，单位为 bps；默认值为 0，表示 SDK 根据当前共享屏幕的分辨率计算出一个合理的值。*/
    capture_mouse_cursor: boolean;          /**< 是否采集鼠标用于屏幕共享。*/
    window_focus: boolean;                  /**< 调用 startScreenCaptureByWindowId 方法共享窗口时，是否将该窗口前置。*/
    excluded_window_list: Array<Number>;         /**< 待屏蔽窗口的 ID 列表。 */
    excluded_window_count: number;          /**< 待屏蔽窗口的数量。*/
    prefer: NERtcSubStreamContentPrefer; /**< 编码策略倾向。*/
    enable_high_performance?: boolean; /**< macOS 高性能模式（共享屏幕生效）。*/
    enable_high_light?: boolean; /**< 是否显示 SDK 内置高亮边框。*/
    high_light_width?: number; /**< 高亮边框宽度（px）。*/
    high_light_color?: number; /**< 高亮边框颜色（ARGB/0xAABBGGRR）。*/
    high_light_length?: number; /**< 高亮边框长度（px），-1 表示全包围。*/
    exclude_highlight_box?: boolean; /**< 采集显示器时是否排除 SDK 内置高亮框。*/
    force_update_data?: boolean; /**< SDK 高亮时是否回调 onScreenCaptureSourceDataUpdate。*/
    prefer_color_space_range?: NERtcVideoColorSpaceRange; /**< 共享视频颜色范围。*/
}

/** 媒体优先级类型。*/
export enum NERtcMediaPriorityType
{
    kNERtcMediaPriorityHigh = 50,    /**< 高优先级 */
    kNERtcMediaPriorityNormal = 100, /**< （默认）普通优先级 */
}

export interface NERtcScreenCaptureWindowParam 
{
    window_list: Array<Number>;         /**< 待屏蔽窗口的 ID 列表。 */
}

/** 录音音质 */
export enum NERtcAudioRecordingQuality
{
    kNERtcAudioRecordingQualityLow = 0,    /**< 低音质 */
    kNERtcAudioRecordingQualityMedium = 1, /**< 中音质 */
    kNERtcAudioRecordingQualityHigh = 2,   /**< 高音质 */
}

/** Data structure related to media stream relay.*/
export interface NERtcChannelMediaRelayInfo 
{
    channel_name: String;     /**< The name of the destination room to which the media stream is relayed. */
    channel_token: String;    /**< The token used to connect to the destination room. */
    uid: string;               /**< The user ID used in the destination room. This ID can be different from the ID used in the current room. */
}

/** Configurations for media stream relay.*/
export interface NERtcChannelMediaRelayConfiguration 
{
    src_infos: NERtcChannelMediaRelayInfo;     /**<The information about the current room. */
    dest_infos: NERtcChannelMediaRelayInfo[];    /**< The configuration of the destination room. */
    dest_count?: number;                     /**< The number of destination rooms. The default value is 0. */
}

/** Media stream encryption mode. */
export enum NERtcEncryptionMode
{
    kNERtcGMCryptoSM4ECB      = 0, /**< 128-bit SM4 encryption, ECB mode. */
    kNERtcEncryptionModeCustom = 1, /**< custom encryption. >*/
}

/** Media stream encryption scheme. */
export interface NERtcEncryptionConfig 
{
    mode: NERtcEncryptionMode;     /**< Media stream encryption mode. For more information, see NERtcEncryptionMode. */
    key: String;     /**< Media stream encryption key. The key is of string type. We recommend that you set the key to a string that contains only letters. */
}

/** 直播推流模式 */
export enum NERtcLiveStreamMode
{
    kNERtcLsModeVideo  = 0, /**< 推流带视频 */
    kNERtcLsModeAudio  = 1, /**< 推流纯音频 */
}

/** 直播推流视频裁剪模式 */
export enum NERtcLiveStreamVideoScaleMode
{
    kNERtcLsModeVideoScaleFit      = 0, /**< 0: 视频尺寸等比缩放。优先保证视频内容全部显示。因视频尺寸与显示视窗尺寸不一致造成的视窗未被填满的区域填充背景色。*/
    kNERtcLsModeVideoScaleCropFill = 1, /**< 1: 视频尺寸等比缩放。优先保证视窗被填满。因视频尺寸与显示视窗尺寸不一致而多出的视频将被截掉。*/
}

/** 直播推流音频采样率 */
export enum NERtcLiveStreamAudioSampleRate
{
    kNERtcLiveStreamAudioSampleRate32000 = 32000, /**< 采样率为 32 kHz。*/
    kNERtcLiveStreamAudioSampleRate44100 = 44100, /**< 采样率为 44.1 kHz。*/
    kNERtcLiveStreamAudioSampleRate48000 = 48000  /**< （默认）采样率为 48 kHz。*/
}

/** 直播推流音频编码规格 */
export enum NERtcLiveStreamAudioCodecProfile
{
    kNERtcLiveStreamAudioCodecProfileLCAAC = 0, /**< （默认）LC-AAC 规格，表示基本音频编码规格。*/
    kNERtcLiveStreamAudioCodecProfileHEAAC = 1  /**< HE-AAC 规格，表示高效音频编码规格。*/
}

/** 直播成员布局 */
export interface NERtcLiveStreamUserTranscoding {
    uid: string;                      /**< 用户id */
    video_push: boolean;                /**< 是否推送该用户视频流，kNERtcLsModeAudio时无效 */
    adaption: NERtcLiveStreamVideoScaleMode;   /**< 视频流裁剪模式 */
    x: number;                          /**< 画面离主画面左边距 */
    y: number;                          /**< 画面离主画面上边距 */
    width: number;                      /**< 画面在主画面的显示宽度，画面右边超出主画面会失败 */
    height: number;                     /**< 画面在主画面的显示高度，画面底边超出主画面会失败 */
    audio_push: boolean;                /**< 是否推送该用户音频流 */
}

/** 图片布局 */
export interface NERtcLiveStreamImageInfo {
    url: String;            /**< 图片地址 */
    x: number;              /**< 画面离主画面左边距 */
    y: number;                          /**< 画面离主画面上边距 */
    width: number;                      /**< 画面在主画面的显示宽度，画面右边超出主画面会失败 */
    height: number;                     /**< 画面在主画面的显示高度，画面底边超出主画面会失败 */
}

/** 直播布局 */
export interface NERtcLiveStreamLayout {
    width: number;                              /**< 视频推流宽度 */
    height: number;                             /**< 视频推流高度 */
    background_color: number;          /**< 视频推流背景色，(R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff) */
    user_count: number;                /**< 成员布局个数 */
    users: Array<NERtcLiveStreamUserTranscoding>;  /**< 成员布局数组 */
    bg_image: NERtcLiveStreamImageInfo;     /**< 背景图信息 */
}

export interface NERtcLiveConfig {
    single_video_passthrough: boolean;  /**< 单路视频透传开关，默认为关闭状态，开启后，如果房间中只有一路视频流输入， 则不对输入视频流进行转码，不遵循转码布局，直接推流 CDN，如果有多个房间成员视频流混合为一路流，则该设置失效，并在恢复为一个成员画面（单路流）时也不会恢复。*/
    interrupted_place_image: boolean; /**< 设置是否开启主播占位图模式。开启后会在主播离线的时候用占位图填补主播位置。*/
    audio_bitrate: number;              /**< 音频推流码率，单位为 kbps，取值范围为 10~192，语音场景建议设置为 64 及以上码率，音乐场景建议设置为 128 及以上码率。 */
    sample_rate: NERtcLiveStreamAudioSampleRate; /**< 音频推流采样率。单位为Hz。默认为 kNERtcLiveStreamAudioSampleRate48000，即采样率为 48 kHz。 */
    channels: number;                   /**< 音频推流声道数，默认值为 2 双声道。 */
    audio_codec_profile: NERtcLiveStreamAudioCodecProfile /**< 音频编码规格。默认值 NERtcLiveStreamAudioCodecProfileLCAAC，普通编码规格，0: LC-AAC 规格，表示基本音频编码规格，1: HE-AAC 规格，表示高效音频编码规格 */
}

/** 直播推流任务的配置项。*/
export interface NERtcLiveStreamTaskInfo
{
    task_id: String;                /**< 推流任务ID，为推流任务的唯一标识，用于过程中增删任务操作 < 64 chars*/
    stream_url: String;             /**< 直播推流地址 <256 chars */
    server_record_enabled: Boolean; /**< 服务器录制功能是否开启 */
    ls_mode: NERtcLiveStreamMode;   /**< 直播推流模式，NERtcLiveStreamMode */
    layout: NERtcLiveStreamLayout;  /**< 视频布局 */
    config: NERtcLiveConfig;        /**< 音视频流编码参数等设置。详细信息请参考 NERtcLiveConfig */
}

/** 音频设备链接类型。*/
export enum NERtcAudioDeviceTransportType
{
    kNERtcAudioDeviceTransportTypeUnknown           = 0,    /**< 未知设备 */
    kNERtcAudioDeviceTransportTypeBluetooth         = 1,    /**< 蓝牙设备 */
    kNERtcAudioDeviceTransportTypeBluetoothA2DP     = 2,    /**< 蓝牙立体声设备 */
    kNERtcAudioDeviceTransportTypeBluetoothLE       = 3,    /**< 蓝牙低功耗设备 */
    kNERtcAudioDeviceTransportTypeUSB               = 4,    /**< USB设备 */
    kNERtcAudioDeviceTransportTypeHDMI              = 5,    /**< HDMI设备 */
    kNERtcAudioDeviceTransportTypeBuiltIn           = 6,    /**< 内置设备 */
    kNERtcAudioDeviceTransportTypeThunderbolt       = 7,    /**< 雷电接口设备 */
    kNERtcAudioDeviceTransportTypeAirPlay           = 8,    /**< AirPlay设备 */
    kNERtcAudioDeviceTransportTypeVirtual           = 9,    /**< 虚拟设备 */
    kNERtcAudioDeviceTransportTypeOther             = 10,   /**< 其他设备 */
}

/** 摄像头设备链接类型。*/
export enum NERtcVideoDeviceTransportType
{
    kNERtcVideoDeviceTransportTypeUnknown   = 0,    /**< 未知设备 */
    kNERtcVideoDeviceTransportTypeUSB       = 1,    /**< USB设备 */
    kNERtcVideoDeviceTransportTypeVirtual   = 2,    /**< 虚拟设备 */
    kNERtcVideoDeviceTransportTypeOther     = 3,    /**< 其他设备 */
}

/** 设备信息 */
export interface NERtcDevice {
    device_id: string;      /**< 设备 ID */
    device_name: string;    /**< 设备名称 */
    transport_type: number; /**< 设备连接类型 */
    suspected_unavailable: boolean; /**< 设备是否可用 */
    system_default_device: boolean; /**< 是否为系统默认设备 */
}

/** 参会者角色类型 */
export enum NERtcClientRole
{
    kNERtcClientRoleBroadcaster     = 0,            /**< 主播 */
    kNERtcClientRoleAudience        = 1,            /**< 观众 */
}

/** SEI 发送的流通道类型 */
export enum NERtcStreamChannelType {
    kNERtcStreamChannelTypeMainStream   = 0, /**< 主流通道 */
    kNERtcStreamChannelTypeSubStream    = 1, /**< 辅流通道 */
}

/** 摄像头采集配置 */
export interface NERtcCameraCaptureConfig
{
    captureWidth: number;      /**< 本地采集的视频宽度，单位为 px。*/
    captureHeight: number;     /**< 本地采集的视频高度，单位为 px）。*/
}


/** 视频流类型。*/
export enum NERtcVideoStreamType {
    kNERtcVideoStreamMain = 0,  /**< 主流。*/
    kNERtcVideoStreamSub  = 1,  /**< 辅流。*/
    kNERtcVideoStreamThird = 2, /**< 第三个自定义扩展流。*/
    kNERtcVideoStreamFourth = 3 /**< 第四个自定义扩展流。*/
}

/** 本地视频发送的流通道个数。*/
export enum NERtcVideoStreamLayerCount {
    kNERtcVideoStreamLayerCountOne = 1, /**< （默认）1个通道。主流通道默认是主辅两流通道发送（支持动态切换），若修改为主辅以及其它扩展流多流通道发送，多流模式固定后通道个数不再支持下行下发动态修改。*/
    kNERtcVideoStreamLayerCountTwo = 2, /**< 2个通道。*/
    kNERtcVideoStreamLayerCountThree = 3 /**< 3个通道。*/
}

/** 通话相关的统计信息。*/
export interface NERtcStats
{
    cpu_app_usage: number;     /**< 当前 App 的 CPU 使用率 (%)。*/
    cpu_idle_usage: number;    /**< 当前系统的 CPU 空闲率 (%)。*/
    cpu_total_usage: number;	/**< 当前系统的 CPU 使用率 (%)。*/
    memory_app_usage: number;	/**< 当前App的内存使用率 (%)。*/
    memory_total_usage: number;/**< 当前系统的内存使用率 (%)。*/
    memory_app_kbytes: number;	/**< 当前App的内存使用量 (KB)。*/
    total_duration: number;         /**< 通话时长（秒）。*/
    tx_bytes: number;	        /**< 发送字节数，累计值。(bytes)*/
    rx_bytes: number;	        /**< 接收字节数，累计值。(bytes)*/
    tx_audio_bytes: number;	/**< 音频发送字节数，累计值。(bytes)*/
    tx_video_bytes: number;	/**< 视频发送字节数，累计值。(bytes)*/
    rx_audio_bytes: number;	/**< 音频接收字节数，累计值。(bytes)*/
    rx_video_bytes: number;	/**< 视频接收字节数，累计值。(bytes)*/
    tx_audio_kbitrate: number;	    /**< 音频发送码率。(kbps)*/
    rx_audio_kbitrate: number;	    /**< 音频接收码率。(kbps)*/
    tx_video_kbitrate: number;	    /**< 视频发送码率。(kbps)*/
    rx_video_kbitrate: number;	    /**< 视频接收码率。(kbps)*/
    up_rtt: number;	                /**< 上行平均往返时延rtt(ms) */
    tx_audio_packet_loss_rate: number;  /**< 本地上行音频实际丢包率。(%) */
    tx_video_packet_loss_rate: number;  /**< 本地上行视频实际丢包率。(%) */
    tx_audio_packet_loss_sum: number;   /**< 本地上行音频实际丢包数。 */
    tx_video_packet_loss_sum: number;   /**< 本地上行视频实际丢包数。 */
    tx_audio_jitter: number;            /**< 本地上行音频抖动计算。(ms) */
    tx_video_jitter: number;            /**< 本地上行视频抖动计算。(ms) */
    rx_audio_packet_loss_rate: number;  /**< 本地下行音频实际丢包率。(%) */
    rx_video_packet_loss_rate: number;  /**< 本地下行视频实际丢包率。(%) */
    rx_audio_packet_loss_sum: number;   /**< 本地下行音频实际丢包数。 */
    rx_video_packet_loss_sum: number;   /**< 本地下行视频实际丢包数。 */
    rx_audio_jitter: number;            /**< 本地下行音频抖动计算。(ms) */
    rx_video_jitter: number;            /**< 本地下行视频抖动计算。(ms) */
}

/** 本地视频流上传统计信息。*/
export interface NERtcVideoSendStats
{
    width: number;      /**< 视频流宽（像素）。*/
    height: number;     /**< 视频流高（像素）。*/
    capture_frame_rate: number; /**< 视频采集帧率。*/
    encoder_frame_rate: number;	/**< （上次统计后）编码帧率 (fps)。*/
    sent_bitrate: number;		/**< （上次统计后）发送码率(Kbps)。*/
    sent_frame_rate: number;	/**< （上次统计后）发送帧率 (fps)。*/
    target_bitrate: number;		/**< （上次统计后）编码器目标码率(Kbps)。*/
}

/** 远端视频流的统计信息。*/
export interface NERtcVideoRecvStats
{
    uid: string;      /**< 用户 ID，指定是哪个用户的视频流。*/
    width: number;      /**< 视频流宽（像素）。*/
    height: number;     /**< 视频流高（像素）。*/
    received_bitrate: number;     /**< （上次统计后）接收到的码率(Kbps)。*/
    packet_loss_rate: number;     /**< 下行丢包率(%)。*/
    decoder_frame_rate: number;	/**< （上次统计后）解码帧率 (fps)。*/
    render_frame_rate: number;	/**< （上次统计后）渲染帧率 (fps)。*/
    received_frame_rate: number;  /**< （上次统计后）接收到的帧率 (fps)。*/
    total_frozen_time: number;  /**< 用户的下行视频卡顿累计时长(ms)。*/
    frozen_rate: number;        /**< 用户的下行视频平均卡顿率(%)。*/
}

/** 本地音频流上传统计信息。*/
export interface NERtcAudioSendStats
{
    num_channels: number;	    /**< 当前采集声道数。*/
    sent_sample_rate: number;	/**< 本地上行音频采样率。*/
    sent_bitrate: number;		/**< （上次统计后）发送码率(Kbps)。*/
    audio_loss_rate: number;    /**< 特定时间内的音频丢包率 (%)。*/
    rtt: number;            /**< RTT。*/
    volume: number;	/**< 音量，范围为 0（最低）- 100（最高）。*/
}

/** 远端用户的音频统计。*/
export interface NERtcAudioRecvStats
{
    uid: string;              /**< 用户 ID，指定是哪个用户的音频流。*/
    received_bitrate: number;   /**< （上次统计后）接收到的码率(Kbps)。*/
    total_frozen_time: number;  /**< 用户的下行音频卡顿累计时长(ms)。*/
    frozen_rate: number;        /**< 用户的下行音频平均卡顿率(%)。*/
    audio_loss_rate: number;  /**< 特定时间内的音频丢包率 (%)。*/
    volume: number;	/**< 音量，范围为 0（最低）- 100（最高）。*/
}

/** @enum NERtcNetworkQualityType 网络质量类型。*/
export enum NERtcNetworkQualityType
{
    kNERtcNetworkQualityUnknown = 0,    /**< 0: 网络质量未知。*/
    kNERtcNetworkQualityExcellent = 1,  /**< 1: 网络质量极好。*/
    kNERtcNetworkQualityGood = 2,       /**< 2: 用户主观感觉和 excellent 差不多，但码率可能略低于 excellent。*/
    kNERtcNetworkQualityPoor = 3,       /**< 3: 用户主观感受有瑕疵但不影响沟通。*/
    kNERtcNetworkQualityBad = 4,        /**< 4: 勉强能沟通但不顺畅。*/
    kNERtcNetworkQualityVeryBad = 5,    /**< 5: 网络质量非常差，基本不能沟通。*/
    kNERtcNetworkQualityDown = 6,       /**< 6: 完全无法沟通。*/
}

/** 网络质量统计信息。*/
export interface NERtcNetworkQualityInfo
{
    uid: string;                          /**< 用户 ID，指定是哪个用户的网络质量统计。*/
    tx_quality: NERtcNetworkQualityType; /**< 该用户的上行网络质量，详见 #NERtcNetworkQualityType.*/
    rx_quality: NERtcNetworkQualityType; /**< 该用户的下行网络质量，详见 #NERtcNetworkQualityType.*/
}

/** 连接状态 */
export enum NERtcConnectionStateType
{
    kNERtcConnectionStateDisconnected   = 1, /**< 没加入频道。*/
    kNERtcConnectionStateConnecting     = 2, /**< 正在加入频道。*/
    kNERtcConnectionStateConnected      = 3, /**< 加入频道成功。*/
    kNERtcConnectionStateReconnecting   = 4, /**< 正在尝试重新加入频道。*/
    kNERtcConnectionStateFailed         = 5, /**< 加入频道失败。*/
}

/** 连接状态变更原因 */
export enum NERtcReasonConnectionChangedType {
    kNERtcReasonConnectionChangedLeaveChannel           = 1,    /**< 离开频道 */
    kNERtcReasonConnectionChangedChannelClosed          = 2,    /**< 频道关闭 */
    kNERtcReasonConnectionChangedBeKicked               = 3,    /**< 被踢 */
    kNERtcReasonConnectionChangedTimeOut                = 4,    /**< 超时 */
    kNERtcReasonConnectionChangedJoinChannel            = 5,    /**< 加入频道 */
    kNERtcReasonConnectionChangedJoinSucceed            = 6,    /**< 加入频道成功 */
    kNERtcReasonConnectionChangedReJoinSucceed          = 7,    /**< 重连成功 */
    kNERtcReasonConnectionChangedMediaConnectionDisconnected = 8, /**< 媒体连接断开 */
    kNERtcReasonConnectionChangedSignalDisconnected     = 9,    /**< 信令连接断开 */
    kNERtcReasonConnectionChangedRequestChannelFailed   = 10,   /**< 请求频道失败 */
    kNERtcReasonConnectionChangedJoinChannelFailed      = 11,   /**< 加入频道失败 */
}

/** 音频设备类型 */
export enum NERtcAudioDeviceType {
    kNERtcAudioDeviceTypeUnknown        = 0,    /**< 未知设备 */
    kNERtcAudioDeviceTypeRecord         = 1,    /**< 录音设备 */
    kNERtcAudioDeviceTypePlayout        = 2,    /**< 播放设备 */
}

/** 音频设备状态 */
export enum NERtcAudioDeviceState {
    kNERtcAudioDeviceStateActive        = 0,    /**< 设备已激活 */
    kNERtcAudioDeviceStateUnactive      = 1,    /**< 设备未激活 */
}

/** 混音状态 */
export enum NERtcAudioMixingState {
    kNERtcAudioMixingStateFinished      = 0,    /**< 混音结束 */
    kNERtcAudioMixingStateFailed        = 1,    /**< 混音失败 */
}

/** @enum NERtcAudioMixingErrorCode 混音音乐文件错误码。
*/
export enum NERtcAudioMixingErrorCode
{
    kNERtcAudioMixingErrorOK            = 0,        /**< 没有错误。*/
    kNERtcAudioMixingErrorFatal         = 1,        /**< 通用错误。*/
	kNERtcAudioMixingErrorCanNotOpen,               /**< 伴音不能正常打开*/
	kNERtcAudioMixingErrorDecode,                   /**<音频解码错误*/
	kNERtcAudioMixingErrorInterrupt,                /**<操作中断码*/
	kNERtcAudioMixingErrorHttpNotFound,             /**<404 file not found，only for http / https*/
	kNERtcAudioMixingErrorOpen,                     /**<打开流 / 文件失败*/
	kNERtcAudioMixingErrorNInfo,                    /**<获取解码信息失败 / 超时*/
	kNERtcAudioMixingErrorNStream,                  /**<无音频流*/
	kNERtcAudioMixingErrorNCodec,                   /**<无解码器*/
	kNERtcAudioMixingErrorNMem,                     /**<无内存*/
	kNERtcAudioMixingErrorCodecOpen,                /**<解码器打开失败 / 超时*/
	kNERtcAudioMixingErrorInvalidInfo,              /**<无效音频参数（声道、采样率）*/
	kNERtcAudioMixingErrorOpenTimeout,              /**<打开流 / 文件超时*/
	kNERtcAudioMixingErrorIoTimeout,                /**<网络io超时*/
	kNERtcAudioMixingErrorIo,                       /**<网络io错误*/
    //kNERtcAudioMixingErrorTooFrequentCall = 101,  /**< 音乐文件打开太频繁。*/
    //kNERtcAudioMixingErrorInterruptedEOF= 102,    /**< 音乐文件播放中断。*/
}

/** 视频设备类型 */
export enum NERtcVideoDeviceType {
    kNERtcVideoDeviceTypeUnknown        = 0,    /**< 未知设备 */
    kNERtcVideoDeviceTypeCapture        = 1,    /**< 采集设备 */
}

/** 视频设备状态 */
export enum NERtcVideoDeviceState {
    kNERtcVideoDeviceStateAdded         = 0,    /**< 设备已添加 */
    kNERtcVideoDeviceStateRemoved       = 1,    /**< 设备已移除 */
}

/** 声音音量信息。一个数组，包含每个说话者的用户 ID 和音量信息。*/
export interface NERtcAudioVolumeInfo
{
    uid: string;				/**< 说话者的用户 ID。如果返回的 uid 为 0，则默认为本地用户。*/
    volume: number;	/**< 说话者的音量，范围为 0（最低）- 100（最高）。*/
}

/** 直播推流状态。*/
export enum NERtcLiveStreamStateCode
{
    kNERtcLsStatePushing        = 505,  /**< 推流中 */
    kNERtcLsStatePushFail       = 506,  /**< 互动直播推流失败 */
    kNERtcLsStatePushStopped    = 511,  /**< 推流结束 */
    kNERtcLsStateImageError     = 512,  /**< 背景图片设置出错 */
}

/** @enum NERtcMediaStatsEventName  SDK 向 App 上报统计信息 */
export enum NERtcMediaStatsEventName {
	RtcStats = "onRtcStats",		/**< 当前通话统计回调, 每 2 秒触发一次 */
	LocalAudioStats = "onLocalAudioStats", 	/**< 本地音频流统计信息回调,每 2 秒触发一次 */
	RemoteAudioStats = "onRemoteAudioStats",	/**< 通话中远端音频流的统计信息回调, 每 2 秒触发一次 */
	LocalVideoStats = "onLocalVideoStats",	/**< 本地视频流统计信息回调, 每 2 秒触发一次 */
	RemoteVideoStats = "onRemoteVideoStats",	/**< 通话中远端视频流的统计信息回调, 每 2 秒触发一次 */
	NetworkQuality = "onNetworkQuality",	/**< 通话中每个用户的网络上下行质量报告回调, 每 2 秒触发一次, 只上报状态有变更的成员 */
}

/** 4.1.1 */

/** 变声 预设值 */
export enum NERtcVoiceChangerType {
    kNERtcVoiceChangerOff           = 0,    /**< 默认关闭 */
    kNERtcVoiceChangerRobot         = 1,    /**< 机器人 */
    kNERtcVoiceChangerGaint         = 2,    /**< 巨人 */
    kNERtcVoiceChangerHorror        = 3,    /**< 恐怖 */
    kNERtcVoiceChangerMature        = 4,    /**< 成熟 */
    kNERtcVoiceChangerManToWoman    = 5,    /**< 男变女 */
    kNERtcVoiceChangerWomanToMan    = 6,    /**< 女变男 */
    kNERtcVoiceChangerManToLoli     = 7,    /**< 男变萝莉 */
    kNERtcVoiceChangerWomanToLoli   = 8     /**< 女变萝莉 */
}

/** 预设的美声效果 */
export enum NERtcVoiceBeautifierType {
    kNERtcVoiceBeautifierOff = 0,             /**< 默认关闭 */
    kNERtcVoiceBeautifierMuffled = 1,         /**< 低沉 */
    kNERtcVoiceBeautifierMellow = 2,          /**< 圆润 */
    kNERtcVoiceBeautifierClear = 3,           /**< 清澈 */
    kNERtcVoiceBeautifierMagnetic = 4,        /**< 磁性 */
    kNERtcVoiceBeautifierRecordingstudio = 5, /**< 录音棚 */
    kNERtcVoiceBeautifierNature = 6,          /**< 天籁 */
    kNERtcVoiceBeautifierKTV = 7,             /**< KTV */
    kNERtcVoiceBeautifierRemote = 8,          /**< 悠远 */
    kNERtcVoiceBeautifierChurch = 9,          /**< 教堂 */
    kNERtcVoiceBeautifierBedroom = 10,        /**< 卧室 */
    kNERtcVoiceBeautifierLive = 11,           /**< Live */
}

/** 音效均衡波段的中心频率 */
export enum NERtcVoiceEqualizationBand {
    kNERtcVoiceEqualizationBand_31  = 0, /**<  31 Hz */
    kNERtcVoiceEqualizationBand_62  = 1, /**<  62 Hz */
    kNERtcVoiceEqualizationBand_125 = 2, /**<  125 Hz */
    kNERtcVoiceEqualizationBand_250 = 3, /**<  250 Hz */
    kNERtcVoiceEqualizationBand_500 = 4, /**<  500 Hz */
    kNERtcVoiceEqualizationBand_1K  = 5, /**<  1 kHz */
    kNERtcVoiceEqualizationBand_2K  = 6, /**<  2 kHz */
    kNERtcVoiceEqualizationBand_4K  = 7, /**<  4 kHz */
    kNERtcVoiceEqualizationBand_8K  = 8, /**<  8 kHz */
    kNERtcVoiceEqualizationBand_16K = 9, /**<  16 kHz */
}

/** 3D音效算法中坐标信息 */
export interface NERtcSpatializerPositionInfo {
    speaker_position: Array<Number>;                      /**< 发声坐标 */
    speaker_quaternion: Array<Number>;               /**< 发声旋转角度四元数 */
    head_position: Array<Number>;   /**< 头部听觉坐标 */
    head_quaternion: Array<Number>;                         /**< 头部听觉旋转角度四元数 */
}

/** 空间音效房间大小 */
export enum NERtcSpatializerRoomCapacity {
    kNERtcSpatializerRoomCapacitySmall  = 0, /**<  小房间 */
    kNERtcSpatializerRoomCapacityMedium  = 1, /**<  中等大小房间 */
    kNERtcSpatializerRoomCapacityLarge = 2, /**<  大房间 */
    kNERtcSpatializerRoomCapacityHuge = 3, /**<  巨大房间 */
    kNERtcSpatializerRoomCapacityNone = 4, /**<  无房间效果 */
}

/** 空间音效中房间材质名称 */
export enum NERtcSpatializerMaterialName {
    kNERtcSpatializerMaterialTransparent  = 0, /**<  透明的 */
    kNERtcSpatializerMaterialAcousticCeilingTiles  = 1, /**<  声学天花板，未开放 */
    kNERtcSpatializerMaterialBrickBare = 2, /**<  砖块，未开放 */
    kNERtcSpatializerMaterialBrickPainted = 3, /**<  涂漆的砖块，未开放 */
    kNERtcSpatializerMaterialConcreteBlockCoarse = 4, /**<  粗糙的混凝土块，未开放 */
    kNERtcSpatializerMaterialConcreteBlockPainted = 5, /**<  涂漆的混凝土块，未开放 */
    kNERtcSpatializerMaterialCurtainHeavy = 6, /**< 厚重的窗帘 */
    kNERtcSpatializerMaterialFiberGlassInsulation = 7, /**< 隔音的玻璃纤维，未开放 */
    kNERtcSpatializerMaterialGlassThin = 8, /**< 薄的的玻璃，未开放 */
    kNERtcSpatializerMaterialGlassThick = 9, /**< 茂密的草地，未开放 */
    kNERtcSpatializerMaterialGrass = 10, /**< 草地 */
    kNERtcSpatializerMaterialLinoleumOnConcrete = 11, /**< 铺装了油毡的混凝土，未开放 */
    kNERtcSpatializerMaterialMarble = 12, /**< 大理石 */
    kNERtcSpatializerMaterialMetal = 13, /**< 金属，未开放 */
    kNERtcSpatializerMaterialParquetOnConcrete = 14, /**< 镶嵌木板的混凝土，未开放 */
    kNERtcSpatializerMaterialPlasterRough = 15, /**< 石膏，未开放 */
    kNERtcSpatializerMaterialPlasterSmooth = 16, /**< 粗糙石膏，未开放 */
    kNERtcSpatializerMaterialPlywoodPanel = 17, /**< 光滑石膏，未开放 */
    kNERtcSpatializerMaterialPolishedConcreteOrTile = 18, /**< 木板，未开放 */
    kNERtcSpatializerMaterialSheetrock = 19, /**< 石膏灰胶纸板，未开放 */
    kNERtcSpatializerMaterialWaterOrIceSurface = 20, /**< 水面或者冰面，未开放 */
    kNERtcSpatializerMaterialWoodCeiling = 21, /**< 木头天花板，未开放 */
    kNERtcSpatializerMaterialWoodPanel = 22, /**< 木头枪板，未开放 */
    kNERtcSpatializerMaterialUniform = 23, /**< 均匀分布，未开放 */
}

/** 3D音效房间属性 */
export interface NERtcSpatializerRoomProperty {
    room_capacity: NERtcSpatializerRoomCapacity;  /**< 房间大小 #NERtcSpatializerRoomCapacity ，默认值 #kNERtcSpatializerRoomCapacitySmall */
    material: NERtcSpatializerMaterialName;               /**< 房间材质 #NERtcSpatializerMaterialName ，默认值 #kNERtcSpatializerMaterialTransparent */
    reflection_scalar: number;   /**< 反射比例，默认值1.0 */
    reverb_gain: number;                         /**< 混响增益比例因子，默认值1.0 */
    reverb_time: number;                         /**< 混响时间比例因子，默认值1.0 */
    reverb_brightness: number;                         /**< 混响亮度，默认值1.0 */
}

/** 空间音效渲染模式 */
export enum NERtcSpatializerRenderMode {
    kNERtcSpatializerRenderStereoPanning  = 0, /**<  立体声 */
    kNERtcSpatializerRenderBinauralLowQuality  = 1, /**<  双声道低 */
    kNERtcSpatializerRenderBinauralMediumQuality = 2, /**<  双声道中 */
    kNERtcSpatializerRenderBinauralHighQuality = 3, /**<  双声道高 */
    kNERtcSpatializerRenderRoomEffectsOnly = 4, /**<  仅房间音效 */
}

/** 录音位置 */
export enum NERtcAudioRecordingPosition {
    kNERtcAudioRecordingPositionMixedRecordingAndPlayback  = 0, /**<  录制本地和所有远端用户混音后的音频（默认） */
    kNERtcAudioRecordingPositionRecording  = 1, /**<  仅录制本地用户的音频 */
    kNERtcAudioRecordingPositionMixedPlayback = 2, /**<  仅录制所有远端用户的音频 */
}
/** 录音循环时间 */
export enum NERtcAudioRecordingCycleTime {
    kNERtcAudioRecordingCycleTime0  = 0, /**<  音频录制缓存时间为0，实时写文件（默认） */
    kNERtcAudioRecordingCycleTime10  = 10, /**<  音频录制缓存时间为10s，StopAudioRecording()后，将缓存都写到文件，文件数据时间跨度为: [0,10s] */
    kNERtcAudioRecordingCycleTime60 = 60, /**<  音频录制缓存时间为60s，StopAudioRecording()后，将缓存都写到文件，文件数据时间跨度为: [0,60s] */
    kNERtcAudioRecordingCycleTime360 = 360, /**<  音频录制缓存时间为360s，StopAudioRecording()后，将缓存都写到文件，文件数据时间跨度为: [0,360s] */
    kNERtcAudioRecordingCycleTime900 = 900, /**<  音频录制缓存时间为900s，StopAudioRecording()后，将缓存都写到文件，文件数据时间跨度为: [0,900s] */
}

/** 录音配置 */
export interface NERtcAudioRecordingConfiguration {
    file_path: string;           /**< 录音文件路径 */
    sample_rate: number;         /**< 采样率 */
    quality: NERtcAudioRecordingQuality; /**< 录音质量 */
    position: NERtcAudioRecordingPosition;            /**< 录音位置 */
    cycle_time: NERtcAudioRecordingCycleTime;          /**< 循环时间 */
}

/** 自定义背景图片的类型。 */
export enum NERtcBackgroundSourceType {
    kNERtcBackgroundColor  = 1, /**<  1：（默认）背景图像为纯色。 */
    kNERtcBackgroundImage  = 2, /**<  背景图像只支持 PNG 或 JPG 格式的文件。 */
}

/**  自定义背景图像*/
export interface VirtualBackgroundSource {
    background_source_type: NERtcBackgroundSourceType;  /**< 自定义背景图片的类型*/
    color: string; /**< 自定义背景图像的颜色。格式为不带#号的十六进制字符串，如 'ffffff' 表示白色，'000000' 表示黑色。仅 kNERtcBackgroundColor 类型时生效。C++ 层用 sscanf(..., "%x") 解析，必须传字符串而非数字。 */
    source: string;   /**< 自定义背景图片或视频的本地绝对路径。支持 PNG、JPG、MOV、MP4 格式。*/
}

/** 拉流回调 */
export type NERtcPullExternalAudioFrameCb = (data: ArrayBuffer, length: number) => void;

/** 截图回调 */
export type NERtcTakeSnapshotCallback = (errorCode: number, image: string) => void;

/** 混响参数 */
export interface NERtcReverbParam {
    wetGain: number;  /**< 湿信号，取值范围为 0 ~ 1，默认值为 0.0f。*/
    dryGain: number; /**< 干信号，取值范围为 0 ~ 1，默认值为 1.0f。 */
    damping: number;   /**< 混响阻尼，取值范围为 0 ~ 1，默认值为 1.0f。 */
    roomSize: number;   /**< 房间大小，取值范围为 0.1 ~ 2，默认值为 0.1f。 */
    decayTime: number;   /**< 持续强度（余响），取值范围为 0.1 ~ 20，默认值为 0.1f。 */
    preDelay: number;   /**< 延迟长度，取值范围为 0 ~ 1，默认值为 0.0f。 */
}

/** 尺寸 */
export interface NERtcSize {
    width: number;  /**< The target width (px) of the thumbnail or icon. The default value is 0.*/
    height: number; /**< The target height (px) of the thumbnail or icon. The default value is 0. */
}

/** 尺寸 */
//export interface NERtcSize {
//    width: number;  /**< The target width (px) of the thumbnail or icon. The default value is 0.*/
//    height: number; /**< The target height (px) of the thumbnail or icon. The default value is 0. */
//}

/** 屏幕采集源信息（Electron环境） */
export interface CaptureSoureInfo {
    source_id: number;     /**< 屏幕或窗口等采集源的 ID */
    type: number;          /**< 采集源的类型，0-窗口 1-屏幕 2-自定义 */
    source_name: string;   /**< 采集源的名称 */
}

/** 功能类型 */
export enum NERtcFeatureType
{
    kNERTCVirtualBackground = 0 /**< 虚拟背景*/
}

/** 屏幕共享状态。*/
export enum NERtcScreenCaptureStatus
{
    kScreenCaptureStatusStart = 1,       /**< 开始屏幕共享。*/
    kScreenCaptureStatusPause = 2,       /**< 暂停屏幕共享。当处于共享进程中的窗口发生大小调整、位置调整、最小化以及隐藏等变化时触发。*/
    kScreenCaptureStatusResume = 3,      /**< 恢复屏幕共享。当处于共享进程中的窗口停止大小调整、位置调整、最小化以及隐藏等变化时触发。*/
    kScreenCaptureStatusStop = 4,        /**< 停止屏幕共享。*/
    kScreenCaptureStatusCovered = 5,     /**< 屏幕共享的目标窗口被覆盖。*/
    kScreenCaptureStatusAbort = 6,       /**< 屏幕共享异常结束。目标窗口无效时触发（例如被关闭或进程崩溃）。*/
}

/** 屏幕分享自定义高亮框的设置动作。 */
export enum NERtcScreenCaptureCustomHLBorderAction
{
    kSetPos = 0,   /**< 设置位置。结合 capture_rect 使用。*/
    kSetAbove = 1, /**< 设置在指定层级之上。*/
    kSetBelow = 2, /**< 预留参数。*/
    kHide = 3,     /**< 隐藏。*/
    kShow = 4,     /**< 显示。*/
}

/** 屏幕共享采集对象发生变化返回的信息。*/
export interface NERtcScreenCaptureSourceData {
    type: CaptureSoureInfo;  /**< 信息源类型：-1-未知，0-窗口，1-屏幕，2-自定义。*/
    source_id: number;       /**< 屏幕分享源的 ID。*/
    status: NERtcScreenCaptureStatus; /**< 屏幕分享状态。*/
    action: NERtcScreenCaptureCustomHLBorderAction; /**< 屏幕分享自定义高亮框的设置动作，结合 capture_rect 使用。*/
    level: number;           /**< 屏幕分享源的层级，仅用于 macOS。*/
    capture_rect: NERtcRectangle; /**< 屏幕分享源的采集范围，可用于设置用户自定义高亮框的位置。*/
}

/** 解码前媒体类型。*/
export enum NERtcPreDecodeMediaType
{
    kNERtcPreDecodeMediaTypeAudio = 0,   /**< 音频。*/
    kNERtcPreDecodeMediaTypeVideo = 1,   /**< 视频。*/
    kNERtcPreDecodeMediaTypeUnknown = 100, /**< 未知类型。*/
}

/** 解码前视频详细信息。*/
export interface NERtcPreDecodeVideoInfo 
{
    width: number;         /**< 视频宽。*/
    height: number;        /**< 视频高。*/
    is_key_frame: boolean; /**< 是否为关键帧。*/
}

/** 解码前音频详细信息。*/
export interface NERtcPreDecodeAudioInfo 
{
    per_time_ms: number; /**< 音频单帧播放时长，单位为毫秒。*/
    toc: number;         /**< 音频帧包含的数据量信息。*/
}

/** 解码前媒体帧信息。*/
export interface NERtcPreDecodeFrameInfo 
{
    media_type: NERtcPreDecodeMediaType; /**< 媒体数据类型。*/
    uid: string;                         /**< 用户 ID。*/
    timestamp_ms: number;                /**< 时间戳，单位为毫秒。*/
    length: number;                      /**< 数据长度。*/
    data: Uint8Array;                    /**< 数据指针。*/
    is_main_stream: boolean;             /**< 是否为主流。*/
    codec: string;                       /**< 编码器名称。*/
    video_info: NERtcPreDecodeVideoInfo; /**< 解码前视频详细信息，media_type 为视频时有效。*/
    audio_info: NERtcPreDecodeAudioInfo; /**< 解码前音频详细信息，media_type 为音频时有效。*/
}

/** 视频数据类型。*/
export enum NERtcVideoType {
    kNERtcVideoTypeI420 = 0,         /**< I420 数据类型。*/
    kNERtcVideoTypeNV12 = 1,         /**< NV12 数据类型。*/
    kNERtcVideoTypeNV21 = 2,         /**< NV21 数据类型。*/
    kNERtcVideoTypeBGRA = 3,         /**< BGRA 数据类型。*/
    kNERtcVideoTypeARGB = 4,         /**< ARGB 数据类型。*/
    kNERtcVideoTypeCVPixelBuffer = 5,/**< CVPixelBuffer 类型，仅 iOS/macOS 支持。*/
    kNERtcVideoTypeRGBA = 6,         /**< RGBA 数据类型。*/
}

/** 视频帧系统回调数据。*/
export interface NERtcVideoCallbackFrame {
    type: NERtcVideoType;      /**< 数据类型。*/
    width: number;             /**< 宽度。*/
    height: number;            /**< 高度。*/
    count: number;             /**< 数据平面的个数，如 I420 为 3，NV12 为 2。*/
    rotation: number;          /**< 画面旋转角度。*/
    offsets: Array<number>;    /**< 各个数据平面的偏移量数组。*/
    strides: Array<number>;    /**< 各个数据平面的步进长度数组。*/
    data?: Uint8Array;         /**< 视频帧数据 Buffer。*/
}

/** 视频帧数据。*/
export interface NERtcVideoFrame {
    format: NERtcVideoType; /**< 视频数据类型。*/
    width: number;          /**< 宽度。*/
    height: number;         /**< 高度。*/
    rotation: number;       /**< 画面旋转角度。*/
    timestamp: number;      /**< 时间戳。*/
    buffer: ArrayBuffer;    /**< 视频原数据。*/
}

/** 外部输入的编码后视频帧。*/
export interface NERtcVideoEncodedFrame {
    codec_type: number;         /**< 视频编解码器类型。*/
    frame_type: number;         /**< 编码后视频帧类型。0：未知，1：IDR，2：I帧，3：P帧。*/
    nal_length: Array<number>;  /**< 编码后视频帧所有的NAL长度数组。*/
    nal_data: ArrayBuffer;      /**< 编码后视频帧数据，包含所有NAL的数据。*/
    timestamp_us: number;       /**< 时间戳，单位为微秒。*/
    width: number;              /**< 视频宽度。*/
    height: number;             /**< 视频高度。*/
}

/** 编码后音频帧数据。*/
export interface NERtcAudioEncodedFrame {
    data: ArrayBuffer;          /**< 音频数据缓冲区。*/
    timestamp_us: number;       /**< 时间戳，单位微秒。*/
    sample_rate: number;        /**< 采样率。*/
    channels: number;           /**< 声道数。*/
    samples_per_channel: number;/**< 每个声道的采样数据量。*/
    encoded_len?: number;       /**< 编码后的数据长度。*/
    encoded_timestamp?: number; /**< 编码后的时间戳。*/
    payload_type?: number;      /**< Payload 类型。*/
    rms_level?: number;         /**< 音频能量水平（RMS）。*/
}

export interface NERtcEngineAPI {
    initialize(context: NERtcEngineContext): number;
    release(): void;
    setClientRole(role: NERtcClientRole): number;
    setChannelProfile(profile: NERtcChannelProfileType): number;
    joinChannel(token: String, channelName: String, uid: string): number;
    joinChannelWithOptions(token: string, channelName: string, uid: string, channelOptions: NERtcJoinChannelOptions): number;
    leaveChannel(): number;
    enableLocalAudio(enabled: Boolean): number;
    setupVideoCanvas(uid: string, enable: boolean): number;
    setupRemoteVideoStreamCanvas(uid: string, enable: boolean, streamType: NERtcVideoStreamType): number;
    enableLocalVideo(enabled: boolean): number;
    enableLocalVideoWithType(streamType: NERtcVideoStreamType, enabled: boolean): number;
    enableLocalVideoWithType(enabled: boolean, streamType: NERtcVideoStreamType): number;
    setExternalVideoSource(enable: boolean): number;
    setExternalVideoSourceEx(type: NERtcVideoStreamType, enable: boolean): number;
    pushExternalVideoFrame(frame: NERtcVideoFrame): number;
    pushExternalVideoFrameWithType(type: NERtcVideoStreamType, frame: NERtcVideoFrame): number;
    pushExternalVideoEncodedFrame(type: NERtcVideoStreamType, frame: NERtcVideoEncodedFrame): number;
    setExternalAudioSource(enable: boolean, sample_rate: number, channels: number): number;
    setExternalAudioRender(enable: boolean, sample_rate: number, channels: number): number;
    pullExternalAudioFrame(length: number, callback: (data: ArrayBuffer) => void): number;
    pushExternalAudioFrame(frame: NERtcAudioFrame): number;
    pushExternalAudioEncodedFrame(frame: NERtcAudioEncodedFrame): number;
    setExternalSubStreamAudioSource(enable: boolean, sample_rate: number, channels: number): number;
    pushExternalSubStreamAudioFrame(frame: NERtcAudioFrame): number;
    pushExternalSubStreamAudioEncodedFrame(frame: NERtcAudioEncodedFrame): number;
    subscribeRemoteVideoStream(uid: string, streamType: NERtcRemoteVideoStreamType, subscribe: boolean): number;
    subscribeRemoteVideoStreamEx(uid: string, streamType: NERtcVideoStreamType, subscribeType: NERtcRemoteVideoStreamType, subscribe: boolean): number;
    setLocalVideoWatermarkConfigs(enable: boolean, streamType: NERtcVideoStreamType, config: any): number;
    getConnectionState(): NERtcConnectionStateType;
    muteLocalAudioStream(mute: boolean): number;
    enableLocalSubStreamAudio(enable: boolean): number;
    muteLocalSubStreamAudio(mute: boolean): number;
    setAudioProfile(profile: NERtcAudioProfileType, scenario: NERtcAudioScenarioType): number;
    setAudioScenario(scenario: NERtcAudioScenarioType): number;
    setAINSMode(mode: number): number;
    setAudioEffectPreset(preset: number): number;
    setVoiceBeautifierPreset(preset: number): number;
    setLocalVoicePitch(pitch: number): number;
    setLocalVoiceEqualization(band: number, gain: number): number;
    subscribeRemoteAudioStream(uid: string, subscribe: boolean): number;
    subscribeRemoteSubStreamAudio(uid: string, subscribe: boolean): number;
    subscribeAllRemoteAudioStream(subscribe: boolean): number;
    setAudioSubscribeOnlyBy(uid_list: Array<string>): number;
    setSubscribeAudioAllowlist(uid_list: Array<string>): number;
    setSubscribeAudioBlocklist(audioStreamType: NERtcAudioStreamType, uid_list: Array<string>): number;
    setStreamAlignmentProperty(property: number): number;
    getNtpTimeOffset(): number;
    setCameraCaptureConfig(config: NERtcCameraCaptureConfig): number;
    setCameraCaptureConfigWithType(config: NERtcCameraCaptureConfig, type: NERtcVideoStreamType): number;
    setVideoConfig(config: NERtcVideoConfig): number;
    setVideoConfigWithType(type: NERtcVideoStreamType, config: NERtcVideoConfig): number;
    setVideoConfigWithType(config: NERtcVideoConfig, type: NERtcVideoStreamType): number;
    enableDualStreamMode(enable: boolean): number;
    setVideoStreamLayerCount(layerCount: NERtcVideoStreamLayerCount): number;
    setupSubStreamVideoCanvas(uid: string, enable: boolean): number;
    setLocalVideoMirrorMode(mode: NERtcVideoMirrorMode): number;
    setLocalVideoMirrorModeWithType(type: NERtcVideoStreamType, mode: NERtcVideoMirrorMode): number;
    subscribeRemoteVideoSubStream(uid: string, subscribe: boolean): number;
    startVideoPreview(): number;
    startVideoPreviewWithType(type: NERtcVideoStreamType): number;
    stopVideoPreview(): number;
    stopVideoPreviewWithType(type: NERtcVideoStreamType): number;
    muteLocalVideoStream(mute: boolean): number;
    muteLocalVideoStreamWithType(type: NERtcVideoStreamType, mute: boolean): number;
    setLocalMediaPriority(priority: NERtcMediaPriorityType, is_preemptive: boolean): number;
    setParameters(parameters: string): number;
    getParameters(key: string): string;
    setRecordingAudioFrameParameters(config: NERtcAudioFrameRequestFormat): number;
    setPlaybackAudioFrameParameters(config: NERtcAudioFrameRequestFormat): number;
    setPlaybackAudioFrameBeforeMixingParameters(config: NERtcAudioFrameRequestFormat | null): number;
    setMixedAudioFrameParameters(sample_rate: number): number;
    startAudioDump(): number;
    startAudioDumpWithType(type: number): number;
    stopAudioDump(): number;
    setVideoDump(type: number): number;
    addLocalRecorderStreamForTask(config: NERtcLocalRecordingConfig, taskId: string): number;
    removeLocalRecorderStreamForTask(taskId: string): number;
    addLocalRecorderStreamLayoutForTask(config: NERtcLocalRecordingLayoutConfig, uid: string, streamType: NERtcVideoStreamType, streamLayer: number, taskId: string): number;
    removeLocalRecorderStreamLayoutForTask(uid: string, streamType: NERtcVideoStreamType, streamLayer: number, taskId: string): number;
    updateLocalRecorderStreamLayoutForTask(infos: Array<NERtcLocalRecordingStreamInfo>, taskId: string): number;
    replaceLocalRecorderStreamLayoutForTask(infos: Array<NERtcLocalRecordingStreamInfo>, taskId: string): number;
    updateLocalRecorderWaterMarksForTask(watermarks: Array<NERtcVideoWatermarkConfig>, taskId: string): number;
    pushLocalRecorderVideoFrameForTask(uid: string, streamType: NERtcVideoStreamType, streamLayer: number, taskId: string, frame: NERtcVideoFrame): number;
    showLocalRecorderStreamDefaultCoverForTask(showEnabled: boolean, uid: string, streamType: NERtcVideoStreamType, streamLayer: number, taskId: string): number;
    stopLocalRecorderRemuxMp4(taskId: string): number;
    remuxFlvToMp4(flvPath: string, mp4Path: string, saveOri: boolean): number;
    stopRemuxFlvToMp4(): number;
    startASRCaption(config: NERtcASRCaptionConfig): number;
    stopASRCaption(): number;
    aiManualInterrupt(dstUid: number): number;
    startVoiceprintRegistration(): number;
    cancelVoiceprintRegistration(): number;
    stopVoiceprintRegistration(): number;
    setVoiceprintInfo(voiceprintInfos: Array<NERtcVoiceprintInfo> | null): number;
    startPushStreaming(config: NERtcPushStreamingConfig): number;
    stopPushStreaming(): number;
    setupPlayStreamingCanvas(streamId: string, enable: boolean): number;
    startPlayStreaming(streamId: string, config: NERtcPlayStreamingConfig): number;
    stopPlayStreaming(streamId: string): number;
    pausePlayStreaming(streamId: string): number;
    resumePlayStreaming(streamId: string): number;
    muteVideoForPlayStreaming(streamId: string, mute: boolean): number;
    muteAudioForPlayStreaming(streamId: string, mute: boolean): number;
    seekPlayStreaming(streamId: string, positionMs: number): number;
    setLocalVideoMosaic(enabled: boolean, streamType: NERtcVideoStreamType, rect: NERtcFrameNormalizedRect): number;
    setRemoteVideoMosaic(enabled: boolean, uid: string, streamType: NERtcVideoStreamType, rect: NERtcFrameNormalizedRect): number;
    startBlendExternalVideo(streamType: NERtcVideoStreamType, config: NERtcVideoExternalBlendConfig): number;
    stopBlendExternalVideo(streamType: NERtcVideoStreamType): number;
    pushBlendExternalVideoFrame(streamType: NERtcVideoStreamType, frame: NERtcVideoFrame): number;
    enableVideoDenoise(enabled: boolean, streamType: NERtcVideoStreamType): number;
    enableVideoLowlightEnhance(enabled: boolean, level: number, streamType: NERtcVideoStreamType): number;
    startAudioMixing(option: NERtcCreateAudioMixingOption): number;
    stopAudioMixing(): number;
    pauseAudioMixing(): number;
    resumeAudioMixing(): number;
    setAudioMixingSendVolume(volume: number): number;
    getAudioMixingSendVolume(): number;
    setAudioMixingPlaybackVolume(volume: number): number;
    getAudioMixingPlaybackVolume(): number;
    getAudioMixingDuration(): number;
    getAudioMixingCurrentPosition(): number;
    setAudioMixingPosition(position: number): number;
    playEffect(effectId: number, option: NERtcCreateAudioEffectOption): number;
    stopEffect(effectId: number): number;
    stopAllEffects(): number;
    pauseEffect(effectId: number): number;
    resumeEffect(effectId: number): number;
    pauseAllEffects(): number;
    resumeAllEffects(): number;
    setEffectSendVolume(effectId: number, volume: number): number;
    getEffectSendVolume(effectId: number): number;
    setEffectPlaybackVolume(effectId: number, volume: number): number;
    getEffectPlaybackVolume(effectId: number): number;
    setAudioMixingPitch(pitch: number): number;
    getAudioMixingPitch(): number;
    setEffectPitch(effectId: number, pitch: number): number;
    getEffectPitch(effectId: number): number;
    enableLoopbackRecording(enable: boolean, deviceName: string): number;
    adjustLoopbackRecordingSignalVolume(volume: number): number;
    enableEarback(enable: boolean, volume: number): number;
    setEarbackVolume(volume: number): number;
    enableAudioVolumeIndication(enable: boolean, interval: number): number;
    enableAudioVolumeIndicationEx(enable: boolean, interval: number, enableVad: boolean): number;
    startScreenCaptureByScreenRect(screenRect: NERtcRectangle, regionRect: NERtcRectangle, param: NERtcScreenCaptureParameters): number;
    startScreenCaptureByDisplayId(displayId: number, regionRect: NERtcRectangle, param: NERtcScreenCaptureParameters): number;
    startScreenCaptureByWindowId(windowId: number, regionRect: NERtcRectangle, param: NERtcScreenCaptureParameters): number;
    updateScreenCaptureRegion(regionRect: NERtcRectangle): number;
    setScreenCaptureMouseCursor(capture: boolean): number;
    stopScreenCapture(): number;
    pauseScreenCapture(): number;
    resumeScreenCapture(): number;
    setExcludeWindowList(windowList: Array<number>): number;
    updateScreenCaptureParameters(param: NERtcScreenCaptureParameters): number;
    getVersion(): string;
    getErrorDescription(errorCode: number): string;
    uploadSdkInfo(): void;
    addLiveStreamTask(taskInfo: NERtcLiveStreamTaskInfo, callback: any): number;
    updateLiveStreamTask(taskInfo: NERtcLiveStreamTaskInfo, callback: any): number;
    removeLiveStreamTask(taskId: string, callback: any): number;
    sendSEIMsg(data: ArrayBuffer): number;
    sendSEIMsgWithType(data: ArrayBuffer, type: NERtcVideoStreamType): number;
    startAudioRecording(filePath: string, sampleRate: number, quality: NERtcAudioRecordingQuality): number;
    startAudioRecordingWithConfig(config: NERtcAudioRecordingConfiguration): number;
    stopAudioRecording(): number;
    adjustUserPlaybackSignalVolume(uid: string, volume: number): number;
    adjustChannelPlaybackSignalVolume(volume: number): number;
    startChannelMediaRelay(config: NERtcChannelMediaRelayConfiguration): number;
    updateChannelMediaRelay(config: NERtcChannelMediaRelayConfiguration): number;
    stopChannelMediaRelay(): number;
    pauseAllMediaRelay(): number;
    resumeAllMediaRelay(): number;
    setLocalPublishFallbackOption(option: number): number;
    setRemoteSubscribeFallbackOption(option: number, streamType: NERtcVideoStreamType): number;
    enableSuperResolution(enable: boolean): number;
    enableEncryption(enable: boolean, config: NERtcEncryptionConfig): number;
    startLastmileProbeTest(config: any): number;
    stopLastmileProbeTest(): number;
    setRemoteHighPriorityAudioStream(enable: boolean, uid: string, streamType: NERtcVideoStreamType): number;
    checkNECastAudioDriver(): number;
    enableVirtualBackground(enable: boolean, source: VirtualBackgroundSource): number;
    isFeatureSupported(type: NERtcFeatureType): boolean;
    setCloudProxy(proxyType: number): number;
    enableLocalData(enable: boolean): number;
    subscribeRemoteData(uid: string, subscribe: boolean): number;
    sendData(data: ArrayBuffer): number;
    startBeauty(path: string): number;
    stopBeauty(): number;
    enableBeauty(enable: boolean): number;
    getBeautyEffect(type: number): number;
    setBeautyEffect(type: number, level: number): number;
    addBeautyFilter(path: string): number;
    removeBeautyFilter(): number;
    setBeautyFilterLevel(level: number): number;
    addBeautySticker(path: string): number;
    removeBeautySticker(): number;
    addBeautyMakeup(path: string): number;
    removeBeautyMakeup(): number;
    setLocalVoiceReverbParam(param: NERtcReverbParam): number;
    enableMediaPub(enable: boolean, mediaType: number): number;
    updatePermissionKey(key: string): number;
    reportCustomEvent(eventName: string, customIdentify: string, parameters: string): number;
    setEffectPosition(effectId: number, position: number): number;
    getEffectCurrentPosition(effectId: number): number;
    getEffectDuration(effectId: number): number;
    setRangeAudioMode(mode: NERtcRangeAudioMode): number;
    setRangeAudioTeamID(teamId: number): number;
    setAudioRecvRange(audible_distance: number, conversational_distance: number, roll_off: NERtcDistanceRolloffModel): number;
    updateSelfPosition(info: NERtcSpatializerPositionInfo): number;
    enableSpatializerRoomEffects(enable: boolean): number;
    setSpatializerRoomProperty(property: NERtcSpatializerRoomProperty): number;
    setSpatializerRenderMode(mode: NERtcSpatializerRenderMode): number;
    initSpatializer(): number;
    enableSpatializer(enable: boolean, apply_to_team: boolean): number;
    enumerateRecordDevices(): Array<NERtcDevice>;
    setRecordDevice(deviceId: string): number;
    getRecordDevice(): string;
    enumeratePlayoutDevices(): Array<NERtcDevice>;
    setPlayoutDevice(deviceId: string): number;
    getPlayoutDevice(): string;
    setRecordDeviceVolume(volume: number): number;
    getRecordDeviceVolume(): number;
    setPlayoutDeviceVolume(volume: number): number;
    getPlayoutDeviceVolume(): number;
    setPlayoutDeviceMute(mute: boolean): number;
    getPlayoutDeviceMute(): number;
    setRecordDeviceMute(mute: boolean): number;
    getRecordDeviceMute(): number;
    adjustRecordingSignalVolume(volume: number): number;
    adjustPlaybackSignalVolume(volume: number): number;
    startRecordDeviceTest(interval: number): number;
    stopRecordDeviceTest(): number;
    startPlayoutDeviceTest(mediaFile: string): number;
    stopPlayoutDeviceTest(): number;
    startAudioDeviceLoopbackTest(interval: number): number;
    stopAudioDeviceLoopbackTest(): number;
    enumerateCaptureDevices(): Array<NERtcDevice>;
    setDevice(deviceId: string): number;
    setDeviceWithType(deviceId: string, type: NERtcVideoStreamType): number;
    getDevice(): string;
    getDeviceWithType(type: NERtcVideoStreamType): string;
    enumerateScreenCaptureSourceInfo(thumbWidth: number, thumbHeight: number, iconWidth: number, iconHeight: number): Array<NERtcScreenCaptureSourceData>;
    getScreenCaptureSources(thumbSize: NERtcSize, iconSize: NERtcSize, includeScreen: boolean): Array<NERtcScreenCaptureSourceData>;
    setScreenCaptureSource(source: CaptureSoureInfo, regionRect: NERtcRectangle, capture_params: NERtcScreenCaptureParameters): number;

    takeLocalSnapshot(streamType: NERtcVideoStreamType, callback: NERtcTakeSnapshotCallback): number;
    takeRemoteSnapshot(uid: string, streamType: NERtcVideoStreamType, callback: NERtcTakeSnapshotCallback): number;
    setPreDecodeObserver(callback: (info: NERtcPreDecodeFrameInfo) => void): number;
    setRemoteVideoFrameObserver(callback: (uid: string, type: NERtcVideoStreamType, frame: NERtcVideoCallbackFrame) => void): number;
    onAudioFrameEvent(eventName: string, callback: any, enable: boolean): void;
    onEvent(eventName: string, callback: any): void;
    onVideoFrame(callback: any): void;
    onStatsObserver(eventName: string, enable: boolean, callback: any): void;
    onQsObserver(eventName: string, enable: boolean, callback: any): void;
    switchChannel(token: string, channelName: string): number;
    switchChannelWithOptions(token: string, channelName: string, channelOptions: NERtcJoinChannelOptions): number;
    switchChannelWithOptionsEx(token: string, channelName: string, channelOptions: NERtcJoinChannelOptionsEx): number;

    // Test mode APIs
    setTestMode(enabled: boolean): number;
    getCallRecords(): CallRecord[];
    clearCallRecords(): number;
    fireTestEvent(eventName: string, uid: string): number;
}

/**
 * API call record for E2E testing
 */
export interface CallRecord {
    /** API method name */
    method: string;
    /** Parameters as JSON string */
    params_json: string;
    /** Call timestamp in milliseconds */
    timestamp: number;
    /** Return code from native */
    return_code: number;
}
