diff options
| -rw-r--r-- | src/DabMod.cpp | 1 | ||||
| -rw-r--r-- | src/OutputUHD.cpp | 54 | ||||
| -rw-r--r-- | src/OutputUHD.h | 7 | 
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;  };  | 
