1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #ifndef __RTPONEROAD_H__
- #define __RTPONEROAD_H__
- #include "GlobalVariable.h"
- #include "BaseRecordThread.h"
- #include "AudioData.h"
- #include "RingQueue.hpp"
- #include <QEventLoop>
- #include <QUdpSocket>
- #include <QMutex>
- #include <QTimer>
- #include <qobject.h>
- #include <qobjectdefs.h>
- #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<RtpSendClientInfo_t> m_listUdpSockets; /* 用于发送数据的UDP套接字列表 */
- RingQueue<AudioSrcData*> m_ringQueue; /* 用于存储音频数据的环形队列 */
- };
- #endif // __RTPONEROAD_H__
|