SRS对StateThreads的封装—SRS源码分析
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
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 应该是在某些动态创建协程的场景有用,这部分内容后面再继续补充。
