Source: ChuangRtckit.js

const WebGlRender = require("./WebGlRender.js");
const napi_addon = require("bindings")("chuangRtcKitdll");
const EventEmitter = require('./EventEmitter.js');
import {ChuangUserRole,ChuangPublishChannel,ChuangVideoBufferType,ChuangStreamRotation,ChuangVideoConfig,ChuangStreamConfig,ChuangCustomAudioCaptureConfig,
    ChuangVideoFrameParam,ChuangVideoEncodedFrameParam,ChuangVideoCanvas,ChuangCustomAudioRenderConfig,ChuangCustomVideoRenderConfig,ChuangMixStreamWatermark,
    ChuangMixStreamInfo,ChuangMixStreamConfig,ChuangNetworkSpeedTestConfig,eventtype} from './doc.js';

var emitter = new EventEmitter();
var ispushExternalRendering = false;
var isplayExternalRendering = false;

var glRenders = {};
var streamRgbdatas = {};

function onRenderCallback(stream, data, dataLength, ChuangVideoFrameParam) {
    //console.log("on render callback: " + ChuangVideoFrameParam[0].width + ", " + ChuangVideoFrameParam[0].height);
    if (!streamRgbdatas[stream]) {
        streamRgbdatas[stream] = {
            width: ChuangVideoFrameParam[0].width,
            height: ChuangVideoFrameParam[0].height,
            rgbData: Buffer.alloc(ChuangVideoFrameParam[0].width * ChuangVideoFrameParam[0].height * 4, "binary")
        }
    }

    var _srgbdata = streamRgbdatas[stream];
    if (ChuangVideoFrameParam[0].width != _srgbdata.width || ChuangVideoFrameParam[0].height != _srgbdata.height) {
        _srgbdata.width = ChuangVideoFrameParam[0].width;
        _srgbdata.height = ChuangVideoFrameParam[0].height;
        _srgbdata.rgbData = Buffer.alloc(ChuangVideoFrameParam[0].width * ChuangVideoFrameParam[0].height * 4, "binary");

    }

    data.copy(_srgbdata.rgbData, 0);
    glRenders[stream].draw(_srgbdata.rgbData, _srgbdata.width, _srgbdata.height);
    if(isplayExternalRendering)
        emitter.emit('play', stream,  _srgbdata.width, _srgbdata.height,_srgbdata.rgbData );
  
}
function onPublishRenderCallback(channel, data, dataLength, ChuangVideoFrameParam) {
    //console.log("onPublishRenderCallback: " + ChuangVideoFrameParam[0].width + ", " + ChuangVideoFrameParam[0].height);
    if (!streamRgbdatas[channel]) {
        streamRgbdatas[channel] = {
            width: ChuangVideoFrameParam[0].width,
            height: ChuangVideoFrameParam[0].height,
            rgbData: Buffer.alloc(ChuangVideoFrameParam[0].width * ChuangVideoFrameParam[0].height * 4, "binary")
        }
    }

    var _srgbdata = streamRgbdatas[channel];
    if (ChuangVideoFrameParam[0].width != _srgbdata.width || ChuangVideoFrameParam[0].height != _srgbdata.height || ChuangVideoFrameParam[0].width * ChuangVideoFrameParam[0].height < _srgbdata.width * _srgbdata.height) {
        _srgbdata.width = ChuangVideoFrameParam[0].width;
        _srgbdata.height = ChuangVideoFrameParam[0].height;
        _srgbdata.rgbData = Buffer.alloc(ChuangVideoFrameParam[0].width * ChuangVideoFrameParam[0].height * 4, "binary");
    }

    data.copy(_srgbdata.rgbData, 0);
    glRenders[channel].draw(_srgbdata.rgbData, _srgbdata.width, _srgbdata.height);
    if(ispushExternalRendering)
        emitter.emit('push', channel,  _srgbdata.width,_srgbdata.height,_srgbdata.rgbData );


}
var ChuangLogLevel = {
    LOG_VERBOSE: 0,
    LOG_DEBUG: 1,
    LOG_INFO: 2,
    LOG_WARN: 3,
    LOG_ERROR: 4,
    LOG_NONE: 5
};
/**
 * @description ChuangLiveEngine
 * @example let ChuangLiveEngine = new ChuangLiveEngine(); 
 * @class 
 */
