/**
 * Copyright (c) 2025 Tencent. All rights reserved.
 * Module：   GME 关键类型定义
 * Function： 常用的结构体、枚举值和常量值的定义。
 */
import 'dart:ffi';

/////////////////////////////////////////////////////////////////////////////////
//
//                              日志级别
//
/////////////////////////////////////////////////////////////////////////////////

/**
 * 应用场景。
 */
enum ITMG_APP_SCENE {

    /// 实时语聊场景，该场景下单个房间最多支持 300 人，最高支持 50 人同时发言，房间内用户默认为主播，均可自由发言。
    ITMG_APP_SCENE_RTC(2),

    /// 音频直播、游戏国战语音场景，同一个房间中最多能容纳 10 万观众；房间内用户默认为观众，不能直接发言，需要在进房前/后调用 {@link SetAudioRole} 切换成主播。
    ITMG_APP_SCENE_LIVE(3);

    final int value;
    const ITMG_APP_SCENE(this.value);
}

/**
 * 角色类型。
 */
enum ITMG_AUDIO_MEMBER_ROLE {

    /// 主播角色，可随时发布自己的音频流。
    ITMG_AUDIO_MEMBER_ROLE_ANCHOR(0),

    /// 观众角色，只能收听主播的音频流，不能发布自己的音频流，如需发布，在进房前/后调用 {@link SetAudioRole} 切换成主播。
    ITMG_AUDIO_MEMBER_ROLE_AUDIENCE(1);

    final int value;
    const ITMG_AUDIO_MEMBER_ROLE(this.value);
}

/**
 * 房间类型。
 */
enum ITMGRoomType {

    /// 流畅音质，单声道，编码码率：18kbps，流畅优先、超低延迟实时语音；应用在游戏内开黑场景，适用于 FPS、MOBA 等类型的游戏。
    ITMG_ROOM_TYPE_FLUENCY(1),

    /// 标准音质，单声道，编码码率：50kbps，音质较好，延时适中；适用于狼人杀、棋牌等休闲游戏的实时通话场景。
    ITMG_ROOM_TYPE_STANDARD(2),

    /// 高清音质，全频带立体声，编码码率：128kbps，超高音质，延时相对大一些；适用于音乐舞蹈类游戏以及语音互动类 App 以及播放音乐、线上 K 歌等有高音质要求的场景。
    ITMG_ROOM_TYPE_HIGHQUALITY(3);

    final int value;
    const ITMGRoomType(this.value);
}

/**
 * GME SDK 事件类型。
 */
class ITMG_MAIN_EVENT_TYPE {
    /// 进入实时语音房间事件。
    static const int ITMG_MAIN_EVENT_TYPE_ENTER_ROOM = 1;

    /// 退出实时语音房间事件 。
    static const int ITMG_MAIN_EVENT_TYPE_EXIT_ROOM = 2;

    /// 房间因为网络等原因断开连接事件。
    static const int ITMG_MAIN_EVENT_TYPE_ROOM_DISCONNECT = 3;

    /// 成员状态变化事件。
    static const int ITMG_MAIN_EVENT_TYPE_USER_UPDATE = 4;

    /// 房间重连开始事件。
    static const int ITMG_MAIN_EVENT_TYPE_RECONNECT_START = 11;

    /// 房间重连成功事件。
    static const int ITMG_MAIN_EVENT_TYPE_RECONNECT_SUCCESS = 12;

    /// 快速切换房间结果事件。
    static const int ITMG_MAIN_EVENT_TYPE_SWITCH_ROOM = 13;

    /// 角色设置成功事件。
    static const int ITMG_MAIN_EVENT_TYPE_SET_AUDIO_ROLE = 14;

    /// 请求跨房通话的结果事件。
    static const int ITMG_MAIN_EVENT_TYPE_ROOM_SHARING_START = 23;

    /// 结束跨房通话的结果回调。
    static const int ITMG_MAIN_EVENT_TYPE_ROOM_SHARING_STOP = 24;

    /// 音频录制结束事件。
    static const int ITMG_MAIN_EVENT_TYPE_RECORD_COMPLETED = 30;

    /// iOS 静音键检查结果，[仅 iOS 平台有效]。
    static const int ITMG_MAIN_EVENT_TYPE_IOS_MUTE_SWITCH_RESULT = 34;

    /// 房间内用户音量发生变化事件。
    static const int ITMG_MAIN_EVENT_TYPE_USER_VOLUMES = 1020;

    /// 网络通话质量事件。
    static const int ITMG_MAIN_EVENT_TYPE_NETWORK_QUALITY = 1021;

    /// 房间内用户频谱数据。
    static const int ITMG_MAIN_EVENT_TYPE_USER_SPECTRUMS = 1023;

