AssignSrcDataThread.h 2.2 KB

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