+++ /dev/null
-#ifndef __JRTC_H__
-#define __JRTC_H__
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * 呼叫流程: 假设 `设备A' 呼叫 `设备B'
- *
- * 启动连接流程
- * - A 需要 "某种推送机制" (长连接,推送方式) 通知到B,
- * - A 打开通信(jrtc_open), 初始状态为 JRTC_OPENED
- * - B 收到 "该种推送通知" 后也打开通信(jrtc_open), 初始状态为 JRTC_OPENED
- * - A 主动激活媒体设备,以便自动接听
- * jrtc_activate(jc, JRTC_AUDIO|JRTC_CAMERA)
- *
- * 成功建立网络通道
- * - A 和 B 在服务器上对呼后连通, 通话状态都变为 JRTC_JOINED
- * - A 可以开始渲染镜头预览(渲染流程)
- *
- * 被叫流程
- * - B 收到A的音视频数据, 通话状态变为 JRTC_TALKING
- * - B 可以开始渲染对端视频(渲染流程)
- * - B 弹出接听提示, 若用户选择"拒接"则进入挂断流程
- * - B 在界面选择接听后, 也激活媒体设备
- * jrtc_activate(jc,JRTC_AUDIO|JRTC_CAMERA)
- *
- * 主叫流程
- * - A 在收到音视频数据后, 状态变为JRTC_TALKING
- * - A 也开始渲染对端视频(渲染流程)
- *
- * 挂断流程
- * - A 调用 jrtc_close 主动挂断
- * - B 通话状态将变为 JRTC_LEAVING 或 JRTC_CLOSED
- * - 通过 jrtc_error() 可以获取挂断的原因(出错值)
- * - B 调用 jrtc_close 结束通话
- *
- * 最简函数流程
- * - jrtc_config(...); // 配置环境,只需调用一次
- * - jc = jrtc_open(...);// 打开通话,返回对象
- * - jrtc_activate(jc,JRTC_AUDIO|JRTC_CAMERA);//激活设备
- * - 在 UI 线程,更新视频或预览,参考下面的`渲染流程'
- * - jrtc_close(jc, JRTC_EBYE); //主动挂断, 并且等待网络线程结束
- *
- * 收到来电中断的处理
- * - jrtc_close(jc, JRTC_EAUDIOCALL);//结束通话,等待网络线程结束
- */
-
-/** 通话状态 */
-enum jrtc_state
-{
- JRTC_CLOSED=0,/*< 初始状态 */
- JRTC_LEAVING, /*< jrtc_leave 或内部出错后的状态 */
- JRTC_OPENED, /*< 调用jrtc_open 后的状态 */
- JRTC_JOINING, /*< 加入中的状态 */
- JRTC_JOINED, /*< 成功加入会话 */
- JRTC_TALKING, /*< 收到媒体后的状态 */
-};
-
-/** 通话错误值 */
-enum jrtc_error
-{
- JRTC_ENIL = 0, /* unknown error */
- JRTC_EPERM = 1, /* Operation not permitted */
- JRTC_ENONET = 64, /* Machine is not on the network */
- JRTC_EPROTO = 71, /* Protocol error */
- JRTC_EMSGSIZE = 90, /* Message too long */
- JRTC_ECONNRESET=104, /* Connection reset by peer */
- JRTC_ETIMEDOUT =101, /* Connection timed out */
- JRTC_ECONNREFUSED=111,/* Connection refused or closed */
- JRTC_EDECLINE = 129, /* Peer decline the call */
- JRTC_EINVOKETIMEOUT = 130, /* IoTUnit invoke timeout */
- JRTC_ECALLSERVERERROR = 131, /* Call server error */
- JRTC_EROOMNOTFND = 132, /* Room or callee not found */
- JRTC_ECALLTIMEOUT = 133, /* Call timeout */
- JRTC_ENOTREG = 134, /* device id not registered */
- JRTC_ELOGIN = 135, /* device id login failed */
- JRTC_EAUDIOCALL = 252, /* external audio call, don't close audio deivce */
- JRTC_EAUDIO=253, /* Audio device error */
- JRTC_EVIDEO=254, /* Video device error */
- JRTC_EBYE = 255, /* Success, Closed by peer leave */
-};
-
-/** 通话中的媒体设备 */
-enum jrtc_device
-{
- JRTC_SPEAKER = 1,
- JRTC_MICROPHONE = 2,
- JRTC_CAMERA = 4,
- JRTC_AUDIO = 3,
-};
-
-/** 渲染流程:
- * jrtc_image_t* img 代表 jrtc_open 中传入 video 或 camera
- * - 检测当前为通话状态, 否则无须渲染
- * if (jrtc_state(jc) < JRTC_JOINED) break;
- *
- * - 内部自动更新图像:
- * if (img->get == img->put) {
- * '更新图像内容: 即对img中的data, width, height, format 赋值'
- * img->put++;//增加写计数
- * }
- *
- * - 上层UI线程(App 界面层)负责绘制图像:
- * if (img->get != img->put) {
- * '界面绘制操作: 即使用img中的data, 更新界面控件'
- * img->get = img->put;//增加读计数
- * }
- * 在 ASR原生 LittlevGL 的 lv_watch 界面中, 界面绘制操作:
- * // yuv420_2_rgb565 是内置的格式转换函数
- * //extern void yuv420_2_rgb565(int width, int height, const unsigned char *src, unsigned short *dst, unsigned semi);
- * yuv420_2_rgb565(img->width, img->height, img->data, img_dsc->data, img->format);
- * lv_img_set_src(img, img_dsc);//img, img_dsc 都是界面中的相应UI控件,
- *
- *
- * 在jrtc_open()中用于设置建议值, 通话过程中用于获取图像数据.
- * 例如, 希望接收和发送都是176x144 8帧/秒, 120 kbps 的音视频通话:
- * static struct jrtc_image_t video, camera;
- * video.width = camera.width = 176;
- * video.height = camera.height = 144;
- * video.fps = camera.fps = 8;
- * video.kbps = camera.kbps = 120;
- * //注意,以上仅是建议值, 在最终接通时, 由服务器决定实际值
- *
- * jc = jrtc_open(roomid, 0, &video, &camera);
- */
-struct jrtc_image_t
-{
- void* data;
- unsigned short width, height, kbps;
- char fps;
- char format;/*< 0: I420; 1: NV12 */
- volatile char put, get;
-};
-
-/** 当前的版本号 */
-#define JRTC_VERTION "1.4.0"
-
-/** 配置全局参数,只需调用一次.
- * 注意: 内部直接引用地址, 由外部保证内存的有效性.
- *
- * @param[in] appkey 当前APP特有的标识, 需向Juphoon申请获得
- * @param[in] uid 账户
- * @param[in] srvURL 服务器地址
- * @param[in] key 通讯密钥, 必须与appkey匹配, 需向Juphoon申请或注册
- */
-void jrtc_config (const char* appkey, const char* uid, const char* srvURL, const char key[16]);
-
-/** 分配通话资源并启动网络线程
- * 注意:
- * - 内部直接引用地址,由外部保证内存的有效性
- * - 内部设备初始没有激活,后续需要调如下开启
- * jrtc_activate(jc,JRTC_AUDIO|JRTC_CAMERA)
- *
- * ticket 作为通话ID, 唯一标识每次通话:
- * - 不能包含JSON需转义的字符
- * - 每次通话, 要使用不同的 ticket,(随机产生或向服务器申请)
- * - A 呼叫前,申请获得 ticket
- * - A 需要通"某种推送机制"(长连接,推送方式) 将 ticket 通知到B
- * - A 和B 对呼时, 必须使用相同的ticket, 以便服务器精确标识会话
- *
- * @param[in] roomid 加入的房间号(对方账户)
- * @param[in] ticket 用于房间的hash值,可通过其他路径获得,默认为NULL,仅用于调试.
- * @param[in] video 期望接收的视频尺寸和帧速,码率. 若 NULL,则不接收视频
- * @param[in] camera 用于预览图像,建议的发送尺寸和帧速,码率. 若 NULL, 则不使用镜头.
- * 最终的视频尺寸和镜头的尺寸,都由服务器协商决定.
- */
-struct jrtc_t* jrtc_open (const char* roomid, const char* ticket, struct jrtc_image_t* video, struct jrtc_image_t* camera);
-
-/** 释放通话资源,并等待网络线程结束.
- *
- * @param[in] err 主动挂断为 JRTC_EBYE
- * 但当语音电话中断时, 须设置为JRTC_EAUDIOCALL,
- * 其他未知情况,可设置为 JRTC_ENIL(不修改挂断原因)
- */
-void jrtc_close (struct jrtc_t* jc, enum jrtc_error err);
-
-/** 动态设置前后镜头
- * @param[in] camera 0为后镜头,1是前镜头
- */
-void jrtc_set_camera (struct jrtc_t* jc, int camera);
-
-/** 激活设备, 开启发送能力
- * @param[in] devices jrtc_device 的集合
- */
-void jrtc_activate (struct jrtc_t* jc, int devices);
-
-/** 禁活设备, 关闭发送能力
- * @param[in] devices jrtc_device 的集合
- */
-void jrtc_deactivate (struct jrtc_t* jc, int devices);
-
-/** 返回通话状态 */
-enum jrtc_state jrtc_state (const struct jrtc_t *jc);
-
-/** 返回最近的出错值 */
-enum jrtc_error jrtc_error (const struct jrtc_t *jc);
-
-#ifdef __cplusplus
-}
-#endif
-#endif