summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2019-09-05 11:15:58 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2019-09-05 11:15:58 +0200
commitc0788a90a0d6e047488980a2ad5bb4f9cf108682 (patch)
tree284b7c184b15e71b8839c1c259d8f888f3c2a5c1
parent80da341c45f7b1b75a2227f931585633a048ce4e (diff)
downloaddabmux-c0788a90a0d6e047488980a2ad5bb4f9cf108682.tar.gz
dabmux-c0788a90a0d6e047488980a2ad5bb4f9cf108682.tar.bz2
dabmux-c0788a90a0d6e047488980a2ad5bb4f9cf108682.zip
Take BufferManagement setting into account
-rw-r--r--src/ConfigParser.cpp11
-rw-r--r--src/DabMultiplexer.cpp12
-rw-r--r--src/MuxElements.h9
3 files changed, 30 insertions, 2 deletions
diff --git a/src/ConfigParser.cpp b/src/ConfigParser.cpp
index 3142bb3..b1e785a 100644
--- a/src/ConfigParser.cpp
+++ b/src/ConfigParser.cpp
@@ -1021,6 +1021,17 @@ static void setup_subchannel_from_ptree(shared_ptr<DabSubchannel>& subchan,
}
}
+ const string bufferManagement = pt.get("buffer-management", "prebuffering");
+ if (bufferManagement == "prebuffering") {
+ subchan->bufferManagement = BufferManagement::Prebuffering;
+ }
+ else if (bufferManagement == "timestamped") {
+ subchan->bufferManagement = BufferManagement::Timestamped;
+ }
+ else {
+ throw runtime_error("Subchannel with uid " + subchanuid + " has invalid buffer-management !");
+ }
+
subchan->startAddress = 0;
dabProtection* protection = &subchan->protection;
diff --git a/src/DabMultiplexer.cpp b/src/DabMultiplexer.cpp
index 498e9e0..6b887bd 100644
--- a/src/DabMultiplexer.cpp
+++ b/src/DabMultiplexer.cpp
@@ -581,8 +581,16 @@ void DabMultiplexer::mux_frame(std::vector<std::shared_ptr<DabOutput> >& outputs
edi::TagESTn& tag = edi_subchannelToTag[subchannel.get()];
int sizeSubchannel = subchannel->getSizeByte();
- int result = subchannel->input->readFrame(
- &etiFrame[index], sizeSubchannel);
+ int result = -1;
+ switch (subchannel->bufferManagement) {
+ case BufferManagement::Prebuffering:
+ result = subchannel->input->readFrame(&etiFrame[index], sizeSubchannel);
+ break;
+ case BufferManagement::Timestamped:
+ // no need to check enableTist because we always increment the timestamp
+ result = subchannel->input->readFrame(&etiFrame[index], sizeSubchannel, edi_time + m_tist_offset, timestamp);
+ break;
+ }
if (result < 0) {
etiLog.log(info,
diff --git a/src/MuxElements.h b/src/MuxElements.h
index ec79fdd..f691093 100644
--- a/src/MuxElements.h
+++ b/src/MuxElements.h
@@ -338,6 +338,14 @@ struct dabProtection {
};
};
+enum class BufferManagement {
+ // Use a buffer in the input that doesn't consider timestamps
+ Prebuffering,
+
+ // Buffer incoming data until a given timestamp is reached
+ Timestamped,
+};
+
class DabSubchannel
{
public:
@@ -359,6 +367,7 @@ public:
std::string uid;
std::string inputUri;
+ BufferManagement bufferManagement = BufferManagement::Prebuffering;
std::shared_ptr<Inputs::InputBase> input;
unsigned char id = 0;
subchannel_type_t type = subchannel_type_t::DABAudio;