#ifndef _CREATEDBTHREAD_H_ #define _CREATEDBTHREAD_H_ #include "BaseRecordThread.h" #include "RingQueue.hpp" #include "RingQueueManualMutex.hpp" #include "AudioData.h" struct AudioSrcData; /** * 这个功能线程计算出音量的线程,给音量报警线程使用 * */ class CreateDBThread : public BaseRecordThread { public: CreateDBThread(RecordThreadInfo_t& threadInfo); ~CreateDBThread() override; /* 设置数据 */ bool setData(const AudioSrcData& srcData) override; /* 设置实时数据 */ bool setRealTimeData(const AudioSrcData& srcData); /* 获取结果的环形队列 */ RingQueueManualMutex* getResultQueue() { return m_queueResultData; } /* 获取最新的结果,根据时间进行对比,最新的时间比传入的晚,就是有新的数据了 */ bool getLatestResult(OneSecondData& resultData); /* 获取最新的结果,让整个环形队列相等 */ bool getLatestResult(RingQueueManualMutex& resultQueue); /* 获取最新的音量包结果,count等于负数是获取所有数据,等于正数,如果暂时没有这么多数据,则返回false */ bool getLatestRealTimeResult(std::list& listData, int count = -1); /* 获取一个最新音量值 */ bool getLatestRealTimeResult(OneDBData& resultData); private: /* 执行任务函数 */ void task() override; /* 初始化一些数据 */ bool initData() override; /* 清理数据 */ void clearData() override; /* 计算音量和反相 */ bool CreateDBPhase(AudioSrcData* audioData); /* 计算实时音量值 */ bool calculateRealTimeVolume(); private: /* --------------------------- 正常音量值的数据 --------------------------- */ /* 原始音频数据环形队列 */ RingQueue m_queueAudioData; /* 计算相关的变量 */ int m_oneDBLengthOfSrcData = 0; /* 计算一个DB需要的原始音频数据的长度,单位:short */ int m_singleDataLength = 0; /* 一秒钟单声道数据长度,单位:字节 */ OneSecondData* m_result = nullptr; /* 存储每秒钟的音量和反相数据 */ /* 计算结果环形队列,存储每秒钟的音量和反相数据 */ RingQueueManualMutex* m_queueResultData = nullptr; /* --------------------------- 正常音量值的数据 --------------------------- */ RingQueue m_queueRealTimeData; /* 存储小于1秒的音频数据,应该是33m的 */ std::mutex m_mutexRealTimeResult; /* 实时结果的互斥锁 */ std::list m_listRealTimeResult; /* 实时音量数据 */ }; #endif // _CREATEDBTHREAD_H_