#ifndef _CREATEWAVTHREAD_H_ #define _CREATEWAVTHREAD_H_ #include "BaseRecordThread.h" #include "RingQueue.hpp" #include "RingQueueManualMutex.hpp" #include "AudioData.h" #include struct AudioSrcData; /** * @brief 生成wav小文件的线程 * 1、这里有一个环形队列,存储音频数据,队列中的每个元素大小是1秒的数据,队列默认60个元素 * 2、这个线程也会生成噪音检测所需要的数据,主要是分离左右声道 * */ class CreateWAVThread : public BaseRecordThread { public: CreateWAVThread(RecordThreadInfo_t& threadInfo); ~CreateWAVThread() override; /* 设置数据 */ bool setData(const AudioSrcData& srcData) override; /* 获取wav小文件路径队列 */ RingQueueManualMutex* getQueueWavFilePath() { return m_queueWavFileName; } /* 获取最新的数据 */ bool getLatestFileName(WavFilePath& wavName); /* 获取最新的左右声道数据 */ bool getLatestLeftRightData(AudioLeftRightData& leftRightData); private: /* 执行任务函数 */ void task() override; /* 初始化一些数据 */ bool initData() override; /* 清理数据 */ void clearData() override; /* 生成wav小文件 */ bool createWAVFile(int secondCount); /* 删除wav小文件,传入留下的个数 */ void deleteWAVFile(int remainCount); /* 从删除列表中删除wav小文件 */ void removeWAVFileFromList(std::list& listDeleteFile); /* 将每秒的数据拆解成两个声道,给噪音检测线程使用 */ bool splitLeftRightChannel(); private: QDir m_wavDir; /* 当前目录 */ RingQueue m_queueWavSrcData; /* 给生成wav小文件用的环形队列 */ RingQueue m_queueLeftRightSrcData; /* 给分离左右声道用的环形队列 */ int32_t m_wavFileDuration = 0; /* wav小文件时长,单位:秒 */ int32_t m_noiseElementDuration = 0; /* 噪音检测元素大小,单位:秒 */ std::list m_listDeleteFile; /* 将要删除的文件名列表 */ std::string m_newFileName; /* 新文件名 */ QDateTime m_newFileStartTime; /* 新文件开始时间 */ int m_filePathNum = 60; /* wav小文件路径队列的容量,默认60个文件 */ /* wav小文件路径队列,这个队列只给一致性检测线程用 * 注意:这个队列可能会给多个一致性线程检测使用,队列中的元素由本线程管理删除, * 其他线程只能copy出去 */ RingQueueManualMutex* m_queueWavFileName = nullptr; RingQueueManualMutex m_queueLeftRightData; /* 左右声道数据的环形队列 */ }; #endif // _CREATEWAVTHREAD_H_