ThreadManager.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897
  1. #include "ThreadManager.h"
  2. #include "CreateWAVThread.h"
  3. #include "CreateDBThread.h"
  4. #include "ConsistencyCompareThread.h"
  5. #include "GlobalVariable.h"
  6. #include "NoiseDetectThread.h"
  7. #include "RtpOneRoadThread.h"
  8. #include "CreateRecordFileThread.h"
  9. #include "RecordThread.h"
  10. #include "AssignSrcDataThread.h"
  11. #include "ThreadPool.h"
  12. #include <mutex>
  13. #include <string>
  14. ThreadManager::ThreadManager()
  15. {
  16. m_logger = spdlog::get("ACAServer");
  17. if(m_logger == nullptr)
  18. {
  19. fmt::print("ThreadManager: ACAServer Logger not found.\n");
  20. return;
  21. }
  22. m_logBase = "ThreadManager";
  23. }
  24. /* 启动所有线程 */
  25. // void ThreadManager::startAllThreads()
  26. // {
  27. // }
  28. /* 停止所有线程 */
  29. void ThreadManager::stopAllThreads()
  30. {
  31. }
  32. /* 创建一个录音通道及其附属的线程 */
  33. bool ThreadManager::createRecordThread(const OneSoundCardPCMInfo_t& pcmInfo, int compareItemID)
  34. {
  35. /* 先查找队列中有没有该录音通道 */
  36. std::lock_guard<std::mutex> lock(m_mutexRecordThreadRefCount);
  37. for(const auto& pair : m_mapRecordThreadRefCount)
  38. {
  39. if( pair.first == pcmInfo.pcmInfo.strPCMName)
  40. {
  41. SPDLOG_LOGGER_TRACE(m_logger, "{}:{} 录音线程已存在", pcmInfo.strSoundCardName, pcmInfo.pcmInfo.strPCMName);
  42. /* 录音线程已存在,增加引用计数
  43. 先判断对比项ID是否已经在列表中了 */
  44. bool idFound = false;
  45. for(const auto& it : pair.second)
  46. {
  47. if(it == compareItemID)
  48. {
  49. idFound = true;
  50. break;
  51. }
  52. }
  53. if(!idFound)
  54. {
  55. /* 如果对比项ID不存在,则添加到引用计数中 */
  56. m_mapRecordThreadRefCount[pair.first].push_back(compareItemID);
  57. }
  58. SPDLOG_LOGGER_INFO(m_logger, "{}:{} 录音线程引用计数增加,当前计数: {}",
  59. pcmInfo.strSoundCardName, pcmInfo.pcmInfo.strPCMName, m_mapRecordThreadRefCount[pair.first].size());
  60. /* 返回成功 */
  61. return true;
  62. }
  63. }
  64. /* 录音线程不存在,挨个创建线程 */
  65. /* 先创建生成wav小文件数据的线程 */
  66. RecordThreadInfo_t threadInfo;
  67. threadInfo.cardRoadInfo = pcmInfo;
  68. threadInfo.threadState = EThreadState::State_Inited;
  69. threadInfo.threadType = EThreadType::Type_CreateWAV;
  70. CreateWAVThread* pCreateWAVThread = new CreateWAVThread(threadInfo);
  71. if(pCreateWAVThread == nullptr)
  72. {
  73. SPDLOG_LOGGER_ERROR(m_logger, "{}:{} 创建生成wav小文件线程失败", pcmInfo.strSoundCardName, pcmInfo.pcmInfo.strPCMName);
  74. // return false; // 创建失败
  75. }else
  76. {
  77. CPPTP.add_task(&CreateWAVThread::threadTask, pCreateWAVThread);
  78. std::lock_guard<std::mutex> lock(m_mutexCreateWAVThreads);
  79. m_createWAVThreads.push_back(pCreateWAVThread);
  80. }
  81. /* 创建计算音量的线程 */
  82. threadInfo.threadType = EThreadType::Type_CreateDB;
  83. CreateDBThread* pCreateDBThread = new CreateDBThread(threadInfo);
  84. if(pCreateDBThread == nullptr)
  85. {
  86. SPDLOG_LOGGER_ERROR(m_logger, "{}:{} 创建计算音量线程失败", pcmInfo.strSoundCardName, pcmInfo.pcmInfo.strPCMName);
  87. // return false; // 创建失败
  88. }else
  89. {
  90. CPPTP.add_task(&CreateDBThread::threadTask, pCreateDBThread);
  91. std::lock_guard<std::mutex> lock(m_mutexCreateDBThreads);
  92. m_createDBThreads.push_back(pCreateDBThread);
  93. }
  94. /* 创建生成长文件的线程 */
  95. threadInfo.threadType = EThreadType::Type_CreateLongWAV;
  96. CreateRecordFileThread* pCreateLongWAVThread = new CreateRecordFileThread(threadInfo);
  97. if(pCreateLongWAVThread == nullptr)
  98. {
  99. SPDLOG_LOGGER_ERROR(m_logger, "{}:{} 创建生成长文件线程失败", pcmInfo.strSoundCardName, pcmInfo.pcmInfo.strPCMName);
  100. // return false; // 创建失败
  101. }else
  102. {
  103. CPPTP.add_task(&CreateRecordFileThread::threadTask, pCreateLongWAVThread);
  104. std::lock_guard<std::mutex> lock(m_mutexCreateLongWAVThreads);
  105. m_createLongWAVThreads.push_back(pCreateLongWAVThread);
  106. }
  107. /* 创建发送RTP数据的线程 */
  108. threadInfo.threadType = EThreadType::Type_RtpSend;
  109. CPPTP.add_task(&ThreadManager::thread_RTPSend, threadInfo);
  110. // RTPOneRoadThread* pRtpSendThread = new RTPOneRoadThread(threadInfo);
  111. // if(pRtpSendThread == nullptr)
  112. // {
  113. // SPDLOG_LOGGER_ERROR(m_logger, "{}:{} 创建发送RTP数据线程失败", pcmInfo.strSoundCardName, pcmInfo.pcmInfo.strPCMName);
  114. // }else
  115. // {
  116. // CPPTP.add_task(&RTPOneRoadThread::threadTask, pRtpSendThread);
  117. // std::lock_guard<std::mutex> lock(m_mutexRtpSendThreads);
  118. // m_rtpSendThreads.push_back(pRtpSendThread);
  119. // }
  120. /* 创建录音线程 */
  121. threadInfo.threadType = EThreadType::Type_RecordSrc;
  122. RecordThread* pRecordThread = new RecordThread(threadInfo);
  123. if(pRecordThread == nullptr)
  124. {
  125. SPDLOG_LOGGER_ERROR(m_logger, "{}:{} 创建录音线程失败", pcmInfo.strSoundCardName, pcmInfo.pcmInfo.strPCMName);
  126. // return false; // 创建失败
  127. }else
  128. {
  129. CPPTP.add_task(&RecordThread::threadTask, pRecordThread);
  130. std::lock_guard<std::mutex> lock(m_mutexRecordThreads);
  131. m_recordThreads.push_back(pRecordThread);
  132. }
  133. /* 创建分派数据线程 */
  134. threadInfo.threadType = EThreadType::Type_AssignSrcData;
  135. AssignSrcDataThread* pAssignSrcDataThread = new AssignSrcDataThread(threadInfo);
  136. if(pAssignSrcDataThread == nullptr)
  137. {
  138. SPDLOG_LOGGER_ERROR(m_logger, "{}:{} 创建分派数据线程失败", pcmInfo.strSoundCardName, pcmInfo.pcmInfo.strPCMName);
  139. // return false; // 创建失败
  140. }else
  141. {
  142. CPPTP.add_task(&AssignSrcDataThread::threadTask, pAssignSrcDataThread);
  143. std::lock_guard<std::mutex> lock(m_mutexAssignSrcDataThreads);
  144. m_assignSrcDataThreads.push_back(pAssignSrcDataThread);
  145. }
  146. /* 录音线程创建成功,增加引用计数 */
  147. m_mapRecordThreadRefCount[pcmInfo.pcmInfo.strPCMName].push_back(compareItemID);
  148. return true;
  149. }
  150. /**
  151. 销毁一个录音通道及其附属的线程,如果引用计数为0, 这里只停止该录音通道的所有线程,不会删除实例
  152. 线程实例会由其他管理线程定期去删除
  153. */
  154. bool ThreadManager::removeRecordThread(const OneSoundCardPCMInfo_t& pcmInfo, int compareItemID)
  155. {
  156. std::lock_guard<std::mutex> lock(m_mutexRecordThreadRefCount);
  157. /* 先查找这个引用计数是否存在 */
  158. int refCount = 0;
  159. for(auto& pair : m_mapRecordThreadRefCount)
  160. {
  161. if(pair.first == pcmInfo.pcmInfo.strPCMName)
  162. {
  163. /* 找到该引用计数,减少引用计数 */
  164. for(auto& it : pair.second)
  165. {
  166. if(it == compareItemID)
  167. {
  168. m_mapRecordThreadRefCount[pair.first].remove(it);
  169. break;
  170. }
  171. }
  172. refCount = m_mapRecordThreadRefCount[pair.first].size();
  173. break;
  174. }
  175. }
  176. std::string logBase = fmt::format("{}:{}", pcmInfo.strSoundCardName, pcmInfo.pcmInfo.strPCMName);
  177. if(refCount > 0)
  178. {
  179. SPDLOG_LOGGER_INFO(m_logger, "{} 录音线程引用计数减少,当前计数: {}", logBase, refCount);
  180. return true;
  181. }
  182. SPDLOG_LOGGER_INFO(m_logger, "{} 录音线程引用计数为0,即将停止该录音通道的所有线程", logBase);
  183. /* 引用计数为0,停止该录音通道的所有线程 */
  184. /* 停止录音线程 */
  185. {
  186. std::lock_guard<std::mutex> lock(m_mutexRecordThreads);
  187. for(auto it : m_recordThreads)
  188. {
  189. const auto& threadInfo = it->getThreadInfo();
  190. if(threadInfo.cardRoadInfo.pcmInfo.strPCMName == pcmInfo.pcmInfo.strPCMName)
  191. {
  192. it->stopThread();
  193. SPDLOG_LOGGER_TRACE(m_logger, "{} 录音线程已停止", logBase);
  194. break;
  195. }
  196. }
  197. }
  198. /* 停止分派任务线程 */
  199. {
  200. std::lock_guard<std::mutex> lock(m_mutexAssignSrcDataThreads);
  201. for(auto it : m_assignSrcDataThreads)
  202. {
  203. const auto& threadInfo = it->getThreadInfo();
  204. if(threadInfo.cardRoadInfo.pcmInfo.strPCMName == pcmInfo.pcmInfo.strPCMName)
  205. {
  206. it->stopThread();
  207. SPDLOG_LOGGER_TRACE(m_logger, "{} 分派数据线程已停止", logBase);
  208. break;
  209. }
  210. }
  211. }
  212. /* 停止生成wav小文件线程 */
  213. {
  214. std::lock_guard<std::mutex> lock(m_mutexCreateWAVThreads);
  215. for(auto it : m_createWAVThreads)
  216. {
  217. const auto& threadInfo = it->getThreadInfo();
  218. if(threadInfo.cardRoadInfo.pcmInfo.strPCMName == pcmInfo.pcmInfo.strPCMName)
  219. {
  220. it->stopThread();
  221. SPDLOG_LOGGER_TRACE(m_logger, "{} 生成wav小文件线程已停止", logBase);
  222. break;
  223. }
  224. }
  225. }
  226. /* 停止计算音量线程 */
  227. {
  228. std::lock_guard<std::mutex> lock(m_mutexCreateDBThreads);
  229. for(auto it : m_createDBThreads)
  230. {
  231. const auto& threadInfo = it->getThreadInfo();
  232. if(threadInfo.cardRoadInfo.pcmInfo.strPCMName == pcmInfo.pcmInfo.strPCMName)
  233. {
  234. it->stopThread();
  235. SPDLOG_LOGGER_TRACE(m_logger, "{} 计算音量线程已停止", logBase);
  236. break;
  237. }
  238. }
  239. }
  240. /* 停止生成长文件线程 */
  241. {
  242. std::lock_guard<std::mutex> lock(m_mutexCreateLongWAVThreads);
  243. for(auto it : m_createLongWAVThreads)
  244. {
  245. const auto& threadInfo = it->getThreadInfo();
  246. if(threadInfo.cardRoadInfo.pcmInfo.strPCMName == pcmInfo.pcmInfo.strPCMName)
  247. {
  248. it->stopThread();
  249. SPDLOG_LOGGER_TRACE(m_logger, "{} 生成长文件线程已停止", logBase);
  250. break;
  251. }
  252. }
  253. }
  254. /* 停止发送RTP数据线程 */
  255. {
  256. std::lock_guard<std::mutex> lock(m_mutexRtpSendThreads);
  257. for(auto it : m_rtpSendThreads)
  258. {
  259. const auto& threadInfo = it->getThreadInfo();
  260. if(threadInfo.cardRoadInfo.pcmInfo.strPCMName == pcmInfo.pcmInfo.strPCMName)
  261. {
  262. it->stopThread();
  263. SPDLOG_LOGGER_TRACE(m_logger, "{} 发送RTP数据线程已停止", logBase);
  264. break;
  265. }
  266. }
  267. }
  268. /* 从引用计数中移除该录音通道 */
  269. auto it = m_mapRecordThreadRefCount.find(pcmInfo.pcmInfo.strPCMName);
  270. if(it != m_mapRecordThreadRefCount.end())
  271. {
  272. m_mapRecordThreadRefCount.erase(it);
  273. SPDLOG_LOGGER_INFO(m_logger, "{} 录音线程已停止运行", logBase);
  274. } else
  275. {
  276. SPDLOG_LOGGER_WARN(m_logger, "{} 录音线程引用计数未找到", logBase);
  277. }
  278. // 设置销毁录音线程标志
  279. m_isDestroyeRecordThread.store(true);
  280. return true;
  281. }
  282. /* 销毁录音线程 */
  283. void ThreadManager::destroyeRecordThread()
  284. {
  285. if(!m_isDestroyeRecordThread.load())
  286. {
  287. /* 没有需要销毁的线程 */
  288. return;
  289. }
  290. /* 销毁录音线程 */
  291. {
  292. std::lock_guard<std::mutex> lock(m_mutexRecordThreads);
  293. for(auto it = m_recordThreads.begin(); it != m_recordThreads.end(); )
  294. {
  295. BaseRecordThread* pThread = *it;
  296. if(pThread != nullptr)
  297. {
  298. if(pThread->getThreadInfo().threadState == EThreadState::State_Running)
  299. {
  300. auto pRecordThread = dynamic_cast<RecordThread*>(pThread);
  301. delete pRecordThread; // 删除线程
  302. pThread = nullptr;
  303. it = m_recordThreads.erase(it); // 从列表中移除
  304. }
  305. } else
  306. {
  307. it++;
  308. }
  309. }
  310. }
  311. /* 销毁分派线程 */
  312. {
  313. std::lock_guard<std::mutex> lock(m_mutexAssignSrcDataThreads);
  314. for(auto it = m_assignSrcDataThreads.begin(); it != m_assignSrcDataThreads.end(); )
  315. {
  316. BaseRecordThread* pThread = *it;
  317. if(pThread != nullptr)
  318. {
  319. if(pThread->getThreadInfo().threadState == EThreadState::State_Running)
  320. {
  321. auto pAssignSrcDataThread = dynamic_cast<AssignSrcDataThread*>(pThread);
  322. delete pAssignSrcDataThread; // 删除线程
  323. pThread = nullptr;
  324. it = m_assignSrcDataThreads.erase(it); // 从列表中移除
  325. }
  326. } else
  327. {
  328. it++;
  329. }
  330. }
  331. }
  332. /* 销毁生成wav小文件线程 */
  333. {
  334. std::lock_guard<std::mutex> lock(m_mutexCreateWAVThreads);
  335. for(auto it = m_createWAVThreads.begin(); it != m_createWAVThreads.end(); )
  336. {
  337. BaseRecordThread* pThread = *it;
  338. if(pThread != nullptr)
  339. {
  340. if(pThread->getThreadInfo().threadState == EThreadState::State_Running)
  341. {
  342. auto pCreateWAVThread = dynamic_cast<CreateWAVThread*>(pThread);
  343. delete pCreateWAVThread; // 删除线程
  344. pThread = nullptr;
  345. it = m_createWAVThreads.erase(it); // 从列表中移除
  346. }
  347. } else
  348. {
  349. it++;
  350. }
  351. }
  352. }
  353. /* 销毁计算音量线程 */
  354. {
  355. std::lock_guard<std::mutex> lock(m_mutexCreateDBThreads);
  356. for(auto it = m_createDBThreads.begin(); it != m_createDBThreads.end(); )
  357. {
  358. BaseRecordThread* pThread = *it;
  359. if(pThread != nullptr)
  360. {
  361. if(pThread->getThreadInfo().threadState == EThreadState::State_Running)
  362. {
  363. auto pCreateDBThread = dynamic_cast<CreateDBThread*>(pThread);
  364. delete pCreateDBThread; // 删除线程
  365. pThread = nullptr;
  366. it = m_createDBThreads.erase(it); // 从列表中移除
  367. }
  368. } else
  369. {
  370. it++;
  371. }
  372. }
  373. }
  374. /* 销毁生成长文件线程 */
  375. {
  376. std::lock_guard<std::mutex> lock(m_mutexCreateLongWAVThreads);
  377. for(auto it = m_createLongWAVThreads.begin(); it != m_createLongWAVThreads.end(); )
  378. {
  379. BaseRecordThread* pThread = *it;
  380. if(pThread != nullptr)
  381. {
  382. if(pThread->getThreadInfo().threadState == EThreadState::State_Running)
  383. {
  384. auto pCreateLongWAVThread = dynamic_cast<CreateRecordFileThread*>(pThread);
  385. delete pCreateLongWAVThread; // 删除线程
  386. pThread = nullptr;
  387. it = m_createLongWAVThreads.erase(it); // 从列表中移除
  388. }
  389. } else
  390. {
  391. it++;
  392. }
  393. }
  394. }
  395. /* 销毁发送RTP数据线程 */
  396. {
  397. std::lock_guard<std::mutex> lock(m_mutexRtpSendThreads);
  398. for(auto it = m_rtpSendThreads.begin(); it != m_rtpSendThreads.end(); )
  399. {
  400. BaseRecordThread* pThread = *it;
  401. if(pThread != nullptr)
  402. {
  403. if(pThread->getThreadInfo().threadState == EThreadState::State_Running)
  404. {
  405. auto pRtpSendThread = dynamic_cast<RTPOneRoadThread*>(pThread);
  406. delete pRtpSendThread; // 删除线程
  407. pThread = nullptr;
  408. it = m_rtpSendThreads.erase(it); // 从列表中移除
  409. }
  410. } else
  411. {
  412. it++;
  413. }
  414. }
  415. }
  416. /* 销毁标志位置为false */
  417. m_isDestroyeRecordThread.store(false);
  418. }
  419. /* 查找录音线程 */
  420. BaseRecordThread* ThreadManager::findRecordThread(EThreadType type, std::string pcmName)
  421. {
  422. switch(type)
  423. {
  424. case EThreadType::Type_RecordSrc: /* 录音线程 */
  425. {
  426. std::lock_guard<std::mutex> lock(m_mutexRecordThreads);
  427. for (auto& pThread : m_recordThreads)
  428. {
  429. if (pThread->getThreadInfo().cardRoadInfo.pcmInfo.strPCMName == pcmName )
  430. {
  431. return pThread;
  432. }
  433. }
  434. }
  435. break;
  436. case EThreadType::Type_CreateWAV: /* 创建wav小文件和分离左右声道的线程 */
  437. {
  438. std::lock_guard<std::mutex> lock(m_mutexCreateWAVThreads);
  439. for (auto& pThread : m_createWAVThreads)
  440. {
  441. if (pThread->getThreadInfo().cardRoadInfo.pcmInfo.strPCMName == pcmName )
  442. {
  443. return pThread;
  444. }
  445. }
  446. }
  447. break;
  448. case EThreadType::Type_CreateDB: /* 计算音量和反相的线程 */
  449. {
  450. std::lock_guard<std::mutex> lock(m_mutexCreateDBThreads);
  451. for (auto& pThread : m_createDBThreads)
  452. {
  453. if (pThread->getThreadInfo().cardRoadInfo.pcmInfo.strPCMName == pcmName )
  454. {
  455. return pThread;
  456. }
  457. }
  458. }
  459. break;
  460. case EThreadType::Type_CreateLongWAV: /* 创建长文件的线程 */
  461. {
  462. std::lock_guard<std::mutex> lock(m_mutexCreateLongWAVThreads);
  463. for (auto& pThread : m_createLongWAVThreads)
  464. {
  465. if (pThread->getThreadInfo().cardRoadInfo.pcmInfo.strPCMName == pcmName )
  466. {
  467. return pThread;
  468. }
  469. }
  470. }
  471. break;
  472. case EThreadType::Type_AssignSrcData: /* 分派数据线程 */
  473. {
  474. std::lock_guard<std::mutex> lock(m_mutexAssignSrcDataThreads);
  475. for (auto& pThread : m_assignSrcDataThreads)
  476. {
  477. if (pThread->getThreadInfo().cardRoadInfo.pcmInfo.strPCMName == pcmName )
  478. {
  479. return pThread;
  480. }
  481. }
  482. }
  483. break;
  484. case EThreadType::Type_RtpSend: /* RTP发送线程 */
  485. {
  486. std::lock_guard<std::mutex> lock(m_mutexRtpSendThreads);
  487. for (auto& pThread : m_rtpSendThreads)
  488. {
  489. if (pThread->getThreadInfo().cardRoadInfo.pcmInfo.strPCMName == pcmName )
  490. {
  491. return pThread;
  492. }
  493. }
  494. }
  495. break;
  496. default:
  497. SPDLOG_LOGGER_ERROR(m_logger, "{} 查找录音线程失败,未知线程类型: {}", m_logBase, static_cast<int>(type));
  498. return nullptr; // 未知线程类型
  499. }
  500. return nullptr;
  501. }
  502. /* 获取创建WAV线程指针 */
  503. CreateWAVThread* ThreadManager::getCreateWAVThread(std::string pcmName)
  504. {
  505. std::lock_guard<std::mutex> lock(m_mutexCreateWAVThreads);
  506. for(auto& pThread : m_createWAVThreads)
  507. {
  508. if(pThread->getThreadInfo().cardRoadInfo.pcmInfo.strPCMName == pcmName)
  509. {
  510. return dynamic_cast<CreateWAVThread*>(pThread);
  511. }
  512. }
  513. return nullptr;
  514. }
  515. /* 获取创建音量值的线程 */
  516. CreateDBThread* ThreadManager::getCreateDBThread(std::string pcmName)
  517. {
  518. std::lock_guard<std::mutex> lock(m_mutexCreateDBThreads);
  519. for(auto& pThread : m_createDBThreads)
  520. {
  521. if(pThread->getThreadInfo().cardRoadInfo.pcmInfo.strPCMName == pcmName)
  522. {
  523. return dynamic_cast<CreateDBThread*>(pThread);
  524. }
  525. }
  526. return nullptr;
  527. }
  528. /* 获取发送Rtp数据的线程 */
  529. RTPOneRoadThread* ThreadManager::getRtpSendThread(std::string pcmName)
  530. {
  531. std::lock_guard<std::mutex> lock(m_mutexRtpSendThreads);
  532. for(auto& pThread : m_rtpSendThreads)
  533. {
  534. const auto& threadInfo = pThread->getThreadInfo();
  535. if(threadInfo.cardRoadInfo.pcmInfo.strPCMName == pcmName)
  536. {
  537. return dynamic_cast<RTPOneRoadThread*>(pThread);
  538. }
  539. }
  540. return nullptr;
  541. }
  542. /* 获取录制报警文件的线程 */
  543. CreateRecordFileThread* ThreadManager::getCreateRecordFileThread(std::string pcmName)
  544. {
  545. std::lock_guard<std::mutex> lock(m_mutexCreateLongWAVThreads);
  546. for(auto& pThread : m_createLongWAVThreads)
  547. {
  548. if(pThread->getThreadInfo().cardRoadInfo.pcmInfo.strPCMName == pcmName)
  549. {
  550. return dynamic_cast<CreateRecordFileThread*>(pThread);
  551. }
  552. }
  553. return nullptr;
  554. }
  555. /* -------------------------------------------------------------------------------------------
  556. * 获取计算线程,如果该线程不存在则创建该线程
  557. * 当不需要此线程后,调用remove()函数去掉该线程
  558. * -------------------------------------------------------------------------------------------- */
  559. /* 获取一致性比对线程,线程不存在则创建 */
  560. // ConsistencyCompareThread* ThreadManager::getConsistencyCompareThread(const SoundCardRoadInfo_t& roadInfo1, const SoundCardRoadInfo_t& roadInfo2)
  561. // {
  562. // std::lock_guard<std::mutex> lock(m_mutexConsistencyCompareThreads);
  563. // for(const auto pThread : m_listConsistencyCompareThreads)
  564. // {
  565. // if(pThread->isRoadEqual(roadInfo1, roadInfo2))
  566. // {
  567. // return pThread; // 找到相同的线程,直接返回
  568. // }
  569. // }
  570. // /* 没找到该线程,创建新的线程 */
  571. // CompareItemRoadInfo_t item1;
  572. // item1.nCompareRoadNum = 1;
  573. // item1.scRoadInfo = roadInfo1;
  574. // CompareItemRoadInfo_t item2;
  575. // item2.nCompareRoadNum = 2;
  576. // item2.scRoadInfo = roadInfo2;
  577. // CalculateThreadInfo_t threadInfo;
  578. // threadInfo.compareItemInfo.mapRoad.insert(item1.nCompareRoadNum, item1);
  579. // threadInfo.compareItemInfo.mapRoad.insert(item2.nCompareRoadNum, item2);
  580. // ConsistencyCompareThread* newThread = new ConsistencyCompareThread(threadInfo);
  581. // if(newThread == nullptr)
  582. // {
  583. // SPDLOG_LOGGER_ERROR(m_logger, "创建一致性比对线程失败");
  584. // return nullptr; // 创建失败
  585. // }
  586. // CPPTP.add_task(&ConsistencyCompareThread::threadTask, newThread);
  587. // m_listConsistencyCompareThreads.push_back(newThread);
  588. // m_referCountConsistencyCompare++; // 引用计数加一
  589. // return newThread;
  590. // }
  591. /* 去掉线程,线程使用的计数减一,计数为0则销毁该线程 */
  592. // bool ThreadManager::removeConsistencyCompareThread(SoundCardRoadInfo_t& roadInfo1, SoundCardRoadInfo_t& roadInfo2)
  593. // {
  594. // std::lock_guard<std::mutex> lock(m_mutexConsistencyCompareThreads);
  595. // ConsistencyCompareThread* pThreadToRemove = nullptr;
  596. // for(const auto pThread : m_listConsistencyCompareThreads)
  597. // {
  598. // if(pThread->isRoadEqual(roadInfo1, roadInfo2))
  599. // {
  600. // pThreadToRemove = pThread; // 找到相同的线程,直接返回
  601. // break;
  602. // }
  603. // }
  604. // if(pThreadToRemove == nullptr)
  605. // {
  606. // SPDLOG_LOGGER_WARN(m_logger, "{}:{} - {}:{} 一致性比对线程未找到", roadInfo1.strSoundCardName.toStdString(), roadInfo1.roadInfo.nRoadNum,
  607. // roadInfo2.strSoundCardName.toStdString(), roadInfo2.roadInfo.nRoadNum);
  608. // return false; // 没找到该线程
  609. // }
  610. // m_referCountConsistencyCompare--; // 引用计数减一
  611. // if(m_referCountConsistencyCompare <= 0)
  612. // {
  613. // /* 停止线程,并一直等待其停止 */
  614. // pThreadToRemove->stopThreadBlock();
  615. // m_listConsistencyCompareThreads.remove(pThreadToRemove); // 从列表中移除
  616. // delete pThreadToRemove; // 删除线程
  617. // pThreadToRemove = nullptr;
  618. // m_referCountConsistencyCompare = 0; // 重置引用计数
  619. // SPDLOG_LOGGER_WARN(m_logger, "{}:{} - {}:{} 一致性比对线程已销毁", roadInfo1.strSoundCardName.toStdString(), roadInfo1.roadInfo.nRoadNum,
  620. // roadInfo2.strSoundCardName.toStdString(), roadInfo2.roadInfo.nRoadNum);
  621. // }
  622. // return true;
  623. // }
  624. /* 获取噪音检测线程 */
  625. // NoiseDetectThread* ThreadManager::getNoiseDetectThread(const OneSoundCardPCMInfo_t& roadInfo, int compareItemID)
  626. // {
  627. // std::lock_guard<std::mutex> lock(m_mutexNoiseDetectThreads);
  628. // NoiseDetectThread* pNoiseDetectThread = nullptr;
  629. // for(const auto pThread : m_listNoiseDetectThreads)
  630. // {
  631. // const OneSoundCardPCMInfo_t & threadRoadInfo = pThread->getRoadInfo();
  632. // if(threadRoadInfo.pcmInfo.strPCMName == roadInfo.pcmInfo.strPCMName)
  633. // {
  634. // pNoiseDetectThread = pThread;
  635. // break;
  636. // }
  637. // }
  638. // /* 判断引用计数是否需要增加 */
  639. // if(pNoiseDetectThread != nullptr)
  640. // {
  641. // /* 查找这个通道是否在列表中(实际上肯定在列表中) */
  642. // bool isExist = false;
  643. // for(auto it = m_mapNoiseDetectThreadRefCount.begin(); it != m_mapNoiseDetectThreadRefCount.end(); ++it)
  644. // {
  645. // if(it->first.roadInfo. == roadInfo.pcmInfo.strPCMName &&
  646. // it->first.roadInfo.nRoadNum == roadInfo.roadInfo.nRoadNum)
  647. // {
  648. // bool isFound = false;
  649. // for(auto& id : it->second)
  650. // {
  651. // if(id == compareItemID)
  652. // {
  653. // isFound = true;
  654. // break; // 找到相同的对比项ID,直接返回
  655. // }
  656. // }
  657. // if(!isFound)
  658. // {
  659. // it->second.push_back(compareItemID); // 添加新的对比项ID
  660. // SPDLOG_LOGGER_TRACE(m_logger, "{}:{} 噪音检测线程引用计数增加,当前计数: {}",
  661. // roadInfo.strSoundCardName.toStdString(), roadInfo.roadInfo.nRoadNum, it->second.size());
  662. // }
  663. // isExist = true;
  664. // break;
  665. // }
  666. // }
  667. // if(!isExist)
  668. // {
  669. // /* 不在引用计数的列表中,添加进入 */
  670. // m_mapNoiseDetectThreadRefCount[roadInfo].push_back(compareItemID);
  671. // }
  672. // return pNoiseDetectThread;
  673. // }
  674. // /* 没找到该线程,创建新的线程 */
  675. // CalculateThreadInfo_t threadInfo;
  676. // CompareItemRoadInfo_t item;
  677. // item.nCompareRoadNum = 1; // 假设噪音检测线程
  678. // item.scRoadInfo = roadInfo;
  679. // threadInfo.compareItemInfo.mapRoad.insert(item.nCompareRoadNum, item);
  680. // NoiseDetectThread* newThread = new NoiseDetectThread(threadInfo);
  681. // if(newThread == nullptr)
  682. // {
  683. // SPDLOG_LOGGER_ERROR(m_logger, "创建噪音检测线程失败");
  684. // return nullptr; // 创建失败
  685. // }
  686. // CPPTP.add_task(&NoiseDetectThread::threadTask, newThread);
  687. // m_listNoiseDetectThreads.push_back(newThread);
  688. // /* 不在引用计数的列表中,添加进入 */
  689. // m_mapNoiseDetectThreadRefCount[roadInfo].push_back(compareItemID);
  690. // return newThread;
  691. // }
  692. /* 去掉噪音检测线程,线程使用的计数减一,计数为0则销毁该线程 */
  693. // bool ThreadManager::removeNoiseDetectThread(const SoundCardRoadInfo_t& roadInfo, int compareItemID)
  694. // {
  695. // std::lock_guard<std::mutex> lock(m_mutexNoiseDetectThreads);
  696. // NoiseDetectThread* pThreadToRemove = nullptr;
  697. // for(const auto pThread : m_listNoiseDetectThreads)
  698. // {
  699. // const SoundCardRoadInfo_t& threadRoadInfo = pThread->getRoadInfo();
  700. // if(threadRoadInfo.nSoundCardNum == roadInfo.nSoundCardNum &&
  701. // threadRoadInfo.roadInfo.nRoadNum == roadInfo.roadInfo.nRoadNum)
  702. // {
  703. // pThreadToRemove = pThread; // 找到相同的线程,直接返回
  704. // break;
  705. // }
  706. // }
  707. // if(pThreadToRemove == nullptr)
  708. // {
  709. // SPDLOG_LOGGER_WARN(m_logger, "{}:{} 噪音检测线程未找到", roadInfo.strSoundCardName.toStdString(), roadInfo.roadInfo.nRoadNum);
  710. // return false; // 没找到该线程
  711. // }
  712. // /* 引用计数减一 */
  713. // int useCount = 0;
  714. // for(auto it = m_mapNoiseDetectThreadRefCount.begin(); it != m_mapNoiseDetectThreadRefCount.end(); ++it)
  715. // {
  716. // if(it->first.nSoundCardNum == roadInfo.nSoundCardNum &&
  717. // it->first.roadInfo.nRoadNum == roadInfo.roadInfo.nRoadNum)
  718. // {
  719. // /* 将对比项ID从列表中删除 */
  720. // auto& compareItemList = it->second;
  721. // auto itemIt = std::find(compareItemList.begin(), compareItemList.end(), compareItemID);
  722. // if(itemIt != compareItemList.end())
  723. // {
  724. // compareItemList.erase(itemIt); // 移除该对比项ID
  725. // SPDLOG_LOGGER_TRACE(m_logger, "{}:{} 噪音检测线程引用计数减少,当前计数: {}",
  726. // roadInfo.strSoundCardName.toStdString(), roadInfo.roadInfo.nRoadNum, compareItemList.size());
  727. // }
  728. // useCount = compareItemList.size(); // 获取当前引用计数
  729. // if(useCount <= 0)
  730. // {
  731. // m_mapNoiseDetectThreadRefCount.erase(it); // 如果引用计数为0,则从列表中移除
  732. // }
  733. // break; // 找到后退出循环
  734. // }
  735. // }
  736. // if(useCount <= 0)
  737. // {
  738. // SPDLOG_LOGGER_INFO(m_logger, "{}:{} 噪音检测线程引用计数为0,准备销毁该线程",
  739. // roadInfo.strSoundCardName.toStdString(), roadInfo.roadInfo.nRoadNum);
  740. // pThreadToRemove->stopThreadBlock(); // 停止线程
  741. // m_listNoiseDetectThreads.remove(pThreadToRemove); // 从列表中移除
  742. // delete pThreadToRemove; // 删除线程
  743. // pThreadToRemove = nullptr;
  744. // SPDLOG_LOGGER_INFO(m_logger, "{}:{} 噪音检测线程已销毁", roadInfo.strSoundCardName.toStdString(), roadInfo.roadInfo.nRoadNum);
  745. // }
  746. // return true;
  747. // }
  748. // /* 获取音量报警线程 */
  749. // CalculateDBPhaseThread* ThreadManager::getCalculateDBPhaseThread(const SoundCardRoadInfo_t& roadInfo)
  750. // {
  751. // std::lock_guard<std::mutex> lock(m_mutexCalculateDBPhaseThreads);
  752. // for(const auto pThread : m_listCalculateDBPhaseThreads)
  753. // {
  754. // const SoundCardRoadInfo_t& threadRoadInfo = pThread->getRoadInfo();
  755. // if(threadRoadInfo.nSoundCardNum == roadInfo.nSoundCardNum &&
  756. // threadRoadInfo.roadInfo.nRoadNum == roadInfo.roadInfo.nRoadNum)
  757. // {
  758. // return pThread; // 找到相同的线程,直接返回
  759. // }
  760. // }
  761. // /* 没找到该线程,创建新的线程 */
  762. // CompareItemRoadInfo_t item;
  763. // item.nCompareRoadNum = 1; // 假设音量报警线程
  764. // item.scRoadInfo = roadInfo;
  765. // threadInfo.compareItemInfo.mapRoad.insert(item.nCompareRoadNum, item);
  766. // CalculateDBPhaseThread* newThread = new CalculateDBPhaseThread(threadInfo);
  767. // if(newThread == nullptr)
  768. // {
  769. // SPDLOG_LOGGER_ERROR(m_logger, "创建音量报警线程失败");
  770. // return nullptr; // 创建失败
  771. // }
  772. // CPPTP.add_task(&CalculateDBPhaseThread::threadTask, newThread);
  773. // m_listCalculateDBPhaseThreads.push_back(newThread);
  774. // m_referCountCalculateDBPhase++; // 引用计数加一
  775. // return newThread;
  776. // }
  777. // /* 去掉音量报警线程,线程使用的计数减一,计数为0则销毁该线程 */
  778. // bool ThreadManager::removeCalculateDBPhaseThread(RoadNumberInfo_t& roadInfo)
  779. // {
  780. // std::lock_guard<std::mutex> lock(m_mutexCalculateDBPhaseThreads);
  781. // CalculateDBPhaseThread* pThreadToRemove = nullptr;
  782. // for(const auto pThread : m_listCalculateDBPhaseThreads)
  783. // {
  784. // if(pThread->getRoadInfo().roadID == roadInfo.roadID)
  785. // {
  786. // pThreadToRemove = pThread; // 找到相同的线程,直接返回
  787. // break;
  788. // }
  789. // }
  790. // if(pThreadToRemove == nullptr)
  791. // {
  792. // SPDLOG_LOGGER_WARN(m_logger, "{} 音量报警线程未找到", roadInfo.strRoadName);
  793. // return false; // 没找到该线程
  794. // }
  795. // m_referCountCalculateDBPhase--; // 引用计数减一
  796. // if(m_referCountCalculateDBPhase <= 0)
  797. // {
  798. // pThreadToRemove->stopThread(); // 停止线程
  799. // m_listCalculateDBPhaseThreads.remove(pThreadToRemove); // 从列表中移除
  800. // delete pThreadToRemove; // 删除线程
  801. // pThreadToRemove = nullptr;
  802. // m_referCountCalculateDBPhase = 0; // 重置引用计数
  803. // SPDLOG_LOGGER_INFO(m_logger, "{} 音量报警线程已销毁", roadInfo.strRoadName);
  804. // }
  805. // return true;
  806. // }
  807. /* RTP线程函数,套一层壳 */
  808. void ThreadManager::thread_RTPSend(RecordThreadInfo_t& threadInfo)
  809. {
  810. RTPOneRoadThread* pRtpSendThread = new RTPOneRoadThread(threadInfo);
  811. if(pRtpSendThread == nullptr)
  812. {
  813. SPDLOG_ERROR("{}:{} 创建RTP发送线程失败", threadInfo.cardRoadInfo.strSoundCardName, threadInfo.cardRoadInfo.pcmInfo.strPCMName);
  814. return;
  815. }
  816. /* 先加入队列,再开启线程 */
  817. ThreadMan.m_mutexRtpSendThreads.lock();
  818. ThreadMan.m_rtpSendThreads.push_back(pRtpSendThread);
  819. ThreadMan.m_mutexRtpSendThreads.unlock();
  820. pRtpSendThread->threadTask();
  821. }