AssignSrcDataThread.h 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. /* 判断是否满足1秒的数据 */
  42. bool isFullOneSecondData() const;
  43. /* 处理数据,将数据分配成1秒的小数据 */
  44. bool processData();
  45. /* 发送原始数据到Rtp中,实时发送,有新的就发送 */
  46. void sendSrcDataToRtp(const AudioSrcData& srcData);
  47. /* 发送常规数据,对实时性要求不高的数据,数据时长1秒 */
  48. void sendRegularData(const AudioSrcData& srcData);
  49. private:
  50. /* 条件变量 */
  51. std::atomic_bool m_isDataUpdate = false; /* 数据更新标志,数据更新时设置为true */
  52. std::condition_variable m_condDataUpdate; /* 数据更新条件变量 */
  53. std::mutex m_mutexDataUpdate; /* 数据更新互斥锁 */
  54. /* ---------------------- 数据缓存列表 ---------------------- */
  55. // QReadWriteLock m_pRwLock; /* 读写锁,保护数据的读写 */
  56. QList<AudioSrcData*> m_listAudioSrcData; /* 数据缓存列表,这里使用QList,可以使用[]运算符 */
  57. int32_t m_listDataSize = 0; /* 缓存中的数据是否满1秒大小 */
  58. AudioSrcData* m_dispatchSrcData = nullptr; /* 分发的数据,1秒大小 */
  59. AudioSrcData* m_pCurrentSrcData = nullptr; /* 当前处理的数据 */
  60. int32_t m_remainingDataSize = 0; /* 当前的AudioSrcData剩余可用数据的大小 */
  61. /* ---------------------- 录音线程指针 ---------------------- */
  62. RecordThread* m_pThreadRecord = nullptr; /* 录音线程 */
  63. /* ---------------------- RTP发送相关变量 ---------------------- */
  64. BaseRecordThread* m_rtpSenderThread = nullptr; /* RTP发送线程 */
  65. QDateTime m_lastSendTime; /* 上次发送数据的时间 */
  66. /* ---------------------- 计算音量的线程 ---------------------- */
  67. CreateDBThread* m_pThreadCreateDB = nullptr; /* 创建音量的线程 */
  68. /* ---------------------- 生成Wav小文件的线程 ---------------------- */
  69. CreateWAVThread* m_pThreadCreateWAV = nullptr; /* 创建Wav小文件的线程 */
  70. /* ---------------------- 生成长文件的线程 ---------------------- */
  71. CreateLongFileThread* m_pThreadCreateLongFile = nullptr; /* 创建长文件的线程 */
  72. };
  73. #endif // _ASSIGNSRCDATATHREAD_H_