    /// 房间内用户 VAD 状态回调事件。
    static const int ITMG_MAIN_EVENT_TYPE_USER_VAD = 1024;

    /// BGM 开始播放事件。
    static const int ITMG_MAIN_EVENT_TYPE_MUSIC_PLAY_START = 1087;

    /// BGM 播放进度事件。
    static const int ITMG_MAIN_EVENT_TYPE_MUSIC_PLAY_PROGRESS = 1088;

    /// BGM 暂停播放事件。
    static const int ITMG_MAIN_EVENT_TYPE_MUSIC_PLAY_PAUSE = 1089;

    /// BGM 恢复播放事件。
    static const int ITMG_MAIN_EVENT_TYPE_MUSIC_PLAY_RESUME = 1090;

    /// BGM 播放完成事件。
    static const int ITMG_MAIN_EVENT_TYPE_MUSIC_PLAY_FINISH = 1091;

    /// 自定义数据事件。
    static const int ITMG_MAIN_EVENT_TYPE_CUSTOMDATA_UPDATE = 1092;

    /// SEI 自定义数据事件。
    static const int ITMG_MAIN_EVENT_TYPE_RECV_SEI_MSG = 1093;

    /// 语音消息录制到第一帧音频事件。
    static const int ITMG_MAIN_EVENT_TYPE_PTT_RECORD_FIRST_FRAME = 5000;

    /// 语音消息录制完成事件。
    static const int ITMG_MAIN_EVENT_TYPE_PTT_RECORD_COMPLETE = 5001;

    /// 语音消息文件上传完成事件。
    static const int ITMG_MAIN_EVENT_TYPE_PTT_UPLOAD_COMPLETE = 5002;

    /// 语音消息文件下载完成事件。
    static const int ITMG_MAIN_EVENT_TYPE_PTT_DOWNLOAD_COMPLETE = 5003;

    /// 语音消息播放完成事件。
    static const int ITMG_MAIN_EVENT_TYPE_PTT_PLAY_COMPLETE = 5004;

    /// 语音消息转文本完成事件。
    static const int ITMG_MAIN_EVENT_TYPE_PTT_SPEECH2TEXT_COMPLETE = 5005;

    /// 流式语音转文本完成事件。
    static const int ITMG_MAIN_EVENT_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE = 5006;

    /// 流式语音转文本进行中。
    static const int ITMG_MAIN_EVENT_TYPE_PTT_STREAMINGRECOGNITION_IS_RUNNING = 5007;

    /// 文本转语音完成事件。
    static const int ITMG_MAIN_EVENT_TYPE_PTT_TEXT2SPEECH_COMPLETE = 5008;

    /// 文本翻译完成事件。
    static const int ITMG_MAIN_EVENT_TYPE_PTT_TRANSLATE_TEXT_COMPLETE = 5009;

    /// 控制远端用户音频设备事件。
    static const int ITMG_MAIN_EVENT_TYPE_ROOM_MANAGEMENT_OPERATOR = 6000;

}

/**
 * 范围语音相关状态。
 */
enum ITMG_RANGE_AUDIO_MODE {

    /// 默认模式：音频发送给房间内所有玩家，接收房间类所有玩家的音频。
    ITMG_RANGE_AUDIO_MODE_SND_ALL_REC_ALL(1),

    /// 主持人模式：音频发送给房间内所有玩家，接收附近范围内和同队玩家的音频。
    ITMG_RANGE_AUDIO_MODE_SND_ALL_REC_BOTH(2),

    /// 小队模式：音频只发送给同队玩家，只接收同队玩家的音频。
    ITMG_RANGE_AUDIO_MODE_SND_TEAM_REC_TEAM(3),

    /// 音频只发送给同队玩家，只接收附近范围内的音频。
    ITMG_RANGE_AUDIO_MODE_SND_TEAM_REC_PROX(4),

    /// 音频只发送给同队玩家，接收附近范围内和同队玩家的音频。
    ITMG_RANGE_AUDIO_MODE_SND_TEAM_REC_BOTH(5),

    /// 音频只发送给附近范围内的玩家，只接收同队玩家的音频。
    ITMG_RANGE_AUDIO_MODE_SND_PROX_REC_TEAM(6),

    /// 范围模式：音频只发送给附近范围内的玩家，只接收附近范围内的音频。
    ITMG_RANGE_AUDIO_MODE_SND_PROX_REC_PROX(7),

    /// 音频只发送给附近范围内的玩家，接收附近范围内和同队玩家的音频。
    ITMG_RANGE_AUDIO_MODE_SND_PROX_REC_BOTH(8),

