RtpOneRoadThread.h 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 <string>
  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. 注:UDP端口是随机分配的,目前不需要指定
  24. */
  25. class RTPOneRoadThread : public QObject, public BaseRecordThread
  26. {
  27. Q_OBJECT
  28. public:
  29. RTPOneRoadThread(RecordThreadInfo_t& threadInfo);
  30. ~RTPOneRoadThread() override;
  31. /* 停止线程 */
  32. void stopThread() override;
  33. /* 设置数据 */
  34. bool setData(const AudioSrcData& srcData) override;
  35. /* 添加一个UDP会话 */
  36. bool addUdpSession(const RtpSendClientInfo_t& udpSession);
  37. /* 删除一个会话 */
  38. bool removeUdpSession(QString clientIP, quint16 clientPort);
  39. signals:
  40. /* 一个UDP关闭了,通知RTP服务,释放掉了一个本地端口 */
  41. void signal_udpClosed(std::string pcmName);
  42. /* 用来触发槽函数 do_timerSendData 用于立刻处理UDP状态 */
  43. void signal_timerSendData();
  44. protected:
  45. /* 任务函数 */
  46. void task() override;
  47. /* 初始化数据 */
  48. bool initData() override;
  49. /* 清除数据*/
  50. void clearData() override;
  51. /* 处理UDP状态 */
  52. bool processUdpState();
  53. /* 发送数据 */
  54. bool sendData();
  55. private slots:
  56. /* 定时发送数据 */
  57. void do_timerSendData();
  58. /* UDP错误槽函数 */
  59. void do_udpError(QAbstractSocket::SocketError socketError);
  60. private:
  61. /* 事件循环 */
  62. QEventLoop m_eventLoop;
  63. QTimer m_sendTimer; /* 定时器,用于定时发送数据 */
  64. QUdpSocket* m_udpSocket = nullptr; /* 用于发送数据的UDP套接字 */
  65. QString m_localIP; /* 本地IP */
  66. // int m_localPort = -1; /* 本地发送数据的UDP端口 */
  67. eUDPState m_udpState = eUDPState::eUDP_None; /* UDP状态 */
  68. /* UDP会话列表 */
  69. std::atomic_bool m_isRecvData = false; /* 是否接收数据的标志 */
  70. std::mutex m_lockClients; /* 用于保护客户端列表的锁 */
  71. QList<RtpSendClientInfo_t> m_listClients; /* 用于发送数据的客户端信息列表 */
  72. RingQueue<AudioSrcData*> m_ringQueue; /* 用于存储音频数据的环形队列 */
  73. };
  74. #endif // __RTPONEROAD_H__