CompareDoubleThread.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. #include "CompareDoubleThread.h"
  2. #include "GlobalInfo.h"
  3. #include "GlobalVariable.h"
  4. #include "GlobalInfo.h"
  5. #include "ThreadManager.h"
  6. #include "ConsistencyCompareThread.h"
  7. #include "ThreadPool.h"
  8. CompareDoubleThread::CompareDoubleThread(CalculateThreadInfo_t& compareItemInfo)
  9. : BaseCalculateThread(compareItemInfo)
  10. {
  11. m_logger = spdlog::get("ACAServer");
  12. if(m_logger == nullptr)
  13. {
  14. fmt::print("CompareDouble: ACAServer Logger not found.\n");
  15. return;
  16. }
  17. m_threadInfo = compareItemInfo;
  18. }
  19. CompareDoubleThread::~CompareDoubleThread()
  20. {
  21. }
  22. /* 获取计算结果 */
  23. OneRoadVolume_t CompareDoubleThread::getVolumeInfo()
  24. {
  25. std::lock_guard<std::mutex> lock(m_mutexVolumeInfo);
  26. return m_roadResult;
  27. }
  28. /**
  29. * @brief 获取最新的计算结果,这里目前只有一致性检测的结果,没有噪音检测的结果
  30. * 1、这里目前没有进行时间判断,直接返回最新的结果
  31. *
  32. * @param volumeInfo
  33. * @return true
  34. * @return false
  35. */
  36. bool CompareDoubleThread::getlastVolumeInfo(OneRoadVolume_t& volumeInfo)
  37. {
  38. std::lock_guard<std::mutex> lock(m_mutexVolumeInfo);
  39. volumeInfo.isConsistency = m_roadResult.isConsistency;
  40. volumeInfo.isNotConsistencyWarning = m_roadResult.isNotConsistencyWarning;
  41. return true;
  42. }
  43. /* 线程功能函数 */
  44. void CompareDoubleThread::task()
  45. {
  46. /* 初始化数据 */
  47. if(!initData())
  48. {
  49. SPDLOG_LOGGER_ERROR(m_logger, "{} 初始化数据失败", m_logBase);
  50. return;
  51. }
  52. SPDLOG_LOGGER_INFO(m_logger, " ******************* {} 计算一致性对比的线程开始运行 ******************* ", m_logBase);
  53. while(m_isRunning)
  54. {
  55. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  56. /* 更新数据 */
  57. if(!updateData())
  58. {
  59. continue; // 数据不足,继续等待
  60. }
  61. // SPDLOG_LOGGER_INFO(m_logger, "{} 更新数据成功,开始计算音量数据", m_logBase);
  62. /* 计算音量数据 */
  63. calculateData();
  64. /* 保存结果,结果已经在上面那个函数中保存了 */
  65. /* 清除标志位 */
  66. m_isUpdated1 = false;
  67. m_isUpdated2 = false;
  68. }
  69. /* 清理数据 */
  70. clearData();
  71. SPDLOG_LOGGER_INFO(m_logger, " ******************* {} 计算双通道对比的线程结束 ******************* ", m_logBase);
  72. m_threadInfo.threadState = EThreadState::State_Stopped; // 更新线程状态
  73. }
  74. /* 初始化数据 */
  75. bool CompareDoubleThread::initData()
  76. {
  77. if(m_threadInfo.compareItemInfo.mapRoad.size() < 2)
  78. {
  79. SPDLOG_LOGGER_WARN(m_logger, "{} 对比项信息错误,录音通道数量小于2", m_threadInfo.compareItemInfo.strName.toStdString());
  80. return false;
  81. }
  82. auto begin = m_threadInfo.compareItemInfo.mapRoad.begin();
  83. m_roadInfo1 = begin->scRoadInfo;
  84. begin++; // 移动到下一个元素
  85. m_roadInfo2 = begin->scRoadInfo; // 录音通道2信息
  86. m_logBase = fmt::format("{} 对比项: {}:{} - {}:{}", m_threadInfo.compareItemInfo.strName.toStdString(),
  87. m_roadInfo1.strSoundCardName.toStdString(), m_roadInfo1.roadInfo.nRoadNum,
  88. m_roadInfo2.strSoundCardName.toStdString(), m_roadInfo2.roadInfo.nRoadNum);
  89. m_offsetMSeconds = GInfo.offsetMSeconds(); // 获取偏移量
  90. // m_calculateSeconds = GInfo.calculateDataSeconds(); // 获取计算需要的秒数
  91. m_avgDBCalculateSeconds = GInfo.avgDBCalculateSeconds(); // 获取计算平均音量所需要的时长
  92. m_silentThreshold = GInfo.silentThreshold(); // 获取静音阈值
  93. m_sinSeconds = GInfo.sinSeconds(); // 获取正弦波计算所需要的时长
  94. m_isAINotConsistencyAlone = GInfo.isAINotConsistencyAlone(); // 获取杭州台是否按上面的逻辑来
  95. m_nIsSameBothMinDBWaitNum = GInfo.nIsSameBothMinDBWaitNum(); // 获取是否需要等待静音状态
  96. /* 获取生成音量的线程,循环等待获取 */
  97. auto startTime = std::chrono::steady_clock::now(); // 记录开始时间
  98. while(true)
  99. {
  100. if(m_threadCreateDB1 == nullptr)
  101. {
  102. m_threadCreateDB1 = ThreadMan.getCreateDBThread(m_roadInfo1.nSoundCardNum, m_roadInfo1.roadInfo.nRoadNum);
  103. }
  104. if(m_threadCreateDB2 == nullptr)
  105. {
  106. m_threadCreateDB2 = ThreadMan.getCreateDBThread(m_roadInfo2.nSoundCardNum, m_roadInfo2.roadInfo.nRoadNum);
  107. }
  108. if(m_threadCreateDB1 != nullptr && m_threadCreateDB2 != nullptr)
  109. {
  110. break; // 获取到两个线程,跳出循环
  111. }
  112. /* 超过10秒还没有获取到线程,返回失败 */
  113. if(std::chrono::steady_clock::now() - startTime > std::chrono::seconds(10))
  114. {
  115. SPDLOG_LOGGER_ERROR(m_logger, "{} 获取生成音量的线程超时", m_logBase);
  116. return false;
  117. }
  118. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  119. }
  120. if(m_threadCreateDB1 == nullptr || m_threadCreateDB2 == nullptr)
  121. {
  122. SPDLOG_LOGGER_ERROR(m_logger, "{} 获取生成音量的线程失败", m_logBase);
  123. return false;
  124. }
  125. /* 创建一致性比较的线程 */
  126. m_pConsistencyCompareThread = new ConsistencyCompareThread(m_threadInfo);
  127. if(m_pConsistencyCompareThread == nullptr)
  128. {
  129. SPDLOG_LOGGER_ERROR(m_logger, "{} 创建一致性比较线程失败", m_logBase);
  130. return false;
  131. }
  132. CPPTP.add_task(&ConsistencyCompareThread::threadTask, m_pConsistencyCompareThread);
  133. return true;
  134. }
  135. /* 清理数据 */
  136. void CompareDoubleThread::clearData()
  137. {
  138. if(m_pConsistencyCompareThread != nullptr)
  139. {
  140. m_pConsistencyCompareThread->stopThreadBlock(); // 停止线程
  141. delete m_pConsistencyCompareThread;
  142. m_pConsistencyCompareThread = nullptr;
  143. }
  144. }
  145. /* 更新数据 */
  146. bool CompareDoubleThread::updateData()
  147. {
  148. /* 获取原始的音量值 */
  149. if(m_isUpdated1 == false)
  150. {
  151. if(m_threadCreateDB1->getLatestResult(m_localData1.ringQueue) == false)
  152. {
  153. // SPDLOG_LOGGER_TRACE(m_logger, "{} 未获取通道1最新数据", m_logBase);
  154. return false; // 没有获取到最新数据,继续等待
  155. }
  156. m_isUpdated1 = true;
  157. }
  158. if(m_isUpdated2 == false)
  159. {
  160. if(m_threadCreateDB2->getLatestResult(m_localData2.ringQueue) == false)
  161. {
  162. // SPDLOG_LOGGER_DEBUG(m_logger, "{} 未获取通道2最新数据", m_logBase);
  163. return false; // 没有获取到最新数据,继续等待
  164. }
  165. m_isUpdated2 = true;
  166. }
  167. if(m_isUpdated1 == false || m_isUpdated2 == false)
  168. {
  169. // SPDLOG_LOGGER_TRACE(m_logger, "{} 队列数据未更新,等待数据更新", m_logBase);
  170. return false;
  171. }
  172. if(m_localData1.isEmpty() || m_localData2.isEmpty())
  173. {
  174. SPDLOG_LOGGER_TRACE(m_logger, "{} 队列数据不足,等待数据更新", m_logBase);
  175. return false;
  176. }
  177. /* 获取一致性线程计算的结果 */
  178. m_consistencyResult = m_pConsistencyCompareThread->getConsistencyResult();
  179. return true;
  180. }
  181. /**
  182. * 再次判断噪音和不一致
  183. *
  184. */
  185. void CompareDoubleThread::calculateData()
  186. {
  187. // 2、用最新数据计算音频状态:静音、过载、反相
  188. bool isAvgDBLessMin = false; /* 平均音量是否最小 */
  189. bool isSin1 = false; /* 通道1是否正弦波 */
  190. bool isSin2 = false; /* 通道2是否正弦波 */
  191. bool isSinDBEqual = false; /* 通道1和通道2的正弦波音量是否相等 */
  192. bool isOffsetSilence1 = false; /* 通道1偏移之后是否静音 */
  193. bool isOffsetSilence2 = false; /* 通道2偏移之后是否静音 */
  194. OneRoadVolume_t oneRoadVolume; /* 一个录音通道的音量信息,临时结果 */
  195. /* 保存通道2的时间 */
  196. oneRoadVolume.dateTime = m_localData2.ringQueue.back()->startTime;
  197. /* ---------------------------------------------------------------
  198. * 这一段计算音量偏移后的静音和正弦波(正弦波也是一种噪音,防止动态库检测不出来)
  199. * (正弦波结果貌似并没有用到)
  200. * ---------------------------------------------------------------*/
  201. {
  202. /* 获取偏移值 */
  203. long chn1Offset = 0;
  204. long chn2Offset = 0;
  205. calculateOffset(chn1Offset, chn2Offset);
  206. // 设置音频偏移
  207. m_localData1.setOffset(chn1Offset);
  208. m_localData2.setOffset(chn2Offset);
  209. // 计算偏移之后的静音
  210. int nSilentEndPos = 0, nSilentEndPos2 = 0;
  211. int nSilentStartPos = 0, nSilentStartPos2 = 0;
  212. isOffsetSilence1 = m_localData1.calculateSilent(m_volumeParam, m_avgDBCalculateSeconds, nSilentStartPos, nSilentEndPos);
  213. isOffsetSilence2 = m_localData2.calculateSilent(m_volumeParam, m_avgDBCalculateSeconds, nSilentStartPos2, nSilentEndPos2);
  214. isAvgDBLessMin = m_localData1.isAvgDBLessThan(m_avgDBCalculateSeconds, m_silentThreshold) && m_localData2.isAvgDBLessThan(m_avgDBCalculateSeconds, m_silentThreshold);
  215. // 音量小时不用判定正弦波
  216. if (!isAvgDBLessMin)
  217. {
  218. // 正弦波处理:正弦波就是一个固定的音量值,这时不做判定,直接比较音量值
  219. // (主次通道的音量值相同,并且是一个固定的音量值时,直接判定为一致)
  220. int nLeftDB1, nRightDB1;
  221. isSin1 = m_localData1.isSinDB(m_sinSeconds, m_avgDBCalculateSeconds, nLeftDB1, nRightDB1);
  222. int nLeftDB2, nRightDB2;
  223. isSin2 = m_localData2.isSinDB(m_sinSeconds, m_avgDBCalculateSeconds, nLeftDB2, nRightDB2);
  224. if (nLeftDB1 == nLeftDB2 && nRightDB1 == nRightDB2)
  225. {
  226. isSinDBEqual = true;
  227. }
  228. }
  229. /* 恢复音频偏移,下面也没有用到这两个环形队列的地方了,所以提到前面恢复 */
  230. m_localData1.setOffset(0);
  231. m_localData2.setOffset(0);
  232. /* 这里貌似也没用到 */
  233. // m_data1 = m_localData1;
  234. // m_data2 = m_localData2;
  235. }
  236. /* ---------------------------------------------------------------
  237. * 和动态库检测的一致性结果进行对比
  238. * ---------------------------------------------------------------*/
  239. {
  240. getLatestConsistencyStatus(oneRoadVolume);
  241. }
  242. if (isOffsetSilence1 && isOffsetSilence2)
  243. {
  244. m_bBothMinDB = ESW_BothMute_TRUE;
  245. } else
  246. {
  247. if (isAvgDBLessMin)
  248. {
  249. m_bBothMinDB = ESW_BothMinDB_TRUE;
  250. } else
  251. {
  252. if (isOffsetSilence1 || isOffsetSilence2)
  253. {
  254. m_bBothMinDB = ESW_OneMinDB_FALSE;
  255. } else
  256. {
  257. m_bBothMinDB = ESW_ALL_NOT;
  258. }
  259. }
  260. m_isSin1 = isSin1;
  261. m_isSin2 = isSin2;
  262. m_isSinDBEqual = isSinDBEqual;
  263. }
  264. /* 保存计算信息,目前只保存了一致性结果和报警 */
  265. {
  266. std::lock_guard<std::mutex> lock(m_mutexVolumeInfo);
  267. m_roadResult.isConsistency = oneRoadVolume.isConsistency;
  268. m_roadResult.isNotConsistencyWarning = oneRoadVolume.isNotConsistencyWarning;
  269. m_roadResult.dateTime = oneRoadVolume.dateTime;
  270. }
  271. }
  272. /* 计算偏移值 */
  273. void CompareDoubleThread::calculateOffset(long chn1Offset, long chn2Offset)
  274. {
  275. chn1Offset = 0;
  276. chn2Offset = 0;
  277. if(m_offsetMSeconds > 0)
  278. {
  279. chn1Offset = m_offsetMSeconds;
  280. } else if(m_offsetMSeconds < 0) {
  281. chn2Offset = std::abs(m_offsetMSeconds);
  282. }
  283. }
  284. /**
  285. * @brief 获取最新的一致性状态
  286. * 1、先使用音量进行静音比对,都不是静音时,使用AI对比
  287. * 2、是否使用AI对比由外部传入的配置决定
  288. *
  289. * @param sendInfo
  290. * @return true
  291. * @return false
  292. */
  293. bool CompareDoubleThread::getLatestConsistencyStatus(OneRoadVolume_t& oneRoad)
  294. {
  295. // 非对比时间时,默认为一致
  296. if (!m_isCompareTime)
  297. {
  298. initMiniArray();
  299. // SPDLOG_LOGGER_DEBUG(m_logger, "{}: 非对比时间时,默认为一致", m_chnName);
  300. oneRoad.isConsistency = true;
  301. return true;
  302. }
  303. /* 使用Python对比的结果,这里没有这个功能 */
  304. /* 如果没有开启比较线程,默认为一致 */
  305. if (!m_isRunCompareThread)
  306. {
  307. oneRoad.isConsistency = true;
  308. SPDLOG_LOGGER_INFO(m_logger, "{}: 没有开启比较线程,默认为一致", m_chnName);
  309. return true;
  310. }
  311. /* 不做一致性检测,返回一致性 */
  312. if (!m_consistencyParam.GetConsistencySwitch())
  313. {
  314. SPDLOG_LOGGER_INFO(m_logger, "{}: 一致性检测关闭,不做一致性检测,返回一致性", m_chnName);
  315. oneRoad.isConsistency = true;
  316. return true;
  317. }
  318. /* 判断是否开启计算这两个通道音量值的线程
  319. * 如果两个线程都在不在运行,无法判断,则设置成一致,一个在运行一个不在运行,则不一致
  320. * */
  321. if(!m_isRunCalDB1Thread && !m_isRunCalDB2Thread)
  322. {
  323. oneRoad.isConsistency = true;
  324. SPDLOG_LOGGER_INFO(m_logger, "{}: 通道指针为空,默认为一致", m_chnName);
  325. return true;
  326. }
  327. // 一个为空,一个不空判定为不一致
  328. if (m_isRunCalDB1Thread != m_isRunCalDB2Thread)
  329. {
  330. oneRoad.isConsistency = false;
  331. SPDLOG_LOGGER_INFO(m_logger, "{}: 一个通道正在运行计算音量的线程,一个通道未在运行,判定为不一致", m_chnName);
  332. return false;
  333. }
  334. /* 上一次的一致性标记 */
  335. m_mutexVolumeInfo.lock();
  336. const bool lastConsistency = m_roadResult.isConsistency;
  337. m_mutexVolumeInfo.unlock();
  338. bool bConsistency = lastConsistency;
  339. if (!m_isRunCompareThread)
  340. {
  341. /* 没有开启比对线程 */
  342. bConsistency = false;
  343. if(m_recordDev1ID == m_recordDev2ID)
  344. {
  345. // 同一个通道肯定是一致的
  346. bConsistency = true;
  347. SPDLOG_LOGGER_INFO(m_logger, "同一个通道肯定是一致的");
  348. }
  349. }
  350. else if(!m_isRunCalDB1Thread && !m_isRunCalDB2Thread)
  351. {
  352. // 都没有开启,表示两者是静音
  353. bConsistency = true;
  354. SPDLOG_LOGGER_INFO(m_logger, "都没有开启,表示两者是静音");
  355. }
  356. else if(m_isRunCalDB1Thread != m_isRunCalDB2Thread)
  357. {
  358. // 一个开启了,一个没有开启,表示不一致
  359. bConsistency = false;
  360. SPDLOG_LOGGER_INFO(m_logger, "一个开启了,一个没有开启,表示不一致");
  361. }else
  362. {
  363. /* 都开启了计算音量的线程 */
  364. /* 获取上一次的低音量信息 */
  365. int bBothMinDB = m_bBothMinDB;
  366. addBothMiniDB(bBothMinDB);
  367. /*************************************************************
  368. * 金海林加入
  369. * 时间: 2023年8月30日 16:09:25
  370. * 描述: 杭州台:在其它报警时,不一致不报警且后台不进行不一致比对,在其它报警恢复后,不一致重新计时比对
  371. if (ESW_ALL_NOT != bBothMinDB)
  372. *************************************************************/
  373. /* m_isAINotConsistencyAlone 是外部的配置选项 */
  374. if (ESW_ALL_NOT != bBothMinDB && !m_isAINotConsistencyAlone)
  375. /**********金海林加入结束*************/
  376. {
  377. if (ESW_BothMinDB_TRUE == bBothMinDB)
  378. {
  379. SPDLOG_LOGGER_INFO(m_logger, "{}: 平均音量比较小时,维持当前状态不变!", m_chnName);
  380. }
  381. else if (ESW_BothMute_TRUE == bBothMinDB)
  382. {
  383. /*************************************************************
  384. * 金海林加入
  385. * 时间: 2022年4月6日 10:58:19
  386. * 描述: 静音判断可能存在时间偏移,所有要多等待一次对比
  387. *************************************************************/
  388. if (isSameBothMinDB(ESW_BothMute_TRUE))
  389. {
  390. SPDLOG_LOGGER_INFO(m_logger, "{}: 两个都是静音,判定为一致!", m_chnName);
  391. bConsistency = true;
  392. }
  393. else
  394. {
  395. SPDLOG_LOGGER_INFO(m_logger, "{}: 两个都是静音,前3次维持当前状态不变!", m_chnName);
  396. //bConsistency = FALSE;
  397. }
  398. /**********金海林加入结束*************/
  399. }
  400. else
  401. {
  402. /* 一个静音,一个非静音 */
  403. /*************************************************************
  404. * 金海林修改
  405. * 时间: 2018年11月2日 14:31:34
  406. * 描述: 一个静音一个非静音,第一次维持不一致状态不变;第二次直接判定位不一致
  407. *************************************************************/
  408. if (isSameBothMinDB(ESW_OneMinDB_FALSE))
  409. {
  410. SPDLOG_LOGGER_INFO(m_logger, "{}: 一个静音一个非静音,上次也是这样,直接判定为不一致!", m_chnName);
  411. bConsistency = false;
  412. }
  413. else
  414. {
  415. SPDLOG_LOGGER_INFO(m_logger, "{}: 一个静音一个非静音,前3次维持当前状态不变!", m_chnName);
  416. //bConsistency = false;
  417. }
  418. /**********金海林修改结束*************/
  419. }
  420. }
  421. else
  422. {
  423. /* 两个都是静音,进一步进行一致性比较 */
  424. /*************************************************************
  425. * 金海林加入
  426. * 时间: 2022年3月31日 16:04:30
  427. * 描述: 开启基础(静音正弦波判断)和AI对比
  428. *************************************************************/
  429. compareConsistencyBaseOnAI(bConsistency, lastConsistency);
  430. /**********金海林加入结束*************/
  431. std::string strMsgLog;
  432. if (bConsistency)
  433. {
  434. if (oneRoad.isNotConsistencyWarning == true)
  435. {
  436. strMsgLog = fmt::format("{}:预警【一致】:{}", m_logBase, m_chnName);
  437. }
  438. else
  439. {
  440. strMsgLog = fmt::format("{}:是一致:{}", m_logBase, m_chnName);
  441. }
  442. }
  443. else
  444. {
  445. strMsgLog = fmt::format("{}:不一致:{}", m_logBase, m_chnName);
  446. }
  447. SPDLOG_LOGGER_DEBUG(m_logger, strMsgLog);
  448. }
  449. }
  450. return true;
  451. }
  452. /* 基础静音判断和AI(这里是调用的动态库)判断进行对比 */
  453. bool CompareDoubleThread::compareConsistencyBaseOnAI(bool& bConsistency, const bool lastConsistency)
  454. {
  455. /*************************************************************
  456. * 金海林加入
  457. * 时间: 2023年8月30日 16:09:25
  458. * 描述: 杭州台:在其它报警时,不一致不报警且后台不进行不一致比对,在其它报警恢复后,不一致重新计时比对
  459. *************************************************************/
  460. if (m_isHasAlarmExecpt)
  461. {
  462. bConsistency = true;
  463. return false;
  464. }
  465. /**********金海林加入结束*************/
  466. /* 更新动态库的一致性比对结果 */
  467. std::string strAIValue, strAIValueNot;
  468. bool bAICon = m_consistencyResult.IsAIConsistency(GInfo.AICMPThresholdNum(), GInfo.AICMPThreshold(), strAIValue);
  469. bool bAINot = m_consistencyResult.IsAINotConsistency(GInfo.AICMPThresholdNum(), GInfo.AICMPThresholdNot(), strAIValueNot);
  470. if (false == bAICon || false == bAINot)
  471. {
  472. bConsistency = true;
  473. return false;
  474. }
  475. if (bAICon)
  476. {
  477. bConsistency = true;
  478. if (!lastConsistency)
  479. {
  480. SPDLOG_LOGGER_INFO(m_logger, "当前AI判定为一致,上次是不一致,确认为一致(第{}次),{}", ++m_arryAIChangeRetNum[1], strAIValue);
  481. }
  482. return true;
  483. }
  484. if (bAINot)
  485. {
  486. bConsistency = false;
  487. if (lastConsistency)
  488. {
  489. SPDLOG_LOGGER_INFO(m_logger, "当前AI判定为不一致,上次是一致,确认为不一致(第{}次),{}", ++m_arryAIChangeRetNum[3], strAIValueNot);
  490. }
  491. return true;
  492. }
  493. bConsistency = lastConsistency; // 如果都不是一致和不一致,则使用上一次的一致性结果
  494. return true;
  495. }
  496. /* 初始化低音量数组 */
  497. void CompareDoubleThread::initMiniArray()
  498. {
  499. for(auto& data : m_arrayMiniDB)
  500. {
  501. data = -1;
  502. }
  503. }
  504. /* 向低音量数组添加数字 */
  505. int CompareDoubleThread::addBothMiniDB(int db)
  506. {
  507. for(int i = 8; i >= 0; --i)
  508. {
  509. m_arrayMiniDB[i+1] = m_arrayMiniDB[i];
  510. }
  511. m_arrayMiniDB[0] = db;
  512. if (ESW_ALL_NOT == db)
  513. {
  514. }
  515. if (ESW_BothMinDB_TRUE == db)
  516. {
  517. SPDLOG_LOGGER_DEBUG(m_logger, "{}: 两个都是声音小,连续{}秒平均音量小于[{}]", m_chnName, m_avgDBCalculateSeconds, m_silentThreshold);
  518. SPDLOG_LOGGER_DEBUG(m_logger, "{}: 记录当前状态:两个都是声音小,连续{}秒平均音量小于[{}]", m_chnName, m_avgDBCalculateSeconds, m_silentThreshold);
  519. }
  520. if (ESW_BothMute_TRUE == db)
  521. {
  522. SPDLOG_LOGGER_DEBUG(m_logger, "{}: 两个静音({})", m_chnName, db);
  523. }
  524. if (ESW_OneMinDB_FALSE == db)
  525. {
  526. SPDLOG_LOGGER_DEBUG(m_logger, "{}: 一个静音一个非静音({})", m_chnName, db);
  527. }
  528. return 10;
  529. }
  530. /**
  531. * @brief 两个低音量是否相似
  532. *
  533. * @param db
  534. * @return true
  535. * @return false
  536. */
  537. bool CompareDoubleThread::isSameBothMinDB(int db)
  538. {
  539. bool bSame = true;
  540. int nThresholdNum = m_nIsSameBothMinDBWaitNum; //是否静音要等待3秒,因为音频有延时
  541. if (nThresholdNum < 0) nThresholdNum = 1;
  542. if (nThresholdNum > 10) nThresholdNum = 10;
  543. for(int i = 0; i < nThresholdNum; ++i)
  544. {
  545. if (db != m_arrayMiniDB[i])
  546. {
  547. bSame = false;
  548. break;
  549. }
  550. }
  551. return bSame;
  552. }