#ifndef _CALCULATEDBTHREAD_H_ #define _CALCULATEDBTHREAD_H_ #include "AudioData.h" #include "BaseCalculateThread.h" #include "CreateDBThread.h" #include "SendStruct.h" #include "CalculateAudio.h" #include "CompareResult.h" /** * 这个线程类进行静音、过载和反相等报警的计算,这个线程和对比项相关,需要对比项中的参数,由对比项线程创建 * 1、计算静音、过载和反相 * 2、保存报警结果得出的报警信息,外部获取是实时的报警状态,通过一个中介报警信息解决了报警时间粘连的问题 * 线程输出结果 * 1、静音报警信息 * 2、过载报警信息 * 3、反相报警信息 * 4、音量包信息 */ class CalculateDBThread : public BaseCalculateThread { public: CalculateDBThread(CalculateThreadInfo_t& threadInfo); ~CalculateDBThread() override; /* 获取线程通道信息 */ const CompareItemRoadInfo_t& getRoadInfo() const { return m_roadInfo; } /* 获取结果,这个线程计算出静音、过载、反相和音量包信息 */ OneRoadVolume_t getVolumeInfo(); /* 获取最新音量值计算的结果 */ bool getlastVolumeInfo(OneRoadVolume_t& volumeInfo); /* 获取最新的结果,实时结果 */ AlarmInfo_t getAlarm(EAlarmType alarmType); protected: /* 线程功能函数 */ void task() override; /* 初始化数据 */ bool initData() override; /* 清理数据 */ void clearData() override; private: /* 计算静音过载反相 */ void calcuDBPhase(); /* 判断是否报警 */ void processAlarm(); /* 处理静音报警 */ void processSilence(); /* 处理过载报警 */ void processOverload(); /* 处理反相报警 */ void processPhase(); /* 生成报警文件路径 */ std::string generateAlarmFilePath(const AlarmInfo_t& alarmInfo); private: /* 录音通道信息 */ CompareItemRoadInfo_t m_roadInfo; /* 录音通道编号,带有对比项信息 */ std::string m_roadName; /* 录音通道名称 */ /* 计算结果 */ std::mutex m_mutexVolumeInfo; /* 保护音量信息的互斥锁 */ OneRoadVolume_t m_roadVolumeInfo; /* 一个录音通道的音量信息这个是计算结果 */ /* 生成音量的线程 */ CreateDBThread* m_threadCreateDBPhase = nullptr; /* 生成音量的线程 */ OneSecondData m_currSecondData; /* 最新一秒的数据 */ StVolumeParam m_volumeParam; /* 音量计算的参数 */ int32_t m_numQueueSeconds = 0; /* 队列元素数目,单位:秒 */ CaculateDBData m_caculateDBData; /* 计算音量的环形队列类 */ bool m_bLastReversed = false; /* 上一次的反相状态 */ bool m_bLastOverload = false; /* 上一次的过载状态 */ /* 计算需要的相关参数 */ int32_t m_avgCalculateDBSeconds = 0; /* 计算平均音量需要的秒数 */ int m_silentStartPos = -1; /* 静音开始位置 */ int m_silentEndPos = -1; /* 静音结束位置 */ int m_overloadStartPos = -1; /* 过载开始位置 */ int m_overloadEndPos = -1; /* 过载结束位置 */ int m_phaseStartPos = -1; /* 反相开始位置 */ int m_phaseEndPos = -1; /* 反相结束位置 */ AlarmInfo_t m_alarmSilence; /* 静音报警信息 */ AlarmInfo_t m_alarmOverload; /* 过载报警信息 */ AlarmInfo_t m_alarmPhase; /* 反相报警信息 */ /* 这里的报警信息作为返回给对比项线程的中介,防止刚结束报警,结果还未取出,又来了一个报警, * 报警时间粘连的问题 */ AlarmInfo_t m_alarmLastSilence; /* 上一次静音报警信息 */ AlarmInfo_t m_alarmLastOverload; /* 上一次过载报警信息 */ AlarmInfo_t m_alarmLastPhase; /* 上一次反相报警信息 */ AlarmInfo_t m_alarmNull; /* 空报警信息 */ }; #endif // _CALCULATEDBTHREAD_H_