RtpOneRoadThread.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #ifndef __RTPONEROAD_H__
  2. #define __RTPONEROAD_H__
  3. #include "GlobalVariable.h"
  4. #include "BaseRecordThread.h"
  5. #include "AudioData.h"
  6. #include "RingQueue.hpp"
  7. #include <QEventLoop>
  8. #include <QUdpSocket>
  9. #include <QMutex>
  10. #include <QTimer>
  11. #include <qobject.h>
  12. #include <qobjectdefs.h>
  13. #include "Rtpcommon.h"
  14. /**
  15. * 一路RTP数据发送服务,一路表示的是一个录音通道,也是一个子线程
  16. * 工作方式:
  17. * 1、这个其实也是一个录音处理线程,分派录音的线程给这里传递数据
  18. * 2、这个线程有一个UDP会话列表,会挨个往监听的客户端发送数据,如果客户端列表为空
  19. * 则不再接收原始音频数据
  20. * 3、这个线程在打开一个录音通道后就会创建,在后台运行,直到RTP服务设置进来一个UDP会话
  21. * 4、这个线程类会被 RTPServer 线程和 AssignSrcData 线程调用
  22. *
  23. */
  24. class RTPOneRoadThread : public QObject, public BaseRecordThread
  25. {
  26. Q_OBJECT
  27. public:
  28. RTPOneRoadThread(RecordThreadInfo_t& threadInfo);
  29. ~RTPOneRoadThread() override;
  30. /* 停止线程 */
  31. void stopThread() override;
  32. /* 设置数据 */
  33. bool setData(const AudioSrcData& srcData) override;
  34. /* 添加一个UDP会话 */
  35. bool addUdpSession(const RtpSendClientInfo_t& udpSession);
  36. /* 删除一个会话 */
  37. bool removeUdpSession(const RtpSendClientInfo_t& udpSession);
  38. protected:
  39. /* 任务函数 */
  40. void task() override;
  41. /* 初始化数据 */
  42. bool initData() override;
  43. /* 清除数据*/
  44. void clearData() override;
  45. /* 发送数据 */
  46. bool sendData();
  47. private slots:
  48. /* 定时发送数据 */
  49. void do_timerSendData();
  50. private:
  51. /* 事件循环 */
  52. QEventLoop m_eventLoop;
  53. QTimer m_sendTimer; /* 定时器,用于定时发送数据 */
  54. /* UDP会话列表 */
  55. std::atomic_bool m_isRecvData = false; /* 是否接收数据的标志 */
  56. QMutex m_lockUdpSockets; /* 用于保护UDP套接字列表的读写锁 */
  57. QList<RtpSendClientInfo_t> m_listUdpSockets; /* 用于发送数据的UDP套接字列表 */
  58. RingQueue<AudioSrcData*> m_ringQueue; /* 用于存储音频数据的环形队列 */
  59. };
  60. #endif // __RTPONEROAD_H__