class ChuangLiveEngine {

    constructor() { }

    /**
     * @description 初始化Engine
     * @param {string}appId  
     * @param {string}appKey
     * @returns  ChuangLiveEngine 实例 
     */
    initEngine(appId, appKey) {
       
        return napi_addon.initEngine(appId, appKey);
    }

    /**
     * @description 释放Engine
     * @returns  void 
     */
    uninitEngine() {
        napi_addon.uninitEngine();
    }

    /**
     * @description 设置日志记录级别 sdk会记录所有日志级别大于设置级别的日志
     * @param {string}ChuangLogLevel  
     * @returns  void 
     */
    setLogLevel(ChuangLogLevel) {
        napi_addon.setLogLevel(ChuangLogLevel);
    }

    /**
     * @description  设置日志文件分块大小, 单位KB, 取值范围为 [0, 10240], 当设置值为0时,sdk会关闭日志记录功能, 默认为1024KB
     * @param {int}fileSizeInKB  
     * @returns  void 
     */
    setLogFileSize(fileSizeInKB) {
        napi_addon.setLogFileSize(fileSizeInKB);
    }

    /**
     * @description  设置日志路径
     * @param {string}filePath  
     * @returns  void 
     */
    setLogFilePath(filePath) {
        napi_addon.setLogFilePath(filePath);
    }
    /**
     * @description 获取版本号
     * @returns string
     */
    getSDKVersion() {
        return napi_addon.getSDKVersion();
    }
    /**
     * @description 获取摄像头列表
     * @returns Array
     */
    getVideoDeviceName() {
        return napi_addon.getVideoDeviceName();
    }
    /**
     * @description 获取麦克风列表
     * @returns Array
     */
    getAudioDeviceName() {
        return napi_addon.getAudioDeviceName();
    }
    /**
     * @description 切换摄像头
     * @param {string}cameraName  摄像头名称
     * @param {ChuangPublishChannel}channel 流通道    
     * @returns bool
     */
    switchCamera(cameraName, channel) {
        return napi_addon.switchCamera(cameraName, channel);
    }
    /**
    *  设置回调事件
    * @return  void
    */
    setEventHandler() {
        return napi_addon.setEventHandler();
    }
    /**
    *  登录房间
    * @param    {string} roomId: 登录房间名
    * @param    {string} userId: 登录用户名
    * @param    ChuangUserRole: 登录角色
    * @return   int 函数调用结果
    */
    loginRoom(roomId, userId, ChuangUserRole) {
        napi_addon.setCustomVideoRenderHandler();
        napi_addon.registerRemoteVideoFrameRawDataCallback(onRenderCallback);
        napi_addon.enableCustomRemoteVideoRender(true, 1, 4, false);

        napi_addon.registerLocalVideoFrameRawDataCallback(onPublishRenderCallback);
        napi_addon.enableCustomLocalVideoRender(true, 1, 4, false);
        return napi_addon.loginRoom(roomId, userId, ChuangUserRole);
    }
    /**
    *  获取当前房间连接状态
    * @return   ChuangRoomState 当前房间连接状态
    */
    getRoomConnectState() {
        return napi_addon.getRoomConnectState();
    }
    /**
    *   退出房间
    * @return   void
    */
    logoutRoom() {
        return napi_addon.logoutRoom();
    }
    // /**
    // * 设置预览
    // * @param    ChuangVideoCanvas: canvas
    // * @param {ChuangPublishChannel}channel 流通道   
    // * @return   int 函数调用结果
    // */
    // setPreviewCanvas(canvas, channel) {

    //     return napi_addon.setPreviewCanvas(canvas, channel);
    // }
    // /**
    // * 开启预览
    // * @param    ChuangPublishChannel channel: 通道
    // * @return   int 函数调用结果
    // */
    // startPreview(channel) {
    //     return napi_addon.startPreview(channel);
    // }
    // /**
    // *  停止预览
    // * @param    ChuangPublishChannel channel: 通道
    // * @return   void 
    // */
    // stopPreview(channel) {
    //     napi_addon.stopPreview(channel);
    // }

