diff --git a/Conf.cpp b/Conf.cpp index 5afec64..f4288ed 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -153,6 +153,7 @@ m_dmrNetworkLocal(0U), m_dmrNetworkPassword(), m_dmrNetworkOptions(), m_dmrNetworkDebug(false), +m_dmrNetworkJitterEnabled(true), m_dmrNetworkJitter(300U), m_dmrNetworkSlot1(true), m_dmrNetworkSlot2(true), @@ -550,6 +551,8 @@ bool CConf::read() m_dmrNetworkOptions = value; else if (::strcmp(key, "Debug") == 0) m_dmrNetworkDebug = ::atoi(value) == 1; + else if (::strcmp(key, "JitterEnabled") == 0) + m_dmrNetworkJitterEnabled = ::atoi(value) == 1; else if (::strcmp(key, "Jitter") == 0) m_dmrNetworkJitter = (unsigned int)::atoi(value); else if (::strcmp(key, "Slot1") == 0) @@ -1161,6 +1164,11 @@ bool CConf::getDMRNetworkDebug() const return m_dmrNetworkDebug; } +bool CConf::getDMRNetworkJitterEnabled() const +{ + return m_dmrNetworkJitterEnabled; +} + unsigned int CConf::getDMRNetworkJitter() const { return m_dmrNetworkJitter; diff --git a/Conf.h b/Conf.h index 2f7304a..5ef5efa 100644 --- a/Conf.h +++ b/Conf.h @@ -154,6 +154,7 @@ public: std::string getDMRNetworkPassword() const; std::string getDMRNetworkOptions() const; bool getDMRNetworkDebug() const; + bool getDMRNetworkJitterEnabled() const; unsigned int getDMRNetworkJitter() const; bool getDMRNetworkSlot1() const; bool getDMRNetworkSlot2() const; @@ -327,6 +328,7 @@ private: std::string m_dmrNetworkPassword; std::string m_dmrNetworkOptions; bool m_dmrNetworkDebug; + bool m_dmrNetworkJitterEnabled; unsigned int m_dmrNetworkJitter; bool m_dmrNetworkSlot1; bool m_dmrNetworkSlot2; diff --git a/DMRNetwork.cpp b/DMRNetwork.cpp index 51843db..c9f251a 100644 --- a/DMRNetwork.cpp +++ b/DMRNetwork.cpp @@ -32,7 +32,7 @@ const unsigned int BUFFER_LENGTH = 500U; const unsigned int HOMEBREW_DATA_PACKET_LENGTH = 55U; -CDMRNetwork::CDMRNetwork(const std::string& address, unsigned int port, unsigned int local, unsigned int id, const std::string& password, bool duplex, const char* version, bool debug, bool slot1, bool slot2, HW_TYPE hwType, unsigned int jitter) : +CDMRNetwork::CDMRNetwork(const std::string& address, unsigned int port, unsigned int local, unsigned int id, const std::string& password, bool duplex, const char* version, bool debug, bool slot1, bool slot2, HW_TYPE hwType, bool jitterEnabled, unsigned int jitter) : m_address(), m_port(port), m_id(NULL), @@ -44,6 +44,7 @@ m_socket(local), m_enabled(false), m_slot1(slot1), m_slot2(slot2), +m_jitterEnabled(jitterEnabled), m_jitterBuffers(NULL), m_hwType(hwType), m_status(WAITING_CONNECT), @@ -498,23 +499,23 @@ void CDMRNetwork::receiveData(const unsigned char* data, unsigned int length) if (slotNo == 2U && !m_slot2) return; - m_jitterBuffers[slotNo]->appendData(data, length); - - /* - unsigned char dataType = data[15U] & 0x3FU; - if (dataType == (0x20U | DT_CSBK) || - dataType == (0x20U | DT_DATA_HEADER) || - dataType == (0x20U | DT_RATE_1_DATA) || - dataType == (0x20U | DT_RATE_34_DATA) || - dataType == (0x20U | DT_RATE_12_DATA)) { - // Data & CSBK frames - m_jitterBuffers[slotNo]->appendData(data, length); + if (m_jitterEnabled) { + unsigned char dataType = data[15U] & 0x3FU; + if (dataType == (0x20U | DT_CSBK) || + dataType == (0x20U | DT_DATA_HEADER) || + dataType == (0x20U | DT_RATE_1_DATA) || + dataType == (0x20U | DT_RATE_34_DATA) || + dataType == (0x20U | DT_RATE_12_DATA)) { + // Data & CSBK frames + m_jitterBuffers[slotNo]->appendData(data, length); + } else { + // Voice frames + unsigned char seqNo = data[4U]; + m_jitterBuffers[slotNo]->addData(data, length, seqNo); + } } else { - // Voice frames - unsigned char seqNo = data[4U]; - m_jitterBuffers[slotNo]->addData(data, length, seqNo); + m_jitterBuffers[slotNo]->appendData(data, length); } - */ } bool CDMRNetwork::writeLogin() diff --git a/DMRNetwork.h b/DMRNetwork.h index 53f579e..cfacb77 100644 --- a/DMRNetwork.h +++ b/DMRNetwork.h @@ -31,7 +31,7 @@ class CDMRNetwork { public: - CDMRNetwork(const std::string& address, unsigned int port, unsigned int local, unsigned int id, const std::string& password, bool duplex, const char* version, bool debug, bool slot1, bool slot2, HW_TYPE hwType, unsigned int jitter); + CDMRNetwork(const std::string& address, unsigned int port, unsigned int local, unsigned int id, const std::string& password, bool duplex, const char* version, bool debug, bool slot1, bool slot2, HW_TYPE hwType, bool jitterEnabled, unsigned int jitter); ~CDMRNetwork(); void setOptions(const std::string& options); @@ -70,6 +70,7 @@ private: bool m_enabled; bool m_slot1; bool m_slot2; + bool m_jitterEnabled; CJitterBuffer** m_jitterBuffers; HW_TYPE m_hwType; diff --git a/MMDVM.ini b/MMDVM.ini index ac034a0..e92e718 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -119,6 +119,7 @@ Debug=0 Enable=1 Address=44.131.4.1 Port=62031 +JitterEnabled=1 Jitter=500 # Local=62032 Password=PASSWORD diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 00c43e8..754c49f 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -944,6 +944,7 @@ bool CMMDVMHost::createDMRNetwork() unsigned int id = m_conf.getDMRId(); std::string password = m_conf.getDMRNetworkPassword(); bool debug = m_conf.getDMRNetworkDebug(); + bool jitterEnabled = m_conf.getDMRNetworkJitterEnabled(); unsigned int jitter = m_conf.getDMRNetworkJitter(); bool slot1 = m_conf.getDMRNetworkSlot1(); bool slot2 = m_conf.getDMRNetworkSlot2(); @@ -957,12 +958,13 @@ bool CMMDVMHost::createDMRNetwork() LogInfo(" Local: %u", local); else LogInfo(" Local: random"); + LogInfo(" Jitter Buffer: %s", jitterEnabled ? "enabled" : "disabled"); LogInfo(" Jitter: %ums", jitter); LogInfo(" Slot 1: %s", slot1 ? "enabled" : "disabled"); LogInfo(" Slot 2: %s", slot2 ? "enabled" : "disabled"); LogInfo(" Mode Hang: %us", m_dmrNetModeHang); - m_dmrNetwork = new CDMRNetwork(address, port, local, id, password, m_duplex, VERSION, debug, slot1, slot2, hwType, jitter); + m_dmrNetwork = new CDMRNetwork(address, port, local, id, password, m_duplex, VERSION, debug, slot1, slot2, hwType, jitterEnabled, jitter); std::string options = m_conf.getDMRNetworkOptions(); if (!options.empty()) {