    /// 音频发送给附近范围内和同队玩家的音频，只接收同队玩家的音频。
    ITMG_RANGE_AUDIO_MODE_SND_BOTH_REC_TEAM(9),

    /// 音频发送给附近范围内和同队玩家的音频，只接收附近范围内的音频。
    ITMG_RANGE_AUDIO_MODE_SND_BOTH_REC_PROX(10),

    /// 范围+小队模式：音频发送给附近范围内和同队玩家的音频，接收附近范围内和同队玩家的音频。
    ITMG_RANGE_AUDIO_MODE_SND_BOTH_REC_BOTH(11);

    final int value;
    const ITMG_RANGE_AUDIO_MODE(this.value);
}

/**
 * 成员状态变化子事件。
 */
enum ITMG_EVENT_ID_USER_UPDATE {

    /// 有用户进入语音房间事件。
    ITMG_EVENT_ID_USER_ENTER(1),

    /// 有用户退出语音房间事件。
    ITMG_EVENT_ID_USER_EXIT(2),

    /// 有用户开启麦克风事件。
    ITMG_EVENT_ID_USER_MIC_OPENED(3),

    /// 有用户关闭麦克风事件。
    ITMG_EVENT_ID_USER_MIC_CLOSED(4),

    /// 有用户发送音频数据事件，返回此时房间内说话的 UserID，通过此事件可以判断用户是否说话，并展示声纹效果。
    ITMG_EVENT_ID_USER_HAS_AUDIO(5),

    /// 有用户停止发送音频数据事件，返回此时房间内停止说话的 UserID。
    ITMG_EVENT_ID_USER_NO_AUDIO(6);

    final int value;
    const ITMG_EVENT_ID_USER_UPDATE(this.value);
}

/**
 * PCM - 位深度。
 */
enum ITMG_PCM_BITS_TYPE {

    /// 16bit
    ITMG_PCM_BITS_TYPE_FIXED_16(0),

    /// 32bit
    ITMG_PCM_BITS_TYPE_FLOAT_32(1);

    final int value;
    const ITMG_PCM_BITS_TYPE(this.value);
}

/**
 * 麦克风权限类型。
 */
enum ITMG_MIC_PERMISSION {

    /// 麦克风已授权。
    ITMG_PERMISSION_GRANTED(0),

    /// 麦克风被禁用。
    ITMG_PERMISSION_Denied(1),

    /// 权限未知，需请求权限。
    ITMG_PERMISSION_NotDetermined(2);

    final int value;
    const ITMG_MIC_PERMISSION(this.value);
}

/**
 * 控制远端用户音频设备子事件。
 */
enum ITMG_ROOM_MANAGEMENT_OPERATOR {

    /// 控制麦克风事件。
    ITMG_ROOM_MANAGEMENT_MIC_OP(0),

    /// 禁止操作麦克风及扬声器事件。
    ITMG_ROOM_MANAGERMENT_FORBID_OP(1);

    final int value;
    const ITMG_ROOM_MANAGEMENT_OPERATOR(this.value);
}

/**
 * 变声特效。
 *
 * 变声特效可以作用于人声之上，通过声学算法对人声进行二次处理，以获得与原始声音所不同的音色。
 */
enum ITMG_VOICE_TYPE {

    /// 关闭特效。
    ITMG_VOICE_TYPE_ORIGINAL_SOUND(0),

    /// 幼稚园。
    ITMG_VOICE_TYPE_KINDER_GARTEN(1),

    /// 萝莉。
    ITMG_VOICE_TYPE_LOLITA(2),

    /// 大叔。
    ITMG_VOICE_TYPE_UNCLE(3),

    /// 重金属。
    ITMG_VOICE_TYPE_HEAVY_MENTAL(4),

    /// 感冒。
    ITMG_VOICE_TYPE_INFLUENZA(5),

    /// 歪果仁。
    ITMG_VOICE_TYPE_DIALECT(6),

    /// 困兽。
    ITMG_VOICE_TYPE_CAGED_ANIMAL(7),

    /// 死肥宅。
    ITMG_VOICE_TYPE_DEAD_FATBOY(8),

    /// 强电流。
    ITMG_VOICE_TYPE_STRONG_CURRENT(9),

    /// 重机器。
    ITMG_VOICE_TYPE_HEAVY_MACHINE(10),

    /// 空灵。
    ITMG_VOICE_TYPE_INTANGIBLE(11),

    /// 猪八戒。
    ITMG_VOICE_TYPE_PIGSY(12),

    /// 绿巨人。
    ITMG_VOICE_TYPE_HULK(13);

    final int value;
    const ITMG_VOICE_TYPE(this.value);
}