    /**
    * @description ChuangAudioConfig  音频配置信息
    * @property    {int} profileId  音频级别 
    * @property    {string} szAudioDev:  麦克风名称
    * @property    {int} useLoopBack: 是否采集loopback
    */
    /**
    * 设置音频配置
    * @param    ChuangAudioConfig config: 音频配置
    * @param    ChuangPublishChannel channel: 流通道
    * @return   int  函数调用结果返回
    */
    setAudioConfig(config, channel) {
       return  napi_addon.setAudioConfig(config.profileId, config.szAudioDev, config.useLoopBack, channel);
    }

    /**
    * @description ChuangVideoConfig  视频配置信息
    * @property    {int} captureWidth  采集宽 
    * @property    {int} captureHeight  采集高 
    * @property    {int} encodeWidth  推流编码宽 
    * @property    {int} encodeHeight  推流编码高 
    * @property    {int} fps  帧率 
    * @property    {int} bitrateKbps  码率 
    * @property    {int} renderMode  采集数据宽高与推流数据宽高不等时的裁剪模式 
    * @property    {string} szCameraName:  摄像头名称
    */
    /**
    * 设置视频配置
    * @param    ChuangVideoConfig config: 视频配置
    * @param    ChuangPublishChannel channel: 流通道
    * @return   int  函数调用结果返回
    */
    setVideoConfig(config, channel) {
        return napi_addon.setVideoConfig(config.captureWidth,
            config.captureHeight,
            config.encodeWidth,
            config.encodeHeight,
            config.fps,
            config.bitrateKbps,
            config.renderMode,
            config.szCameraName,
            channel);
    }
    /**
    *  获取视频配置
    * @param    ChuangPublishChannel channel: 流通道
    * @return   ChuangVideoConfig
    */
    getVideoConfig(channel) {
        return napi_addon.getVideoConfig(channel);
    }

    /**
   * @description ChuangStreamConfig  视频配置信息
   * @property    {string} streamID:  推流流名
   * @property    {string} rtmpAddress:  rtmp完整推流地址
   * @property    {int} streamMode  推流类型 
   */
    /**
    *  开始推流
    * @param    ChuangStreamConfig config: 推流配置
    * @param    HTMLElement canvas: 渲染的view
    * @param    ChuangPublishChannel channel: 流通道  
    * @return   int 函数调用结果返回
    */
    startPublishStream(config, canvas, channel) {

        const renderView2 = document.getElementById(canvas);
        if (!glRenders[channel]) {
            glRenders[channel] = new WebGlRender();
            glRenders[channel].init(renderView2);
        }

        return napi_addon.startPublishStream(config.streamId, config.rtmpAddress, config.streamMode, channel);
    }
    /**
   *  停止推流
   * @param    ChuangPublishChannel channel: 流通道
   * @return   void
   */
    stopPublishStream(channel) {
        napi_addon.stopPublishStream(channel);
    }

    /**
    * @description ChuangCustomAudioCaptureConfig  视频配置信息
    * @property    {int} sampleRate:  采样率
    * @property    {int} channel:  声道数
    */
    /**
    * 音频自定义采集开关及参数设置
    * @param    {bool}  enable
    * @param    {ChuangCustomAudioCaptureConfig} config 音频参数
    * @param    {ChuangPublishChannel} channel: 流通道
    * @return   int   函数调用结果返回
    */
    enableCustomAudioCapture(enable, config, channel) {
        napi_addon.enableCustomAudioCapture(enable, config.sampleRate, config.channel, channel);
    }
    /**
    * 向sdk发送音频数据
    * @param    {uint8Array}data   音频数据
    * @param    {int}length   长度
    * @param    {ChuangPublishChannel} channel: 流通道
    * @return   int  函数调用结果返回
    */
    sendCustomAudioCapturePCMData(data, length, channel) {
        napi_addon.sendCustomAudioCapturePCMData(data, length, channel);
    }
    /**
    * 视频自定义采集开关及参数设置
    * @param    {bool}  true or false
    * @param    {ChuangVideoBufferType} type 视频自采集格式
    * @param    {ChuangPublishChannel} channel: 流通道
    * @return   int  函数调用结果返回
    */
    enableCustomVideoCapture(enable, type, channel) {
        return napi_addon.enableCustomVideoCapture(enable, type, channel);
    }
    /**
     * 设置视频自定义采集接口回调
     * @return   int  函数调用结果返回
     */
    setCustomVideoCaptureHandler() {
        return napi_addon.setCustomVideoCaptureHandler();
    }

