#ifndef __RTPONEROAD_H__ #define __RTPONEROAD_H__ #include "GlobalVariable.h" #include "BaseRecordThread.h" #include "AudioData.h" #include "RingQueue.hpp" #include #include #include #include #include #include #include "Rtpcommon.h" /** * 一路RTP数据发送服务,一路表示的是一个录音通道,也是一个子线程 * 工作方式: * 1、这个其实也是一个录音处理线程,分派录音的线程给这里传递数据 * 2、这个线程有一个UDP会话列表,会挨个往监听的客户端发送数据,如果客户端列表为空 * 则不再接收原始音频数据 * 3、这个线程在打开一个录音通道后就会创建,在后台运行,直到RTP服务设置进来一个UDP会话 * 4、这个线程类会被 RTPServer 线程和 AssignSrcData 线程调用 * */ class RTPOneRoadThread : public QObject, public BaseRecordThread { Q_OBJECT public: RTPOneRoadThread(RecordThreadInfo_t& threadInfo); ~RTPOneRoadThread() override; /* 停止线程 */ void stopThread() override; /* 设置数据 */ bool setData(const AudioSrcData& srcData) override; /* 添加一个UDP会话 */ bool addUdpSession(const RtpSendClientInfo_t& udpSession); /* 删除一个会话 */ bool removeUdpSession(const RtpSendClientInfo_t& udpSession); protected: /* 任务函数 */ void task() override; /* 初始化数据 */ bool initData() override; /* 清除数据*/ void clearData() override; /* 发送数据 */ bool sendData(); private slots: /* 定时发送数据 */ void do_timerSendData(); private: /* 事件循环 */ QEventLoop m_eventLoop; QTimer m_sendTimer; /* 定时器,用于定时发送数据 */ /* UDP会话列表 */ std::atomic_bool m_isRecvData = false; /* 是否接收数据的标志 */ QMutex m_lockUdpSockets; /* 用于保护UDP套接字列表的读写锁 */ QList m_listUdpSockets; /* 用于发送数据的UDP套接字列表 */ RingQueue m_ringQueue; /* 用于存储音频数据的环形队列 */ }; #endif // __RTPONEROAD_H__