AssignSrcDataThread.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #ifndef _ASSIGNSRCDATATHREAD_H_
  2. #define _ASSIGNSRCDATATHREAD_H_
  3. #include "BaseRecordThread.h"
  4. #include <condition_variable>
  5. #include <cstdint>
  6. #include <QList>
  7. #include <QReadWriteLock>
  8. struct AudioSrcData;
  9. class RecordThread;
  10. class CreateDBThread;
  11. class CreateWAVThread;
  12. class CreateLongFileThread;
  13. /**
  14. 线程功能:
  15. 1、获取小于1s的数据,将其拼接成1s大小的数据,并配上这段数据开始时间(由数据大小推算而来)
  16. 2、线程等待不再使用线程休眠的方式,使用条件变量休眠线程,有数据后可以立马唤醒线程
  17. 3、常规分发数据: 将拼接好的数据分发给各个数据处理线程,满1秒就分发一次
  18. 4、实时分发数据: 收到数据后立马进行转发
  19. */
  20. class AssignSrcDataThread : public BaseRecordThread
  21. {
  22. public:
  23. AssignSrcDataThread(RecordThreadInfo_t& threadInfo);
  24. ~AssignSrcDataThread() override;
  25. /* 停止线程 */
  26. void stopThread() override;
  27. /* 设置数据,这里不用 */
  28. bool setData(const AudioSrcData& srcData) override;
  29. /* 设置数据,输入小于1秒的数据 */
  30. bool setSrcData(const char* srcData, int32_t dataSize, QDateTime& endTime);
  31. protected:
  32. /* 线程任务函数 */
  33. void task() override;
  34. /* 初始化一些数据 */
  35. bool initData() override;
  36. /* 清理数据 */
  37. void clearData() override;
  38. private:
  39. /* 获取需要分派数据的线程 */
  40. bool getDispatchThread();
  41. /* ---------------------- 发送常规音量 ---------------------- */
  42. /* 发送常规数据,对实时性要求不高的数据,数据时长1秒 */
  43. void sendRegularData(const AudioSrcData& srcData);
  44. /* 判断是否满足1秒的数据 */
  45. bool isFullOneSecondData() const;
  46. /* 处理数据,将数据分配成1秒的小数据 */
  47. bool processData();
  48. /* ---------------------- 发送实时音频数据 ---------------------- */
  49. /* 发送实时音频数据 */
  50. void sendRealTimeSrcData(const AudioSrcData& srcData);
  51. /* 发送原始数据到Rtp中,实时发送,有新的就发送 */
  52. inline void sendSrcDataToRtp(const AudioSrcData& srcData);
  53. private:
  54. /* 条件变量 */
  55. std::atomic_bool m_isDataUpdate = false; /* 数据更新标志,数据更新时设置为true */
  56. std::condition_variable m_condDataUpdate; /* 数据更新条件变量 */
  57. std::mutex m_mutexDataUpdate; /* 数据更新互斥锁 */
  58. /* ---------------------- 数据缓存列表 ---------------------- */
  59. // QReadWriteLock m_pRwLock; /* 读写锁,保护数据的读写 */
  60. QList<AudioSrcData*> m_listAudioSrcData; /* 数据缓存列表,这里使用QList,可以使用[]运算符 */
  61. int32_t m_listDataSize = 0; /* 缓存中的数据是否满1秒大小 */
  62. AudioSrcData* m_dispatchSrcData = nullptr; /* 分发的数据,1秒大小 */
  63. AudioSrcData* m_pCurrentSrcData = nullptr; /* 当前处理的数据 */
  64. int32_t m_remainingDataSize = 0; /* 当前的AudioSrcData剩余可用数据的大小 */
  65. /* ---------------------- 录音线程指针 ---------------------- */
  66. RecordThread* m_pThreadRecord = nullptr; /* 录音线程 */
  67. /* ---------------------- RTP发送相关变量 ---------------------- */
  68. BaseRecordThread* m_rtpSenderThread = nullptr; /* RTP发送线程 */
  69. QDateTime m_lastSendTime; /* 上次发送数据的时间 */
  70. /* ---------------------- 计算音量的线程 ---------------------- */
  71. CreateDBThread* m_pThreadCreateDB = nullptr; /* 创建音量的线程 */
  72. /* ---------------------- 生成Wav小文件的线程 ---------------------- */
  73. CreateWAVThread* m_pThreadCreateWAV = nullptr; /* 创建Wav小文件的线程 */
  74. /* ---------------------- 生成长文件的线程 ---------------------- */
  75. CreateLongFileThread* m_pThreadCreateLongFile = nullptr; /* 创建长文件的线程 */
  76. };
  77. #endif // _ASSIGNSRCDATATHREAD_H_