CreateWAVThread.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #ifndef _CREATEWAVTHREAD_H_
  2. #define _CREATEWAVTHREAD_H_
  3. #include "BaseRecordThread.h"
  4. #include "RingQueue.hpp"
  5. #include "RingQueueManualMutex.hpp"
  6. #include "AudioData.h"
  7. #include <QDir>
  8. struct AudioSrcData;
  9. /**
  10. * @brief 生成wav小文件的线程
  11. * 1、这里有一个环形队列,存储音频数据,队列中的每个元素大小是1秒的数据,队列默认60个元素
  12. * 2、这个线程也会生成噪音检测所需要的数据,主要是分离左右声道
  13. *
  14. */
  15. class CreateWAVThread : public BaseRecordThread
  16. {
  17. public:
  18. CreateWAVThread(RecordThreadInfo_t& threadInfo);
  19. ~CreateWAVThread() override;
  20. /* 设置数据 */
  21. bool setData(const AudioSrcData& srcData) override;
  22. /* 获取最新的数据 */
  23. bool getLatestFileName(WavFilePath& wavName);
  24. /* 获取最新的左右声道数据 */
  25. bool getLatestLeftRightData(AudioLeftRightData& leftRightData);
  26. private:
  27. /* 执行任务函数 */
  28. void task() override;
  29. /* 初始化一些数据 */
  30. bool initData() override;
  31. /* 清理数据 */
  32. void clearData() override;
  33. /* 生成wav小文件 */
  34. bool createWAVFile(int secondCount);
  35. /* 删除wav小文件,传入留下的个数 */
  36. void deleteWAVFile(int remainCount);
  37. /* 从删除列表中删除wav小文件 */
  38. void removeWAVFileFromList(std::list<WavFilePath>& listDeleteFile);
  39. /* 将每秒的数据拆解成两个声道,给噪音检测线程使用 */
  40. bool splitLeftRightChannel();
  41. private:
  42. QDir m_wavDir; /* 当前目录 */
  43. RingQueue<AudioSrcData*> m_queueWavSrcData; /* 给生成wav小文件用的环形队列 */
  44. RingQueue<AudioSrcData*> m_queueLeftRightSrcData; /* 给分离左右声道用的环形队列 */
  45. int32_t m_wavFileDuration = 0; /* wav小文件时长,单位:秒 */
  46. int32_t m_noiseElementDuration = 0; /* 噪音检测元素大小,单位:秒 */
  47. std::list<WavFilePath> m_listDeleteFile; /* 将要删除的文件名列表 */
  48. int m_filePathNum = 60; /* wav小文件路径队列的容量,默认60个文件 */
  49. /* wav小文件路径队列,这个队列只给一致性检测线程用
  50. * 注意:这个队列可能会给多个一致性线程检测使用,队列中的元素由本线程管理删除,
  51. * 其他线程只能copy出去 */
  52. RingQueueManualMutex<WavFilePath> m_queueWavFileName;
  53. RingQueueManualMutex<AudioLeftRightData*> m_queueLeftRightData; /* 左右声道数据的环形队列 */
  54. int m_numLeftRight = 10; /* 这个队列占用内存非常多,因此设置数目小一些 */
  55. };
  56. #endif // _CREATEWAVTHREAD_H_