SRS 对 StateThreads 的封装都在 srs_app_st.hpp、srs_app_st.cpp 里面,这个文件里面的 class 类结构之间的关系如下:
SrsSTCoroutine 可以说就是 SRS 封装 StateThreads 之后提供的外部接口类。
如果你想创建一个协程服务,首先,你需要让你的类继承 ISrsCoroutineHandler,然后实现自己的 cycle() 方法,他内部最终会创建一个协程来运行你的 cycle() 方法。
以 SrsSignalManager 信号处理模块为例,他的类定义如下:
class SrsSignalManager : public ISrsCoroutineHandler
SrsSignalManager 的 cycle 函数如下:
不过需要注意的是 SrsSignalManager 并没有继承 SrsSTCoroutine,SrsSTCoroutine 是作为 trd 变量在 SrsSignalManager 里面存在的,如下:
//创建协程
trd = new SrsSTCoroutine("signal", this, _srs_context->get_id());
//启动协程
trd->start();
上面的 this 就是 SrsSignalManager 本身,这样就把 SrsSignalManager 作为一个 handler 绑定到 SrsFastCoroutine 里面了,最后会启动一个协程执行 this 里面的 cycle() 函数,流程图如下:
SrsSignalManager 是一个比较好的示例模块,代码比较短,如果你想创建一个新的模块,可以把 SrsSignalManager 复制一份来修改。
本文的第一张图片里面有一个 SrsDummyCoroutine 类,SrsDummyCoroutine 的设计有点不太好理解,其实他使用的是 empty object 设计模式,就是一个空的对象,里面的 start()、stop() 等函数都是空的。
以 HTTP API 模块为例,他的用法如下:
其实跟之前的区别就是, new SrsDummyCoroutine 变成了 new SrsSTCoroutine。但是这个 SrsDummyCoroutine 实例最后是会被释放的,然后重新用 SrsSTCoroutine 实例来替代的,如下:
SrsDummyCoroutine 应该是在某些动态创建协程的场景有用,这部分内容后面再继续补充。
本文是《 SRS原理 》一书中的文章,如需观看更多内容,请购买本书。