diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2019-09-05 11:15:58 +0200 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2019-09-05 11:15:58 +0200 |
commit | c0788a90a0d6e047488980a2ad5bb4f9cf108682 (patch) | |
tree | 284b7c184b15e71b8839c1c259d8f888f3c2a5c1 | |
parent | 80da341c45f7b1b75a2227f931585633a048ce4e (diff) | |
download | dabmux-c0788a90a0d6e047488980a2ad5bb4f9cf108682.tar.gz dabmux-c0788a90a0d6e047488980a2ad5bb4f9cf108682.tar.bz2 dabmux-c0788a90a0d6e047488980a2ad5bb4f9cf108682.zip |
Take BufferManagement setting into account
-rw-r--r-- | src/ConfigParser.cpp | 11 | ||||
-rw-r--r-- | src/DabMultiplexer.cpp | 12 | ||||
-rw-r--r-- | src/MuxElements.h | 9 |
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; |