123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- #ifndef _CALCULATEDBTHREAD_H_
- #define _CALCULATEDBTHREAD_H_
- #include "AudioData.h"
- #include "BaseCalculateThread.h"
- #include "CreateDBThread.h"
- #include "CreateLongFileThread.h"
- #include "SendStruct.h"
- #include "CalculateAudio.h"
- #include "CompareResult.h"
- /**
- 这个线程类进行静音、过载和反相等报警的计算,这个线程和对比项相关,需要对比项中的参数,由对比项线程创建
- 1、计算静音、过载和反相
- 2、保存报警结果得出的报警信息,外部获取是实时的报警状态,通过一个中介报警信息解决了报警时间粘连的问题
- 线程输出结果
- 1、静音报警信息
- 2、过载报警信息
- 3、反相报警信息
- 4、音量包信息
- 检测时间段:
- 1、如果某一项不在检测时间段内,那么这一项不会进行计算,检测结果全部为false
- 2、即使所有的检测项目都不在检测时间段内,这个线程也不能停,因为对比项需要从这里获取音量包信息
- */
- 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);
- /* 设置是否在检测时段内 */
- void setSilenceInDetectPeriod(bool isInPeriod) { m_isSilenceInDetectPeriod = isInPeriod; }
- void setOverloadInDetectPeriod(bool isInPeriod) { m_isOverloadInDetectPeriod = isInPeriod; }
- void setPhaseInDetectPeriod(bool isInPeriod) { m_isPhaseInDetectPeriod = isInPeriod; }
- protected:
- /* 线程功能函数 */
- void task() override;
- /* 初始化数据 */
- bool initData() override;
- /* 清理数据 */
- void clearData() override;
- private:
- /* 计算静音过载反相 */
- void calcuDBData();
- /* 判断是否报警 */
- void processAlarm();
- /* 处理静音报警 */
- void processSilence();
- /* 处理过载报警 */
- void processOverload();
- /* 处理反相报警 */
- void processPhase();
- /* 结束所有的报警 */
- void endAllAlarm();
- private:
- /* 静音、过载、反相是否在检测时间段内 */
- std::atomic_bool m_isSilenceInDetectPeriod = true; /* 静音检测是否在检测时间段内 */
- std::atomic_bool m_isOverloadInDetectPeriod = true; /* 过载检测是否在检测时间段内 */
- std::atomic_bool m_isPhaseInDetectPeriod = true; /* 反相检测是否在检测时间段内 */
- /* 录音通道信息 */
- CompareItemRoadInfo_t m_roadInfo; /* 录音通道编号,带有对比项信息 */
- std::string m_roadName; /* 录音通道名称 */
- /* 计算结果 */
- std::mutex m_mutexVolumeInfo; /* 保护音量信息的互斥锁 */
- OneRoadVolume_t m_roadVolumeInfo; /* 一个录音通道的音量信息这个是计算结果 */
- /* 生成音量的线程 */
- CreateDBThread* m_threadCreateDB = nullptr; /* 生成音量的线程 */
- OneSecondData m_currSecondData; /* 最新一秒的数据 */
- StVolumeParam m_volumeParam; /* 音量计算的参数 */
- /* 录制报警文件的线程 */
- CreateLongFileThread* m_threadCreateAlarmFile = nullptr;
- 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_
|