From 9d6d9ef58257e41a063fd537597bdcd950999d8c Mon Sep 17 00:00:00 2001 From: Tom Early Date: Wed, 22 Dec 2021 06:09:33 -0700 Subject: [PATCH] fixed preceived concurance issues --- Controller.cpp | 21 +++++++++++++++++++-- Controller.h | 2 +- DV3003.cpp | 24 +++++++++++++++--------- TranscoderPacket.h | 5 +++-- 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/Controller.cpp b/Controller.cpp index acd02fb..335457a 100644 --- a/Controller.cpp +++ b/Controller.cpp @@ -109,10 +109,14 @@ void CController::ReadReflectorThread() switch (packet->GetCodecIn()) { case ECodecType::dstar: + add_dst_mux.lock(); dstar_device.AddPacket(packet); + add_dst_mux.unlock(); break; case ECodecType::dmr: + add_dmr_mux.lock(); dmr_device.AddPacket(packet); + add_dmr_mux.unlock(); break; case ECodecType::c2_1600: case ECodecType::c2_3200: @@ -200,8 +204,12 @@ void CController::Codec2toAudio(std::shared_ptr packet) } } // the only thing left is to encode the two ambe, so push the packet onto both AMBE queues + add_dst_mux.lock(); dstar_device.AddPacket(packet); + add_dst_mux.unlock(); + add_dmr_mux.lock(); dmr_device.AddPacket(packet); + add_dmr_mux.unlock(); } void CController::ProcessC2Thread() @@ -243,15 +251,20 @@ void CController::SendToReflector(std::shared_ptr packet) // send the packet over the socket socket.Send(packet->GetTCPacket()); // the socket will automatically close after sending -#ifdef DEBUG +//#ifdef DEBUG //AppendWave(packet); -#endif +//#endif } void CController::RouteDstPacket(std::shared_ptr packet) { if (ECodecType::dstar == packet->GetCodecIn()) + { + // codec_in is dstar, the audio has just completed, so now calc the DMR + add_dmr_mux.lock(); dmr_device.AddPacket(packet); + add_dmr_mux.unlock(); + } else if (packet->AllCodecsAreSet()) { send_mux.lock(); @@ -263,7 +276,11 @@ void CController::RouteDstPacket(std::shared_ptr packet) void CController::RouteDmrPacket(std::shared_ptr packet) { if (ECodecType::dmr == packet->GetCodecIn()) + { + add_dst_mux.lock(); dstar_device.AddPacket(packet); + add_dst_mux.unlock(); + } else if (packet->AllCodecsAreSet()) { send_mux.lock(); diff --git a/Controller.h b/Controller.h index bc65959..6d49de6 100644 --- a/Controller.h +++ b/Controller.h @@ -53,7 +53,7 @@ protected: CDV3003 dmr_device{Encoding::dmr}; CPacketQueue codec2_queue; - std::mutex c2_mux, send_mux; + std::mutex add_dst_mux, add_dmr_mux, c2_mux, send_mux; bool InitDevices(); // processing threads diff --git a/DV3003.cpp b/DV3003.cpp index 73caef6..2003825 100644 --- a/DV3003.cpp +++ b/DV3003.cpp @@ -384,28 +384,28 @@ void CDV3003::FeedDevice() in_mux.unlock(); if (packet) { - bool device_is_full = true; + bool device_is_ready = false; bool has_ambe = (Encoding::dstar==type) ? packet->DStarIsSet() : packet->DMRIsSet(); - while (keep_running && device_is_full) // wait until there is room + while (keep_running && (! device_is_ready)) // wait until there is room { if (has_ambe) { // we need to decode ambe to audio if (ch_depth < 2) - device_is_full = false; + device_is_ready = true; } else { // we need to encode audio to ambe if (sp_depth < 2) - device_is_full = false; + device_is_ready = true; } - if (device_is_full) + if (! device_is_ready) std::this_thread::sleep_for(std::chrono::milliseconds(2)); } - if (keep_running) + if (keep_running && device_is_ready) { voc_mux[current_vocoder].lock(); vocq->push(packet); @@ -414,11 +414,17 @@ void CDV3003::FeedDevice() { SendAudio(current_vocoder, packet->GetAudio()); sp_depth++; +#ifdef DEBUG + std::cout << "Sent audio to " << devicepath << std::endl; +#endif } else { SendData(current_vocoder, (Encoding::dstar==type) ? packet->GetDStarData() : packet->GetDMRData()); ch_depth++; +#ifdef DEBUG + std::cout << "Sent AMBE to " << devicepath << std::endl; +#endif } if(++current_vocoder > 2) current_vocoder = 0; @@ -440,8 +446,8 @@ void CDV3003::ReadDevice() FD_SET(fd, &FdSet); struct timeval tv; tv.tv_sec = 0; - tv.tv_usec = 400000; - auto rval = select(fd+1, &FdSet, 0, 0, &tv); // wait for 0.4 sec for something to read + tv.tv_usec = 400000; // wait for 0.4 sec for something to read + auto rval = select(fd+1, &FdSet, 0, 0, &tv); if (rval < 0) { @@ -480,7 +486,7 @@ void CDV3003::ReadDevice() dump("ReadDevice() ERROR: Read an unexpected device packet:", &p, packet_size(p)); continue; } - if (Encoding::dstar == type) + if (Encoding::dstar == type) // is this a DMR or a DStar device? { Controller.dstar_mux.lock(); Controller.RouteDstPacket(packet); diff --git a/TranscoderPacket.h b/TranscoderPacket.h index e8459f0..f251312 100644 --- a/TranscoderPacket.h +++ b/TranscoderPacket.h @@ -18,7 +18,8 @@ // along with this program. If not, see . #include -#include +#include +#include #include "TCPacketDef.h" @@ -58,5 +59,5 @@ public: private: STCPacket tcpacket; int16_t audio[160]; - bool dstar_set, dmr_set, m17_set; + std::atomic dstar_set, dmr_set, m17_set; };