    /**
    * @description ChuangVideoFrameParam  视频帧参数
    * @property    {ChuangVideoPixelType} type:  视频像素存储类型
    * @property    {int} width:  宽
    * @property    {int} height:  高
    * @property    {ChuangStreamRotation} rotation:  旋转角度
    */
    /**
    * 向sdk发送视频帧数据
    * @param    {uint8Array}data   视频数据
    * @param    {ChuangVideoFrameParam} param   视频帧参数
    * @param    long referenceTimeMillisecond 时间戳
    * @param    ChuangPublishChannel channel: 流通道
    * @return   int 函数调用结果
    */
    sendCustomVideoCaptureRawData(data, dataLength, param, referenceTimeMillisecond, channel) {
        return napi_addon.sendCustomVideoCaptureRawData(data, dataLength, param.type, param.width, param.height, param.rotation, referenceTimeMillisecond, channel);
    }


    /**
    * @description ChuangVideoEncodedFrameParam  视频帧参数
    * @property    {bool} isKeyFrame:  是否关键帧
    * @property    {int} width:  宽
    * @property    {int} height:  高
    * @property    {ChuangStreamRotation} rotation:  旋转角度
    */
    /**
    * 向sdk发送h264数据
    * @param    {uint8Array} data   h264数据
    * @param    {ChuangVideoEncodedFrameParam} param   视频参数
    * @param    {long} referenceTimeMillisecond 时间戳
    * @param    {ChuangPublishChannel} channel: 流通道
    * @return   int 函数调用结果返回
    */
    sendCustomVideoCaptureEncodedData(data, dataLength, param, referenceTimeMillisecond, channel) {
        return napi_addon.sendCustomVideoCaptureEncodedData(data, dataLength, param.isKeyFrame, param.width, param.height, param.rotation, referenceTimeMillisecond, channel);
    }
    /**
    * 开/关回声消除
    * @param    {bool} enable
    * @return   void
    */
    enableAEC(enable) {
        napi_addon.enableAEC();
    }

    /**
     * 开/关噪声抑制
    * @param    {bool} enable
     * @return   void
    */
    enableANS(enable) {
        napi_addon.enableANS();
    }

    /**
     * 开/关自动增益
    * @param    {bool} enable
    * @return   void
    */
    enableAGC(enable) {
        napi_addon.enableAGC();
    }
    /**
    * 开启音频混音
    * @param    {bool} enable
    * @param    {ChuangPublishChannel} channel  流通道
    * @return   int 函数调用结果返回
    */
    enableAudioMixing(enable, channel) {
        return napi_addon.enableAudioMixing(enable, channel);
    }
    /**
     * 设置音频混音回调
     * @return   int 函数调用结果返回
     */
    setAudioMixingHandler() {
        return napi_addon.setAudioMixingHandler();
    }


    /**
    * @description ChuangVideoCanvas  绘制窗口信息
    * @property    {HTMLElement} canvas:  canvas
    * @property    {int} renderMode:  填充模式
    * @property    {int} mirrorMode:  镜像
    */
    /**
    * 开始拉流
    * @param   {string}} roomId 房间号
    * @param   {string}} streamId 流ID
    * @param   {ChuangVideoCanvas} videoCanvas 绘制窗口信息
    * @return   void
    */
    startPlayStream(roomId, streamId, videoCanvas) {

        const canvas = document.getElementById(videoCanvas.canvas);

        glRenders[streamId] = new WebGlRender();
        glRenders[streamId].init(canvas);

        let ret = napi_addon.startPlayStream(roomId, streamId, videoCanvas.renderMode, videoCanvas.mirrorMode);
        return ret;
    }
    /**
    * 停止拉流
    * @param    {string} streamId 流ID
    * @return   void
    */
    stopPlayStream(streamId) {
        napi_addon.stopPlayStream(streamId);
    }

