diff options
60 files changed, 797 insertions, 1309 deletions
diff --git a/Makefile.am b/Makefile.am index 8345277..c52405e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -31,14 +31,20 @@ else GITVERSION_FLAGS = endif +if DEBUG +DEBUG_FLAGS = -DDEBUG +else +DEBUG_FLAGS = +endif + bin_PROGRAMS = odr-dabmod FFT_LDADD= odr_dabmod_CXXFLAGS = -Wall -Isrc -std=c++11 \ - $(GITVERSION_FLAGS) + $(GITVERSION_FLAGS) $(DEBUG_FLAGS) odr_dabmod_CFLAGS = -Wall -Isrc \ - $(GITVERSION_FLAGS) + $(GITVERSION_FLAGS) $(DEBUG_FLAGS) odr_dabmod_LDADD = $(FFT_LDADD) odr_dabmod_SOURCES = src/DabMod.cpp \ src/PcDebug.h \ @@ -48,8 +54,6 @@ odr_dabmod_SOURCES = src/DabMod.cpp \ src/DabModulator.h \ src/Buffer.cpp \ src/Buffer.h \ - src/ModCodec.cpp \ - src/ModCodec.h \ src/ModPlugin.cpp \ src/ModPlugin.h \ src/EtiReader.cpp \ @@ -60,8 +64,6 @@ odr_dabmod_SOURCES = src/DabMod.cpp \ src/FicSource.h \ src/FIRFilter.cpp \ src/FIRFilter.h \ - src/ModInput.cpp \ - src/ModInput.h \ src/PuncturingRule.cpp \ src/PuncturingRule.h \ src/PuncturingEncoder.cpp \ @@ -80,8 +82,6 @@ odr_dabmod_SOURCES = src/DabMod.cpp \ src/TimestampDecoder.cpp \ src/OutputUHD.cpp \ src/OutputUHD.h \ - src/ModOutput.cpp \ - src/ModOutput.h \ src/InputMemory.cpp \ src/InputMemory.h \ src/InputFileReader.cpp \ @@ -92,8 +92,6 @@ odr_dabmod_SOURCES = src/DabMod.cpp \ src/OutputFile.h \ src/FrameMultiplexer.cpp \ src/FrameMultiplexer.h \ - src/ModMux.cpp \ - src/ModMux.h \ src/PrbsGenerator.cpp \ src/PrbsGenerator.h \ src/BlockPartitioner.cpp \ diff --git a/src/BlockPartitioner.h b/src/BlockPartitioner.h index 70f5a76..90cffa3 100644 --- a/src/BlockPartitioner.h +++ b/src/BlockPartitioner.h @@ -19,15 +19,15 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef BLOCK_PARTITIONER_H -#define BLOCK_PARTITIONER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModMux.h" +#include "ModPlugin.h" +#include <vector> #include <sys/types.h> @@ -54,5 +54,3 @@ protected: size_t d_outputFramecount; }; - -#endif // BLOCK_PARTITIONER_H diff --git a/src/Buffer.h b/src/Buffer.h index 4bb157b..c4c73ce 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -20,14 +20,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef BUFFER_H -#define BUFFER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif #include <unistd.h> +#include <memory> /* Buffer is a container for a byte array, that is memcpy'ed * on assignment and by the copy-constructor. @@ -48,6 +48,8 @@ class Buffer { void *data; public: + using sptr = std::shared_ptr<Buffer>; + Buffer(const Buffer& copy); Buffer(size_t len = 0, const void *data = NULL); ~Buffer(); @@ -71,5 +73,3 @@ class Buffer { void *getData() const { return data; } }; -#endif // BUFFER_H - diff --git a/src/CicEqualizer.h b/src/CicEqualizer.h index f8b6edf..792da02 100644 --- a/src/CicEqualizer.h +++ b/src/CicEqualizer.h @@ -19,15 +19,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef CIC_EQUALIZER_H -#define CIC_EQUALIZER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModCodec.h" +#include "ModPlugin.h" #include <vector> #include <sys/types.h> @@ -57,6 +56,3 @@ protected: std::vector<float> myFilter; }; - -#endif //CIC_EQUALIZER_H - diff --git a/src/ConvEncoder.cpp b/src/ConvEncoder.cpp index 0aaec7f..74de34f 100644 --- a/src/ConvEncoder.cpp +++ b/src/ConvEncoder.cpp @@ -52,14 +52,6 @@ ConvEncoder::ConvEncoder(size_t framesize) : d_framesize(framesize) { PDEBUG("ConvEncoder::ConvEncoder(%zu)\n", framesize); - -} - - -ConvEncoder::~ConvEncoder() -{ - PDEBUG("ConvEncoder::~ConvEncoder()\n"); - } diff --git a/src/ConvEncoder.h b/src/ConvEncoder.h index 7912fde..4360bfd 100644 --- a/src/ConvEncoder.h +++ b/src/ConvEncoder.h @@ -19,32 +19,23 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef CONV_ENCODER_H -#define CONV_ENCODER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif - -#include "ModCodec.h" - +#include "ModPlugin.h" #include <sys/types.h> - class ConvEncoder : public ModCodec { -private: - size_t d_framesize; - -protected: - public: ConvEncoder(size_t framesize); - virtual ~ConvEncoder(); int process(Buffer* const dataIn, Buffer* dataOut); const char* name() { return "ConvEncoder"; } -}; +private: + size_t d_framesize; +}; -#endif // CONV_ENCODER_H diff --git a/src/DabModulator.cpp b/src/DabModulator.cpp index c96a763..f63ecd7 100644 --- a/src/DabModulator.cpp +++ b/src/DabModulator.cpp @@ -74,8 +74,8 @@ DabModulator::DabModulator( myFilterTapsFilename(filterTapsFilename), myTiiConfig(tiiConfig) { - PDEBUG("DabModulator::DabModulator(%u, %u, %u, %u) @ %p\n", - outputRate, clockRate, dabMode, gainMode, this); + PDEBUG("DabModulator::DabModulator(%u, %u, %u, %zu) @ %p\n", + outputRate, clockRate, dabMode, (size_t)gainMode, this); if (myDabMode == 0) { setMode(2); @@ -252,11 +252,11 @@ int DabModulator::process(Buffer* const dataIn, Buffer* dataOut) // Configuring puncturing encoder auto ficPunc = make_shared<PuncturingEncoder>(); - for (const auto *rule : fic->get_rules()) { + for (const auto &rule : fic->get_rules()) { PDEBUG(" Adding rule:\n"); - PDEBUG(" Length: %zu\n", rule->length()); - PDEBUG(" Pattern: 0x%x\n", rule->pattern()); - ficPunc->append_rule(*rule); + PDEBUG(" Length: %zu\n", rule.length()); + PDEBUG(" Pattern: 0x%x\n", rule.pattern()); + ficPunc->append_rule(rule); } PDEBUG(" Adding tail\n"); ficPunc->append_tail_rule(PuncturingRule(3, 0xcccccc)); @@ -312,9 +312,9 @@ int DabModulator::process(Buffer* const dataIn, Buffer* dataOut) for (const auto& rule : subchannel->get_rules()) { PDEBUG(" Adding rule:\n"); - PDEBUG(" Length: %zu\n", rule->length()); - PDEBUG(" Pattern: 0x%x\n", rule->pattern()); - subchPunc->append_rule(*rule); + PDEBUG(" Length: %zu\n", rule.length()); + PDEBUG(" Pattern: 0x%x\n", rule.pattern()); + subchPunc->append_rule(rule); } PDEBUG(" Adding tail\n"); subchPunc->append_tail_rule(PuncturingRule(3, 0xcccccc)); diff --git a/src/DabModulator.h b/src/DabModulator.h index 41fa42d..77c0457 100644 --- a/src/DabModulator.h +++ b/src/DabModulator.h @@ -25,8 +25,7 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef DAB_MODULATOR_H -#define DAB_MODULATOR_H +#pragma once #ifdef HAVE_CONFIG_H # include "config.h" @@ -36,7 +35,7 @@ #include <string> #include <memory> -#include "ModCodec.h" +#include "ModPlugin.h" #include "EtiReader.h" #include "Flowgraph.h" #include "GainControl.h" @@ -90,5 +89,3 @@ protected: size_t myFicSizeIn; }; -#endif // DAB_MODULATOR_H - diff --git a/src/DifferentialModulator.h b/src/DifferentialModulator.h index 05eeed2..b26ea8b 100644 --- a/src/DifferentialModulator.h +++ b/src/DifferentialModulator.h @@ -19,15 +19,15 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef _DIFFERENTIAL_MODULATOR_H -#define _DIFFERENTIAL_MODULATOR_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModMux.h" +#include "ModPlugin.h" +#include <vector> #include <sys/types.h> @@ -48,5 +48,3 @@ protected: size_t d_carriers; }; - -#endif //_DIFFERENTIAL_MODULATOR_H diff --git a/src/EtiReader.cpp b/src/EtiReader.cpp index 1511015..e841f03 100644 --- a/src/EtiReader.cpp +++ b/src/EtiReader.cpp @@ -2,7 +2,7 @@ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) - Copyright (C) 2014, 2015 + Copyright (C) 2016 Matthias P. Braendli, matthias.braendli@mpb.li http://opendigitalradio.org @@ -205,7 +205,7 @@ int EtiReader::process(const Buffer* dataIn) } PDEBUG("Writting 128 bytes of FIC channel data\n"); Buffer fic = Buffer(128, in); - myFicSource->process(&fic, NULL); + myFicSource->loadFicData(fic); input_size -= 128; framesize -= 128; in += 128; @@ -215,7 +215,7 @@ int EtiReader::process(const Buffer* dataIn) } PDEBUG("Writting 96 bytes of FIC channel data\n"); Buffer fic = Buffer(96, in); - myFicSource->process(&fic, NULL); + myFicSource->loadFicData(fic); input_size -= 96; framesize -= 96; in += 96; @@ -227,7 +227,7 @@ int EtiReader::process(const Buffer* dataIn) unsigned size = mySources[i]->framesize(); PDEBUG("Writting %i bytes of subchannel data\n", size); Buffer subch = Buffer(size, in); - mySources[i]->process(&subch, NULL); + mySources[i]->loadSubchannelData(subch); input_size -= size; framesize -= size; in += size; diff --git a/src/EtiReader.h b/src/EtiReader.h index a8399d2..cfc03af 100644 --- a/src/EtiReader.h +++ b/src/EtiReader.h @@ -2,7 +2,7 @@ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) - Copyright (C) 2014, 2015 + Copyright (C) 2016 Matthias P. Braendli, matthias.braendli@mpb.li http://opendigitalradio.org @@ -24,8 +24,7 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef ETI_READER_H -#define ETI_READER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> @@ -88,5 +87,4 @@ private: }; -#endif // ETI_READER_H diff --git a/src/FIRFilter.h b/src/FIRFilter.h index ceac4cd..209d79d 100644 --- a/src/FIRFilter.h +++ b/src/FIRFilter.h @@ -31,7 +31,7 @@ #include <boost/thread.hpp> #include "RemoteControl.h" -#include "ModCodec.h" +#include "ModPlugin.h" #include "PcDebug.h" #include "ThreadsafeQueue.h" diff --git a/src/FicSource.cpp b/src/FicSource.cpp index 64bd1a7..85614f6 100644 --- a/src/FicSource.cpp +++ b/src/FicSource.cpp @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -28,7 +33,7 @@ #include <string.h> -const std::vector<PuncturingRule*>& FicSource::get_rules() +const std::vector<PuncturingRule>& FicSource::get_rules() { return d_puncturing_rules; } @@ -47,67 +52,42 @@ FicSource::FicSource(eti_FC &fc) : d_buffer.setLength(0); return; } - + if (fc.MID == 3) { d_framesize = 32 * 4; - d_puncturing_rules.push_back(new PuncturingRule(29 * 16, 0xeeeeeeee)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, 0xeeeeeeec)); + d_puncturing_rules.emplace_back(29 * 16, 0xeeeeeeee); + d_puncturing_rules.emplace_back(3 * 16, 0xeeeeeeec); } else { d_framesize = 24 * 4; - d_puncturing_rules.push_back(new PuncturingRule(21 * 16, 0xeeeeeeee)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, 0xeeeeeeec)); + d_puncturing_rules.emplace_back(21 * 16, 0xeeeeeeee); + d_puncturing_rules.emplace_back(3 * 16, 0xeeeeeeec); } d_buffer.setLength(d_framesize); } - -FicSource::~FicSource() -{ - PDEBUG("FicSource::~FicSource()\n"); - for (size_t i = 0; i < d_puncturing_rules.size(); ++i) { -// PDEBUG(" Deleting rules @ %p\n", d_puncturing_rules[i]); - delete d_puncturing_rules[i]; - } -} - - size_t FicSource::getFramesize() { return d_framesize; } - -int FicSource::process(Buffer* inputData, Buffer* outputData) +void FicSource::loadFicData(const Buffer& fic) { - PDEBUG("FicSource::process" - "(inputData: %p, outputData: %p)\n", - inputData, outputData); - - if ((inputData != NULL) && inputData->getLength()) { - PDEBUG(" Input, storing data\n"); - if (inputData->getLength() != d_framesize) { - PDEBUG("ERROR: FicSource::process.inputSize != d_framesize\n"); - exit(-1); - } - d_buffer = *inputData; - return inputData->getLength(); - } - PDEBUG(" Output, retriving data\n"); - - return read(outputData); + d_buffer = fic; } - -int FicSource::read(Buffer* outputData) +int FicSource::process(Buffer* outputData) { - PDEBUG("FicSource::read(outputData: %p, outputSize: %zu)\n", + PDEBUG("FicSource::process (outputData: %p, outputSize: %zu)\n", outputData, outputData->getLength()); if (d_buffer.getLength() != d_framesize) { - PDEBUG("ERROR: FicSource::read.outputSize != d_framesize\n"); - exit(-1); + throw std::runtime_error( + "ERROR: FicSource::process.outputSize != d_framesize: " + + std::to_string(d_buffer.getLength()) + " != " + + std::to_string(d_framesize)); } *outputData = d_buffer; - + return outputData->getLength(); } + diff --git a/src/FicSource.h b/src/FicSource.h index 307908c..cb1d3a8 100644 --- a/src/FicSource.h +++ b/src/FicSource.h @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -19,43 +24,33 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef FIC_SOURCE_H -#define FIC_SOURCE_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif - #include "PuncturingRule.h" #include "Eti.h" -#include "ModInput.h" - +#include "ModPlugin.h" #include <vector> #include <sys/types.h> - class FicSource : public ModInput { -protected: - size_t d_framesize; - Buffer d_buffer; - std::vector<PuncturingRule*> d_puncturing_rules; - public: FicSource(eti_FC &fc); - FicSource(const FicSource&); - FicSource& operator=(const FicSource&); - virtual ~FicSource(); size_t getFramesize(); - const std::vector<PuncturingRule*>& get_rules(); - - int process(Buffer* inputData, Buffer* outputData); + const std::vector<PuncturingRule>& get_rules(); + + void loadFicData(const Buffer& fic); + int process(Buffer* outputData); const char* name() { return "FicSource"; } - int read(Buffer* outputData); +private: + size_t d_framesize; + Buffer d_buffer; + std::vector<PuncturingRule> d_puncturing_rules; }; - -#endif // FIC_SOURCE_H diff --git a/src/Flowgraph.cpp b/src/Flowgraph.cpp index c199945..0eb1c60 100644 --- a/src/Flowgraph.cpp +++ b/src/Flowgraph.cpp @@ -2,7 +2,7 @@ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) - Copyright (C) 2015 + Copyright (C) 2016 Matthias P. Braendli, matthias.braendli@mpb.li http://opendigitalradio.org @@ -27,6 +27,7 @@ #include "Flowgraph.h" #include "PcDebug.h" #include <memory> +#include <algorithm> #if HAVE_DECL__MM_MALLOC # include <mm_malloc.h> @@ -36,17 +37,12 @@ #include <sys/types.h> #include <stdexcept> #include <assert.h> -#if defined(_WIN32) and !defined(__MINGW32__) -//#include <sys/timeb.h> -//#include <sys/types.h> -#else #include <sys/time.h> -#endif using namespace std; -typedef std::vector<shared_ptr<Node> >::iterator NodeIterator; -typedef std::vector<shared_ptr<Edge> >::iterator EdgeIterator; +using NodeIterator = std::vector<shared_ptr<Node> >::iterator; +using EdgeIterator = std::vector<shared_ptr<Edge> >::iterator; Node::Node(shared_ptr<ModPlugin> plugin) : @@ -55,10 +51,8 @@ Node::Node(shared_ptr<ModPlugin> plugin) : { PDEBUG("Node::Node(plugin(%s): %p) @ %p\n", plugin->name(), plugin.get(), this); - } - Node::~Node() { PDEBUG("Node::~Node() @ %p\n", this); @@ -67,6 +61,55 @@ Node::~Node() assert(myOutputBuffers.size() == 0); } +void Node::addOutputBuffer(Buffer::sptr& buffer) +{ + myOutputBuffers.push_back(buffer); +#if DEBUG + std::string fname = string(myPlugin->name()) + + "-" + to_string(myDebugFiles.size()) + + "-" + to_string((size_t)(void*)myPlugin.get()) + + ".dat"; + FILE* fd = fopen(fname.c_str(), "wb"); + assert(fd != nullptr); + myDebugFiles.push_back(fd); +#endif +} + +void Node::removeOutputBuffer(Buffer::sptr& buffer) +{ + auto it = std::find( + myOutputBuffers.begin(), + myOutputBuffers.end(), + buffer); + if (it != myOutputBuffers.end()) { +#if DEBUG + size_t pos = std::distance(myOutputBuffers.begin(), + it); + + auto fd_it = std::next(myDebugFiles.begin(), pos); + + fclose(*fd_it); + myDebugFiles.erase(fd_it); +#endif + myOutputBuffers.erase(it); + } +} + +void Node::addInputBuffer(Buffer::sptr& buffer) +{ + myInputBuffers.push_back(buffer); +} + +void Node::removeInputBuffer(Buffer::sptr& buffer) +{ + auto it = std::find( + myInputBuffers.begin(), + myInputBuffers.end(), + buffer); + if (it != myInputBuffers.end()) { + myInputBuffers.erase(it); + } +} Edge::Edge(shared_ptr<Node>& srcNode, shared_ptr<Node>& dstNode) : mySrcNode(srcNode), @@ -78,8 +121,8 @@ Edge::Edge(shared_ptr<Node>& srcNode, shared_ptr<Node>& dstNode) : this); myBuffer = make_shared<Buffer>(); - srcNode->myOutputBuffers.push_back(myBuffer); - dstNode->myInputBuffers.push_back(myBuffer); + srcNode->addOutputBuffer(myBuffer); + dstNode->addInputBuffer(myBuffer); } @@ -87,52 +130,52 @@ Edge::~Edge() { PDEBUG("Edge::~Edge() @ %p\n", this); - std::vector<shared_ptr<Buffer> >::iterator buffer; - if (myBuffer != NULL) { - for (buffer = mySrcNode->myOutputBuffers.begin(); - buffer != mySrcNode->myOutputBuffers.end(); - ++buffer) { - if (*buffer == myBuffer) { - mySrcNode->myOutputBuffers.erase(buffer); - break; - } - } - - for (buffer = myDstNode->myInputBuffers.begin(); - buffer != myDstNode->myInputBuffers.end(); - ++buffer) { - if (*buffer == myBuffer) { - myDstNode->myInputBuffers.erase(buffer); - break; - } - } + if (myBuffer) { + mySrcNode->removeOutputBuffer(myBuffer); + myDstNode->removeInputBuffer(myBuffer); } } int Node::process() { - PDEBUG("Edge::process()\n"); + PDEBUG("Node::process()\n"); PDEBUG(" Plugin name: %s (%p)\n", myPlugin->name(), myPlugin.get()); - // the plugin process() still wants vector<Buffer*> + // the plugin process() wants vector<Buffer*> // arguments. std::vector<Buffer*> inBuffers; - std::vector<shared_ptr<Buffer> >::iterator buffer; - for (buffer = myInputBuffers.begin(); - buffer != myInputBuffers.end(); - ++buffer) { - inBuffers.push_back(buffer->get()); + for (auto& buffer : myInputBuffers) { + assert(buffer.get() != nullptr); + inBuffers.push_back(buffer.get()); } std::vector<Buffer*> outBuffers; - for (buffer = myOutputBuffers.begin(); - buffer != myOutputBuffers.end(); - ++buffer) { - outBuffers.push_back(buffer->get()); + for (auto& buffer : myOutputBuffers) { + assert(buffer.get() != nullptr); + outBuffers.push_back(buffer.get()); } - return myPlugin->process(inBuffers, outBuffers); + int ret = myPlugin->process(inBuffers, outBuffers); +#if DEBUG + assert(myDebugFiles.size() == myOutputBuffers.size()); + + auto buf = myOutputBuffers.begin(); + auto fd_it = myDebugFiles.begin(); + + for (size_t i = 0; i < myDebugFiles.size(); i++) { + if (*buf) { + Buffer& b = *buf->get(); + FILE* fd = *fd_it; + + fwrite(b.getData(), b.getLength(), 1, fd); + } + + ++buf; + ++fd_it; + } +#endif + return ret; } diff --git a/src/Flowgraph.h b/src/Flowgraph.h index 9c6c2d8..ebb7314 100644 --- a/src/Flowgraph.h +++ b/src/Flowgraph.h @@ -2,7 +2,7 @@ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) - Copyright (C) 2015 + Copyright (C) 2016 Matthias P. Braendli, matthias.braendli@mpb.li http://opendigitalradio.org @@ -24,8 +24,7 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef FLOWGRAPH_H -#define FLOWGRAPH_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> @@ -37,28 +36,38 @@ #include <memory> #include <sys/types.h> #include <vector> - +#include <list> +#include <cstdio> class Node { public: Node(std::shared_ptr<ModPlugin> plugin); ~Node(); - Node(const Node&); - Node& operator=(const Node&); + Node(const Node&) = delete; + Node& operator=(const Node&) = delete; std::shared_ptr<ModPlugin> plugin() { return myPlugin; } - std::vector<std::shared_ptr<Buffer> > myInputBuffers; - std::vector<std::shared_ptr<Buffer> > myOutputBuffers; - int process(); time_t processTime() { return myProcessTime; } void addProcessTime(time_t processTime) { myProcessTime += processTime; } + void addOutputBuffer(Buffer::sptr& buffer); + void removeOutputBuffer(Buffer::sptr& buffer); + + void addInputBuffer(Buffer::sptr& buffer); + void removeInputBuffer(Buffer::sptr& buffer); + protected: + std::list<Buffer::sptr> myInputBuffers; + std::list<Buffer::sptr> myOutputBuffers; +#if DEBUG + std::list<FILE*> myDebugFiles; +#endif + std::shared_ptr<ModPlugin> myPlugin; time_t myProcessTime; }; @@ -69,8 +78,8 @@ class Edge public: Edge(std::shared_ptr<Node>& src, std::shared_ptr<Node>& dst); ~Edge(); - Edge(const Edge&); - Edge& operator=(const Edge&); + Edge(const Edge&) = delete; + Edge& operator=(const Edge&) = delete; protected: std::shared_ptr<Node> mySrcNode; @@ -84,8 +93,8 @@ class Flowgraph public: Flowgraph(); virtual ~Flowgraph(); - Flowgraph(const Flowgraph&); - Flowgraph& operator=(const Flowgraph&); + Flowgraph(const Flowgraph&) = delete; + Flowgraph& operator=(const Flowgraph&) = delete; void connect(std::shared_ptr<ModPlugin> input, std::shared_ptr<ModPlugin> output); @@ -98,5 +107,3 @@ protected: }; -#endif // FLOWGRAPH_H - diff --git a/src/FormatConverter.h b/src/FormatConverter.h index 0243685..86ce347 100644 --- a/src/FormatConverter.h +++ b/src/FormatConverter.h @@ -26,15 +26,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef FORMAT_CONVERTER_H -#define FORMAT_CONVERTER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif #include "porting.h" -#include "ModCodec.h" +#include "ModPlugin.h" #include <complex> #include <stdint.h> @@ -49,5 +48,4 @@ class FormatConverter : public ModCodec const char* name(); }; -#endif // FORMAT_CONVERTER_H diff --git a/src/FrameMultiplexer.h b/src/FrameMultiplexer.h index b32a0d7..b1dd971 100644 --- a/src/FrameMultiplexer.h +++ b/src/FrameMultiplexer.h @@ -19,15 +19,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef FRAME_MULTIPLEXER_H -#define FRAME_MULTIPLEXER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModMux.h" +#include "ModPlugin.h" #include "SubchannelSource.h" #include <memory> @@ -52,5 +51,4 @@ protected: const std::vector<std::shared_ptr<SubchannelSource> >* mySubchannels; }; -#endif // FRAME_MULTIPLEXER_H diff --git a/src/FrequencyInterleaver.h b/src/FrequencyInterleaver.h index 0e4a287..7c0fb22 100644 --- a/src/FrequencyInterleaver.h +++ b/src/FrequencyInterleaver.h @@ -19,15 +19,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef FREQUENCY_INTERLEAVER_H -#define FREQUENCY_INTERLEAVER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModCodec.h" +#include "ModPlugin.h" #include <sys/types.h> @@ -50,4 +49,3 @@ protected: size_t* d_indexes; }; -#endif // FREQUENCY_INTERLEAVER_H diff --git a/src/GainControl.cpp b/src/GainControl.cpp index ec3e90f..4a05be1 100644 --- a/src/GainControl.cpp +++ b/src/GainControl.cpp @@ -58,7 +58,7 @@ GainControl::GainControl(size_t framesize, m_digGain(digGain), m_normalise(normalise) { - PDEBUG("GainControl::GainControl(%zu, %u) @ %p\n", framesize, mode, this); + PDEBUG("GainControl::GainControl(%zu, %zu) @ %p\n", framesize, (size_t)mode, this); /* register the parameters that can be remote controlled */ RC_ADD_PARAMETER(digital, "Digital Gain"); diff --git a/src/GainControl.h b/src/GainControl.h index 603875b..a8f8233 100644 --- a/src/GainControl.h +++ b/src/GainControl.h @@ -25,14 +25,13 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef GAIN_CONTROL_H -#define GAIN_CONTROL_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModCodec.h" +#include "ModPlugin.h" #include "RemoteControl.h" #include <sys/types.h> @@ -87,5 +86,4 @@ class GainControl : public ModCodec, public RemoteControllable #endif }; -#endif // GAIN_CONTROL_H diff --git a/src/GuardIntervalInserter.h b/src/GuardIntervalInserter.h index ffa8f5e..70a8fcd 100644 --- a/src/GuardIntervalInserter.h +++ b/src/GuardIntervalInserter.h @@ -19,16 +19,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef GUARD_INTERVAL_INSERTER_H -#define GUARD_INTERVAL_INSERTER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModCodec.h" - +#include "ModPlugin.h" #include <sys/types.h> @@ -53,5 +51,3 @@ protected: bool myHasNull; }; - -#endif // GUARD_INTERVAL_INSERTER_H diff --git a/src/InputMemory.cpp b/src/InputMemory.cpp index e27e967..c15c2b8 100644 --- a/src/InputMemory.cpp +++ b/src/InputMemory.cpp @@ -48,11 +48,10 @@ void InputMemory::setInput(Buffer* dataIn) } -int InputMemory::process(Buffer* dataIn, Buffer* dataOut) +int InputMemory::process(Buffer* dataOut) { - PDEBUG("InputMemory::process" - "(dataIn: %p, dataOut: %p)\n", - dataIn, dataOut); + PDEBUG("InputMemory::process (dataOut: %p)\n", + dataOut); *dataOut = *myDataIn; diff --git a/src/InputMemory.h b/src/InputMemory.h index 6d794a1..e5a6512 100644 --- a/src/InputMemory.h +++ b/src/InputMemory.h @@ -19,15 +19,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef INPUT_MEMORY_H -#define INPUT_MEMORY_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModInput.h" +#include "ModPlugin.h" class InputMemory : public ModInput @@ -35,7 +34,7 @@ class InputMemory : public ModInput public: InputMemory(Buffer* dataIn); virtual ~InputMemory(); - virtual int process(Buffer* dataIn, Buffer* dataOut); + virtual int process(Buffer* dataOut); const char* name() { return "InputMemory"; } void setInput(Buffer* dataIn); @@ -44,5 +43,3 @@ protected: Buffer *myDataIn; }; - -#endif // INPUT_MEMORY_H diff --git a/src/ModCodec.cpp b/src/ModCodec.cpp deleted file mode 100644 index 9e7cf72..0000000 --- a/src/ModCodec.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty - the Queen in Right of Canada (Communications Research Center Canada) - */ -/* - This file is part of ODR-DabMod. - - ODR-DabMod is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - ODR-DabMod is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ModCodec.h" - -#include <assert.h> - - -#ifdef DEBUG -size_t ModCodec::myCount = 0; -#endif - - -ModCodec::ModCodec() : - ModPlugin() -{ -#ifdef DEBUG - myOutputFile = NULL; -#endif -} - - -ModCodec::~ModCodec() -{ -#ifdef DEBUG - if (myOutputFile != NULL) { - fclose(myOutputFile); - } -#endif -} - - -int ModCodec::process(std::vector<Buffer*> dataIn, - std::vector<Buffer*> dataOut) -{ - assert(dataIn.size() <= 1); - assert(dataOut.size() <= 1); - - if (dataIn.size() == 0) { -#ifdef DEBUG - int ret = process(NULL, dataOut[0]); - if (myOutputFile == NULL) { - char filename[128]; - sprintf(filename, "output.cod.%.2zu.%s", myCount, name()); - myOutputFile = fopen(filename, "w"); - ++myCount; - } - fwrite(dataOut[0]->getData(), dataOut[0]->getLength(), 1, myOutputFile); - return ret; -#else - return process(NULL, dataOut[0]); -#endif - } -#ifdef DEBUG - int ret = process(dataIn[0], dataOut[0]); - if (ret) { - if (myOutputFile == NULL) { - char filename[128]; - sprintf(filename, "output.cod.%.2zu.%s", myCount, name()); - myOutputFile = fopen(filename, "w"); - ++myCount; - } - fwrite(dataOut[0]->getData(), dataOut[0]->getLength(), 1, myOutputFile); - } - return ret; -#else - return process(dataIn[0], dataOut[0]); -#endif -} diff --git a/src/ModCodec.h b/src/ModCodec.h deleted file mode 100644 index 465af46..0000000 --- a/src/ModCodec.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty - the Queen in Right of Canada (Communications Research Center Canada) - */ -/* - This file is part of ODR-DabMod. - - ODR-DabMod is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - ODR-DabMod is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. - */ - -#pragma once - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - - -#include "ModPlugin.h" - -#include <sys/types.h> -#include <vector> - - -class ModCodec : public ModPlugin -{ -public: - ModCodec(); - virtual ~ModCodec(); - - virtual int process(std::vector<Buffer*> dataIn, - std::vector<Buffer*> dataOut); - virtual int process(Buffer* const dataIn, Buffer* dataOut) = 0; - -protected: -#ifdef DEBUG - FILE* myOutputFile; - static size_t myCount; -#endif -}; - - diff --git a/src/ModInput.cpp b/src/ModInput.cpp deleted file mode 100644 index 392b2ae..0000000 --- a/src/ModInput.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty - the Queen in Right of Canada (Communications Research Center Canada) - */ -/* - This file is part of ODR-DabMod. - - ODR-DabMod is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - ODR-DabMod is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ModInput.h" - -#include <assert.h> - - -#ifdef DEBUG -size_t ModInput::myCount = 0; -#endif - - -ModInput::ModInput() : - ModPlugin() -{ -#ifdef DEBUG - myOutputFile = NULL; -#endif -} - - -ModInput::~ModInput() -{ -#ifdef DEBUG - if (myOutputFile != NULL) { - fclose(myOutputFile); - } -#endif -} - - -int ModInput::process(std::vector<Buffer*> dataIn, - std::vector<Buffer*> dataOut) -{ - assert(dataIn.size() == 0); - assert(dataOut.size() == 1); - -#ifdef DEBUG - int ret = process(NULL, dataOut[0]); - if (myOutputFile == NULL) { - char filename[256]; - sprintf(filename, "output.in.%.2zu.%s", myCount, name()); - myOutputFile = fopen(filename, "w"); - ++myCount; - assert(myOutputFile != NULL); - } - fprintf(stderr, "Writting %zu bytes @ %p from %s\n", dataOut[0]->getLength(), dataOut[0], name()); - fwrite(dataOut[0]->getData(), dataOut[0]->getLength(), 1, myOutputFile); - return ret; -#else - return process(NULL, dataOut[0]); -#endif -} diff --git a/src/ModInput.h b/src/ModInput.h deleted file mode 100644 index 2f1619c..0000000 --- a/src/ModInput.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty - the Queen in Right of Canada (Communications Research Center Canada) - */ -/* - This file is part of ODR-DabMod. - - ODR-DabMod is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - ODR-DabMod is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef MOD_INPUT_H -#define MOD_INPUT_H - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - - -#include "ModPlugin.h" - -#include <sys/types.h> - - -class ModInput : public ModPlugin -{ -public: - ModInput(); - virtual ~ModInput(); - - virtual int process(std::vector<Buffer*> dataIn, - std::vector<Buffer*> dataOut); - virtual int process(Buffer* dataIn, Buffer* dataOut) = 0; - -protected: -#ifdef DEBUG - FILE* myOutputFile; - static size_t myCount; -#endif -}; - - -#endif // MOD_INPUT_H diff --git a/src/ModMux.cpp b/src/ModMux.cpp deleted file mode 100644 index 2ab9b43..0000000 --- a/src/ModMux.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty - the Queen in Right of Canada (Communications Research Center Canada) - */ -/* - This file is part of ODR-DabMod. - - ODR-DabMod is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - ODR-DabMod is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ModMux.h" - -#include <assert.h> - - -#ifdef DEBUG -size_t ModMux::myCount = 0; -#endif - - -ModMux::ModMux() : - ModPlugin() -{ -#ifdef DEBUG - myOutputFile = NULL; -#endif -} - - -ModMux::~ModMux() -{ -#ifdef DEBUG - if (myOutputFile != NULL) { - fclose(myOutputFile); - } -#endif -} - - -int ModMux::process(std::vector<Buffer*> dataIn, std::vector<Buffer*> dataOut) -{ - assert(dataOut.size() == 1); - -#ifdef DEBUG - int ret = process(dataIn, dataOut[0]); - if (myOutputFile == NULL) { - char filename[128]; - sprintf(filename, "output.mux.%.2zu.%s", myCount, name()); - myOutputFile = fopen(filename, "w"); - ++myCount; - } - fwrite(dataOut[0]->getData(), dataOut[0]->getLength(), 1, myOutputFile); - return ret; -#else - return process(dataIn, dataOut[0]); -#endif -} diff --git a/src/ModMux.h b/src/ModMux.h deleted file mode 100644 index 45f2ce2..0000000 --- a/src/ModMux.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty - the Queen in Right of Canada (Communications Research Center Canada) - */ -/* - This file is part of ODR-DabMod. - - ODR-DabMod is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - ODR-DabMod is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef MOD_MUX_H -#define MOD_MUX_H - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - - -#include "ModPlugin.h" - -#include <sys/types.h> -#include <vector> - - -class ModMux : public ModPlugin -{ -public: - ModMux(); - virtual ~ModMux(); - - virtual int process(std::vector<Buffer*> dataIn, - std::vector<Buffer*> dataOut); - virtual int process(std::vector<Buffer*> dataIn, Buffer* dataOut) = 0; - -protected: -#ifdef DEBUG - FILE* myOutputFile; - static size_t myCount; -#endif -}; - - -#endif // MOD_MUX_H diff --git a/src/ModOutput.cpp b/src/ModOutput.cpp deleted file mode 100644 index 12818c7..0000000 --- a/src/ModOutput.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty - the Queen in Right of Canada (Communications Research Center Canada) - */ -/* - This file is part of ODR-DabMod. - - ODR-DabMod is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - ODR-DabMod is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ModOutput.h" - -#include <assert.h> - - -#ifdef DEBUG -size_t ModOutput::myCount = 0; -#endif - - -ModOutput::ModOutput() : - ModPlugin() -{ -#ifdef DEBUG - myOutputFile = NULL; -#endif -} - - -ModOutput::~ModOutput() -{ -#ifdef DEBUG - if (myOutputFile != NULL) { - fclose(myOutputFile); - } -#endif -} - - -int ModOutput::process(std::vector<Buffer*> dataIn, - std::vector<Buffer*> dataOut) -{ - assert(dataIn.size() == 1); - assert(dataOut.size() == 0); - -#ifdef DEBUG - int ret = process(dataIn[0], NULL); - if (myOutputFile == NULL) { - char filename[256]; - sprintf(filename, "output.out.%.2zu.%s", myCount, name()); - myOutputFile = fopen(filename, "w"); - ++myCount; - assert(myOutputFile != NULL); - } - fprintf(stderr, "Writting %zu bytes @ %p from %s\n", dataIn[0]->getLength(), dataIn[0], name()); - fwrite(dataIn[0]->getData(), dataIn[0]->getLength(), 1, myOutputFile); - return ret; -#else - return process(dataIn[0], NULL); -#endif -} diff --git a/src/ModOutput.h b/src/ModOutput.h deleted file mode 100644 index 5e370e8..0000000 --- a/src/ModOutput.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty - the Queen in Right of Canada (Communications Research Center Canada) - */ -/* - This file is part of ODR-DabMod. - - ODR-DabMod is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - ODR-DabMod is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef MOD_OUTPUT_H -#define MOD_OUTPUT_H - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - - -#include "ModPlugin.h" - -#include <sys/types.h> - - -class ModOutput : public ModPlugin -{ -public: - ModOutput(); - virtual ~ModOutput(); - - virtual int process(std::vector<Buffer*> dataIn, - std::vector<Buffer*> dataOut); - virtual int process(Buffer* dataIn, Buffer* dataOut) = 0; - -protected: -#ifdef DEBUG - FILE* myOutputFile; - static size_t myCount; -#endif -}; - - -#endif // MOD_OUTPUT_H diff --git a/src/ModPlugin.cpp b/src/ModPlugin.cpp index 1f94770..775b284 100644 --- a/src/ModPlugin.cpp +++ b/src/ModPlugin.cpp @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -20,4 +25,49 @@ */ #include "ModPlugin.h" +#include "PcDebug.h" +#include <stdexcept> +#include <string> + +#define MODASSERT(cond) \ + if (not (cond)) { \ + throw std::runtime_error("Assertion failure: " #cond " for " + \ + std::string(name())); \ + } + +int ModInput::process( + std::vector<Buffer*> dataIn, + std::vector<Buffer*> dataOut) +{ + MODASSERT(dataIn.empty()); + MODASSERT(dataOut.size() == 1); + return process(dataOut[0]); +} + +int ModCodec::process( + std::vector<Buffer*> dataIn, + std::vector<Buffer*> dataOut) +{ + MODASSERT(dataIn.size() == 1); + MODASSERT(dataOut.size() == 1); + return process(dataIn[0], dataOut[0]); +} + +int ModMux::process( + std::vector<Buffer*> dataIn, + std::vector<Buffer*> dataOut) +{ + MODASSERT(not dataIn.empty()); + MODASSERT(dataOut.size() == 1); + return process(dataIn, dataOut[0]); +} + +int ModOutput::process( + std::vector<Buffer*> dataIn, + std::vector<Buffer*> dataOut) +{ + MODASSERT(dataIn.size() == 1); + MODASSERT(dataOut.empty()); + return process(dataIn[0]); +} diff --git a/src/ModPlugin.h b/src/ModPlugin.h index 215951a..bdc3843 100644 --- a/src/ModPlugin.h +++ b/src/ModPlugin.h @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -30,16 +35,52 @@ #include <sys/types.h> #include <vector> -#ifdef DEBUG -# include <stdio.h> -#endif - class ModPlugin { public: - virtual int process(std::vector<Buffer*> dataIn, + virtual int process( + std::vector<Buffer*> dataIn, std::vector<Buffer*> dataOut) = 0; virtual const char* name() = 0; }; +/* Inputs are sources, the output buffers without reading any */ +class ModInput : public ModPlugin +{ +public: + virtual int process( + std::vector<Buffer*> dataIn, + std::vector<Buffer*> dataOut); + virtual int process(Buffer* dataOut) = 0; +}; + +/* Codecs are 1-input 1-output flowgraph plugins */ +class ModCodec : public ModPlugin +{ +public: + virtual int process( + std::vector<Buffer*> dataIn, + std::vector<Buffer*> dataOut); + virtual int process(Buffer* const dataIn, Buffer* dataOut) = 0; +}; + +/* Muxes are N-input 1-output flowgraph plugins */ +class ModMux : public ModPlugin +{ +public: + virtual int process( + std::vector<Buffer*> dataIn, + std::vector<Buffer*> dataOut); + virtual int process(std::vector<Buffer*> dataIn, Buffer* dataOut) = 0; +}; + +/* Outputs do not create any output buffers */ +class ModOutput : public ModPlugin +{ +public: + virtual int process( + std::vector<Buffer*> dataIn, + std::vector<Buffer*> dataOut); + virtual int process(Buffer* dataIn) = 0; +}; diff --git a/src/NullSymbol.cpp b/src/NullSymbol.cpp index f2c600e..015e564 100644 --- a/src/NullSymbol.cpp +++ b/src/NullSymbol.cpp @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -29,31 +34,27 @@ typedef std::complex<float> complexf; - NullSymbol::NullSymbol(size_t nbCarriers) : - ModCodec(), + ModInput(), myNbCarriers(nbCarriers) { PDEBUG("NullSymbol::NullSymbol(%zu) @ %p\n", nbCarriers, this); - } NullSymbol::~NullSymbol() { PDEBUG("NullSymbol::~NullSymbol() @ %p\n", this); - } -int NullSymbol::process(Buffer* const dataIn, Buffer* dataOut) +int NullSymbol::process(Buffer* dataOut) { - PDEBUG("NullSymbol::process" - "(dataIn: %p, dataOut: %p)\n", - dataIn, dataOut); - + PDEBUG("NullSymbol::process(dataOut: %p)\n", dataOut); + dataOut->setLength(myNbCarriers * 2 * sizeof(float)); bzero(dataOut->getData(), dataOut->getLength()); return dataOut->getLength(); } + diff --git a/src/NullSymbol.h b/src/NullSymbol.h index e8372f0..8840449 100644 --- a/src/NullSymbol.h +++ b/src/NullSymbol.h @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -19,32 +24,30 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef NULL_SYMBOL_H -#define NULL_SYMBOL_H +#pragma once #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "porting.h" -#include "ModCodec.h" +#include "ModPlugin.h" #include <sys/types.h> #include <stdint.h> -class NullSymbol : public ModCodec +class NullSymbol : public ModInput { -protected: - size_t myNbCarriers; - public: NullSymbol(size_t nbCarriers); virtual ~NullSymbol(); - int process(Buffer* const dataIn, Buffer* dataOut); + int process(Buffer* dataOut); const char* name() { return "NullSymbol"; } -}; +private: + size_t myNbCarriers; + +}; -#endif // NULL_SYMBOL_H diff --git a/src/OfdmGenerator.h b/src/OfdmGenerator.h index 061ad91..a8c3c19 100644 --- a/src/OfdmGenerator.h +++ b/src/OfdmGenerator.h @@ -24,15 +24,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef OFDM_GENERATOR_H -#define OFDM_GENERATOR_H +#pragma once #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "porting.h" -#include "ModCodec.h" +#include "ModPlugin.h" #include "fftw3.h" @@ -67,5 +66,4 @@ protected: unsigned myZeroSize; }; -#endif // OFDM_GENERATOR_H diff --git a/src/OutputFile.cpp b/src/OutputFile.cpp index d1a7a4c..23d5523 100644 --- a/src/OutputFile.cpp +++ b/src/OutputFile.cpp @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -53,9 +58,9 @@ OutputFile::~OutputFile() } -int OutputFile::process(Buffer* dataIn, Buffer* dataOut) +int OutputFile::process(Buffer* dataIn) { - PDEBUG("OutputFile::process(%p, %p)\n", dataIn, dataOut); + PDEBUG("OutputFile::process(%p)\n", dataIn); assert(dataIn != NULL); if (fwrite(dataIn->getData(), dataIn->getLength(), 1, myFile) == 0) { diff --git a/src/OutputFile.h b/src/OutputFile.h index 8b37f91..7121ef3 100644 --- a/src/OutputFile.h +++ b/src/OutputFile.h @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -19,15 +24,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef OUTPUT_FILE_H -#define OUTPUT_FILE_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModOutput.h" +#include "ModPlugin.h" #include <string> #include <stdio.h> @@ -40,7 +44,7 @@ public: OutputFile(std::string filename); virtual ~OutputFile(); - virtual int process(Buffer* dataIn, Buffer* dataOut); + virtual int process(Buffer* dataIn); const char* name() { return "OutputFile"; } protected: @@ -48,5 +52,3 @@ protected: FILE* myFile; }; - -#endif // OUTPUT_FILE_H diff --git a/src/OutputMemory.cpp b/src/OutputMemory.cpp index 6e81cba..6e2fd49 100644 --- a/src/OutputMemory.cpp +++ b/src/OutputMemory.cpp @@ -2,7 +2,7 @@ Copyright (C) 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) - Copyright (C) 2014 + Copyright (C) 2016 Matthias P. Braendli, matthias.braendli@mpb.li http://opendigitalradio.org @@ -71,11 +71,10 @@ void OutputMemory::setOutput(Buffer* dataOut) } -int OutputMemory::process(Buffer* dataIn, Buffer* dataOut) +int OutputMemory::process(Buffer* dataIn) { - PDEBUG("OutputMemory::process" - "(dataIn: %p, dataOut: %p)\n", - dataIn, dataOut); + PDEBUG("OutputMemory::process(dataIn: %p)\n", + dataIn); *myDataOut = *dataIn; diff --git a/src/OutputMemory.h b/src/OutputMemory.h index 56cbc01..715cb2d 100644 --- a/src/OutputMemory.h +++ b/src/OutputMemory.h @@ -2,7 +2,7 @@ Copyright (C) 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) - Copyright (C) 2014 + Copyright (C) 2016 Matthias P. Braendli, matthias.braendli@mpb.li http://opendigitalradio.org @@ -24,8 +24,7 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef OUTPUT_MEMORY_H -#define OUTPUT_MEMORY_H +#pragma once #ifdef HAVE_CONFIG_H # include "config.h" @@ -44,7 +43,7 @@ #endif -#include "ModOutput.h" +#include "ModPlugin.h" class OutputMemory : public ModOutput @@ -52,7 +51,7 @@ class OutputMemory : public ModOutput public: OutputMemory(Buffer* dataOut); virtual ~OutputMemory(); - virtual int process(Buffer* dataIn, Buffer* dataOut); + virtual int process(Buffer* dataIn); const char* name() { return "OutputMemory"; } void setOutput(Buffer* dataOut); @@ -68,5 +67,3 @@ protected: #endif }; -#endif // OUTPUT_MEMORY_H - diff --git a/src/OutputUHD.cpp b/src/OutputUHD.cpp index d5caa15..55a24b2 100644 --- a/src/OutputUHD.cpp +++ b/src/OutputUHD.cpp @@ -304,7 +304,7 @@ void OutputUHD::SetDelayBuffer(unsigned int dabMode) myDelayBuf.resize(myTFDurationMs * myConf.sampleRate / 1000); } -int OutputUHD::process(Buffer* dataIn, Buffer* dataOut) +int OutputUHD::process(Buffer* dataIn) { uwd.muting = myConf.muting; diff --git a/src/OutputUHD.h b/src/OutputUHD.h index 8ef4037..9987c79 100644 --- a/src/OutputUHD.h +++ b/src/OutputUHD.h @@ -33,8 +33,7 @@ DESCRIPTION: along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef OUTPUT_UHD_H -#define OUTPUT_UHD_H +#pragma once #define FAKE_UHD 0 @@ -54,7 +53,7 @@ DESCRIPTION: #include <string> #include "Log.h" -#include "ModOutput.h" +#include "ModPlugin.h" #include "EtiReader.h" #include "TimestampDecoder.h" #include "RemoteControl.h" @@ -222,7 +221,7 @@ class OutputUHD: public ModOutput, public RemoteControllable { OutputUHD(OutputUHDConfig& config); ~OutputUHD(); - int process(Buffer* dataIn, Buffer* dataOut); + int process(Buffer* dataIn); const char* name() { return "OutputUHD"; } @@ -287,5 +286,3 @@ class OutputUHD: public ModOutput, public RemoteControllable { #endif // HAVE_OUTPUT_UHD -#endif // OUTPUT_UHD_H - diff --git a/src/OutputZeroMQ.cpp b/src/OutputZeroMQ.cpp index 1148a42..93fe3c0 100644 --- a/src/OutputZeroMQ.cpp +++ b/src/OutputZeroMQ.cpp @@ -2,7 +2,7 @@ Copyright (C) 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) - Copyright (C) 2014 + Copyright (C) 2016 Matthias P. Braendli, matthias.braendli@mpb.li http://opendigitalradio.org @@ -64,11 +64,11 @@ OutputZeroMQ::~OutputZeroMQ() PDEBUG("OutputZeroMQ::~OutputZeroMQ() @ %p\n", this); } -int OutputZeroMQ::process(Buffer* dataIn, Buffer* dataOut) +int OutputZeroMQ::process(Buffer* dataIn) { PDEBUG("OutputZeroMQ::process" - "(dataIn: %p, dataOut: %p)\n", - dataIn, dataOut); + "(dataIn: %p)\n", + dataIn); if (m_type == ZMQ_REP) { // A ZMQ_REP socket requires a request first diff --git a/src/OutputZeroMQ.h b/src/OutputZeroMQ.h index 85f85a7..3107225 100644 --- a/src/OutputZeroMQ.h +++ b/src/OutputZeroMQ.h @@ -2,7 +2,7 @@ Copyright (C) 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) - Copyright (C) 2014 + Copyright (C) 2016 Matthias P. Braendli, matthias.braendli@mpb.li http://opendigitalradio.org @@ -24,8 +24,7 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef OUTPUT_ZEROMQ_H -#define OUTPUT_ZEROMQ_H +#pragma once #ifdef HAVE_CONFIG_H # include "config.h" @@ -33,7 +32,7 @@ #if defined(HAVE_ZEROMQ) -#include "ModOutput.h" +#include "ModPlugin.h" #include "zmq.hpp" class OutputZeroMQ : public ModOutput @@ -41,7 +40,7 @@ class OutputZeroMQ : public ModOutput public: OutputZeroMQ(std::string endpoint, int type, Buffer* dataOut = NULL); virtual ~OutputZeroMQ(); - virtual int process(Buffer* dataIn, Buffer* dataOut); + virtual int process(Buffer* dataIn); const char* name() { return m_name.c_str(); } protected: @@ -57,5 +56,3 @@ class OutputZeroMQ : public ModOutput #endif // HAVE_ZEROMQ -#endif // OUTPUT_ZEROMQ_H - diff --git a/src/PhaseReference.cpp b/src/PhaseReference.cpp index 2fbd32d..c73c6e2 100644 --- a/src/PhaseReference.cpp +++ b/src/PhaseReference.cpp @@ -55,7 +55,7 @@ const uint8_t PhaseReference::d_h[4][32] = { PhaseReference::PhaseReference(unsigned int dabmode) : - ModCodec(), + ModInput(), d_dabmode(dabmode) { PDEBUG("PhaseReference::PhaseReference(%u) @ %p\n", dabmode, this); @@ -165,15 +165,9 @@ void PhaseReference::fillData() } -int PhaseReference::process(Buffer* const dataIn, Buffer* dataOut) +int PhaseReference::process(Buffer* dataOut) { - PDEBUG("PhaseReference::process(dataIn: %p, dataOut: %p)\n", - dataIn, dataOut); - - if ((dataIn != NULL) && (dataIn->getLength() != 0)) { - throw std::runtime_error( - "PhaseReference::process input size not valid!"); - } + PDEBUG("PhaseReference::process(dataOut: %p)\n", dataOut); dataOut->setData(&d_dataIn[0], d_carriers * sizeof(complexf)); diff --git a/src/PhaseReference.h b/src/PhaseReference.h index 12ac9c4..f7a5cdc 100644 --- a/src/PhaseReference.h +++ b/src/PhaseReference.h @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -19,21 +24,20 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef PHASE_REFERENCE_H -#define PHASE_REFERENCE_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModCodec.h" +#include "ModPlugin.h" #include <sys/types.h> #include <complex> #include <vector> -class PhaseReference : public ModCodec +class PhaseReference : public ModInput { public: PhaseReference(unsigned int dabmode); @@ -41,8 +45,7 @@ public: PhaseReference(const PhaseReference&); PhaseReference& operator=(const PhaseReference&); - - int process(Buffer* const dataIn, Buffer* dataOut); + int process(Buffer* dataOut); const char* name() { return "PhaseReference"; } protected: @@ -55,5 +58,3 @@ protected: void fillData(); }; -#endif // PHASE_REFERENCE_H - diff --git a/src/PrbsGenerator.cpp b/src/PrbsGenerator.cpp index baec9b7..69d6af4 100644 --- a/src/PrbsGenerator.cpp +++ b/src/PrbsGenerator.cpp @@ -29,7 +29,7 @@ PrbsGenerator::PrbsGenerator(size_t framesize, uint32_t polynomial, uint32_t accum, size_t init) : - ModCodec(), + ModPlugin(), d_framesize(framesize), d_polynomial(polynomial), d_accum(accum), @@ -122,17 +122,28 @@ uint32_t PrbsGenerator::update_prbs() } -int PrbsGenerator::process(Buffer* const dataIn, Buffer* dataOut) +int PrbsGenerator::process( + std::vector<Buffer*> dataIn, + std::vector<Buffer*> dataOut) { - PDEBUG("PrbsGenerator::process(dataIn: %p, dataOut: %p)\n", - dataIn, dataOut); - dataOut->setLength(d_framesize); - unsigned char* out = reinterpret_cast<unsigned char*>(dataOut->getData()); - + PDEBUG("PrbsGenerator::process(dataIn: %zu, dataOut: %zu)\n", + dataIn.size(), dataOut.size()); + if (dataIn.size() > 1) { + throw std::runtime_error("Invalid dataIn size for PrbsGenerator " + + std::to_string(dataIn.size())); + } + if (dataOut.size() != 1) { + throw std::runtime_error("Invalid dataOut size for PrbsGenerator " + + std::to_string(dataOut.size())); + } + dataOut[0]->setLength(d_framesize); + unsigned char* out = reinterpret_cast<unsigned char*>(dataOut[0]->getData()); + // Initialization if (d_accum_init) { d_accum = d_accum_init; - } else { + } + else { d_accum = 0; while (d_accum < d_polynomial) { d_accum <<= 1; @@ -147,28 +158,30 @@ int PrbsGenerator::process(Buffer* const dataIn, Buffer* dataOut) } for (; i < d_framesize; ++i) { - // Writting data d_accum = update_prbs(); if ((d_accum_init == 0xa9) && (i % 188 == 0)) { // DVB energy dispersal out[i] = 0; - } else { + } + else { out[i] = (unsigned char)(d_accum & 0xff); } //PDEBUG("accum: 0x%x\n", d_accum); } - if ((dataIn != NULL) && dataIn->getLength()) { + if (not dataIn.empty()) { PDEBUG(" mixing input\n"); - const unsigned char* in = reinterpret_cast<const unsigned char*>(dataIn->getData()); - if (dataIn->getLength() != dataOut->getLength()) { - PDEBUG("%zu != %zu\n", dataIn->getLength(), dataOut->getLength()); + const unsigned char* in = + reinterpret_cast<const unsigned char*>(dataIn[0]->getData()); + + if (dataIn[0]->getLength() != dataOut[0]->getLength()) { + PDEBUG("%zu != %zu\n", dataIn[0]->getLength(), dataOut[0]->getLength()); throw std::runtime_error("PrbsGenerator::process " "input size is not equal to output size!\n"); } - for (size_t i = 0; i < dataOut->getLength(); ++i) { + for (size_t i = 0; i < dataOut[0]->getLength(); ++i) { out[i] ^= in[i]; } } - - return dataOut->getLength(); + + return dataOut[0]->getLength(); } diff --git a/src/PrbsGenerator.h b/src/PrbsGenerator.h index 0603df7..b86bc70 100644 --- a/src/PrbsGenerator.h +++ b/src/PrbsGenerator.h @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -19,30 +24,28 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef PRBS_GENERATOR_H -#define PRBS_GENERATOR_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif - -#include "ModCodec.h" - +#include "ModPlugin.h" #include <sys/types.h> #include <stdint.h> - -class PrbsGenerator : public ModCodec +/* The PrbsGenerator can work as a ModInput generating a Prbs + * sequence from the given parameters only, or as a ModCodec + * XORing incoming data with the PRBS + */ +class PrbsGenerator : public ModPlugin { private: - -protected: uint32_t parity_check(uint32_t prbs_accum); void gen_prbs_table(); uint32_t update_prbs(); void gen_weight_table(); - + size_t d_framesize; // table of matrix products used to update a 32-bit PRBS generator uint32_t d_prbs_table [4][256]; @@ -63,9 +66,7 @@ public: size_t init = 0); virtual ~PrbsGenerator(); - int process(Buffer* const dataIn, Buffer* dataOut); + int process(std::vector<Buffer*> dataIn, std::vector<Buffer*> dataOut); const char* name() { return "PrbsGenerator"; } }; - -#endif // PRBS_GENERATOR_H diff --git a/src/PuncturingEncoder.cpp b/src/PuncturingEncoder.cpp index 66fd0e0..a212a93 100644 --- a/src/PuncturingEncoder.cpp +++ b/src/PuncturingEncoder.cpp @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -32,47 +37,29 @@ PuncturingEncoder::PuncturingEncoder() : ModCodec(), d_in_block_size(0), d_out_block_size(0), - d_tail_rule(NULL) + d_tail_rule() { PDEBUG("PuncturingEncoder() @ %p\n", this); } - -PuncturingEncoder::~PuncturingEncoder() -{ - PDEBUG("PuncturingEncoder::~PuncturingEncoder() @ %p\n", this); - for (unsigned i = 0; i < d_rules.size(); ++i) { - PDEBUG(" Deleting rules @ %p\n", d_rules[i]); - delete d_rules[i]; - } - if (d_tail_rule != NULL) { - PDEBUG(" Deleting rules @ %p\n", d_tail_rule); - delete d_tail_rule; - } -} - void PuncturingEncoder::adjust_item_size() { PDEBUG("PuncturingEncoder::adjust_item_size()\n"); int in_size = 0; int out_size = 0; int length = 0; - std::vector<PuncturingRule*>::iterator ptr; - - for (ptr = d_rules.begin(); ptr != d_rules.end(); ++ptr) { - for (length = (*ptr)->length(); length > 0; length -= 4) { - out_size += (*ptr)->bit_size(); + + for (const auto& rule : d_rules) { + for (length = rule.length(); length > 0; length -= 4) { + out_size += rule.bit_size(); in_size += 4; -// PDEBUG("- in: %i, out: %i\n", in_size, out_size); } -// PDEBUG("- in: %i, out: %i\n", in_size, (out_size + 7) / 8); } - if (d_tail_rule != NULL) { -// PDEBUG("- computing tail rule\n"); + + if (d_tail_rule) { in_size += d_tail_rule->length(); out_size += d_tail_rule->bit_size(); -// PDEBUG("- in: %i, out: %i\n", in_size, out_size); } d_in_block_size = in_size; @@ -86,7 +73,7 @@ void PuncturingEncoder::adjust_item_size() void PuncturingEncoder::append_rule(const PuncturingRule& rule) { PDEBUG("append_rule(rule(%zu, 0x%x))\n", rule.length(), rule.pattern()); - d_rules.push_back(new PuncturingRule(rule)); + d_rules.push_back(rule); adjust_item_size(); } @@ -95,7 +82,7 @@ void PuncturingEncoder::append_rule(const PuncturingRule& rule) void PuncturingEncoder::append_tail_rule(const PuncturingRule& rule) { PDEBUG("append_tail_rule(rule(%zu, 0x%x))\n", rule.length(), rule.pattern()); - d_tail_rule = new PuncturingRule(rule); + d_tail_rule = rule; adjust_item_size(); } @@ -113,14 +100,14 @@ int PuncturingEncoder::process(Buffer* const dataIn, Buffer* dataOut) unsigned char data; uint32_t mask; uint32_t pattern; - std::vector<PuncturingRule*>::iterator ptr = d_rules.begin(); + auto rule_it = d_rules.begin(); PDEBUG(" in block size: %zu\n", d_in_block_size); PDEBUG(" out block size: %zu\n", d_out_block_size); dataOut->setLength(d_out_block_size); const unsigned char* in = reinterpret_cast<const unsigned char*>(dataIn->getData()); unsigned char* out = reinterpret_cast<unsigned char*>(dataOut->getData()); - + if (dataIn->getLength() != d_in_block_size) { throw std::runtime_error("PuncturingEncoder::process wrong input size"); } @@ -129,9 +116,9 @@ int PuncturingEncoder::process(Buffer* const dataIn, Buffer* dataOut) d_in_block_size -= d_tail_rule->length(); } while (in_count < d_in_block_size) { - for (length = (*ptr)->length(); length > 0; length -= 4) { + for (length = rule_it->length(); length > 0; length -= 4) { mask = 0x80000000; - pattern = (*ptr)->pattern(); + pattern = rule_it->pattern(); for (int i = 0; i < 4; ++i) { data = in[in_count++]; for (int j = 0; j < 8; ++j) { @@ -148,8 +135,8 @@ int PuncturingEncoder::process(Buffer* const dataIn, Buffer* dataOut) } } } - if (++ptr == d_rules.end()) { - ptr = d_rules.begin(); + if (++rule_it == d_rules.end()) { + rule_it = d_rules.begin(); } } if (d_tail_rule) { @@ -183,11 +170,12 @@ int PuncturingEncoder::process(Buffer* const dataIn, Buffer* dataOut) for (size_t i = d_out_block_size; i < dataOut->getLength(); ++i) { out[out_count++] = 0; } + assert(out_count == dataOut->getLength()); if (out_count != dataOut->getLength()) { throw std::runtime_error("PuncturingEncoder::process output size " "does not correspond!"); } - + return d_out_block_size; } diff --git a/src/PuncturingEncoder.h b/src/PuncturingEncoder.h index 17dc21f..19be53e 100644 --- a/src/PuncturingEncoder.h +++ b/src/PuncturingEncoder.h @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -19,8 +24,7 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef PUNCTURING_ENCODER_H -#define PUNCTURING_ENCODER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> @@ -28,36 +32,31 @@ #include "PuncturingRule.h" -#include "ModCodec.h" +#include "ModPlugin.h" #include <vector> #include <sys/types.h> - +#include <boost/optional.hpp> class PuncturingEncoder : public ModCodec { -private: - size_t d_in_block_size; - size_t d_out_block_size; - std::vector<PuncturingRule*> d_rules; - PuncturingRule* d_tail_rule; - -protected: - void adjust_item_size(); - public: PuncturingEncoder(); - virtual ~PuncturingEncoder(); - PuncturingEncoder(const PuncturingEncoder&); - PuncturingEncoder& operator=(const PuncturingEncoder&); - + void append_rule(const PuncturingRule& rule); void append_tail_rule(const PuncturingRule& rule); int process(Buffer* const dataIn, Buffer* dataOut); const char* name() { return "PuncturingEncoder"; } size_t getInputSize() { return d_in_block_size; } size_t getOutputSize() { return d_out_block_size; } -}; +private: + size_t d_in_block_size; + size_t d_out_block_size; + std::vector<PuncturingRule> d_rules; + boost::optional<PuncturingRule> d_tail_rule; + + void adjust_item_size(); + +}; -#endif // PUNCTURING_ENCODER_H diff --git a/src/PuncturingRule.cpp b/src/PuncturingRule.cpp index 77668aa..ee5bfa0 100644 --- a/src/PuncturingRule.cpp +++ b/src/PuncturingRule.cpp @@ -19,42 +19,24 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifdef HAVE_CONFIG_H -//#include "config.h" -#endif - #include "PcDebug.h" #include "PuncturingRule.h" #include <stdio.h> -#include <stdexcept> - PuncturingRule::PuncturingRule( const size_t length, const uint32_t pattern) : d_length(length), d_pattern(pattern) -{ - PDEBUG("PuncturingRule::PuncturingRule(%zu, 0x%x) @ %p\n", - length, pattern, this); -} - - -PuncturingRule::~PuncturingRule() -{ - PDEBUG("PuncturingRule::~PuncturingRule() @ %p\n", this); -} - +{ } size_t PuncturingRule::bit_size() const { -// fprintf(stderr, "Calling bit_size()"); size_t bits = 0; for (uint32_t mask = 0x80000000; mask != 0; mask >>= 1) { if (d_pattern & mask) { ++bits; } } -// fprintf(stderr, " -> return %i\n", bits); return bits; } diff --git a/src/PuncturingRule.h b/src/PuncturingRule.h index d600b95..c91acf1 100644 --- a/src/PuncturingRule.h +++ b/src/PuncturingRule.h @@ -19,38 +19,28 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef PUNCTURING_RULE_H -#define PUNCTURING_RULE_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif - #include <sys/types.h> #include <stdint.h> - class PuncturingRule { -private: - size_t d_length; - uint32_t d_pattern; - -protected: - public: PuncturingRule( const size_t length, const uint32_t pattern); - virtual ~PuncturingRule(); -// PuncturingRule(const PuncturingRule& rule); - PuncturingRule& operator=(const PuncturingRule&); size_t length() const { return d_length; } size_t bit_size() const; const uint32_t pattern() const { return d_pattern; } -}; +private: + size_t d_length; + uint32_t d_pattern; +}; -#endif // PUNCTURING_RULE_H diff --git a/src/QpskSymbolMapper.h b/src/QpskSymbolMapper.h index ddba719..98f2e60 100644 --- a/src/QpskSymbolMapper.h +++ b/src/QpskSymbolMapper.h @@ -19,15 +19,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef QPSK_SYMBOL_MAPPER_H -#define QPSK_SYMBOL_MAPPER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModCodec.h" +#include "ModPlugin.h" #include <sys/types.h> @@ -48,4 +47,3 @@ protected: size_t d_carriers; }; -#endif // QPSK_SYMBOL_MAPPER_H diff --git a/src/Resampler.h b/src/Resampler.h index f8388ee..d9d9d89 100644 --- a/src/Resampler.h +++ b/src/Resampler.h @@ -24,15 +24,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef RESAMPLER_H -#define RESAMPLER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif #include "porting.h" -#include "ModCodec.h" +#include "ModPlugin.h" #include <sys/types.h> #include <fftw3.h> @@ -73,5 +72,4 @@ protected: float myFactor; }; -#endif // RESAMPLER_H diff --git a/src/SignalMultiplexer.h b/src/SignalMultiplexer.h index 79b9640..5186a8d 100644 --- a/src/SignalMultiplexer.h +++ b/src/SignalMultiplexer.h @@ -19,15 +19,15 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef SIGNAL_MULTIPLEXER_H -#define SIGNAL_MULTIPLEXER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModMux.h" +#include "ModPlugin.h" +#include <vector> #include <sys/types.h> @@ -49,5 +49,3 @@ protected: size_t d_frameSize; }; - -#endif // SIGNAL_MULTIPLEXER_H diff --git a/src/SubchannelSource.cpp b/src/SubchannelSource.cpp index 14d6399..f4b6b55 100644 --- a/src/SubchannelSource.cpp +++ b/src/SubchannelSource.cpp @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -54,7 +59,7 @@ #define P24 0xffffffff -const std::vector<PuncturingRule*>& SubchannelSource::get_rules() +const std::vector<PuncturingRule>& SubchannelSource::get_rules() { return d_puncturing_rules; } @@ -67,42 +72,38 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : d_protection(stc.TPL) { PDEBUG("SubchannelSource::SubchannelSource(...) @ %p\n", this); -// PDEBUG(" Start address: %i\n", d_start_address); -// PDEBUG(" Framesize: %i\n", d_framesize); -// PDEBUG(" Protection: %i\n", d_protection); + PDEBUG(" Start address: %zu\n", d_start_address); + PDEBUG(" Framesize: %zu\n", d_framesize); + PDEBUG(" Protection: %zu\n", d_protection); if (protectionForm()) { if (protectionOption() == 0) { switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule( - ((6 * bitrate() / 8) - 3) * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule( - 3 * 16, P23)); + d_puncturing_rules.emplace_back( + ((6 * bitrate() / 8) - 3) * 16, P24); + d_puncturing_rules.emplace_back(3 * 16, P23); break; case 2: if (bitrate() == 8) { - d_puncturing_rules.push_back(new PuncturingRule( - 5 * 16, P13)); - d_puncturing_rules.push_back(new PuncturingRule( - 1 * 16, P12)); + d_puncturing_rules.emplace_back(5 * 16, P13); + d_puncturing_rules.emplace_back(1 * 16, P12); } else { - d_puncturing_rules.push_back(new PuncturingRule( - ((2 * bitrate() / 8) - 3) * 16, P14)); - d_puncturing_rules.push_back(new PuncturingRule( - ((4 * bitrate() / 8) + 3) * 16, P13)); + d_puncturing_rules.emplace_back( + ((2 * bitrate() / 8) - 3) * 16, P14); + d_puncturing_rules.emplace_back( + ((4 * bitrate() / 8) + 3) * 16, P13); } break; case 3: - d_puncturing_rules.push_back(new PuncturingRule( - ((6 * bitrate() / 8) - 3) * 16, P8)); - d_puncturing_rules.push_back(new PuncturingRule( - 3 * 16, P7)); + d_puncturing_rules.emplace_back( + ((6 * bitrate() / 8) - 3) * 16, P8); + d_puncturing_rules.emplace_back(3 * 16, P7); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule( - ((4 * bitrate() / 8) - 3) * 16, P3)); - d_puncturing_rules.push_back(new PuncturingRule( - ((2 * bitrate() / 8) + 3) * 16, P2)); + d_puncturing_rules.emplace_back( + ((4 * bitrate() / 8) - 3) * 16, P3); + d_puncturing_rules.emplace_back( + ((2 * bitrate() / 8) + 3) * 16, P2); break; default: fprintf(stderr, @@ -115,28 +116,28 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : } else if (protectionOption() == 1) { switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule( - ((24 * bitrate() / 32) - 3) * 16, P10)); - d_puncturing_rules.push_back(new PuncturingRule( - 3 * 16, P9)); + d_puncturing_rules.emplace_back( + ((24 * bitrate() / 32) - 3) * 16, P10); + d_puncturing_rules.emplace_back( + 3 * 16, P9); break; case 2: - d_puncturing_rules.push_back(new PuncturingRule( - ((24 * bitrate() / 32) - 3) * 16, P6)); - d_puncturing_rules.push_back(new PuncturingRule( - 3 * 16, P5)); + d_puncturing_rules.emplace_back( + ((24 * bitrate() / 32) - 3) * 16, P6); + d_puncturing_rules.emplace_back( + 3 * 16, P5); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule( - ((24 * bitrate() / 32) - 3) * 16, P4)); - d_puncturing_rules.push_back(new PuncturingRule( - 3 * 16, P3)); + d_puncturing_rules.emplace_back( + ((24 * bitrate() / 32) - 3) * 16, P4); + d_puncturing_rules.emplace_back( + 3 * 16, P3); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule( - ((24 * bitrate() / 32) - 3) * 16, P2)); - d_puncturing_rules.push_back(new PuncturingRule( - 3 * 16, P1)); + d_puncturing_rules.emplace_back( + ((24 * bitrate() / 32) - 3) * 16, P2); + d_puncturing_rules.emplace_back( + 3 * 16, P1); break; default: fprintf(stderr, @@ -160,32 +161,32 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 32: switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(5 * 16, P17)); - d_puncturing_rules.push_back(new PuncturingRule(13 * 16, P12)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P17)); + d_puncturing_rules.emplace_back(3 * 16, P24); + d_puncturing_rules.emplace_back(5 * 16, P17); + d_puncturing_rules.emplace_back(13 * 16, P12); + d_puncturing_rules.emplace_back(3 * 16, P17); break; case 2: - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P22)); - d_puncturing_rules.push_back(new PuncturingRule(4 * 16, P13)); - d_puncturing_rules.push_back(new PuncturingRule(14 * 16, P8 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P13)); + d_puncturing_rules.emplace_back(3 * 16, P22); + d_puncturing_rules.emplace_back(4 * 16, P13); + d_puncturing_rules.emplace_back(14 * 16, P8 ); + d_puncturing_rules.emplace_back(3 * 16, P13); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P15)); - d_puncturing_rules.push_back(new PuncturingRule(4 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(14 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P8 )); + d_puncturing_rules.emplace_back(3 * 16, P15); + d_puncturing_rules.emplace_back(4 * 16, P9 ); + d_puncturing_rules.emplace_back(14 * 16, P6 ); + d_puncturing_rules.emplace_back(3 * 16, P8 ); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P11)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(18 * 16, P5 )); + d_puncturing_rules.emplace_back(3 * 16, P11); + d_puncturing_rules.emplace_back(3 * 16, P6 ); + d_puncturing_rules.emplace_back(18 * 16, P5 ); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P5 )); - d_puncturing_rules.push_back(new PuncturingRule(4 * 16, P3 )); - d_puncturing_rules.push_back(new PuncturingRule(17 * 16, P2 )); + d_puncturing_rules.emplace_back(3 * 16, P5 ); + d_puncturing_rules.emplace_back(4 * 16, P3 ); + d_puncturing_rules.emplace_back(17 * 16, P2 ); break; default: error = true; @@ -194,34 +195,34 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 48: switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(5 * 16, P18)); - d_puncturing_rules.push_back(new PuncturingRule(25 * 16, P13)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P18)); + d_puncturing_rules.emplace_back(3 * 16, P24); + d_puncturing_rules.emplace_back(5 * 16, P18); + d_puncturing_rules.emplace_back(25 * 16, P13); + d_puncturing_rules.emplace_back(3 * 16, P18); break; case 2: - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(4 * 16, P14)); - d_puncturing_rules.push_back(new PuncturingRule(26 * 16, P8 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P15)); + d_puncturing_rules.emplace_back(3 * 16, P24); + d_puncturing_rules.emplace_back(4 * 16, P14); + d_puncturing_rules.emplace_back(26 * 16, P8 ); + d_puncturing_rules.emplace_back(3 * 16, P15); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P15)); - d_puncturing_rules.push_back(new PuncturingRule(4 * 16, P10)); - d_puncturing_rules.push_back(new PuncturingRule(26 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P9 )); + d_puncturing_rules.emplace_back(3 * 16, P15); + d_puncturing_rules.emplace_back(4 * 16, P10); + d_puncturing_rules.emplace_back(26 * 16, P6 ); + d_puncturing_rules.emplace_back(3 * 16, P9 ); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(4 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(26 * 16, P4 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P6 )); + d_puncturing_rules.emplace_back(3 * 16, P9 ); + d_puncturing_rules.emplace_back(4 * 16, P6 ); + d_puncturing_rules.emplace_back(26 * 16, P4 ); + d_puncturing_rules.emplace_back(3 * 16, P6 ); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(4 * 16, P5 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P4 )); - d_puncturing_rules.push_back(new PuncturingRule(26 * 16, P2 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P3 )); + d_puncturing_rules.emplace_back(4 * 16, P5 ); + d_puncturing_rules.emplace_back(3 * 16, P4 ); + d_puncturing_rules.emplace_back(26 * 16, P2 ); + d_puncturing_rules.emplace_back(3 * 16, P3 ); break; default: error = true; @@ -230,28 +231,28 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 56: switch (protectionLevel()) { case 2: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P23)); - d_puncturing_rules.push_back(new PuncturingRule(10 * 16, P13)); - d_puncturing_rules.push_back(new PuncturingRule(23 * 16, P8 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P13)); + d_puncturing_rules.emplace_back(6 * 16, P23); + d_puncturing_rules.emplace_back(10 * 16, P13); + d_puncturing_rules.emplace_back(23 * 16, P8 ); + d_puncturing_rules.emplace_back(3 * 16, P13); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(12 * 16, P7 )); - d_puncturing_rules.push_back(new PuncturingRule(21 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P9 )); + d_puncturing_rules.emplace_back(6 * 16, P16); + d_puncturing_rules.emplace_back(12 * 16, P7 ); + d_puncturing_rules.emplace_back(21 * 16, P6 ); + d_puncturing_rules.emplace_back(3 * 16, P9 ); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(10 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(23 * 16, P4 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P5 )); + d_puncturing_rules.emplace_back(6 * 16, P9 ); + d_puncturing_rules.emplace_back(10 * 16, P6 ); + d_puncturing_rules.emplace_back(23 * 16, P4 ); + d_puncturing_rules.emplace_back(3 * 16, P5 ); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P5 )); - d_puncturing_rules.push_back(new PuncturingRule(10 * 16, P4 )); - d_puncturing_rules.push_back(new PuncturingRule(23 * 16, P2 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P3 )); + d_puncturing_rules.emplace_back(6 * 16, P5 ); + d_puncturing_rules.emplace_back(10 * 16, P4 ); + d_puncturing_rules.emplace_back(23 * 16, P2 ); + d_puncturing_rules.emplace_back(3 * 16, P3 ); break; default: error = true; @@ -260,33 +261,33 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 64: switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P18)); - d_puncturing_rules.push_back(new PuncturingRule(28 * 16, P12)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P18)); + d_puncturing_rules.emplace_back(6 * 16, P24); + d_puncturing_rules.emplace_back(11 * 16, P18); + d_puncturing_rules.emplace_back(28 * 16, P12); + d_puncturing_rules.emplace_back(3 * 16, P18); break; case 2: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P23)); - d_puncturing_rules.push_back(new PuncturingRule(10 * 16, P13)); - d_puncturing_rules.push_back(new PuncturingRule(29 * 16, P8 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P13)); + d_puncturing_rules.emplace_back(6 * 16, P23); + d_puncturing_rules.emplace_back(10 * 16, P13); + d_puncturing_rules.emplace_back(29 * 16, P8 ); + d_puncturing_rules.emplace_back(3 * 16, P13); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(12 * 16, P8 )); - d_puncturing_rules.push_back(new PuncturingRule(27 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P9 )); + d_puncturing_rules.emplace_back(6 * 16, P16); + d_puncturing_rules.emplace_back(12 * 16, P8 ); + d_puncturing_rules.emplace_back(27 * 16, P6 ); + d_puncturing_rules.emplace_back(3 * 16, P9 ); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P11)); - d_puncturing_rules.push_back(new PuncturingRule(9 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(33 * 16, P5 )); + d_puncturing_rules.emplace_back(6 * 16, P11); + d_puncturing_rules.emplace_back(9 * 16, P6 ); + d_puncturing_rules.emplace_back(33 * 16, P5 ); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P5 )); - d_puncturing_rules.push_back(new PuncturingRule(9 * 16, P3 )); - d_puncturing_rules.push_back(new PuncturingRule(31 * 16, P2 )); - d_puncturing_rules.push_back(new PuncturingRule(2 * 16, P3 )); + d_puncturing_rules.emplace_back(6 * 16, P5 ); + d_puncturing_rules.emplace_back(9 * 16, P3 ); + d_puncturing_rules.emplace_back(31 * 16, P2 ); + d_puncturing_rules.emplace_back(2 * 16, P3 ); break; default: error = true; @@ -295,34 +296,34 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 80: switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(10 * 16, P17)); - d_puncturing_rules.push_back(new PuncturingRule(41 * 16, P12)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P18)); + d_puncturing_rules.emplace_back(6 * 16, P24); + d_puncturing_rules.emplace_back(10 * 16, P17); + d_puncturing_rules.emplace_back(41 * 16, P12); + d_puncturing_rules.emplace_back(3 * 16, P18); break; case 2: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P23)); - d_puncturing_rules.push_back(new PuncturingRule(10 * 16, P13)); - d_puncturing_rules.push_back(new PuncturingRule(41 * 16, P8 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P13)); + d_puncturing_rules.emplace_back(6 * 16, P23); + d_puncturing_rules.emplace_back(10 * 16, P13); + d_puncturing_rules.emplace_back(41 * 16, P8 ); + d_puncturing_rules.emplace_back(3 * 16, P13); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P8 )); - d_puncturing_rules.push_back(new PuncturingRule(40 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P7 )); + d_puncturing_rules.emplace_back(6 * 16, P16); + d_puncturing_rules.emplace_back(11 * 16, P8 ); + d_puncturing_rules.emplace_back(40 * 16, P6 ); + d_puncturing_rules.emplace_back(3 * 16, P7 ); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P11)); - d_puncturing_rules.push_back(new PuncturingRule(10 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(41 * 16, P5 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P6 )); + d_puncturing_rules.emplace_back(6 * 16, P11); + d_puncturing_rules.emplace_back(10 * 16, P6 ); + d_puncturing_rules.emplace_back(41 * 16, P5 ); + d_puncturing_rules.emplace_back(3 * 16, P6 ); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(10 * 16, P3 )); - d_puncturing_rules.push_back(new PuncturingRule(41 * 16, P2 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P3 )); + d_puncturing_rules.emplace_back(6 * 16, P6 ); + d_puncturing_rules.emplace_back(10 * 16, P3 ); + d_puncturing_rules.emplace_back(41 * 16, P2 ); + d_puncturing_rules.emplace_back(3 * 16, P3 ); break; default: error = true; @@ -331,34 +332,34 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 96: switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(13 * 16, P18)); - d_puncturing_rules.push_back(new PuncturingRule(50 * 16, P13)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P19)); + d_puncturing_rules.emplace_back(6 * 16, P24); + d_puncturing_rules.emplace_back(13 * 16, P18); + d_puncturing_rules.emplace_back(50 * 16, P13); + d_puncturing_rules.emplace_back(3 * 16, P19); break; case 2: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P22)); - d_puncturing_rules.push_back(new PuncturingRule(10 * 16, P12)); - d_puncturing_rules.push_back(new PuncturingRule(53 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P12)); + d_puncturing_rules.emplace_back(6 * 16, P22); + d_puncturing_rules.emplace_back(10 * 16, P12); + d_puncturing_rules.emplace_back(53 * 16, P9 ); + d_puncturing_rules.emplace_back(3 * 16, P12); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(6 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(12 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(51 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P10)); + d_puncturing_rules.emplace_back(6 * 16, P16); + d_puncturing_rules.emplace_back(12 * 16, P9 ); + d_puncturing_rules.emplace_back(51 * 16, P6 ); + d_puncturing_rules.emplace_back(3 * 16, P10); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(7 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(10 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(52 * 16, P4 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P6 )); + d_puncturing_rules.emplace_back(7 * 16, P9 ); + d_puncturing_rules.emplace_back(10 * 16, P6 ); + d_puncturing_rules.emplace_back(52 * 16, P4 ); + d_puncturing_rules.emplace_back(3 * 16, P6 ); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(7 * 16, P5 )); - d_puncturing_rules.push_back(new PuncturingRule(9 * 16, P4 )); - d_puncturing_rules.push_back(new PuncturingRule(53 * 16, P2 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P4 )); + d_puncturing_rules.emplace_back(7 * 16, P5 ); + d_puncturing_rules.emplace_back(9 * 16, P4 ); + d_puncturing_rules.emplace_back(53 * 16, P2 ); + d_puncturing_rules.emplace_back(3 * 16, P4 ); break; default: error = true; @@ -367,28 +368,28 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 112: switch (protectionLevel()) { case 2: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P23)); - d_puncturing_rules.push_back(new PuncturingRule(21 * 16, P12)); - d_puncturing_rules.push_back(new PuncturingRule(49 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P14)); + d_puncturing_rules.emplace_back(11 * 16, P23); + d_puncturing_rules.emplace_back(21 * 16, P12); + d_puncturing_rules.emplace_back(49 * 16, P9 ); + d_puncturing_rules.emplace_back(3 * 16, P14); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(23 * 16, P8 )); - d_puncturing_rules.push_back(new PuncturingRule(47 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P9 )); + d_puncturing_rules.emplace_back(11 * 16, P16); + d_puncturing_rules.emplace_back(23 * 16, P8 ); + d_puncturing_rules.emplace_back(47 * 16, P6 ); + d_puncturing_rules.emplace_back(3 * 16, P9 ); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(21 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(49 * 16, P4 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P8 )); + d_puncturing_rules.emplace_back(11 * 16, P9 ); + d_puncturing_rules.emplace_back(21 * 16, P6 ); + d_puncturing_rules.emplace_back(49 * 16, P4 ); + d_puncturing_rules.emplace_back(3 * 16, P8 ); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(14 * 16, P5 )); - d_puncturing_rules.push_back(new PuncturingRule(17 * 16, P4 )); - d_puncturing_rules.push_back(new PuncturingRule(50 * 16, P2 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P5 )); + d_puncturing_rules.emplace_back(14 * 16, P5 ); + d_puncturing_rules.emplace_back(17 * 16, P4 ); + d_puncturing_rules.emplace_back(50 * 16, P2 ); + d_puncturing_rules.emplace_back(3 * 16, P5 ); break; default: error = true; @@ -397,34 +398,34 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 128: switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(20 * 16, P17)); - d_puncturing_rules.push_back(new PuncturingRule(62 * 16, P13)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P19)); + d_puncturing_rules.emplace_back(11 * 16, P24); + d_puncturing_rules.emplace_back(20 * 16, P17); + d_puncturing_rules.emplace_back(62 * 16, P13); + d_puncturing_rules.emplace_back(3 * 16, P19); break; case 2: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P22)); - d_puncturing_rules.push_back(new PuncturingRule(21 * 16, P12)); - d_puncturing_rules.push_back(new PuncturingRule(61 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P14)); + d_puncturing_rules.emplace_back(11 * 16, P22); + d_puncturing_rules.emplace_back(21 * 16, P12); + d_puncturing_rules.emplace_back(61 * 16, P9 ); + d_puncturing_rules.emplace_back(3 * 16, P14); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(22 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(60 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P10)); + d_puncturing_rules.emplace_back(11 * 16, P16); + d_puncturing_rules.emplace_back(22 * 16, P9 ); + d_puncturing_rules.emplace_back(60 * 16, P6 ); + d_puncturing_rules.emplace_back(3 * 16, P10); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P11)); - d_puncturing_rules.push_back(new PuncturingRule(21 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(61 * 16, P5 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P7 )); + d_puncturing_rules.emplace_back(11 * 16, P11); + d_puncturing_rules.emplace_back(21 * 16, P6 ); + d_puncturing_rules.emplace_back(61 * 16, P5 ); + d_puncturing_rules.emplace_back(3 * 16, P7 ); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(12 * 16, P5 )); - d_puncturing_rules.push_back(new PuncturingRule(19 * 16, P3 )); - d_puncturing_rules.push_back(new PuncturingRule(62 * 16, P2 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P4 )); + d_puncturing_rules.emplace_back(12 * 16, P5 ); + d_puncturing_rules.emplace_back(19 * 16, P3 ); + d_puncturing_rules.emplace_back(62 * 16, P2 ); + d_puncturing_rules.emplace_back(3 * 16, P4 ); break; default: error = true; @@ -433,34 +434,34 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 160: switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(22 * 16, P18)); - d_puncturing_rules.push_back(new PuncturingRule(84 * 16, P12)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P19)); + d_puncturing_rules.emplace_back(11 * 16, P24); + d_puncturing_rules.emplace_back(22 * 16, P18); + d_puncturing_rules.emplace_back(84 * 16, P12); + d_puncturing_rules.emplace_back(3 * 16, P19); break; case 2: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P22)); - d_puncturing_rules.push_back(new PuncturingRule(21 * 16, P11)); - d_puncturing_rules.push_back(new PuncturingRule(85 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P13)); + d_puncturing_rules.emplace_back(11 * 16, P22); + d_puncturing_rules.emplace_back(21 * 16, P11); + d_puncturing_rules.emplace_back(85 * 16, P9 ); + d_puncturing_rules.emplace_back(3 * 16, P13); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(24 * 16, P8 )); - d_puncturing_rules.push_back(new PuncturingRule(82 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P11)); + d_puncturing_rules.emplace_back(11 * 16, P16); + d_puncturing_rules.emplace_back(24 * 16, P8 ); + d_puncturing_rules.emplace_back(82 * 16, P6 ); + d_puncturing_rules.emplace_back(3 * 16, P11); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P11)); - d_puncturing_rules.push_back(new PuncturingRule(23 * 16, P6 )); - d_puncturing_rules.push_back(new PuncturingRule(83 * 16, P5 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P9 )); + d_puncturing_rules.emplace_back(11 * 16, P11); + d_puncturing_rules.emplace_back(23 * 16, P6 ); + d_puncturing_rules.emplace_back(83 * 16, P5 ); + d_puncturing_rules.emplace_back(3 * 16, P9 ); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P5 )); - d_puncturing_rules.push_back(new PuncturingRule(19 * 16, P4 )); - d_puncturing_rules.push_back(new PuncturingRule(87 * 16, P2 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P4 )); + d_puncturing_rules.emplace_back(11 * 16, P5 ); + d_puncturing_rules.emplace_back(19 * 16, P4 ); + d_puncturing_rules.emplace_back(87 * 16, P2 ); + d_puncturing_rules.emplace_back(3 * 16, P4 ); break; default: error = true; @@ -469,34 +470,34 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 192: switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(21 * 16, P20)); - d_puncturing_rules.push_back(new PuncturingRule(109 * 16, P13)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P24)); + d_puncturing_rules.emplace_back(11 * 16, P24); + d_puncturing_rules.emplace_back(21 * 16, P20); + d_puncturing_rules.emplace_back(109 * 16, P13); + d_puncturing_rules.emplace_back(3 * 16, P24); break; case 2: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P22)); - d_puncturing_rules.push_back(new PuncturingRule(20 * 16, P13)); - d_puncturing_rules.push_back(new PuncturingRule(110 * 16, P9)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P13)); + d_puncturing_rules.emplace_back(11 * 16, P22); + d_puncturing_rules.emplace_back(20 * 16, P13); + d_puncturing_rules.emplace_back(110 * 16, P9); + d_puncturing_rules.emplace_back(3 * 16, P13); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(24 * 16, P10)); - d_puncturing_rules.push_back(new PuncturingRule(106 * 16, P6)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P11)); + d_puncturing_rules.emplace_back(11 * 16, P16); + d_puncturing_rules.emplace_back(24 * 16, P10); + d_puncturing_rules.emplace_back(106 * 16, P6); + d_puncturing_rules.emplace_back(3 * 16, P11); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P10)); - d_puncturing_rules.push_back(new PuncturingRule(22 * 16, P6)); - d_puncturing_rules.push_back(new PuncturingRule(108 * 16, P4)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P9)); + d_puncturing_rules.emplace_back(11 * 16, P10); + d_puncturing_rules.emplace_back(22 * 16, P6); + d_puncturing_rules.emplace_back(108 * 16, P4); + d_puncturing_rules.emplace_back(3 * 16, P9); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P6)); - d_puncturing_rules.push_back(new PuncturingRule(20 * 16, P4)); - d_puncturing_rules.push_back(new PuncturingRule(110 * 16, P2)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P5)); + d_puncturing_rules.emplace_back(11 * 16, P6); + d_puncturing_rules.emplace_back(20 * 16, P4); + d_puncturing_rules.emplace_back(110 * 16, P2); + d_puncturing_rules.emplace_back(3 * 16, P5); break; default: error = true; @@ -505,34 +506,34 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 224: switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(24 * 16, P20)); - d_puncturing_rules.push_back(new PuncturingRule(130 * 16, P12)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P20)); + d_puncturing_rules.emplace_back(11 * 16, P24); + d_puncturing_rules.emplace_back(24 * 16, P20); + d_puncturing_rules.emplace_back(130 * 16, P12); + d_puncturing_rules.emplace_back(3 * 16, P20); break; case 2: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(22 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(132 * 16, P10)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P15)); + d_puncturing_rules.emplace_back(11 * 16, P24); + d_puncturing_rules.emplace_back(22 * 16, P16); + d_puncturing_rules.emplace_back(132 * 16, P10); + d_puncturing_rules.emplace_back(3 * 16, P15); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(20 * 16, P10)); - d_puncturing_rules.push_back(new PuncturingRule(134 * 16, P7)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P9)); + d_puncturing_rules.emplace_back(11 * 16, P16); + d_puncturing_rules.emplace_back(20 * 16, P10); + d_puncturing_rules.emplace_back(134 * 16, P7); + d_puncturing_rules.emplace_back(3 * 16, P9); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(12 * 16, P12)); - d_puncturing_rules.push_back(new PuncturingRule(26 * 16, P8)); - d_puncturing_rules.push_back(new PuncturingRule(127 * 16, P4)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P11)); + d_puncturing_rules.emplace_back(12 * 16, P12); + d_puncturing_rules.emplace_back(26 * 16, P8); + d_puncturing_rules.emplace_back(127 * 16, P4); + d_puncturing_rules.emplace_back(3 * 16, P11); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(12 * 16, P8)); - d_puncturing_rules.push_back(new PuncturingRule(22 * 16, P6)); - d_puncturing_rules.push_back(new PuncturingRule(131 * 16, P2)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P6)); + d_puncturing_rules.emplace_back(12 * 16, P8); + d_puncturing_rules.emplace_back(22 * 16, P6); + d_puncturing_rules.emplace_back(131 * 16, P2); + d_puncturing_rules.emplace_back(3 * 16, P6); break; default: error = true; @@ -541,34 +542,34 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 256: switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(26 * 16, P19)); - d_puncturing_rules.push_back(new PuncturingRule(152 * 16, P14)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P18)); + d_puncturing_rules.emplace_back(11 * 16, P24); + d_puncturing_rules.emplace_back(26 * 16, P19); + d_puncturing_rules.emplace_back(152 * 16, P14); + d_puncturing_rules.emplace_back(3 * 16, P18); break; case 2: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(22 * 16, P14)); - d_puncturing_rules.push_back(new PuncturingRule(156 * 16, P10)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P13)); + d_puncturing_rules.emplace_back(11 * 16, P24); + d_puncturing_rules.emplace_back(22 * 16, P14); + d_puncturing_rules.emplace_back(156 * 16, P10); + d_puncturing_rules.emplace_back(3 * 16, P13); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(27 * 16, P10)); - d_puncturing_rules.push_back(new PuncturingRule(151 * 16, P7)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P10)); + d_puncturing_rules.emplace_back(11 * 16, P16); + d_puncturing_rules.emplace_back(27 * 16, P10); + d_puncturing_rules.emplace_back(151 * 16, P7); + d_puncturing_rules.emplace_back(3 * 16, P10); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P12)); - d_puncturing_rules.push_back(new PuncturingRule(24 * 16, P9)); - d_puncturing_rules.push_back(new PuncturingRule(154 * 16, P5)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P10)); + d_puncturing_rules.emplace_back(11 * 16, P12); + d_puncturing_rules.emplace_back(24 * 16, P9); + d_puncturing_rules.emplace_back(154 * 16, P5); + d_puncturing_rules.emplace_back(3 * 16, P10); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P6)); - d_puncturing_rules.push_back(new PuncturingRule(24 * 16, P5)); - d_puncturing_rules.push_back(new PuncturingRule(154 * 16, P2)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P5)); + d_puncturing_rules.emplace_back(11 * 16, P6); + d_puncturing_rules.emplace_back(24 * 16, P5); + d_puncturing_rules.emplace_back(154 * 16, P2); + d_puncturing_rules.emplace_back(3 * 16, P5); break; default: error = true; @@ -577,22 +578,22 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 320: switch (protectionLevel()) { case 2: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(26 * 16, P17)); - d_puncturing_rules.push_back(new PuncturingRule(200 * 16, P9 )); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P17)); + d_puncturing_rules.emplace_back(11 * 16, P24); + d_puncturing_rules.emplace_back(26 * 16, P17); + d_puncturing_rules.emplace_back(200 * 16, P9 ); + d_puncturing_rules.emplace_back(3 * 16, P17); break; case 4: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P13)); - d_puncturing_rules.push_back(new PuncturingRule(25 * 16, P9)); - d_puncturing_rules.push_back(new PuncturingRule(201 * 16, P5)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P10)); + d_puncturing_rules.emplace_back(11 * 16, P13); + d_puncturing_rules.emplace_back(25 * 16, P9); + d_puncturing_rules.emplace_back(201 * 16, P5); + d_puncturing_rules.emplace_back(3 * 16, P10); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P8)); - d_puncturing_rules.push_back(new PuncturingRule(26 * 16, P5)); - d_puncturing_rules.push_back(new PuncturingRule(200 * 16, P2)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P6)); + d_puncturing_rules.emplace_back(11 * 16, P8); + d_puncturing_rules.emplace_back(26 * 16, P5); + d_puncturing_rules.emplace_back(200 * 16, P2); + d_puncturing_rules.emplace_back(3 * 16, P6); break; default: error = true; @@ -601,22 +602,22 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : case 384: switch (protectionLevel()) { case 1: - d_puncturing_rules.push_back(new PuncturingRule(12 * 16, P24)); - d_puncturing_rules.push_back(new PuncturingRule(28 * 16, P20)); - d_puncturing_rules.push_back(new PuncturingRule(245 * 16, P14)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P23)); + d_puncturing_rules.emplace_back(12 * 16, P24); + d_puncturing_rules.emplace_back(28 * 16, P20); + d_puncturing_rules.emplace_back(245 * 16, P14); + d_puncturing_rules.emplace_back(3 * 16, P23); break; case 3: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P16)); - d_puncturing_rules.push_back(new PuncturingRule(24 * 16, P9)); - d_puncturing_rules.push_back(new PuncturingRule(250 * 16, P7)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P10)); + d_puncturing_rules.emplace_back(11 * 16, P16); + d_puncturing_rules.emplace_back(24 * 16, P9); + d_puncturing_rules.emplace_back(250 * 16, P7); + d_puncturing_rules.emplace_back(3 * 16, P10); break; case 5: - d_puncturing_rules.push_back(new PuncturingRule(11 * 16, P8)); - d_puncturing_rules.push_back(new PuncturingRule(27 * 16, P6)); - d_puncturing_rules.push_back(new PuncturingRule(247 * 16, P2)); - d_puncturing_rules.push_back(new PuncturingRule(3 * 16, P7)); + d_puncturing_rules.emplace_back(11 * 16, P8); + d_puncturing_rules.emplace_back(27 * 16, P6); + d_puncturing_rules.emplace_back(247 * 16, P2); + d_puncturing_rules.emplace_back(3 * 16, P7); break; default: error = true; @@ -634,23 +635,11 @@ SubchannelSource::SubchannelSource(eti_STC &stc) : } } - -SubchannelSource::~SubchannelSource() -{ - PDEBUG("SubchannelSource::~SubchannelSource() @ %p\n", this); - for (unsigned i = 0; i < d_puncturing_rules.size(); ++i) { -// PDEBUG(" Deleting rules @ %p\n", d_puncturing_rules[i]); - delete d_puncturing_rules[i]; - } -} - - size_t SubchannelSource::startAddress() { return d_start_address; } - size_t SubchannelSource::framesize() { return d_framesize; @@ -1018,8 +1007,8 @@ size_t SubchannelSource::bitrate() { return d_framesize / 3; } - - + + size_t SubchannelSource::protection() { return d_protection; @@ -1049,38 +1038,23 @@ size_t SubchannelSource::protectionOption() return 0; } - -int SubchannelSource::process(Buffer* inputData, Buffer* outputData) +void SubchannelSource::loadSubchannelData(const Buffer& data) { - PDEBUG("SubchannelSource::process" - "(inputData: %p, outputData: %p)\n", - inputData, outputData); - - if (inputData != NULL && inputData->getLength()) { - PDEBUG(" Input, storing data\n"); - if (inputData->getLength() != d_framesize) { - PDEBUG("ERROR: Subchannel::process.inputSize != d_framesize\n"); - exit(-1); - } - d_buffer = *inputData; - return inputData->getLength(); - } - PDEBUG(" Output, retriving data\n"); - - return read(outputData); + d_buffer = data; } - -int SubchannelSource::read(Buffer* outputData) +int SubchannelSource::process(Buffer* outputData) { - PDEBUG("SubchannelSource::read(outputData: %p, outputSize: %zu)\n", + PDEBUG("SubchannelSource::process(outputData: %p, outputSize: %zu)\n", outputData, outputData->getLength()); - + if (d_buffer.getLength() != d_framesize) { - PDEBUG("ERROR: Subchannel::read.outputSize != d_framesize\n"); - exit(-1); + throw std::runtime_error( + "ERROR: Subchannel::process: d_buffer != d_framesize: " + + std::to_string(d_buffer.getLength()) + " != " + + std::to_string(d_framesize)); } *outputData = d_buffer; - + return outputData->getLength(); } diff --git a/src/SubchannelSource.h b/src/SubchannelSource.h index e1db026..f2f261b 100644 --- a/src/SubchannelSource.h +++ b/src/SubchannelSource.h @@ -1,6 +1,11 @@ /* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org */ /* This file is part of ODR-DabMod. @@ -19,8 +24,7 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef SUBCHANNEL_SOURCE_H -#define SUBCHANNEL_SOURCE_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> @@ -29,25 +33,15 @@ #include "PuncturingRule.h" #include "Eti.h" -#include "ModInput.h" +#include "ModPlugin.h" #include <vector> class SubchannelSource : public ModInput { -protected: - size_t d_start_address; - size_t d_framesize; - size_t d_protection; - Buffer d_buffer; - std::vector<PuncturingRule*> d_puncturing_rules; - public: SubchannelSource(eti_STC &stc); - SubchannelSource(const SubchannelSource&); - SubchannelSource& operator=(const SubchannelSource&); - virtual ~SubchannelSource(); size_t startAddress(); size_t framesize(); @@ -57,12 +51,18 @@ public: size_t protectionForm(); size_t protectionLevel(); size_t protectionOption(); - const std::vector<PuncturingRule*>& get_rules(); - - int process(Buffer* inputData, Buffer* outputData); + const std::vector<PuncturingRule>& get_rules(); + + void loadSubchannelData(const Buffer& data); + int process(Buffer* outputData); const char* name() { return "SubchannelSource"; } - int read(Buffer* outputData); + +private: + size_t d_start_address; + size_t d_framesize; + size_t d_protection; + Buffer d_buffer; + std::vector<PuncturingRule> d_puncturing_rules; }; -#endif // SUBCHANNEL_SOURCE_H @@ -26,14 +26,13 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef TII_H -#define TII_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModCodec.h" +#include "ModPlugin.h" #include "RemoteControl.h" #include <boost/thread.hpp> @@ -107,5 +106,4 @@ class TII : public ModCodec, public RemoteControllable TII& operator=(const TII&); }; -#endif // TII_H diff --git a/src/TimeInterleaver.h b/src/TimeInterleaver.h index 31ec006..c131d24 100644 --- a/src/TimeInterleaver.h +++ b/src/TimeInterleaver.h @@ -19,15 +19,14 @@ along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef TIME_INTERLEAVER_H -#define TIME_INTERLEAVER_H +#pragma once #ifdef HAVE_CONFIG_H # include <config.h> #endif -#include "ModCodec.h" +#include "ModPlugin.h" #include <vector> #include <deque> @@ -52,4 +51,3 @@ public: }; -#endif // TIME_INTERLEAVER_H |