/***************************************************************************
 *
 * Copyright (c) 2020 Baidu.com, Inc. All Rights Reserved
 *
 * @author: sunjian
 *
 * @discuss: The file is for implementing c# calling.
 *
 ***************************************************************************/
#pragma once

#include <memory>
#include "baidu_rtc_client.h"

 /*
  * 创建RTC Handle
  *
  * @return  handle, rtc client handle
  *
  * @discuss 通过该接口创建rtc client handle, 开发者可通过改接口返回的handle管理使用RTC sdk
  *
  **/
extern "C" __declspec(dllexport) void* brtc_create_client();



/*
  * 销毁RTC Handle
  *
  * @param rtc_client, rtc client handle.
  *
  * @discuss 开发者可通过该接口销毁 brtc_create_client 创建的rtc client hanle
  *
  **/
extern "C" __declspec(dllexport) void brtc_destroy_client(void *rtc_client);


/*
* 初始化SDK
*
* @param rtc_client rtc client 句柄
* @param app_id, 百度提供给开发者的数字签名，是开发者的唯一标识
* @param token, 用于信令交互时，与server端鉴权
* @param cer_path, ssl 证书存放路径，证书有百度提供
* @discuss 该interface用于初始化windows rtc sdk, 需在使用之前调用进行初始化
*
**/
extern "C" __declspec(dllexport) void brtc_init_sdk(void *rtc_client, char* app_id, char* token, char* cer_path);



/*
 * 释放SDK
 *
 * @param rtc_client rtc client 句柄
 * @discuss 在sdk使用完后，可调用该sdk进行释放，销毁操作
 *
**/
extern "C" __declspec(dllexport) void brtc_deInit_sdk(void *rtc_client);



/*
 * 登录房间
 *
 * @param rtc_client rtc client 句柄
 * @param room_name 房间名，长度不超过255字节
 * @param user_id 用户id, 每个房间的用户id必须唯一
 * @return true 成功， false 失败
 *
 * @discuss 登录房间成功后，用户可以发布流，或订阅流，并能通过IRtcMessageListener接口获取房间状态信息。
 *
 **/
extern "C" __declspec(dllexport) void brtc_login_room(void *rtc_client, char *room_name, char* user_id, char* token);



/*
 * 登出房间
 *
 * @param rtc_client rtc client 句柄
 * @return true 成功， false 失败
 * @discuss  关闭媒体通道，关闭信令通道，释放内存资源，及销毁其他申请的资源
 *
 **/
extern "C" __declspec(dllexport) void brtc_logout_room(void *rtc_client);



/*
 * 发布流
 *
 * @param rtc_client rtc client 句柄;
 * @param is_auto_subscribe_stream, 标识在发布流的同时，是否自动订阅流；
 *
 * @discuss 流发布在roomId指定的房间，在同一房间joined 的用户可以相互订阅流，默认在发布流的同时，
 *         listening/subscriber 在该房间其他用户的流；
 *
 **/
extern "C" __declspec(dllexport) void brtc_publish_streaming(void *rtcClient, bool is_auto_subscribe_stream);



/*
 * 停止发布流
 *
 * @param rtc_client rtc client 句柄;
 * @discuss  publishing的流都可通过该interface停止发布或订阅
 *
 **/
extern "C" __declspec(dllexport) void brtc_stop_publish_streaming(void *rtc_client);



/*
 * 订阅流
 *
 * @param rtc_client rtc client 句柄;
 * @param stream_id, 用户要订阅的其他用户的流id(即其他用户id)
 *
 * @discuss 用于订阅同一房间的其他用户的流
 *
 **/
extern "C" __declspec(dllexport) void brtc_subscribe_streaming(void *rtc_client, char *stream_id);



/*
 * 停止订阅流
 *
 * @param rtc_client rtc client 句柄;
 * @param stream_id, 用户要停止订阅的流id(即其他用户id)
 *
 * @discuss  publishing and subscribering 的流都可通过该interface停止发布或订阅
 *
 **/
extern "C" __declspec(dllexport) void brtc_stop_subscribe_streaming(void *rtc_client, char *stream_id);



/*
 * 设置只发布音频流
 *
 * @param rtc_client rtc client 句柄;
 *
 * @discuss  该接口主要用于设置只发布音频流
 *
 **/
extern "C" __declspec(dllexport) void brtc_set_only_publish_audio(void *rtc_client);



