#ifndef _CompareDoubleThread_H_ #define _CompareDoubleThread_H_ #include "AudioData.h" #include "ChannelParam.h" #include "CompareResult.h" #include "CreateDBThread.h" #include "ConsistencyResult.h" #include "CalculateAudio.h" #include "spdlog/spdlog.h" #include "BaseCalculateThread.h" class ConsistencyCompareThread; class CreateLongFileThread; /** 功能:再检测一遍一致性和噪音,和动态库检测结果进行对比 对比两个录音通道的数据,通道1是需要所有被对比的主通道,通道2就是其余通道 对比结果就是对比项中任意一个通道和主通道的对比结果 1、这里进一步进行噪音和一致性检测,可能是不放心动态库检测的结果 2、正弦波是用来判断噪音的,不过貌似没用到这个计算结果 3、一致性检测通过检测是否静音来进行计算的,这里直接获取两个通道的音量值进行对比, 获取一致性对比结果,再结合动态库检测的一致性进行判断 */ class CompareDoubleThread : public BaseCalculateThread { enum ECompareFileMode { ECFM_ONLY_CommonCompare = 0, // 仅仅通用对比 ECFM_ONLY_PythonCompare = 1, // 仅仅python对比,测试python对比性能 ECFM_Common_PythonCompare = 2, // 先通用对比,再python对比(共2个对比) ECFM_ONLY_AICompare = 4, // 开启基础(静音正弦波判断)和AI对比 ECFM_ONLY_AIPythonCompare = 5, // 4+1表示python对比和AI对比、通用对比不开启 // 8表示通用对比 ECFM_Common_AICompare = 12, // 8+4表示先通用对比,再AI对比,python对比不开启(共2个对比) ECFM_Common_AIPythonCompare = 13, // 8+4+1表示先通用对比,再AI对比和python对比(共3个对比) }; enum ESilentWav { ESW_ALL_NOT = 0, // 都不是静音 ESW_BothMinDB_TRUE, // 两个都是声音小 ESW_BothMute_TRUE, // 两个静音 ESW_OneMinDB_FALSE, // 一个静音一个非静音 }; public: CompareDoubleThread(CalculateThreadInfo_t& compareItemInfo); ~CompareDoubleThread(); /* 获取计算结果 */ OneRoadVolume_t getVolumeInfo(); /* 获取最新的计算结果 */ bool getlastResult(OneRoadVolume_t& volumeInfo); protected: /* 线程功能函数 */ void task() override; /* 初始化数据 */ bool initData() override; /* 清理数据 */ void clearData() override; private: /* 更新数据 */ bool updateData(); /* 计算数据 */ void calculateData(); /* 计算偏移值 */ void calculateOffset(long chn1Offset, long chn2Offset); /* 获取最新的一致性状态 */ bool getLatestConsistencyStatus(OneRoadVolume_t& oneRoad); /* 基础静音判断和AI(这里是调用的动态库)判断进行对比 */ bool compareConsistencyBaseOnAI(bool& bConsistency, const bool lastConsistency); /* 初始化低音量数组 */ void initMiniArray(); /* 向低音量数组添加数字 */ int addBothMiniDB(int db); /* 两个低音量是否相似 */ bool isSameBothMinDB(int db); /* 保存报警信息 */ void saveAlarmInfo(); private: /* ----------------- 基础成员变量 ------------------ */ SoundCardRoadInfo_t m_roadInfo1; /* 录音通道1信息 */ SoundCardRoadInfo_t m_roadInfo2; /* 录音通道2信息 */ CompareItemRoadInfo_t m_itemRoadInfo1; /* 对比项通道1信息,这两个给报警信息使用的 */ CompareItemRoadInfo_t m_itemRoadInfo2; /* 对比项通道2信息 */ /* ----------------- 生成音量数据的线程 ------------------ */ CreateDBThread* m_threadCreateDB1 = nullptr; /* 生成通道1音量数据的线程 */ CreateDBThread* m_threadCreateDB2 = nullptr; /* 生成通道2音量数据的线程 */ bool m_isUpdated1 = false; /* 通道1数据是否更新 */ bool m_isUpdated2 = false; /* 通道2数据是否更新 */ /* 本地存储音量数据的环形队列 */ CaculateDBData m_localData1; CaculateDBData m_localData2; /* ----------------- 生成报警音频文件的线程 ------------------ */ CreateLongFileThread* m_threadCreateAlarmFile1 = nullptr; CreateLongFileThread* m_threadCreateAlarmFile2 = nullptr; /* 计算音量静音、过载、反相的线程,从这里获取到填充好的音量包 */ // CaculateDBData m_data1; /* 这个给其他线程使用的 */ // CaculateDBData m_data2; /* 这个给其他线程使用的 */ /* 这个比对通道与主通道的对比结果 */ std::mutex m_mutexVolumeInfo; /* 保护音量信息的互斥锁 */ OneRoadVolume_t m_roadResult; /* 中间参数 */ bool m_isSin1; /* 主通道是否正弦波 */ bool m_isSin2; /* 次通道是否正弦波 */ bool m_isSinDBEqual; /* 主次通道的正弦波音量是否相等 */ /* 频道相关数据 */ int m_chnID; std::string m_chnName; /* 频道名称 */ std::string m_recordRoad1Name; /* 录音通道1名称 */ std::string m_recordRoad2Name; /* 录音通道2名称 */ int m_recordDev1ID = 0; /* 录音通道1ID */ int m_recordDev2ID = 0; /* 录音通道2 */ /* 比较相关的标志位 */ bool m_isCompareTime = false; /* 是否比较时间 */ bool m_isRunCompareThread = false; /* 是否开启比较线程 */ bool m_isRunCalDB1Thread = false; /* 是否开启生成音量的线程1 */ bool m_isRunCalDB2Thread = false; /* 是否开启生成音量的线程2 */ /* 偏移量,通道1和通道2可能会有偏移,如果通道1是发射出去,通道2是结束过来,之间可能会有 * 几秒钟的偏移,这个偏移量是手动设置的 * 正数是通道1向后偏移几秒 * 负数是通道2向后偏移几秒 */ long m_offsetMSeconds = 0; // int m_calculateSeconds = 0; /* 计算需要的的秒数 */ int m_avgDBCalculateSeconds = 0; /* 计算平均音量所需要的时长 */ int m_silentThreshold = 0; /* 静音阈值 */ int m_sinSeconds = 0; /* 正弦波计算所需要的时长 */ StVolumeParam m_volumeParam; /* 频道音频设置 */ StConsistencyParam m_consistencyParam; /* 一致性检测需要的参数 */ int m_arrayMiniDB[10] = {-1}; /* 低音量值数组 */ // 主次通道是否都是比较小的音量(包括静音) int m_bBothMinDB = 0; /************************************************************* * 金海林加入 * 时间: 2023年8月29日 14:49:05 * 描述: 杭州台:在其它报警时,不一致不报警且后台不进行不一致比对,在其它报警恢复后,不一致重新计时比对 * 可以,加个配置项吧;这样的不一致更纯粹。1表示按上面的逻辑来,0表示不按上面的逻辑来 *************************************************************/ bool m_isAINotConsistencyAlone; /**********金海林加入结束*************/ /* 因为音频播放存在时间偏移,判断两个都是静音,或者判断一个静音一个非静音时, * 需要有延时时间(次数),CalcRefreshDataThread线程一秒一次 */ int m_nIsSameBothMinDBWaitNum; bool m_isHasAlarmExecpt = false; /* 是否还有其他报警 */ /* ----------------------------------------------------------------------- * ConsistencyCompareThread 一致性检测功能线程,从这里开启 * ----------------------------------------------------------------------- */ ConsistencyCompareThread* m_pConsistencyCompareThread = nullptr; /* 一致性检测线程指针 */ StConsistencyResult m_consistencyResult; /* 一致性结果 */ // AI对比更正次数 int32_t m_arryAIChangeRetNum[8]; int m_nCompareTimeSpan = 3000; // 比对时间间隔,单位毫秒 /* 一致性报警信息 */ AlarmInfo_t m_alarmConsistencyMain; /* 一致性报警信息,主通道 */ AlarmInfo_t m_alarmConsistencySub; /* 一致性报警信息,次通道 */ }; #endif // _CompareDoubleThread_H_