RtpOneRoadThread.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 <QTimer>
  10. #include <qobject.h>
  11. #include <qobjectdefs.h>
  12. #include <mutex>
  13. #include "Rtpcommon.h"
  14. /**
  15. 一路RTP数据发送服务,一路表示的是一个录音通道,也是一个子线程
  16. 工作方式:
  17. 1、这个其实也是一个录音处理线程,分派录音的线程给这里传递数据
  18. 2、这个线程有一个UDP会话列表,会挨个往监听的客户端发送数据,如果客户端列表为空
  19. 则不再接收原始音频数据
  20. 3、这个线程在打开一个录音通道后就会创建,在后台运行,直到RTP服务设置进来一个UDP会话
  21. 4、这个线程类会被 RTPServer 线程和 AssignSrcData 线程调用
  22. 5、这个线程添加会话后会占用一个本地的UDP端口,所有会话移除掉后会释放这个端口
  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(QString clientIP, quint16 clientPort);
  38. signals:
  39. /* 一个UDP关闭了,通知RTP服务,释放掉了一个本地端口 */
  40. void signal_udpClosed(int soundCardNum, int roadNum, int localPort);
  41. protected:
  42. /* 任务函数 */
  43. void task() override;
  44. /* 初始化数据 */
  45. bool initData() override;
  46. /* 清除数据*/
  47. void clearData() override;
  48. /* 处理UDP状态 */
  49. bool processUdpState();
  50. /* */
  51. /* 发送数据 */
  52. bool sendData();
  53. private slots:
  54. /* 定时发送数据 */
  55. void do_timerSendData();
  56. /* UDP错误槽函数 */
  57. void do_udpError(QAbstractSocket::SocketError socketError);
  58. private:
  59. /* 事件循环 */
  60. QEventLoop m_eventLoop;
  61. QTimer m_sendTimer; /* 定时器,用于定时发送数据 */
  62. QUdpSocket* m_udpSocket = nullptr; /* 用于发送数据的UDP套接字 */
  63. QString m_localIP; /* 本地IP */
  64. int m_localPort = -1; /* 本地发送数据的UDP端口 */
  65. eUDPState m_udpState = eUDPState::eUDP_None; /* UDP状态 */
  66. /* UDP会话列表 */
  67. std::atomic_bool m_isRecvData = false; /* 是否接收数据的标志 */
  68. std::mutex m_lockClients; /* 用于保护客户端列表的锁 */
  69. QList<RtpSendClientInfo_t> m_listClients; /* 用于发送数据的客户端信息列表 */
  70. RingQueue<AudioSrcData*> m_ringQueue; /* 用于存储音频数据的环形队列 */
  71. };
  72. #endif // __RTPONEROAD_H__