/*
 * Mute摄像头
 *
 * @param rtc_client rtc client 句柄;
 * @discuss  关闭摄像头，停止画面预览及传输
 *
 **/
extern "C" __declspec(dllexport) void brtc_mute_camera(void *rtc_client, bool is_mute);



/*
 * Mute麦克风
 *
 * @param rtc_client rtc client 句柄;
 * @discuss  关闭麦克风，停止声音采集及传输
 *
 **/
extern "C" __declspec(dllexport) void brtc_mute_micphone(void *rtc_client, bool is_mute);


/*
 * 设置码率(video)
 *
 * @param rtc_client, rtc instance 句柄;
 * @param bit_rate, video编码码率
 * @discuss 设置视频编码码率，该码率是最大码率，会随着网络变化做自适应的变化
 *
 **/
extern "C" __declspec(dllexport) void brtc_set_video_bitrate(void *rtc_client, int bit_rate);


/*
 * 设置video fps
 *
 * @param rtc_client, rtc instance 句柄;
 * @param fps, 视频采集帧率
 * @discuss 设置视频采集fps
 *
 **/
extern "C" __declspec(dllexport) void brtc_set_video_fps(void *rtc_client, int fps);


/*
 * 设置video 分辨率
 *
 * @param rtc_client, rtc instance 句柄;
 * @param width, 视频宽
 * @param height, 视频高
 * @discuss 视频resolution会随着网络状态自适应变化
 *
 **/
extern "C" __declspec(dllexport) void brtc_set_video_resolution(void *rtc_client, int width, int height);


/*
 * 设置video 镜像
 *
 * @param rtc_client, rtc instance 句柄;
 * @param is_mirror, 是否开启镜像
 *
 **/
extern "C" __declspec(dllexport) void brtc_set_video_mirror(void *rtc_client, bool is_mirror);


/*
 * 发送消息
 *
 * @param rtc_client rtc client 句柄;
 * @param message, 准备发的消息
 * @discuss 可通过该接口发送文本消息到聊天室，房间的其他人能接收到所发消息
 *
 **/
extern "C" __declspec(dllexport) void brtc_send_message(void *rtc_client, const char* message);



/*
 * 设置消息到达回调
 *
 * @param rtc_client rtc client 句柄;
 * @param msg_call_back, 需要应用层设置的callback
 * @discuss 设置消息接收接口, 当有消息到达时，通过msg_call_back上报应用层
 *
 **/
extern "C" __declspec(dllexport) void brtc_set_message_arrival_callback(void *rtc_client, MessageArrivalCallback msg_call_back);



/*
 * 设置事件到达回调
 *
 * @param rtc_client rtc client 句柄;
 * @param event_call_back, 需要应用层设置的callback
 * @discuss 设置事件接收接口, 当有事件到达时，通过event_call_back上报应用层
 *
 **/
extern "C" __declspec(dllexport) void brtc_set_event_arrival_callback(void *rtc_client, EventArrivalCallback event_call_back);



/*
 * 设置视频帧到达回调
 *
 * @param rtc_client rtc client 句柄;
 * @param videoArrivalCb, 需要应用层设置的callback
 * @param observerId, 视频帧观察着id, 应用可以自己设定，便于底层SDK识别observer
 * @discuss 设置视频到达C#接口, 当有视频帧到达时，通过videoArrivalCb C#上报应用层， 应用层可对视频进行处理渲染等
 *
 **/
extern "C" __declspec(dllexport) void brtc_set_video_arrival_callback(void *rtc_client, VideoArrivalCallback videoArrivalCb, int observerId);



/*
 * 设置预览视频帧到达回调
 *
 * @param rtc_client rtc client 句柄;
 * @param videoArrivalCb, 需要应用层设置的callback
 * @param observerId, 视频帧观察着id, 应用可以自己设定，便于底层SDK识别observer
 * @discuss 设置视频到达C#接口, 当有视频帧到达时，通过videoArrivalCb C#上报应用层， 应用层可对视频进行处理渲染等
 *
 **/
extern "C" __declspec(dllexport) void brtc_set_preview_video_arrival_callback(void *rtc_client, VideoArrivalCallback videoArrivalCb, int observerId);



/*
 * 获取SDK版本号
 *
 * @param rtc_client rtc client 句柄;
 * @return const char *, SDK 版本号
 * @discuss 通过该接口获取SDK的版本号
 *
 **/
