AssignSrcDataThread.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #ifndef _ASSIGNSRCDATATHREAD_H_
  2. #define _ASSIGNSRCDATATHREAD_H_
  3. #include "BaseRecordThread.h"
  4. #include <cstdint>
  5. #include <list>
  6. #include <QReadWriteLock>
  7. struct AudioSrcData;
  8. class RecordThread;
  9. /**
  10. * 线程功能:
  11. * 1、获取小于1s的数据,将其拼接成1s大小的数据,并配上这段数据开始时间(由数据大小推算而来)
  12. * 2、将拼接好的数据分发给各个数据处理线程,满1秒就分发一次
  13. */
  14. class AssignSrcDataThread : public BaseRecordThread
  15. {
  16. public:
  17. AssignSrcDataThread(RecordThreadInfo_t& threadInfo);
  18. ~AssignSrcDataThread() override;
  19. /* 设置数据,这里不用 */
  20. bool setData(const AudioSrcData& srcData) override;
  21. /* 设置数据,输入小于1秒的数据 */
  22. bool setSrcData(const char* srcData, int32_t dataSize, QDateTime& endTime);
  23. protected:
  24. /* 线程任务函数 */
  25. void task() override;
  26. /* 初始化一些数据 */
  27. bool initData() override;
  28. /* 清理数据 */
  29. void clearData() override;
  30. private:
  31. /* 获取需要分派数据的线程 */
  32. bool getDispatchThread();
  33. /* 判断是否满足1秒的数据 */
  34. bool isFullOneSecondData() const;
  35. /* 处理数据,将数据分配成1秒的小数据 */
  36. bool processData();
  37. /* 发送原始数据到Rtp中,实时发送,有新的就发送 */
  38. void sendSrcDataToRtp();
  39. private:
  40. /* 需要分配数据的线程指针集合 */
  41. std::list<BaseRecordThread*> m_listDispatchThreads;
  42. RecordThread* m_pRecordThread = nullptr; /* 录音线程 */
  43. BaseRecordThread* m_rtpSenderThread = nullptr; /* RTP发送线程 */
  44. AudioSrcData* m_pSendSrcData = nullptr; /* 已发送的数据,用牌判断是否有新数据了 */
  45. QReadWriteLock* m_pRwLock = nullptr; /* 读写锁,保护数据的读写 */
  46. std::list<AudioSrcData*> m_listAudioSrcData; /* 数据缓存列表 */
  47. int32_t m_listDataSize = 0; /* 缓存中的数据是否满1秒大小 */
  48. AudioSrcData* m_dispatchSrcData = nullptr; /* 分发的数据,1秒大小 */
  49. AudioSrcData* m_pCurrentSrcData = nullptr; /* 当前处理的数据 */
  50. int32_t m_remainingDataSize = 0; /* 当前的AudioSrcData剩余可用数据的大小 */
  51. };
  52. #endif // _ASSIGNSRCDATATHREAD_H_