Add a proper bypass for the jitter buffer if wanted.

This commit is contained in:
Jonathan Naylor
2018-02-05 19:46:27 +00:00
parent 14a06e7182
commit 4323c02a0a
16 changed files with 287 additions and 53 deletions

View File

@@ -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);
}
}