    /**
    * @description ChuangCustomAudioRenderConfig  音频配置
    * @property    {int} sampleRate:  采样率
    * @property    {int} channel:  声道数
    */
    /**
    * 开/关外部音频渲染
    * @param    bool enable
    * @param    {ChuangCustomAudioRenderConfig} config 音频配置
    * @return   int 函数调用结果返回
    */
    enableCustomAudioRender(enable, config) {
        return napi_addon.enableCustomAudioRender(enable.config.sampleRate, config.channel);
    }

    /**
    * 从sdk获取一部分音频数据
    * @param    {uint8Array} data 音频数据存放
    * @param    {int} dataLength 数据长度
    * @return   int  函数调用结果返回
    */
    fetchCustomAudioRenderPCMData(data, dataLength) {
        return napi_addon.fetchCustomAudioRenderPCMData(data, dataLength);
    }

    /**
    * @description ChuangCustomVideoRenderConfig  视频配置
    * @property    {ChuangVideoBufferType} type:  视频数据格式类型
    * @property    {ChuangVideoPixelType} format:  视频像素存储类型
    * @property    {bool} enableEngineRender:  是否SDK渲染
    */
    /**
    * 开/关远端流外部视频渲染
    * @param    bool enable
    * @param    ChuangPublishChannel channel  流通道
    * @return   int 函数调用结果返回
    */
    enableCustomRemoteVideoRender(enable) {
        isplayExternalRendering = true;
    }

    // /**
    // * 设置外部渲染视频接口句柄
    // * @return   void
    // */
    // setCustomVideoRenderHandler() {
    //     //napi_addon.setCustomVideoRenderHandler();
    // }
    /**
    * 开启本地流外部渲染
    * @param   bool 
    * @return   void
    */
     // ChuangCustomVideoRenderConfig config配置
    enableCustomLocalVideoRender(enable) {
        ispushExternalRendering = enable;
    }


    /**
     * 发送推流消息
     * @param   {string} streamId  流ID
     * @param   {string} msg    消息内容
     * @return   int 函数调用结果返回
     */
    sendStreamAttachedMessage(streamId, msg) {
        return napi_addon.sendStreamAttachedMessage(streamId, msg);
    }
    /**
     * 开启流音量大小回调
     * @return   void
     */
    startSoundLevelMonitor() {
        napi_addon.startSoundLevelMonitor();
    }
    /**
     * 关闭流音量大小回调
     * @return   void
     */
    stopSoundLevelMonitor() {
        napi_addon.stopSoundLevelMonitor();
    }
    /**
     * 设置回调间隔,单位毫秒
     * @param   {int} intervalMs 时间间隔 默认200
     * @return   int 函数调用结果返回
     */
    setSoundLevelMonitorInterval(intervalMs) {
        return napi_addon.setSoundLevelMonitorInterval(intervalMs);
    }
    /**
    * 本地流静音音频
    * @param   {string} streamId  流ID
    * @param   {bool} mute   是否静音
    * @return   int 函数调用结果返回
    */
    muteLocalAudio(streamId, mute) {
        return napi_addon.muteLocalAudio(streamId, mute);
    }
    /**
     * 远端流静音音频
     * @param   {string} streamId  流ID
     * @param   bool mute   是否静音
     * @return   int
     */
    muteRemoteAudio(streamId, mute) {
        return napi_addon.muteRemoteAudio(streamId, mute);
    }
    /**
     * 本地流静音视频
     * @param   {string} streamId  流ID
     * @param   bool mute   是否静音
     * @return   int
     */
    muteLocalVideo(streamId, mute) {
        return napi_addon.muteLocalVideo(streamId, mute);
    }
    /**
     * 远端流静音视频
     * @param   {string} streamId  流ID
     * @param   bool mute   是否静音
     * @return   int
     */
    muteRemoteVideo(streamId, mute) {
        return napi_addon.muteRemoteVideo(streamId, mute);
    }

