|
@@ -1,7 +1,7 @@
|
|
|
#include "ThreadManager.h"
|
|
|
|
|
|
#include "CreateWAVThread.h"
|
|
|
-#include "CreateDBPhaseThread.h"
|
|
|
+#include "CreateDBThread.h"
|
|
|
|
|
|
#include "CalculateDBThread.h"
|
|
|
#include "ConsistencyCompareThread.h"
|
|
@@ -10,6 +10,7 @@
|
|
|
#include "RtpOneRoadThread.h"
|
|
|
|
|
|
#include "ThreadPool.h"
|
|
|
+#include <mutex>
|
|
|
|
|
|
ThreadManager::ThreadManager()
|
|
|
{
|
|
@@ -34,11 +35,28 @@ void ThreadManager::stopAllThreads()
|
|
|
|
|
|
}
|
|
|
|
|
|
-// /* 添加线程 */
|
|
|
-// void ThreadManager::addThread(StRecordThreadInfo* pThreadInfo)
|
|
|
-// {
|
|
|
+/* 创建一个录音通道及其附属的线程 */
|
|
|
+bool ThreadManager::createRecordThread(const SoundCardRoadInfo_t& roadInfo)
|
|
|
+{
|
|
|
+ /* 需要修改的地方
|
|
|
+ 1、录音线程修改线程函数,添加task()函数,统一处理开启和关闭状态
|
|
|
+ 2、原始录音线程,获取分派数据的函数指针不再自己获取,而是由分派线程自己设置过来指针
|
|
|
+ 3、给存储录音线程的队列添加互斥锁,保护线程的创建和销毁
|
|
|
+ */
|
|
|
+
|
|
|
+ /* 先查找队列中有没有该录音通道 */
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+/* 销毁一个录音通道及其附属的线程 */
|
|
|
+bool ThreadManager::destroyRecordThread(const SoundCardRoadInfo_t& roadInfo)
|
|
|
+{
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
-// }
|
|
|
|
|
|
/* 查找录音线程 */
|
|
|
BaseRecordThread* ThreadManager::findRecordThread(EThreadType type, int cardID, int recordID)
|
|
@@ -46,61 +64,80 @@ BaseRecordThread* ThreadManager::findRecordThread(EThreadType type, int cardID,
|
|
|
switch(type)
|
|
|
{
|
|
|
case EThreadType::Type_RecordSrc: /* 录音线程 */
|
|
|
- for (auto& pThread : m_recordThreads)
|
|
|
{
|
|
|
- if (pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID &&
|
|
|
- pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID)
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexRecordThreads);
|
|
|
+ for (auto& pThread : m_recordThreads)
|
|
|
{
|
|
|
- return pThread;
|
|
|
+ if (pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID &&
|
|
|
+ pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID)
|
|
|
+ {
|
|
|
+ return pThread;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EThreadType::Type_CreateWAV: /* 创建wav小文件和分离左右声道的线程 */
|
|
|
- for (auto& pThread : m_createWAVThreads)
|
|
|
{
|
|
|
- if (pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
|
- pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID)
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexCreateWAVThreads);
|
|
|
+ for (auto& pThread : m_createWAVThreads)
|
|
|
{
|
|
|
- return pThread;
|
|
|
+ if (pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
|
+ pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID)
|
|
|
+ {
|
|
|
+ return pThread;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EThreadType::Type_CalculateDBAndPhase: /* 计算音量和反相的线程 */
|
|
|
- for (auto& pThread : m_createDBPhaseThreads)
|
|
|
{
|
|
|
- if (pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
|
- pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID)
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexCreateDBThreads);
|
|
|
+ for (auto& pThread : m_createDBThreads)
|
|
|
{
|
|
|
- return pThread;
|
|
|
+ if (pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
|
+ pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID)
|
|
|
+ {
|
|
|
+ return pThread;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EThreadType::Type_CreateLongWAV: /* 创建长文件的线程 */
|
|
|
- for (auto& pThread : m_createLongWAVThreads)
|
|
|
{
|
|
|
- if (pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
|
- pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID)
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexCreateLongWAVThreads);
|
|
|
+ for (auto& pThread : m_createLongWAVThreads)
|
|
|
{
|
|
|
- return pThread;
|
|
|
+ if (pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
|
+ pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID)
|
|
|
+ {
|
|
|
+ return pThread;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EThreadType::Type_AssignSrcData: /* 分派数据线程 */
|
|
|
- for (auto& pThread : m_assignSrcDataThreads)
|
|
|
{
|
|
|
- if (pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
|
- pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID)
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexAssignSrcDataThreads);
|
|
|
+ for (auto& pThread : m_assignSrcDataThreads)
|
|
|
{
|
|
|
- return pThread;
|
|
|
+ if (pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
|
+ pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID)
|
|
|
+ {
|
|
|
+ return pThread;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ break;
|
|
|
case EThreadType::Type_RtpSend: /* RTP发送线程 */
|
|
|
- for (auto& pThread : m_rtpSendThreads)
|
|
|
{
|
|
|
- if (pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
|
- pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID)
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexRtpSendThreads);
|
|
|
+ for (auto& pThread : m_rtpSendThreads)
|
|
|
{
|
|
|
- return pThread;
|
|
|
+ if (pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
|
+ pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID)
|
|
|
+ {
|
|
|
+ return pThread;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -117,6 +154,7 @@ BaseRecordThread* ThreadManager::findRecordThread(EThreadType type, int cardID,
|
|
|
/* 获取创建WAV线程指针 */
|
|
|
CreateWAVThread* ThreadManager::getCreateWAVThread(int cardID, int recordID)
|
|
|
{
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexCreateWAVThreads);
|
|
|
for(auto& pThread : m_createWAVThreads)
|
|
|
{
|
|
|
if(pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
@@ -129,14 +167,15 @@ CreateWAVThread* ThreadManager::getCreateWAVThread(int cardID, int recordID)
|
|
|
}
|
|
|
|
|
|
/* 获取创建音量值的线程 */
|
|
|
-CreateDBPhaseThread* ThreadManager::getCreateDBPhaseThread(int cardID, int recordID)
|
|
|
+CreateDBThread* ThreadManager::getCreateDBThread(int cardID, int recordID)
|
|
|
{
|
|
|
- for(auto& pThread : m_createDBPhaseThreads)
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexCreateDBThreads);
|
|
|
+ for(auto& pThread : m_createDBThreads)
|
|
|
{
|
|
|
if(pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|
|
|
pThread->getThreadInfo().cardRoadInfo.roadInfo.nRoadNum == recordID)
|
|
|
{
|
|
|
- return dynamic_cast<CreateDBPhaseThread*>(pThread);
|
|
|
+ return dynamic_cast<CreateDBThread*>(pThread);
|
|
|
}
|
|
|
}
|
|
|
return nullptr;
|
|
@@ -145,6 +184,7 @@ CreateDBPhaseThread* ThreadManager::getCreateDBPhaseThread(int cardID, int recor
|
|
|
/* 获取发送Rtp数据的线程 */
|
|
|
RTPOneRoadThread* ThreadManager::getRtpSendThread(int cardID, int recordID)
|
|
|
{
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexRtpSendThreads);
|
|
|
for(auto& pThread : m_rtpSendThreads)
|
|
|
{
|
|
|
if(pThread->getThreadInfo().cardRoadInfo.nSoundCardNum == cardID &&
|