summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJörgen Scott <jorgen.scott@gmail.com>2015-02-04 12:19:55 +0100
committerJörgen Scott <jorgen.scott@gmail.com>2015-02-04 12:19:55 +0100
commit1ab555f832c764bd10cebeeee51d9f7ad5c4b2c6 (patch)
treef0f9b28446ff35433223761c8239dae7706a85e4
parent7e9fa603ee00fa0ec8ebf6e258f94cadbb300856 (diff)
downloaddabmod-1ab555f832c764bd10cebeeee51d9f7ad5c4b2c6.tar.gz
dabmod-1ab555f832c764bd10cebeeee51d9f7ad5c4b2c6.tar.bz2
dabmod-1ab555f832c764bd10cebeeee51d9f7ad5c4b2c6.zip
Removed magick numbers and added support for static delay in all dab modes
-rw-r--r--src/DabMod.cpp1
-rw-r--r--src/OutputUHD.cpp54
-rw-r--r--src/OutputUHD.h7
3 files changed, 51 insertions, 11 deletions
diff --git a/src/DabMod.cpp b/src/DabMod.cpp
index 82f03e5..214231c 100644
--- a/src/DabMod.cpp
+++ b/src/DabMod.cpp
@@ -535,6 +535,7 @@ int main(int argc, char* argv[])
outputuhd_conf.txgain = pt.get("uhdoutput.txgain", 0.0);
outputuhd_conf.frequency = pt.get<double>("uhdoutput.frequency", 0);
std::string chan = pt.get<std::string>("uhdoutput.channel", "");
+ outputuhd_conf.dabMode = dabMode;
if (outputuhd_conf.frequency == 0 && chan == "") {
std::cerr << " UHD output enabled, but neither frequency nor channel defined.\n";
diff --git a/src/OutputUHD.cpp b/src/OutputUHD.cpp
index 741731e..91c030f 100644
--- a/src/OutputUHD.cpp
+++ b/src/OutputUHD.cpp
@@ -57,11 +57,11 @@ OutputUHD::OutputUHD(
// the buffers at object initialisation.
first_run(true),
activebuffer(1),
- myDelayBuf(196608)
+ myDelayBuf(0)
{
myMuting = 0; // is remote-controllable
- myStaticDelay = 0; // is remote-controllable
+ myStaticDelayUs = 0; // is remote-controllable
#if FAKE_UHD
MDEBUG("OutputUHD:Using fake UHD output");
@@ -225,6 +225,7 @@ OutputUHD::OutputUHD(
uwd.check_refclk_loss = true;
}
+ SetDelayBuffer(config.dabMode);
shared_ptr<barrier> b(new barrier(2));
mySyncBarrier = b;
@@ -246,6 +247,35 @@ OutputUHD::~OutputUHD()
}
}
+void OutputUHD::SetDelayBuffer(unsigned int dabMode)
+{
+ // find out the duration of the transmission frame (Table 2 in ETSI 300 401)
+ switch (dabMode) {
+ case 0: // could happen when called from constructor and we take the mode from ETI
+ myTFDurationMs = 0;
+ break;
+ case 1:
+ myTFDurationMs = 96;
+ break;
+ case 2:
+ myTFDurationMs = 24;
+ break;
+ case 3:
+ myTFDurationMs = 24;
+ break;
+ case 4:
+ myTFDurationMs = 48;
+ break;
+ default:
+ throw std::runtime_error("OutPutUHD: invalid DAB mode");
+ }
+ fprintf(stderr, "DelayBuf = %d\n", myTFDurationMs * myConf.sampleRate / 1000);
+ // The buffer size equals the number of samples per transmission frame so
+ // we calculate it by multiplying the duration of the transmission frame
+ // with the samplerate.
+ myDelayBuf.resize(myTFDurationMs * myConf.sampleRate / 1000);
+}
+
int OutputUHD::process(Buffer* dataIn, Buffer* dataOut)
{
struct frame_timestamp ts;
@@ -281,6 +311,10 @@ int OutputUHD::process(Buffer* dataIn, Buffer* dataOut)
default: break;
}
+ // we only set the delay buffer from the dab mode signaled in ETI if the
+ // dab mode was not set in contructor
+ if (myTFDurationMs == 0)
+ SetDelayBuffer(myEtiReader->getMode());
activebuffer = 1;
@@ -307,7 +341,7 @@ int OutputUHD::process(Buffer* dataIn, Buffer* dataOut)
myEtiReader->sourceContainsTimestamp();
// calculate delay
- uint32_t noSampleDelay = (myStaticDelay * 2048) / 1000;
+ uint32_t noSampleDelay = (myStaticDelayUs * myConf.sampleRate / 1000) / 1000;
uint32_t noByteDelay = noSampleDelay * sizeof(complexf);
uint8_t* pInData = (uint8_t*) dataIn->getData();
@@ -655,13 +689,13 @@ void OutputUHD::set_parameter(const string& parameter, const string& value)
else if (parameter == "staticdelay") {
int adjust;
ss >> adjust;
- int newStaticDelay = myStaticDelay + adjust;
- if (newStaticDelay > 96000)
- myStaticDelay = newStaticDelay - 96000;
- else if (newStaticDelay < 0)
- myStaticDelay = newStaticDelay + 96000;
+ int newStaticDelayUs = myStaticDelayUs + adjust;
+ if (newStaticDelayUs > myTFDurationMs * 1000)
+ myStaticDelayUs = newStaticDelayUs - myTFDurationMs * 1000;
+ else if (newStaticDelayUs < 0)
+ myStaticDelayUs = newStaticDelayUs + myTFDurationMs * 1000;
else
- myStaticDelay = newStaticDelay;
+ myStaticDelayUs = newStaticDelayUs;
}
else if (parameter == "iqbalance") {
ss >> myConf.frequency;
@@ -689,7 +723,7 @@ const string OutputUHD::get_parameter(const string& parameter) const
ss << myMuting;
}
else if (parameter == "staticdelay") {
- ss << myStaticDelay;
+ ss << myStaticDelayUs;
}
else {
ss << "Parameter '" << parameter <<
diff --git a/src/OutputUHD.h b/src/OutputUHD.h
index 7eb6733..d002e98 100644
--- a/src/OutputUHD.h
+++ b/src/OutputUHD.h
@@ -171,6 +171,7 @@ struct OutputUHDConfig {
double txgain;
bool enableSync;
bool muteNoTimestamps;
+ unsigned dabMode;
/* allowed values : auto, int, sma, mimo */
std::string refclk_src;
@@ -231,8 +232,12 @@ class OutputUHD: public ModOutput, public RemoteControllable {
bool myMuting;
private:
+ // methods
+ void SetDelayBuffer(unsigned int dabMode);
+
// data
- int myStaticDelay;
+ int myStaticDelayUs; // static delay in microseconds
+ int myTFDurationMs; // TF duration in milliseconds
std::vector<complexf> myDelayBuf;
size_t lastLen;
};