    /**
   * @description ChuangMixStreamWatermark   混流水印信息
   * @property    {string} image: 水印图片id
   * @property    {int} left:  混流画布中水印左上角x坐标
   * @property    {int} top: 混流画布中水印左上角y坐标
   * @property    {int} right 混流画布中水印右下角x坐标
   * @property    {int} bottom  混流画布中水印右下角y坐标
   */
    /**
     * @description ChuangMixStreamInfo   混流单个流的信息
     * @property    {string} streamId  流ID
     * @property    {int} width: 流宽
     * @property    {int} height: 流高
     * @property    {int} zlevel  流所处层 
     * @property    {int} mixVideo  是否混当前流 
     * @property    {int} srcRect.left  视频源 左 
     * @property    {int} srcRect.top   视频源 上 
     * @property    {int} srcRect.right 视频源 右
     * @property    {int} srcRect.bottom   视频源 下
     * @property    {int} dstRect.left  视频显示 左 
     * @property    {int} dstRect.top   视频显示 上 
     * @property    {int} dstRect.right 视频显示 右
     * @property    {int} dstRect.bottom   视频显示 下
     * @property    {ChuangVideoRenderMode} renderMode 填充模式
     * @property    {ChuangStreamRotation} rotation   流方向类型
     */
    /**
    * @description ChuangMixStreamConfig  混流信息
    * @property    {string} target  rtmp完整混流地址
    * @property    {int} width:  流宽
    * @property    {int} height: 流高
    * @property    {int} videoBitrateKbps  码率 
    * @property    {string} backgroundImage  混流背景图id 
    * @property    {bool} noticeStream 是否将该混流通知给房间内其他用户
    * @property    {int} nInputStreamCount:  混流总数
    * @property    {ChuangMixStreamWatermark} watermark 混流水印信息
    * @property    {ChuangMixStreamInfo} mixStreams:  混流流信息(数组)
    */

    /**
     * 开启混流
     * @param   {ChuangMixStreamConfig} config 混流配置
     * @return   int 函数调用结果返回
     */
    startMixStream(config) {
        var str = '';
        for (var index = 0; index < config.mixStreams.length; index++) {

            str += (config.mixStreams[index].streamId + ',' +
                config.mixStreams[index].width + ',' +
                config.mixStreams[index].height + ',' +
                config.mixStreams[index].zlevel + ',' +
                config.mixStreams[index].mixVideo + ',' +
                config.mixStreams[index].srcRect.left + ',' +
                config.mixStreams[index].srcRect.top + ',' +
                config.mixStreams[index].srcRect.right + ',' +
                config.mixStreams[index].srcRect.bottom + ',' +
                config.mixStreams[index].dstRect.left + ',' +
                config.mixStreams[index].dstRect.top + ',' +
                config.mixStreams[index].dstRect.right + ',' +
                config.mixStreams[index].dstRect.bottom + ',' +
                config.mixStreams[index].renderMode + ',' +
                config.mixStreams[index].rotation + ',');
        }

        let ret = napi_addon.startMixStream(config.target,
            config.width,
            config.height,
            config.videoBitrateKbps,
            config.backgroundImage,
            config.noticeStream,
            config.nInputStreamCount,
            config.watermark.image,
            config.watermark.left,
            config.watermark.top,
            config.watermark.right,
            config.watermark.bottom,
            str);
        return ret;
    }


    /**
    * 停止混流
    * @return   void
    */
    stopMixStream() {
        napi_addon.stopMixStream();
    }

    /**
    * @description ChuangNetworkSpeedTestConfig  网络测速配置
    * @property    {bool} testUpLink  是否测试上行连接
    * @property    {int} expectedUpLinkBitrateKbps:  上行连接测速码率,单位Kbps (10Kbps~10000Kbps)
    * @property    {bool} testDownLink: 是否测试下行连接
    * @property    {int} exceptedDownLinkBitrateKbps  下行连接测速码率,单位Kbps (10Kbps~10000Kbps) 
    */
    /**
     * 开始网络测速
     * @param   {ChuangNetworkSpeedTestConfig} config 网络测速配置
     * @return   int 函数调用结果返回
     */
    startNetworkSpeedTest(config) {
        return napi_addon.startNetworkSpeedTest(config);
    }
    /**
     * 
     * 停止网络测速
     * @return   void
     */
    stopNetworkSpeedTest() {
        napi_addon.stopNetworkSpeedTest();
    }
    /**
        * @description 注册SDK回调事件
        * @param    {eventtype}eventtype 事件
        * @param    {function}callback 回调:不同事件回调时的参数不同
        */