extern "C" __declspec(dllexport) char * brtc_get_sdk_version(void *rtc_client);



/*
 * 获取音频采集设备数目
 *
 * @param rtc_client rtc client 句柄;
 * @return int, 返回实际的采集设备数目
 * @discuss 通过该接口获取音频采集设备数目
 *
 **/
extern "C" __declspec(dllexport) int brtc_get_audio_record_device_num(void *rtc_client);




/*
 * 获取音频输出设备数目
 *
 * @param rtc_client rtc client 句柄;
 * @return int, 返回实际的输出设备数目
 * @discuss 通过该接口获取音频输出设备数目
 *
 **/
extern "C" __declspec(dllexport) int brtc_get_audio_playout_device_num(void *rtc_client);




/*
 * 获取音频采集设备列表
 *
 * @param rtc_client rtc client 句柄;
 * @param devNameList, 输出参数，存储具体的采集设备名
 * @param listLen， 设备列表长度
 * @param maxNameLen, 每个设备名的最大长度
 * @discuss 通过该接口获取音频采集设备列表，列表中存储的是设备名
 *
 **/
extern "C" __declspec(dllexport) void brtc_get_audio_record_devices(void *rtc_client, char * devNameList, int listLen, int maxNameLen);




/*
 * 获取音频输出设备列表
 *
 * @param rtc_client rtc client 句柄;
 * @param devNameList, 输出参数，存储具体的音频输出设备名
 * @param listLen， 设备列表长度
 * @param maxNameLen, 每个设备名的最大长度
 * @discuss 通过该接口获取音频输出设备列表，列表中存储的是设备名
 *
 **/
extern "C" __declspec(dllexport) void brtc_get_audio_playout_devices(void *rtc_client, char * devNameList, int listLen, int maxNameLen);



/*
 * 设置音频采集设备
 *
 * @param rtc_client rtc client 句柄;
 * @param devName, 欲设置的设备名
 * @discuss 通过设备名，设置选取的音频采集设备
 *
 **/
extern "C" __declspec(dllexport) void brtc_set_auido_record_device(void *rtc_client, char * devName);




/*
 * 设置音频输出设备
 *
 * @param rtc_client rtc client 句柄;
 * @param devName, 欲设置的设备名
 * @discuss 通过设备名，设置选取的音频播放输出设备
 *
 **/
extern "C" __declspec(dllexport) void brtc_set_auido_playout_device(void *rtc_client, char * devName);



/*
 * 开启/关闭RTC信息打点
 *
 * @param rtc_client rtc client 句柄;
 * @param isEnable,  isEnable=true 开启信息打点统计, isEnable=false 关闭信息打点统计
 * @discuss 该接口用于控制RTC状态信息统计，并上传到server, 故有一定的性能消耗，建议在正式发版时关闭该功能，只有在测试时打开。
 *
 **/
extern "C" __declspec(dllexport) void brtc_enable_rtc_stats_info_dot(void *rtc_client, bool isEnable);



/*
 * 开启/关闭日志功能
 *
 * @param rtc_client rtc client 句柄;
 * @param isEnable,  isEnable=true 开启, isEnable=false 关闭
 * @discuss 用于打开或关闭日志功能，若打开会在exe目录下保存rtc运行日志文件，若关闭将不进行日志文件保存。建议在发版时关闭该功能。
 *
 **/
extern "C" __declspec(dllexport) void brtc_enable_rtc_logger(void *rtc_client, bool isEnable);



/*
 * 获取房间号
 *
 * @param rtc_client rtc client 句柄;
 *
 * @discuss 用于获取房间名对应的房间号
 *
 **/
extern "C" __declspec(dllexport) unsigned long long brtc_get_room_id(void *rtc_client);



/*
 * 开始预览
 *
 * @discuss  打开摄像头后，可开始画面预览
 *
 **/
extern "C" __declspec(dllexport) void brtc_start_preview(void *rtc_client);



/*
 * 停止预览
 *
 * @discuss  在开始预览后，可通过该接口停止预览
 *
 **/
extern "C" __declspec(dllexport) void brtc_stop_preview(void *rtc_client);



/*
 * 屏幕共享
 *
 * @param rtc_client rtc client 句柄;
 *
 * @discuss 可通过该接口开启屏幕分享功能, 让其他用户看到你的屏幕操作,默认多屏幕下画面自动合并;
 *
 **/
