#ifndef _CREATELONGFILETHREAD_H_ #define _CREATELONGFILETHREAD_H_ #include "BaseRecordThread.h" #include "AudioData.h" #include #include #include /** * @brief 这个线程类记录一个长的录音文件,1小时一个文件 * 1、如果是刚开始录音,到下一个整点记录一个文件,后续都是满1小时一个文件 * 2、数据先放到缓冲区中,满1分钟写一次文件 * */ class CreateLongFileThread : public BaseRecordThread { public: CreateLongFileThread(RecordThreadInfo_t& threadInfo); ~CreateLongFileThread() override; /* 设置数据 */ bool setData(const AudioSrcData& srcData) override; private: /* 执行任务函数 */ void task() override; /* 初始化一些数据 */ bool initData() override; /* 清理数据 */ void clearData() override; /* 设置今日目录 */ inline bool setTodayPath(bool isNewFile); /* 打开文件 */ bool openFile(QFile& wavFile, bool isNewFile); /* 写入音频数据到文件 */ bool writeAudioDataToFile(const AudioSrcData& audioData, const QString& fileName); /* 生成文件名 */ inline QString generateFileName(const QDateTime& startTime, const QDateTime& endTime) const; /* 判断是否过了整点 */ inline bool isOneHourPassed(); private: /* 临时缓存数据, 一分钟写入一次,给这个分配2分钟的数据大小 */ std::mutex m_mutexBuffer; AudioSrcData m_bufferData; AudioSrcData m_srcData; /* 当前的音频数据 */ int32_t m_writeCriticalSize = 0; /* 写入文件的临界大小,单位:字节,缓存超过这个大小就写入文件 */ int32_t m_oneHourSize = 0; /* 一小时的音频数据大小 */ int m_openFileErrorSize = 0; /* 打开文件错误次数 */ QString m_recordPath; /* 记录长文件的路径 */ QDir m_todayDir; /* 今日目录 */ QString m_wavFileName; /* wav文件对象 */ WavHeader m_wavHeader; /* 当前wav文件头信息 */ int64_t m_writtenSize = 0; /* 已经写入的数据大小 */ QDateTime m_writtenStartTime; /* 已经写入数据的开始时间点 */ QDateTime m_writtenNowTime; /* 已经写入数据的最后时间点 */ }; #endif // _CREATELONGFILETHREAD_H_