diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.ui b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.ui
index 760a65de5..fb2586dfd 100644
--- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.ui
+++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.ui
@@ -620,7 +620,7 @@
- API IP address
+ Remote API IPv4 address
000.000.000.000
@@ -646,7 +646,7 @@
- API IP port
+ Remote API port
00000
@@ -711,7 +711,7 @@
- Remote data address
+ Remote data connection IPv4 address
000.000.000.000
@@ -737,7 +737,7 @@
- Remote data port
+ Remote data connection port
00000
diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp
index bc112b475..03f4808cb 100644
--- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp
+++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp
@@ -92,9 +92,11 @@ bool SDRdaemonSinkOutput::start()
m_sdrDaemonSinkThread->connectTimer(m_masterTimer);
m_sdrDaemonSinkThread->startWork();
+ // restart auto rate correction
m_lastRemoteTimestampRateCorrection = 0;
m_lastTimestampRateCorrection = 0;
m_lastQueueLength = -2; // set first value out of bounds
+ m_chunkSizeCorrection = 0;
double delay = ((127*126*m_settings.m_txDelay) / m_settings.m_sampleRate)/(128 + m_settings.m_nbFECBlocks);
m_sdrDaemonSinkThread->setTxDelay((int) (delay*1e6));
diff --git a/plugins/samplesink/sdrdaemonsink/udpsinkfec.cpp b/plugins/samplesink/sdrdaemonsink/udpsinkfec.cpp
index c2a25ac2a..6fa7ee1d2 100644
--- a/plugins/samplesink/sdrdaemonsink/udpsinkfec.cpp
+++ b/plugins/samplesink/sdrdaemonsink/udpsinkfec.cpp
@@ -141,18 +141,34 @@ void UDPSinkFEC::write(const SampleVector::iterator& begin, uint32_t sampleChunk
m_txBlockIndex = 1; // next Tx block with data
}
+ int samplesPerBlock = bytesPerBlock / (m_sampleBytes*2);
+
if (m_sampleIndex + inRemainingSamples < samplesPerBlock) // there is still room in the current super block
{
- if (SDR_RX_SAMP_SZ == SDR_TX_SAMP_SZ) // can do direct copy if sizes are equal (to 16 bits)
+ if (sizeof(Sample) == m_sampleBytes*2) // can do direct copy if sample sizes are equal
{
- memcpy((char *) &m_superBlock.protectedBlock.m_samples[m_sampleIndex],
+ memcpy((char *) &m_superBlock.protectedBlock.m_buf[m_sampleIndex*m_sampleBytes*2],
(const char *) &(*it),
inRemainingSamples * sizeof(Sample));
}
- else // Samples are limited to 16 bits by the modulators
+ else if ((sizeof(Sample) == 8) && (m_sampleBytes == 2)) // modulators produce 16 bit samples
{
- for (int is = 0; is < inRemainingSamples; is++) {
- m_superBlock.protectedBlock.m_samples[m_sampleIndex+is] = *(it+is);
+ for (int is = 0; is < inRemainingSamples; is++)
+ {
+ int16_t *rp = (int16_t*) &(m_superBlock.protectedBlock.m_buf[(m_sampleIndex+is)*m_sampleBytes*2]);
+ int16_t *ip = (int16_t*) &(m_superBlock.protectedBlock.m_buf[(m_sampleIndex+is)*m_sampleBytes*2+2]);
+ *rp = (it+is)->m_real & 0xFFFF;
+ *ip = (it+is)->m_imag & 0xFFFF;
+ }
+ }
+ else if ((sizeof(Sample) == 4) && (m_sampleBytes == 4)) // use 16 bit samples for Tx
+ {
+ for (int is = 0; is < inRemainingSamples; is++)
+ {
+ int32_t *rp = (int32_t*) &(m_superBlock.protectedBlock.m_buf[(m_sampleIndex+is)*m_sampleBytes*2]);
+ int32_t *ip = (int32_t*) &(m_superBlock.protectedBlock.m_buf[(m_sampleIndex+is)*m_sampleBytes*2+4]);
+ *rp = (it+is)->m_real;
+ *ip = (it+is)->m_imag;
}
}
@@ -161,16 +177,30 @@ void UDPSinkFEC::write(const SampleVector::iterator& begin, uint32_t sampleChunk
}
else // complete super block and initiate the next if not end of frame
{
- if (SDR_RX_SAMP_SZ == SDR_TX_SAMP_SZ) // can do direct copy if sizes are equal (to 16 bits)
+ if (sizeof(Sample) == m_sampleBytes*2) // can do direct copy if sample sizes are equal
{
- memcpy((char *) &m_superBlock.protectedBlock.m_samples[m_sampleIndex],
+ memcpy((char *) &m_superBlock.protectedBlock.m_buf[m_sampleIndex*m_sampleBytes*2],
(const char *) &(*it),
(samplesPerBlock - m_sampleIndex) * sizeof(Sample));
}
- else // Samples are limited to 16 bits by the modulators
+ else if ((sizeof(Sample) == 8) && (m_sampleBytes == 2)) // modulators produce 16 bit samples
{
- for (int is = 0; is < samplesPerBlock - m_sampleIndex; is++) {
- m_superBlock.protectedBlock.m_samples[m_sampleIndex+is] = *(it+is);
+ for (int is = 0; is < samplesPerBlock - m_sampleIndex; is++)
+ {
+ int16_t *rp = (int16_t*) &(m_superBlock.protectedBlock.m_buf[(m_sampleIndex+is)*m_sampleBytes*2]);
+ int16_t *ip = (int16_t*) &(m_superBlock.protectedBlock.m_buf[(m_sampleIndex+is)*m_sampleBytes*2+2]);
+ *rp = (it+is)->m_real & 0xFFFF;
+ *ip = (it+is)->m_imag & 0xFFFF;
+ }
+ }
+ else if ((sizeof(Sample) == 4) && (m_sampleBytes == 4)) // use 16 bit samples for Tx
+ {
+ for (int is = 0; is < samplesPerBlock - m_sampleIndex; is++)
+ {
+ int32_t *rp = (int32_t*) &(m_superBlock.protectedBlock.m_buf[(m_sampleIndex+is)*m_sampleBytes*2]);
+ int32_t *ip = (int32_t*) &(m_superBlock.protectedBlock.m_buf[(m_sampleIndex+is)*m_sampleBytes*2+4]);
+ *rp = (it+is)->m_real;
+ *ip = (it+is)->m_imag;
}
}
diff --git a/plugins/samplesink/sdrdaemonsink/udpsinkfec.h b/plugins/samplesink/sdrdaemonsink/udpsinkfec.h
index 6fea548e8..a1cae77f5 100644
--- a/plugins/samplesink/sdrdaemonsink/udpsinkfec.h
+++ b/plugins/samplesink/sdrdaemonsink/udpsinkfec.h
@@ -75,11 +75,11 @@ public:
uint32_t filler2;
};
- static const int samplesPerBlock = (m_udpSize - sizeof(Header)) / (2 * SDR_TX_SAMP_SZ);
+ static const int bytesPerBlock = m_udpSize - sizeof(Header);
struct ProtectedBlock
{
- Sample m_samples[samplesPerBlock];
+ uint8_t m_buf[bytesPerBlock];
};
struct SuperBlock
diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.ui b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.ui
index 837506fe2..118f06235 100644
--- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.ui
+++ b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.ui
@@ -584,7 +584,7 @@
- Local data connection IP address
+ Remote API IPv4 address
000.000.000.000
@@ -619,7 +619,7 @@
- Remote control port
+ Remote API port
00000
@@ -692,6 +692,9 @@
16777215
+
+ Local data connection IPv4 address
+
000.000.000.000