mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-22 16:25:45 +08:00
Add a proper bypass for the jitter buffer if wanted.
This commit is contained in:
@@ -46,6 +46,7 @@ m_slot1(slot1),
|
||||
m_slot2(slot2),
|
||||
m_jitterEnabled(jitterEnabled),
|
||||
m_jitterBuffers(NULL),
|
||||
m_delayBuffers(NULL),
|
||||
m_hwType(hwType),
|
||||
m_status(WAITING_CONNECT),
|
||||
m_retryTimer(1000U, 10U),
|
||||
@@ -79,11 +80,16 @@ m_beacon(false)
|
||||
m_salt = new unsigned char[sizeof(uint32_t)];
|
||||
m_id = new uint8_t[4U];
|
||||
m_streamId = new uint32_t[2U];
|
||||
|
||||
m_jitterBuffers = new CJitterBuffer*[3U];
|
||||
m_delayBuffers = new CDelayBuffer*[3U];
|
||||
|
||||
m_jitterBuffers[1U] = new CJitterBuffer("DMR Slot 1", 60U, DMR_SLOT_TIME, jitter, 256U, debug);
|
||||
m_jitterBuffers[2U] = new CJitterBuffer("DMR Slot 2", 60U, DMR_SLOT_TIME, jitter, 256U, debug);
|
||||
|
||||
m_delayBuffers[1U] = new CDelayBuffer("DMR Slot 1", 60U, DMR_SLOT_TIME, jitter, debug);
|
||||
m_delayBuffers[2U] = new CDelayBuffer("DMR Slot 2", 60U, DMR_SLOT_TIME, jitter, debug);
|
||||
|
||||
m_id[0U] = id >> 24;
|
||||
m_id[1U] = id >> 16;
|
||||
m_id[2U] = id >> 8;
|
||||
@@ -101,11 +107,16 @@ CDMRNetwork::~CDMRNetwork()
|
||||
delete m_jitterBuffers[1U];
|
||||
delete m_jitterBuffers[2U];
|
||||
|
||||
delete m_delayBuffers[1U];
|
||||
delete m_delayBuffers[2U];
|
||||
|
||||
delete[] m_buffer;
|
||||
delete[] m_salt;
|
||||
delete[] m_streamId;
|
||||
delete[] m_id;
|
||||
|
||||
delete[] m_jitterBuffers;
|
||||
delete[] m_delayBuffers;
|
||||
}
|
||||
|
||||
void CDMRNetwork::setOptions(const std::string& options)
|
||||
@@ -151,8 +162,14 @@ bool CDMRNetwork::read(CDMRData& data)
|
||||
|
||||
for (unsigned int slotNo = 1U; slotNo <= 2U; slotNo++) {
|
||||
unsigned int length = 0U;
|
||||
JB_STATUS status = m_jitterBuffers[slotNo]->getData(m_buffer, length);
|
||||
if (status != JBS_NO_DATA) {
|
||||
B_STATUS status = BS_NO_DATA;
|
||||
|
||||
if (m_jitterEnabled)
|
||||
status = m_jitterBuffers[slotNo]->getData(m_buffer, length);
|
||||
else
|
||||
status = m_delayBuffers[slotNo]->getData(m_buffer, length);
|
||||
|
||||
if (status != BS_NO_DATA) {
|
||||
unsigned char seqNo = m_buffer[4U];
|
||||
|
||||
unsigned int srcId = (m_buffer[5U] << 16) | (m_buffer[6U] << 8) | (m_buffer[7U] << 0);
|
||||
@@ -166,7 +183,7 @@ bool CDMRNetwork::read(CDMRData& data)
|
||||
data.setSrcId(srcId);
|
||||
data.setDstId(dstId);
|
||||
data.setFLCO(flco);
|
||||
data.setMissing(status == JBS_MISSING);
|
||||
data.setMissing(status == BS_MISSING);
|
||||
|
||||
bool dataSync = (m_buffer[15U] & 0x20U) == 0x20U;
|
||||
bool voiceSync = (m_buffer[15U] & 0x10U) == 0x10U;
|
||||
@@ -331,6 +348,9 @@ void CDMRNetwork::clock(unsigned int ms)
|
||||
m_jitterBuffers[1U]->clock(ms);
|
||||
m_jitterBuffers[2U]->clock(ms);
|
||||
|
||||
m_delayBuffers[1U]->clock(ms);
|
||||
m_delayBuffers[2U]->clock(ms);
|
||||
|
||||
if (m_status == WAITING_CONNECT) {
|
||||
m_retryTimer.clock(ms);
|
||||
if (m_retryTimer.isRunning() && m_retryTimer.hasExpired()) {
|
||||
@@ -475,9 +495,11 @@ void CDMRNetwork::reset(unsigned int slotNo)
|
||||
|
||||
if (slotNo == 1U) {
|
||||
m_jitterBuffers[1U]->reset();
|
||||
m_delayBuffers[1U]->reset();
|
||||
m_streamId[0U] = ::rand() + 1U;
|
||||
} else {
|
||||
m_jitterBuffers[2U]->reset();
|
||||
m_delayBuffers[2U]->reset();
|
||||
m_streamId[1U] = ::rand() + 1U;
|
||||
}
|
||||
}
|
||||
@@ -514,7 +536,7 @@ void CDMRNetwork::receiveData(const unsigned char* data, unsigned int length)
|
||||
m_jitterBuffers[slotNo]->addData(data, length, seqNo);
|
||||
}
|
||||
} else {
|
||||
m_jitterBuffers[slotNo]->appendData(data, length);
|
||||
m_delayBuffers[slotNo]->addData(data, length);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user