RtpOneRoadThread.h 3.1 KB

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