#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_