extern "C" __declspec(dllexport) void brtc_start_share_screen(void *rtc_client);



/*
 * 屏幕共享
 *
 * @param rtc_client rtc client 句柄;
 * @param sourceId 屏幕序号,如0,1,2;
 *
 * @discuss 可通过该接口开启屏幕分享功能, 让其他用户看到你的屏幕操作;通过sourceId指定分享的屏幕;
 *
 **/
extern "C" __declspec(dllexport) void brtc_start_share_screen_with_source(void *rtc_client, long long sourceId);


/*
 * 停止屏幕共享
 *
 * @param rtc_client rtc client 句柄;
 *
 * @discuss 关闭屏幕分享功能
 *
 **/
extern "C" __declspec(dllexport) void brtc_stop_share_screen(void *rtc_client);



/*
* 获取可共享窗口列表
* 
* @param rtc_client rtc client 句柄;
* @param type 获取类型;
* @param length 返回列表长度;
*
* @retrun 返回窗口列表
*
* @discuss 可通过该接口获取可共享屏幕/窗口列表
*
**/
extern "C" __declspec(dllexport) void* brtc_get_window_source_list(void *rtc_client, CaptureType type, int& length);



/*
* 设置屏幕共享模式
*
* @param rtc_client rtc client 句柄;
* @param type 共享类型;kOnlyScreen,仅屏幕;kWithPreviewVideo,携带摄像头预览数据
*
* @discuss 设置屏幕共享模式
*
**/
extern "C" __declspec(dllexport) void brtc_set_share_screen_mode(void *rtc_client, ShareScreenMode type);



/*
 * 释放共享窗口列表
 *
 * @param rtc_client rtc client 句柄;
 * @param sourceList 要释放窗口列表;
 * @param length 列表长度;
 *
 * @discuss 释放共享窗口列表
 *
 **/
extern "C" __declspec(dllexport) void brtc_free_window_source_list(void *rtc_client, void* sourceList, int length);



/*
 * 窗口共享
 *
 * @param rtc_client rtc client 句柄;
 * @param sourceId 窗口winId,通过getWindowSourceList获取,或者外部获取后传入;
 *
 * @discuss 可通过该接口开启窗口分享功能, 让其他用户看到你的窗口操作;通过sourceId指定分享的窗口;
 *
 **/
extern "C" __declspec(dllexport) void brtc_start_share_window(void *rtc_client, long long sourceId);



/*
 * 停止窗口共享
 *
 * @param rtc_client rtc client 句柄;
 *
 * @discuss 关闭窗口分享功能
 *
 **/
extern "C" __declspec(dllexport) void brtc_stop_share_window(void *rtc_client);



/*
 * 配置server端推流参数
 *
 * @param rtc_client rtc client 句柄;
 * @param url rtmp推流地址;
 * @param is_mix 是否做混流处理;
 * @param is_recording 是否录制;
 * @param mix_template 混流模板;
 * @param transfer_mode 转推模式，有两种： 聊天室模式， 主播转推模式;
 *
 * @discuss 该接口用于配置server推流的参数，聊天室模式：在同一个rtc房间的所有参与者在混流后，直接转推到一个指定的直播房间；
 *    主播转推模式：主播推向不同的直播房间;进入房间前调用;
 *
 **/
extern "C" __declspec(dllexport) bool brtc_config_live_stream_with_url(void *rtc_client, char* url, bool is_mix, 
    bool is_recording, char* mix_template, RtcLiveTransferMode transfer_mode);



/*
 * 启动动态转推功能
 *
 * @param rtc_client rtc client 句柄;
 * @param url rtmp推流地址;
 * @param is_mix 是否做混流处理;
 * @param is_recording 是否录制;
 * @param mix_template 混流模板;
 * @param transfer_mode 转推模式，有两种： 聊天室模式， 主播转推模式;
 *
 * @discuss 启动动态转推功能,进入房间成功后调用;
 *
 **/
extern "C" __declspec(dllexport) bool brtc_start_live_server_streaming(void *rtc_client, char* url, bool is_mix,
    bool is_recording, char* mix_template, RtcLiveTransferMode transfer_mode);



/*
 * 停止动态转推功能
 *
 * @param rtc_client rtc client 句柄;
 *
 * @discuss 停止动态转推功能
 *
 **/
extern "C" __declspec(dllexport) bool brtc_stop_live_server_streaming(void *rtc_client, RtcLiveTransferMode transfer_mode);