CompareDoubleThread.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #ifndef _CompareDoubleThread_H_
  2. #define _CompareDoubleThread_H_
  3. #include "AudioData.h"
  4. #include "ChannelParam.h"
  5. #include "CompareResult.h"
  6. #include "CreateDBThread.h"
  7. #include "ConsistencyResult.h"
  8. #include "CalculateAudio.h"
  9. #include "spdlog/spdlog.h"
  10. #include "BaseCalculateThread.h"
  11. class ConsistencyCompareThread;
  12. class CreateRecordFileThread;
  13. /**
  14. 功能: 不一致检测的运行线程,这个线程会调用 ConsistencyCompareThread 进行一致性检测,
  15. 不过这里会再检测一遍一致性和噪音,和动态库检测结果进行对比
  16. 对比两个录音通道的数据,通道1是需要所有被对比的主通道,通道2就是其余通道
  17. 对比结果就是对比项中任意一个通道和主通道的对比结果
  18. 1、这里进一步进行噪音和一致性检测,可能是不放心动态库检测的结果
  19. 2、正弦波是用来判断噪音的,不过貌似没用到这个计算结果
  20. 3、一致性检测通过检测是否静音来进行计算的,这里直接获取两个通道的音量值进行对比,
  21. 获取一致性对比结果,再结合动态库检测的一致性进行判断
  22. 4、调用动态库检测的功能没有再开一个线程,直接在这个线程中进行检测
  23. 最新说明:
  24. 2025-05-05: 这个类暂时废弃了
  25. */
  26. class CompareDoubleThread : public BaseCalculateThread
  27. {
  28. enum ECompareFileMode
  29. {
  30. ECFM_ONLY_CommonCompare = 0, // 仅仅通用对比
  31. ECFM_ONLY_PythonCompare = 1, // 仅仅python对比,测试python对比性能
  32. ECFM_Common_PythonCompare = 2, // 先通用对比,再python对比(共2个对比)
  33. ECFM_ONLY_AICompare = 4, // 开启基础(静音正弦波判断)和AI对比
  34. ECFM_ONLY_AIPythonCompare = 5, // 4+1表示python对比和AI对比、通用对比不开启
  35. // 8表示通用对比
  36. ECFM_Common_AICompare = 12, // 8+4表示先通用对比,再AI对比,python对比不开启(共2个对比)
  37. ECFM_Common_AIPythonCompare = 13, // 8+4+1表示先通用对比,再AI对比和python对比(共3个对比)
  38. };
  39. enum ESilentWav
  40. {
  41. ESW_ALL_NOT = 0, // 都不是静音
  42. ESW_BothMinDB_TRUE, // 两个都是声音小
  43. ESW_BothMute_TRUE, // 两个静音
  44. ESW_OneMinDB_FALSE, // 一个静音一个非静音
  45. };
  46. public:
  47. CompareDoubleThread(CalculateThreadInfo_t& compareItemInfo);
  48. ~CompareDoubleThread();
  49. /* 获取计算结果 */
  50. OneRoadVolume_t getVolumeInfo();
  51. /* 获取最新的计算结果 */
  52. bool getlastResult(OneRoadVolume_t& volumeInfo);
  53. /* 设置是否在检测时间段 */
  54. void setInDetectPeriod(bool isInDetectPeriod) { m_isInDetectPeriod = isInDetectPeriod; }
  55. /* 设置是否开启不一致检测 */
  56. void enableNotConsistencyDetect(bool isNotConsistencyDetect) { m_isEnableNotConsistencyDetect.store(isNotConsistencyDetect); }
  57. protected:
  58. /* 线程功能函数 */
  59. void task() override;
  60. /* 初始化数据 */
  61. bool initData() override;
  62. /* 清理数据 */
  63. void clearData() override;
  64. private:
  65. /* 更新数据 */
  66. bool updateData();
  67. /* 计算数据 */
  68. void calculateData();
  69. /* 计算偏移值 */
  70. void calculateOffset(long chn1Offset, long chn2Offset);
  71. /* 获取最新的一致性状态 */
  72. bool getLatestConsistencyStatus(OneRoadVolume_t& oneRoad);
  73. /* 基础静音判断和AI(这里是调用的动态库)判断进行对比 */
  74. bool compareConsistencyBaseOnAI(bool& bConsistency, const bool lastConsistency);
  75. /* 初始化低音量数组 */
  76. void initMiniArray();
  77. /* 向低音量数组添加数字 */
  78. int addBothMiniDB(int db);
  79. /* 两个低音量是否相似 */
  80. bool isSameBothMinDB(int db);
  81. /* 保存报警信息 */
  82. void saveAlarmInfo();
  83. /* 结束报警 */
  84. void endAlarm();
  85. private:
  86. /* ----------------- 基础成员变量 ------------------ */
  87. SoundCardRoadInfo_t m_roadInfo1; /* 录音通道1信息 */
  88. SoundCardRoadInfo_t m_roadInfo2; /* 录音通道2信息 */
  89. CompareItemRoadInfo_t m_itemRoadInfo1; /* 对比项通道1信息,这两个给报警信息使用的 */
  90. CompareItemRoadInfo_t m_itemRoadInfo2; /* 对比项通道2信息 */
  91. std::atomic_bool m_isInDetectPeriod = true; /* 是否在检测时段内 */
  92. std::atomic_bool m_isEnableNotConsistencyDetect = false;/* 是否开启不一致检测 */
  93. /* ----------------- 生成音量数据的线程 ------------------ */
  94. CreateDBThread* m_threadCreateDB1 = nullptr; /* 生成通道1音量数据的线程 */
  95. CreateDBThread* m_threadCreateDB2 = nullptr; /* 生成通道2音量数据的线程 */
  96. bool m_isUpdated1 = false; /* 通道1数据是否更新 */
  97. bool m_isUpdated2 = false; /* 通道2数据是否更新 */
  98. /* 本地存储音量数据的环形队列 */
  99. CaculateDBData m_localData1;
  100. CaculateDBData m_localData2;
  101. /* ----------------- 生成报警音频文件的线程 ------------------ */
  102. CreateRecordFileThread* m_threadCreateAlarmFile1 = nullptr;
  103. CreateRecordFileThread* m_threadCreateAlarmFile2 = nullptr;
  104. /* 计算音量静音、过载、反相的线程,从这里获取到填充好的音量包 */
  105. // CaculateDBData m_data1; /* 这个给其他线程使用的 */
  106. // CaculateDBData m_data2; /* 这个给其他线程使用的 */
  107. /* 这个比对通道与主通道的对比结果 */
  108. std::mutex m_mutexVolumeInfo; /* 保护音量信息的互斥锁 */
  109. OneRoadVolume_t m_roadResult;
  110. /* 中间参数 */
  111. bool m_isSin1; /* 主通道是否正弦波 */
  112. bool m_isSin2; /* 次通道是否正弦波 */
  113. bool m_isSinDBEqual; /* 主次通道的正弦波音量是否相等 */
  114. /* 频道相关数据 */
  115. int m_chnID;
  116. std::string m_chnName; /* 频道名称 */
  117. std::string m_recordRoad1Name; /* 录音通道1名称 */
  118. std::string m_recordRoad2Name; /* 录音通道2名称 */
  119. int m_recordDev1ID = 0; /* 录音通道1ID */
  120. int m_recordDev2ID = 0; /* 录音通道2 */
  121. /* 比较相关的标志位 */
  122. // bool m_isCompareTime = false; /* 是否比较时间 */
  123. // bool m_isRunCompareThread = false; /* 是否开启比较线程 */
  124. // bool m_isRunCalDB1Thread = false; /* 是否开启生成音量的线程1 */
  125. // bool m_isRunCalDB2Thread = false; /* 是否开启生成音量的线程2 */
  126. /* 偏移量,通道1和通道2可能会有偏移,如果通道1是发射出去,通道2是结束过来,之间可能会有
  127. * 几秒钟的偏移,这个偏移量是手动设置的
  128. * 正数是通道1向后偏移几秒
  129. * 负数是通道2向后偏移几秒 */
  130. long m_offsetMSeconds = 0;
  131. // int m_calculateSeconds = 0; /* 计算需要的的秒数 */
  132. int m_avgDBCalculateSeconds = 0; /* 计算平均音量所需要的时长 */
  133. int m_silentThreshold = 0; /* 静音阈值 */
  134. int m_sinSeconds = 0; /* 正弦波计算所需要的时长 */
  135. StVolumeParam m_volumeParam; /* 频道音频设置 */
  136. StConsistencyParam m_consistencyParam; /* 一致性检测需要的参数 */
  137. int m_arrayMiniDB[10] = {-1}; /* 低音量值数组 */
  138. // 主次通道是否都是比较小的音量(包括静音)
  139. int m_bBothMinDB = 0;
  140. /*************************************************************
  141. * 金海林加入
  142. * 时间: 2023年8月29日 14:49:05
  143. * 描述: 杭州台:在其它报警时,不一致不报警且后台不进行不一致比对,在其它报警恢复后,不一致重新计时比对
  144. * 可以,加个配置项吧;这样的不一致更纯粹。1表示按上面的逻辑来,0表示不按上面的逻辑来
  145. * 注:现在这个开关配置已经搬到对比项类中了,这里不再生效
  146. *************************************************************/
  147. // bool m_isAINotConsistencyAlone;
  148. /**********金海林加入结束*************/
  149. /* 因为音频播放存在时间偏移,判断两个都是静音,或者判断一个静音一个非静音时,
  150. * 需要有延时时间(次数),CalcRefreshDataThread线程一秒一次 */
  151. int m_nIsSameBothMinDBWaitNum;
  152. // bool m_isHasAlarmExecpt = false; /* 是否还有其他报警 */
  153. /* -----------------------------------------------------------------------
  154. * ConsistencyCompareThread 一致性检测功能线程,从这里开启
  155. * ----------------------------------------------------------------------- */
  156. ConsistencyCompareThread* m_pConsistencyCompareThread = nullptr; /* 一致性检测线程指针 */
  157. StConsistencyResult m_consistencyResult; /* 一致性结果 */
  158. // AI对比更正次数
  159. int32_t m_arryAIChangeRetNum[8];
  160. int m_nCompareTimeSpan = 3000; // 比对时间间隔,单位毫秒
  161. /* 一致性报警信息 */
  162. AlarmInfo_t m_alarmConsistencyMain; /* 一致性报警信息,主通道 */
  163. AlarmInfo_t m_alarmConsistencySub; /* 一致性报警信息,次通道 */
  164. };
  165. #endif // _CompareDoubleThread_H_