123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- #ifndef CONSISTENCYCOMPARETHREAD_H_
- #define CONSISTENCYCOMPARETHREAD_H_
- #include "BaseCalculateThread.h"
- #include "RingQueueManualMutex.hpp"
- #include "AudioData.h"
- #include "ConsistencyResult.h"
- class CreateWAVThread;
- class CreateRecordFileThread;
- /**
- @brief 计算一致性的线程类
- 1、一致性对比线程是调用动态库对比,没有对比参数,不和对比项有关联
- 2、这线程计算速度很快,8秒的对比文件20ms即可计算完成,可以将其合并到其他线程中
- */
- class ConsistencyCompareThread : public BaseCalculateThread
- {
- public:
- ConsistencyCompareThread(CalculateThreadInfo_t& threadInfo);
- ~ConsistencyCompareThread() override;
- /* 获取一致性比对的结果 */
- bool isConsistency() { return m_isConsistency.load(); }
- /* 获取不一致性预警 */
- bool isNotConsistencyWarning() { return m_isConsistencyWarning.load(); }
- /* 判断录音通道是否相等 */
- // bool isRoadEqual(const SoundCardRoadInfo_t& roadInfo1, const SoundCardRoadInfo_t& roadInfo2);
- /* 这几个函数给外部线程调用,无需单独开启子线程了 */
- /* 初始化 */
- bool initConsistencyCompare();
- /* 比对函数 */
- bool compareConsistencyData();
- /* 清理数据 */
- void clearConsistencyCompareData();
- /* 设置是否在检测时间段 */
- void setInDetectPeriod(bool isInDetectPeriod) { m_isInDetectPeriod = isInDetectPeriod; }
- /* 设置是否开启不一致检测 */
- void enableNotConsistencyDetect(bool isNotConsistencyDetect) { m_isEnableNotConsistencyDetect.store(isNotConsistencyDetect); }
- protected:
- /* 线程功能函数 */
- void task() override;
- /* 初始化数据 */
- bool initData() override;
- /* 清理数据 */
- void clearData() override;
- private:
- /* 比对两个wav文件的一致性 */
- bool compareConsistency();
- /* 根据动态库返回的结果计算一致性 */
- bool computeResult();
- /* 保存报警信息 */
- void saveAlarmInfo();
- /* 结束报警 */
- void endAlarm();
- private:
- std::atomic_bool m_isInDetectPeriod = true; /* 是否在检测时段内 */
- std::atomic_bool m_isEnableNotConsistencyDetect = true; /* 是否开启不一致检测 */
- /* 两个录音通道的信息 */
- CompareItemRoadInfo_t m_itemRoadInfo1; /* 对比项通道1信息,这两个给报警信息使用的 */
- CompareItemRoadInfo_t m_itemRoadInfo2; /* 对比项通道2信息 */
- /* 两个录音通道的线程指针,直接通过录音类获取最新的数据 */
- CreateWAVThread* m_pCreateWAVThread1 = nullptr; /* 通道1的录音线程 */
- CreateWAVThread* m_pCreateWAVThread2 = nullptr; /* 通道2的录音线程 */
- WavFilePath m_wavFilePath1; /* 通道1的wav文件路径 */
- WavFilePath m_wavFilePath2; /* 通道2的wav文件路径 */
- WavFilePath m_prevWavFilePath1; /* 通道1的上一个wav文件路径 */
- WavFilePath m_prevWavFilePath2; /* 通道2的上一个wav文件路径 */
- /* ---------------------------------- 动态库检测参数和结果 ---------------------------------- */
- double m_sensitivity = 20.0; /* 比对灵敏度,默认20,范围[0-100] */
- double m_similarity = 0.0; /* 比对结果相似度 */
- /* ---------------------------------- 一致性计算参数 ---------------------------------- */
- /* 这些都是从设置动态库中获取 */
- int m_numFileDuration = 8; /* 文件对比的时间长度,单位秒 */
- int m_numCompareContinue = 3; /* 持续对比次数 */
- double m_fNotConsistencyThreshold = 0.6; /* 不相似度阈值,小于这个就不一致的 */
- double m_fConsistencyThreshold = 0.7; /* 相似度阈值,高于这个就是一致的 */
- // int m_arryAIChangeRetNum[2] = {0}; /* AI对比更正次数,默认10次 */
- /* ---------------------------------- 计算的一致性结果 ---------------------------------- */
- /* 动态库只检测出相似度,没有给出是否一致的定论,需要手动判断 */
- ConsistencyResult_t m_consistencyResult; /* 存储动态库计算的结果,并计算出一致性结论 */
- // StConsistencyParam m_consistencyParam; /* 一致性检测需要的参数 */
- std::atomic_bool m_isConsistency = true; /* 是否一致性,默认一致性 */
- std::atomic_bool m_isConsistencyLatest = true;/* 上一次检测的一致性结果 */
- std::atomic_bool m_isConsistencyWarning = false; /* 是否有不一致性预警 */
- /* ---------------------------------- 报警信息 ---------------------------------- */
- /* 生成报警音频文件的线程 */
- CreateRecordFileThread* m_threadCreateAlarmFile1 = nullptr;
- CreateRecordFileThread* m_threadCreateAlarmFile2 = nullptr;
- /* 一致性报警信息 */
- AlarmInfo_t m_alarmConsistencyMain; /* 一致性报警信息,主通道 */
- AlarmInfo_t m_alarmConsistencySub; /* 一致性报警信息,次通道 */
- };
- #endif // CONSISTENCYCOMPARETHREAD_H_
|