/**
         * 获取错误描述
         * @param [in] code 错误代码
         * @return 错误代码对应的错误描述
         */
        public static string GetKickErrorDescription(KICK_ERROR_CODE code)
        {
            string error = string.Empty;

            switch (code)
            {
            case KICK_ERROR_CODE.ERROR_KICK_BY_HOST:
                error = "被主播请出房间";
                break;

            case KICK_ERROR_CODE.ERROR_KICK_BY_MASTER_EXIT:
                error = "RTMP推流失败";
                break;

            case KICK_ERROR_CODE.ERROR_KICK_BY_NEWCHAIRENTER:
                error = "其他人以主播身份进入房间";
                break;

            case KICK_ERROR_CODE.ERROR_KICK_BY_NOAUDIODATA:
                error = "没有上行音频数据";
                break;

            case KICK_ERROR_CODE.ERROR_KICK_BY_NOVIDEODATA:
                error = "没有上行视频数据";
                break;

            case KICK_ERROR_CODE.ERROR_KICK_BY_PUSHRTMPFAILED:
                error = "RTMP推流失败";
                break;

            case KICK_ERROR_CODE.ERROR_KICK_BY_RELOGIN:
                error = "重复登录";
                break;

            case KICK_ERROR_CODE.ERROR_KICK_BY_SERVEROVERLOAD:
                error = "服务器过载";
                break;

            case KICK_ERROR_CODE.ERROR_TOKEN_EXPIRED:
                error = "token过期";
                break;
            }
            ;
            return(error);
        }
        // 触发 SDK 事件
        public string Poll()
        {
            IntPtr msg = getMessage();
            string str = Marshal.PtrToStringAnsi(msg);

            freeObject(msg);

            if (string.IsNullOrEmpty(str))
            {
                return(string.Empty);
            }
            Debug.Log("TTT >>> " + str + " <<<");
            string[] sArray = str.Split('\t');

            if (sArray [0].CompareTo("onError") == 0)
            {
                if (OnError != null)
                {
                    ERROR_CODE errCode = (ERROR_CODE)int.Parse(sArray [1]);
                    OnError(errCode, GetErrorDescription(errCode));
                }
            }
            else if (sArray[0].CompareTo("onUserKicked") == 0)
            {
                if (onUserKicked != null)
                {
                    int             uid     = int.Parse(sArray[1]);
                    KICK_ERROR_CODE errCode = (KICK_ERROR_CODE)int.Parse(sArray[2]);
                    onUserKicked(errCode, GetKickErrorDescription(errCode));
                }
            }
            else if (sArray [0].CompareTo("onConnectionLost") == 0)
            {
                if (OnConnectionLost != null)
                {
                    OnConnectionLost();
                }
            }
            else if (sArray [0].CompareTo("onJoinChannelSuccess") == 0)
            {
                if (OnJoinChannelSuccess != null)
                {
                    uint uid     = (uint)int.Parse(sArray [2]);
                    int  elapsed = int.Parse(sArray [3]);
                    OnJoinChannelSuccess(sArray [1], uid, elapsed);
                }
            }
            else if (sArray [0].CompareTo("onLeaveChannel") == 0)
            {
                if (OnLeaveChannel != null)
                {
                    int duration        = int.Parse(sArray [1]);
                    int txAudioKBitrate = int.Parse(sArray [2]);
                    int rxAudioKBitrate = int.Parse(sArray [3]);
                    int users           = int.Parse(sArray [4]);

                    RtcStats stats;
                    stats.duration        = (uint)duration;
                    stats.txAudioKBitRate = (ushort)txAudioKBitrate;
                    stats.rxAudioKBitRate = (ushort)rxAudioKBitrate;
                    stats.users           = (uint)users;
                    OnLeaveChannel(stats);
                }
            }
            else if (sArray [0].CompareTo("onUserJoined") == 0)
            {
                if (OnUserJoined != null)
                {
                    uint uid     = (uint)int.Parse(sArray [1]);
                    int  elapsed = int.Parse(sArray [2]);
                    OnUserJoined(uid, elapsed);
                }
            }
            else if (sArray [0].CompareTo("onUserOffline") == 0)
            {
                if (OnUserOffline != null)
                {
                    uint uid    = (uint)int.Parse(sArray [1]);
                    int  reason = int.Parse(sArray [2]);
                    OnUserOffline(uid, (USER_OFFLINE_REASON)reason);
                }
            }
            else if (sArray [0].CompareTo("onAudioRouteChanged") == 0)
            {
                if (OnAudioRouteChanged != null)
                {
                    int routing = int.Parse(sArray [1]);
                    OnAudioRouteChanged((AUDIO_ROUTE)routing);
                }
            }
            else if (sArray [0].CompareTo("onReportAuidoLevel") == 0)
            {
                if (OnReportAuidoLevel != null)
                {
                    uint uid        = (uint)int.Parse(sArray [1]);
                    int  auidoLevel = int.Parse(sArray [2]);
                    OnReportAuidoLevel(uid, auidoLevel);
                }
            }
            else if (sArray [0].CompareTo("onAudioMuted") == 0)
            {
                if (OnUserMuted != null)
                {
                    uint uid   = (uint)int.Parse(sArray [1]);
                    bool muted = int.Parse(sArray [2]) != 0;
                    OnUserMuted(uid, muted);
                }
            }
            else if (sArray [0].CompareTo("onReportRtcStats") == 0)
            {
                if (OnRtcStats != null)
                {
                    int j               = 1;
                    int duration        = int.Parse(sArray[j++]);
                    int txAudioKBitrate = int.Parse(sArray[j++]);
                    int rxAudioKBitrate = int.Parse(sArray[j++]);
                    int users           = int.Parse(sArray[j++]);

                    RtcStats stats;
                    stats.duration        = (uint)duration;
                    stats.txAudioKBitRate = (ushort)txAudioKBitrate;
                    stats.rxAudioKBitRate = (ushort)rxAudioKBitrate;
                    stats.users           = (uint)users;

                    OnRtcStats(stats);
                }
            }
            else
            {
            }

            return(sArray [0]);
        }