    static on(eventtype, callback) {
        switch (eventtype) {
            case 'onRoomStateUpdate':
                napi_addon.registerRoomStateUpdateCallback(callback);
                break;
            case 'onRoomStreamUpdate':
                napi_addon.registerRoomStreamUpdateCallback(callback);
                break;
            case 'onPublishStreamStateUpdate':
                napi_addon.registerPublishStreamStateUpdateCallback(callback);
                break;
            case 'onPublishStreamVideoSizeChanged':
                napi_addon.registerPublishStreamVideoSizeChangedCallback(callback);
                break;
            case 'onPublishStreamQualityUpdate':
                napi_addon.registerPublishStreamQualityUpdateCallback(callback);
                break;
            case 'onCaptureSoundLevelUpdate':
                napi_addon.registerCaptureSoundLevelUpdateCallback(callback);
                break;
            case 'onPlayStreamQualityUpdate':
                napi_addon.registerPlayStreamQualityUpdateCallback(callback);
                break;
            case 'onPlayStreamStateUpdate':
                napi_addon.registerPlayStreamStateUpdateCallback(callback);
                break;
            case 'onRemoteSoundLevelUpdate':
                napi_addon.registerRemoteSoundLevelUpdateCallback(callback);
                break;
            case 'onPlayStreamEvent':
                napi_addon.registerPlayStreamEventCallback(callback);
                break;
            case 'onPlayStreamFirstAudio':
                napi_addon.registerPlayStreamFirstAudioCallback(callback);
                break;
            case 'onPlayStreamFirstVideo':
                napi_addon.registerPlayStreamFirstVideoCallback(callback);
                break;
            case 'onPlayStreamStateChanged':
                napi_addon.registerPlayStreamStateChangedCallback(callback);
                break;
            case 'onPlayStreamVideoSizeChanged':
                napi_addon.registerPlayStreamVideoSizeChangedCallback(callback);
                break;
            case 'onPlayStreamVideoRotationChanged':
                napi_addon.registerPlayStreamVideoRotationChangedCallback(callback);
                break;
            case 'onReceiveStreamAttchedMessage':
                napi_addon.registerReceiveStreamAttchedMessageCallback(callback);
                break;
            case 'onNetworkSpeedTestQualityUpdate':
                napi_addon.registerNetworkSpeedTestQualityUpdateCallback(callback);
                break;
            case 'onNetworkTypeChanged':
                napi_addon.registerNetworkTypeChangedCallback(callback);
                break;
            case 'onFirstLocalAudioFramePublished':
                napi_addon.registerFirstLocalAudioFramePublishedCallback(callback);
                break;
            case 'onFirstLocalVideoFramePublished':
                napi_addon.registerFirstLocalVideoFramePublishedCallback(callback);
                break;
            case 'onPlayStreamFirstAudioDecoded':
                napi_addon.registerPlayStreamFirstAudioDecodedCallback(callback);
                break;
            case 'onAudioRouteChange':
                napi_addon.registerAudioRouteChangeCallback(callback);
                break;
            case 'onStart':
                napi_addon.registerStartCallback(callback);
            case 'onStop':
                napi_addon.registerStopCallback(callback);
                break;
            case 'onEncodedDataTrafficControl':
                napi_addon.registerEncodedDataTrafficControlCallback(callback);
                break;
            case 'onVideoNeedKeyFrame':
                napi_addon.registerVideoNeedKeyFrameCallback(callback);
                break;
            case 'onRemoteVideoFrameRawData':
                emitter.on('play', function(channel, data, dataLength, ChuangVideoFrameParam) {
                    callback(channel, data, dataLength, ChuangVideoFrameParam);
                })
                break;
            // case 'onRemoteVideoFrameEncodedData':
            //     napi_addon.registerRemoteVideoFrameEncodedDataCallback(callback);
            //     break;
            case 'onLocalVideoFrameRawData':
                emitter.on('push', function(channel, data, dataLength, ChuangVideoFrameParam) {
                    callback(channel, data, dataLength, ChuangVideoFrameParam);
                })
                break;

            case 'onMixStreamResult':
                napi_addon.registerMixStreamResultCallback(callback);
                break;
            case 'onAudioMixingCopyData':
                napi_addon.registerAudioMixingCopyDataCallback(callback);
                break;
            default:
                break;
        }

    }

}
module.exports = ChuangLiveEngine;