NoiseDetectThread.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. #include "NoiseDetectThread.h"
  2. #include <random>
  3. #include "CreateWAVThread.h"
  4. #include "CreateRecordFileThread.h"
  5. #include "ThreadWriteDBManager.h"
  6. #include "ThreadManager.h"
  7. #include "commonDefine.h"
  8. #include "GlobalInfo.h"
  9. #include "signalstats.h"
  10. #include "spdlog.h"
  11. NoiseDetectThread::NoiseDetectThread(CalculateThreadInfo_t& threadInfo)
  12. : BaseCalculateThread(threadInfo),
  13. m_leftRightData(0)
  14. {
  15. }
  16. NoiseDetectThread::~NoiseDetectThread()
  17. {
  18. }
  19. /* 停止线程,只设置个停止标志,不阻塞等待 */
  20. void NoiseDetectThread::thread_stop()
  21. {
  22. m_isRunning = false;
  23. m_condVar.notify_all();
  24. }
  25. /* 停止线程 */
  26. void NoiseDetectThread::thread_stop_block()
  27. {
  28. m_isRunning = false;
  29. m_condVar.notify_all();
  30. while(!m_isStoped)
  31. {
  32. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  33. }
  34. }
  35. /* 开启对比项通道的噪音报警功能 */
  36. // void NoiseDetectThread::startCompareItemNoiseAlarm(const int itemID, const QString strName, const CompareItemRoadInfo_t& compareItemRoadInfo)
  37. // {
  38. // std::lock_guard<std::mutex> lock(m_mutexAlarm);
  39. // /* 如果已经存在这个对比项的报警信息,就不需要重复添加了 */
  40. // if(m_mapAlarmInfo.find(itemID) != m_mapAlarmInfo.end())
  41. // {
  42. // SPDLOG_LOGGER_INFO(m_logger, "{} 对比项 {} 的噪音报警功能已经开启", m_logBase, strName.toStdString());
  43. // return;
  44. // }
  45. // /* 添加对比项的噪音报警信息 */
  46. // AlarmInfo_t alarmInfo;
  47. // alarmInfo.CompareItemID = itemID;
  48. // alarmInfo.strCompareItemName = strName.toStdString();
  49. // alarmInfo.isAlarm = false; // 初始状态没有报警
  50. // alarmInfo.RoadInfo = compareItemRoadInfo;
  51. // alarmInfo.AlarmType = EAlarmType::EAT_Noise;
  52. // m_mapAlarmInfo[itemID] = alarmInfo;
  53. // }
  54. /* 关闭对比项通道的噪音报警功能 */
  55. // void NoiseDetectThread::stopCompareItemNoiseAlarm(const int itemID, const QString strName, const CompareItemRoadInfo_t& compareItemRoadInfo)
  56. // {
  57. // std::lock_guard<std::mutex> lock(m_mutexAlarm);
  58. // auto it = m_mapAlarmInfo.find(itemID);
  59. // if(it != m_mapAlarmInfo.end())
  60. // {
  61. // SPDLOG_LOGGER_INFO(m_logger, "{} 对比项 {} 的噪音报警功能已关闭", m_logBase, strName.toStdString());
  62. // m_mapAlarmInfo.erase(it); // 移除对比项的噪音报警信息
  63. // }else {
  64. // SPDLOG_LOGGER_WARN(m_logger, "{} 对比项 {} 的噪音报警功能未开启,无法关闭", m_logBase, strName.toStdString());
  65. // }
  66. // }
  67. /* 线程功能函数 */
  68. void NoiseDetectThread::task()
  69. {
  70. /* 初始化数据 */
  71. if(!initData())
  72. {
  73. SPDLOG_LOGGER_ERROR(m_logger, "{} 初始化数据失败", m_logBase);
  74. return;
  75. }
  76. /* 计算检测间隔,转换为毫秒 */
  77. int detectInterval = m_baseNoiseDetectConfig.nNoiseDetectInterval * 1000;
  78. if(detectInterval <= 0)
  79. {
  80. SPDLOG_LOGGER_WARN(m_logger, "{} 噪音检测间隔配置错误: {}秒,设置为默认1秒", m_logBase, m_baseNoiseDetectConfig.nNoiseDetectInterval);
  81. detectInterval = 1000; // 默认1秒
  82. }
  83. SPDLOG_LOGGER_INFO(m_logger, " ★ {} 噪音检测线程开始运行 ", m_logBase);
  84. // std::chrono::system_clock::time_point startTime = std::chrono::system_clock::now();
  85. #if(CREATE_NOISE_WARN)
  86. int noiseWarnCount = 0;
  87. bool isNoise = false;
  88. #endif /* CREATE_NOISE_WARN */
  89. while(true)
  90. {
  91. std::unique_lock<std::mutex> lock(m_mutexCondVar);
  92. m_condVar.wait_for(lock, std::chrono::milliseconds(detectInterval));
  93. if(m_isRunning == false)
  94. {
  95. /* 退出线程,结束噪音报警 */
  96. m_currentIsNoise = false;
  97. saveResultOnlyOneItem();
  98. break;
  99. }
  100. /* 判断是否还在噪音检测时间段内,如果还在噪音报警中,
  101. 则继续保存数据 */
  102. if(m_isInDetectPeriod.load() == false)
  103. {
  104. m_currentIsNoise = false;
  105. if(m_currentAlarmInfo.isAlarm)
  106. {
  107. saveResultOnlyOneItem();
  108. }else {
  109. m_isNoise.store(false);
  110. m_isNoiseWarning.store(false);
  111. }
  112. continue;
  113. }
  114. /*------------------------------------------------------------------------
  115. * 获取最新的左右声道数据
  116. *------------------------------------------------------------------------*/
  117. if(!m_pThreadWav->getLatestLeftRightData(m_leftRightData))
  118. {
  119. continue;
  120. }
  121. // SPDLOG_LOGGER_ERROR(m_logger, "{} 获取最新的左右声道数据成功,开始调用动态库计算噪音------------------------------------------ ", m_logBase);
  122. /*------------------------------------------------------------------------
  123. * 计算数据
  124. *------------------------------------------------------------------------*/
  125. if(!detectNoise())
  126. {
  127. continue;
  128. }
  129. #if(CREATE_NOISE_WARN)
  130. /* 这里模拟报警 */
  131. if( noiseWarnCount >= 12)
  132. {
  133. isNoise = !isNoise;
  134. noiseWarnCount = 0;
  135. }
  136. noiseWarnCount++;
  137. m_currentIsNoise = isNoise;
  138. #endif /* CREATE_NOISE_WARN */
  139. /*------------------------------------------------------------------------
  140. * 处理结果,写噪音报警信息到数据库(这里不写数据库,只计算结果返回给对比项)
  141. * 上面那个函数已经把结果保存了
  142. *------------------------------------------------------------------------*/
  143. // saveResult();
  144. saveResultOnlyOneItem();
  145. }
  146. clearData(); // 清理数据
  147. SPDLOG_LOGGER_WARN(m_logger, " ★ {} 噪音检测线程停止运行 ", m_logBase);
  148. }
  149. /* 初始化数据 */
  150. bool NoiseDetectThread::initData()
  151. {
  152. auto begin = m_threadInfo.compareItemInfo.mapRoad.begin(); // 获取第一个通道的信息
  153. m_roadInfo = begin->scRoadInfo; // 录音通道信息
  154. m_roadName = fmt::format("{}:{}", m_roadInfo.strSoundCardName, m_roadInfo.pcmInfo.strPCMName);
  155. m_logBase = fmt::format("噪音检测通道 {}:", m_roadName);
  156. /* 获取线程 */
  157. auto now = std::chrono::steady_clock::now();
  158. while(true)
  159. {
  160. if(m_pThreadWav == nullptr)
  161. {
  162. m_pThreadWav = ThreadMan.getCreateWAVThread(m_roadInfo.pcmInfo.strPCMName);
  163. }
  164. if(m_pThreadCreateAlarm == nullptr)
  165. {
  166. m_pThreadCreateAlarm = ThreadMan.getCreateRecordFileThread(m_roadInfo.pcmInfo.strPCMName);
  167. }
  168. if(m_pThreadWav != nullptr && m_pThreadCreateAlarm != nullptr)
  169. {
  170. break; // 获取到线程了
  171. }
  172. if(std::chrono::steady_clock::now() - now > std::chrono::seconds(10))
  173. {
  174. SPDLOG_LOGGER_ERROR(m_logger, "{} 获取数据线程超时", m_logBase);
  175. return false; // 超时了,获取线程失败
  176. }
  177. }
  178. auto sampleRate = GInfo.sampleRate();
  179. m_sample_rate = static_cast<double>(sampleRate);
  180. /* 获取噪音检测参数 */
  181. m_noiseDetectParam = SysConfig.getNoiseDetectParam();
  182. m_baseNoiseDetectConfig = SysConfig.getNoiseDetectBaseConfig();
  183. /* 设置给计算的参数变量 */
  184. m_silence_threshold = m_noiseDetectParam.dThresholdSlient;
  185. m_db_threshold = m_noiseDetectParam.dThresholdDB;
  186. m_cv_threshold = m_noiseDetectParam.dThresholdCV;
  187. /* 设置噪音检测参数 */
  188. m_ringQueueIsNoise.setQueueCapacity(m_noiseDetectParam.nNoiseDetectContinueCount);
  189. return true;
  190. }
  191. /* 清理数据 */
  192. void NoiseDetectThread::clearData()
  193. {
  194. /* 判断是否还在报警中,如果是,则结束报警 */
  195. endAlarm();
  196. /* 删除分配的内存 */
  197. }
  198. /* 调用动态库检测噪音 */
  199. bool NoiseDetectThread::detectNoise()
  200. {
  201. // SPDLOG_LOGGER_TRACE(m_logger, "{} 开始调用动态库计算噪音", m_logBase);
  202. // SPDLOG_LOGGER_INFO(m_logger, "{} 左声道数据大小: {}, 右声道数据大小: {}",
  203. // m_logBase, m_leftRightData.vecLeftData.size(), m_leftRightData.vecRightData.size());
  204. auto startTime = std::chrono::steady_clock::now();
  205. bool isNoiseLeft = false; /* 是否检测到左声道噪音 */
  206. bool isNoiseRight = false; /* 是否检测到右声道噪音 */
  207. try
  208. {
  209. /*-------------------------- 先检测左声道 --------------------------*/
  210. nJson jsonOutput;
  211. auto ret = signalstats::detect_signal(
  212. jsonOutput, /* 返回结果,和jsonResult是一样的 */
  213. m_leftRightData.vecLeftData, /* 左声道数据 */
  214. m_sample_rate, /* 采样率(HZ) */
  215. m_silence_threshold, /* 静音阈值 */
  216. m_db_threshold, /* 分贝阈值 */
  217. m_cv_threshold, /* 变异系数阈值 */
  218. m_window_params, /* 窗函数参数 */
  219. m_nperseg, /* 每段样本数 */
  220. m_noverlap, /* 重叠样本数 */
  221. m_nfft /* FFT点数 */
  222. );
  223. isNoiseLeft = jsonOutput["noise"].is_null() ? false : jsonOutput["noise"].get<bool>();
  224. // std::chrono::duration<double> duration = std::chrono::steady_clock::now() - startTime;
  225. // std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
  226. // SPDLOG_LOGGER_DEBUG(m_logger, "{} 计算左声道噪音耗时: {}ms", m_logBase, ms.count());
  227. // startTime = std::chrono::steady_clock::now(); /* 重置开始时间 */
  228. /*-------------------------- 再检测右声道 --------------------------*/
  229. jsonOutput.clear(); /* 清空输出结果 */
  230. signalstats::detect_signal(
  231. jsonOutput, /* 返回结果,和jsonResult是一样的 */
  232. m_leftRightData.vecRightData, /* 右声道数据 */
  233. m_sample_rate, /* 采样率(HZ) */
  234. m_silence_threshold, /* 静音阈值 */
  235. m_db_threshold, /* 分贝阈值 */
  236. m_cv_threshold, /* 变异系数阈值 */
  237. m_window_params, /* 窗函数参数 */
  238. m_nperseg, /* 每段样本数 */
  239. m_noverlap, /* 重叠样本数 */
  240. m_nfft /* FFT点数 */
  241. );
  242. isNoiseRight = jsonOutput["noise"].is_null() ? false : jsonOutput["noise"].get<bool>();
  243. // SPDLOG_LOGGER_DEBUG(m_logger, "{} 右声道噪音检测结果: {}", m_logBase, jsonOutput["silence_state"].dump(4));
  244. // SPDLOG_LOGGER_DEBUG(m_logger, "{} 右声道噪音检测结果: {}, silence_state: {}", m_logBase, isNoiseRight, jsonOutput["silence_state"].dump(4));
  245. }
  246. catch (const std::exception& e)
  247. {
  248. SPDLOG_LOGGER_ERROR(m_logger, "{} 调用动态库检测噪音失败: {}", m_logBase, e.what());
  249. return false;
  250. }
  251. std::chrono::duration<double> duration = std::chrono::steady_clock::now() - startTime;
  252. std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
  253. // SPDLOG_LOGGER_DEBUG(m_logger, "{} 计算噪音耗时: {}ms", m_logBase, ms.count());
  254. SPDLOG_LOGGER_DEBUG(m_logger, "{} 左声道噪音检测结果: {}, 右声道噪音检测结果: {}, 耗时:{}ms", m_logBase, isNoiseLeft, isNoiseRight, ms.count());
  255. /* -------------------------- 和以往的结果对比 --------------------------*/
  256. m_currentIsNoise = (isNoiseLeft || isNoiseRight); /* 是否检测到噪音 */
  257. return true;
  258. }
  259. /* 保存结果 */
  260. // void NoiseDetectThread::saveResult()
  261. // {
  262. // /* 将当前噪音检测结果保存到环形队列中 */
  263. // m_ringQueueIsNoise.push(m_currentIsNoise);
  264. // /* 计算出噪音个数和噪音所占百分比 */
  265. // const int size = m_ringQueueIsNoise.QueueSize();
  266. // int numNoise = 0; // 噪音的个数
  267. // int numCountinueNoise = 0; // 连续噪音的个数
  268. // double percentNoise = 0.0; // 噪音所占百分比
  269. // for(int i = 0; i < size; ++i)
  270. // {
  271. // if(m_ringQueueIsNoise.at(i))
  272. // {
  273. // numNoise++;
  274. // numCountinueNoise++;
  275. // }else {
  276. // numCountinueNoise = 0; // 如果不是噪音,连续噪音计数清零
  277. // }
  278. // }
  279. // /* 判断是否是噪音预警 */
  280. // if(numCountinueNoise >= m_noiseDetectParam.nNoiseContinueCountIsWarn)
  281. // {
  282. // m_isNoiseWarning.store(true);
  283. // }
  284. // percentNoise = numNoise * 100.0 / m_noiseDetectParam.nNoiseDetectContinueCount;
  285. // /* 根据噪音所占的百分比判断是否是噪音 */
  286. // if(percentNoise >= m_noiseDetectParam.nNoiseContinueCountPercent)
  287. // {
  288. // m_isNoise.store(true);
  289. // }else {
  290. // m_isNoise.store(false);
  291. // }
  292. // // SPDLOG_LOGGER_INFO(m_logger, "{} 当前噪音检测结果: {}, 噪音预警: {}, 连续噪音个数: {}, 噪音所占百分比: {:.2f}%",
  293. // // m_logBase, m_currentIsNoise, m_isNoiseWarning.load(), numCountinueNoise, percentNoise);
  294. // /* 噪音报警信息 */
  295. // if(m_isNoise.load())
  296. // {
  297. // /* 判断上次是否是噪音 */
  298. // if(!m_isNoiseLast)
  299. // {
  300. // /* 开始噪音报警 */
  301. // m_isNoiseWarning = true;
  302. // /* 通知对比项线程,开始噪音报警 */
  303. // std::lock_guard<std::mutex> lock(m_mutexAlarm);
  304. // for(auto& pair : m_mapAlarmInfo)
  305. // {
  306. // AlarmInfo_t& alarmInfo = pair.second;
  307. // if(!alarmInfo.isAlarm) // 如果没有报警
  308. // {
  309. // alarmInfo.isAlarm = true; // 设置为报警状态
  310. // /* 向前推算噪音开始时间,开始时间需要向前推 n次噪音检测的时间 x 单次噪音检测需要的时间,单位秒 */
  311. // int nNoiseDetectTime = m_noiseDetectParam.nNoiseDetectContinueCount * 1;
  312. // QDateTime startTime = m_leftRightData.startTime;
  313. // startTime = startTime.addSecs(-nNoiseDetectTime);
  314. // alarmInfo.StartTime = startTime;
  315. // SPDLOG_LOGGER_WARN(m_logger, "{} 对比项-{} {} 开始噪音报警, 报警开始时间: {}", m_logBase, alarmInfo.strCompareItemName,
  316. // alarmInfo.RoadInfo.strCompareRoadName.toStdString(),
  317. // startTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
  318. // /* 这里可以添加通知录制报警文件的线程开始录音 */
  319. // if(m_pThreadCreateAlarm != nullptr)
  320. // {
  321. // m_pThreadCreateAlarm->startRecordAlarmFile(alarmInfo);
  322. // }
  323. // }
  324. // }
  325. // }
  326. // }else
  327. // {
  328. // /* 没有噪音,判断是否结束报警 */
  329. // if(m_isNoiseLast)
  330. // {
  331. // /* 停止噪音报警 */
  332. // m_isNoiseWarning = false;
  333. // /* 通知对比项线程,结束噪音报警 */
  334. // std::lock_guard<std::mutex> lock(m_mutexAlarm);
  335. // for(auto& pair : m_mapAlarmInfo)
  336. // {
  337. // AlarmInfo_t& alarmInfo = pair.second;
  338. // if(alarmInfo.isAlarm) // 如果正在报警
  339. // {
  340. // // 设置为非报警状态
  341. // alarmInfo.isAlarm = false;
  342. // /* 设置结束时间 */
  343. // alarmInfo.EndTime = m_leftRightData.endTime;
  344. // SPDLOG_LOGGER_WARN(m_logger, "{} 对比项-{} {} 结束噪音报警", m_logBase, alarmInfo.strCompareItemName,
  345. // alarmInfo.RoadInfo.strCompareRoadName.toStdString());
  346. // /* 这里可以添加通知录制报警文件的线程停止录音 */
  347. // if(m_pThreadCreateAlarm != nullptr)
  348. // {
  349. // m_pThreadCreateAlarm->stopRecordAlarmFile(alarmInfo);
  350. // }
  351. // /* 写入数据库,并清空时间 */
  352. // WriteDB.addAlarmInfo(alarmInfo);
  353. // alarmInfo.StartTime = QDateTime();
  354. // alarmInfo.EndTime = QDateTime();
  355. // }
  356. // }
  357. // }
  358. // }
  359. // m_isNoiseLast = m_isNoise.load(); // 更新这一次的噪音检测结果
  360. // }
  361. /* 新的保存结果函数,只有一个对比项信息 */
  362. void NoiseDetectThread::saveResultOnlyOneItem()
  363. {
  364. /* 将当前噪音检测结果保存到环形队列中 */
  365. m_ringQueueIsNoise.push(m_currentIsNoise);
  366. /* 计算出噪音个数和噪音所占百分比 */
  367. const int size = m_ringQueueIsNoise.QueueSize();
  368. int numNoise = 0; // 噪音的个数
  369. int numCountinueNoise = 0; // 连续噪音的个数
  370. double percentNoise = 0.0; // 噪音所占百分比
  371. for(int i = 0; i < size; ++i)
  372. {
  373. if(m_ringQueueIsNoise.at(i))
  374. {
  375. numNoise++;
  376. numCountinueNoise++;
  377. }else {
  378. numCountinueNoise = 0; // 如果不是噪音,连续噪音计数清零
  379. }
  380. }
  381. /* 判断是否是噪音预警 */
  382. if(numCountinueNoise >= m_noiseDetectParam.nNoiseContinueCountIsWarn)
  383. {
  384. m_isNoiseWarning.store(true);
  385. }
  386. percentNoise = numNoise * 100.0 / m_noiseDetectParam.nNoiseDetectContinueCount;
  387. /* 根据噪音所占的百分比判断是否是噪音 */
  388. if(percentNoise >= m_noiseDetectParam.nNoiseContinueCountPercent)
  389. {
  390. m_isNoise.store(true);
  391. }else {
  392. m_isNoise.store(false);
  393. }
  394. SPDLOG_LOGGER_DEBUG(m_logger, "{} 当前噪音检测结果: {}, 噪音预警: {}, 连续噪音个数: {}, 噪音所占百分比: {:.2f}%",
  395. m_logBase, m_currentIsNoise, m_isNoiseWarning.load(), numCountinueNoise, percentNoise);
  396. /* 噪音报警信息 */
  397. if(m_isNoise.load())
  398. {
  399. /* 判断上次是否是噪音 */
  400. if(!m_isNoiseLast)
  401. {
  402. /* 开始噪音报警 */
  403. m_isNoiseWarning = true;
  404. /* 通知对比项线程,开始噪音报警 */
  405. if(!m_currentAlarmInfo.isAlarm) // 如果没有报警
  406. {
  407. m_currentAlarmInfo.isAlarm = true; // 设置为报警状态
  408. m_currentAlarmInfo.CompareItemID = m_threadInfo.compareItemInfo.nID;
  409. m_currentAlarmInfo.strCompareItemName = m_threadInfo.compareItemInfo.strName;
  410. m_currentAlarmInfo.RoadInfo = m_threadInfo.compareItemInfo.mapRoad.first();
  411. m_currentAlarmInfo.AlarmType = EAlarmType::EAT_Noise;
  412. /* 向前推算噪音开始时间,开始时间需要向前推 n次噪音检测的时间 x 单次噪音检测需要的时间,单位秒 */
  413. int nNoiseDetectTime = m_noiseDetectParam.nNoiseDetectContinueCount * 1;
  414. QDateTime startTime = m_leftRightData.startTime;
  415. startTime = startTime.addSecs(-nNoiseDetectTime);
  416. m_currentAlarmInfo.StartTime = startTime;
  417. SPDLOG_LOGGER_WARN(m_logger, "{} 对比项-{} {} 开始噪音报警, 报警开始时间: {}", m_logBase, m_currentAlarmInfo.strCompareItemName.toStdString(),
  418. m_currentAlarmInfo.RoadInfo.strCompareRoadName.toStdString(),
  419. startTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
  420. /* 这里可以添加通知录制报警文件的线程开始录音 */
  421. if(m_pThreadCreateAlarm != nullptr)
  422. {
  423. m_pThreadCreateAlarm->startRecordAlarmFile(m_currentAlarmInfo);
  424. }
  425. }
  426. }
  427. }else
  428. {
  429. /* 没有噪音,判断是否结束报警 */
  430. if(m_isNoiseLast)
  431. {
  432. /* 停止噪音报警 */
  433. m_isNoiseWarning = false;
  434. /* 通知对比项线程,结束噪音报警 */
  435. std::lock_guard<std::mutex> lock(m_mutexAlarm);
  436. if(m_currentAlarmInfo.isAlarm) // 如果正在报警
  437. {
  438. // 设置为非报警状态
  439. m_currentAlarmInfo.isAlarm = false;
  440. /* 设置结束时间 */
  441. m_currentAlarmInfo.EndTime = m_leftRightData.endTime;
  442. SPDLOG_LOGGER_WARN(m_logger, "{} 对比项-{} {} 结束噪音报警", m_logBase, m_currentAlarmInfo.strCompareItemName.toStdString(),
  443. m_currentAlarmInfo.RoadInfo.strCompareRoadName.toStdString());
  444. /* 设置录音状态 */
  445. m_currentAlarmInfo.fileState = eRecordState::eRS_RecordCompleted;
  446. /* 这里可以添加通知录制报警文件的线程停止录音 */
  447. if(m_pThreadCreateAlarm != nullptr)
  448. {
  449. m_pThreadCreateAlarm->stopRecordAlarmFile(m_currentAlarmInfo);
  450. }
  451. /* 写入数据库,并清空时间 */
  452. WriteDB.addAlarmInfo(m_currentAlarmInfo);
  453. m_currentAlarmInfo = AlarmInfo_t(); // 清空当前报警信息
  454. }
  455. }
  456. }
  457. m_isNoiseLast = m_isNoise.load(); // 更新这一次的噪音检测结果
  458. }
  459. /* 结束报警 */
  460. void NoiseDetectThread::endAlarm()
  461. {
  462. if(m_currentAlarmInfo.isAlarm) // 如果正在报警
  463. {
  464. // 设置为非报警状态
  465. m_currentAlarmInfo.isAlarm = false;
  466. /* 设置结束时间 */
  467. m_currentAlarmInfo.EndTime = m_leftRightData.endTime;
  468. SPDLOG_LOGGER_WARN(m_logger, "{} 对比项-{} {} 结束噪音报警", m_logBase, m_currentAlarmInfo.strCompareItemName.toStdString(),
  469. m_currentAlarmInfo.RoadInfo.strCompareRoadName.toStdString());
  470. /* 这里可以添加通知录制报警文件的线程停止录音 */
  471. if(m_pThreadCreateAlarm != nullptr)
  472. {
  473. m_pThreadCreateAlarm->stopRecordAlarmFile(m_currentAlarmInfo);
  474. }
  475. /* 写入数据库,并清空时间 */
  476. WriteDB.addAlarmInfo(m_currentAlarmInfo);
  477. m_currentAlarmInfo = AlarmInfo_t(); // 清空当前报警信息
  478. }
  479. m_isNoiseWarning.store(false);
  480. m_isNoise.store(false);
  481. m_isNoiseLast = false;
  482. m_currentIsNoise = false;
  483. }