CreateWAVThread.h 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. /* 获取wav小文件路径队列 */
  23. RingQueueManualMutex<WavFilePath>* getQueueWavFilePath() { return m_queueWavFileName; }
  24. /* 获取最新的数据 */
  25. bool getLatestFileName(WavFilePath& wavName);
  26. /* 获取最新的左右声道数据 */
  27. bool getLatestLeftRightData(AudioLeftRightData& leftRightData);
  28. private:
  29. /* 执行任务函数 */
  30. void task() override;
  31. /* 初始化一些数据 */
  32. bool initData() override;
  33. /* 清理数据 */
  34. void clearData() override;
  35. /* 生成wav小文件 */
  36. bool createWAVFile(int secondCount);
  37. /* 删除wav小文件,传入留下的个数 */
  38. void deleteWAVFile(int remainCount);
  39. /* 从删除列表中删除wav小文件 */
  40. void removeWAVFileFromList(std::list<WavFilePath>& listDeleteFile);
  41. /* 将每秒的数据拆解成两个声道,给噪音检测线程使用 */
  42. bool splitLeftRightChannel();
  43. private:
  44. QDir m_wavDir; /* 当前目录 */
  45. RingQueue<AudioSrcData*> m_queueWavSrcData; /* 给生成wav小文件用的环形队列 */
  46. RingQueue<AudioSrcData*> m_queueLeftRightSrcData; /* 给分离左右声道用的环形队列 */
  47. int32_t m_wavFileDuration = 0; /* wav小文件时长,单位:秒 */
  48. int32_t m_noiseElementDuration = 0; /* 噪音检测元素大小,单位:秒 */
  49. std::list<WavFilePath> m_listDeleteFile; /* 将要删除的文件名列表 */
  50. std::string m_newFileName; /* 新文件名 */
  51. QDateTime m_newFileStartTime; /* 新文件开始时间 */
  52. int m_filePathNum = 60; /* wav小文件路径队列的容量,默认60个文件 */
  53. /* wav小文件路径队列,这个队列只给一致性检测线程用
  54. * 注意:这个队列可能会给多个一致性线程检测使用,队列中的元素由本线程管理删除,
  55. * 其他线程只能copy出去 */
  56. RingQueueManualMutex<WavFilePath>* m_queueWavFileName = nullptr;
  57. RingQueueManualMutex<AudioLeftRightData*> m_queueLeftRightData; /* 左右声道数据的环形队列 */
  58. };
  59. #endif // _CREATEWAVTHREAD_H_