aboutsummaryrefslogtreecommitdiffstats
path: root/src/DabMultiplexer.cpp
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2026-01-09 09:39:35 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2026-01-09 09:39:35 +0100
commit5972c0042396e8445b34916fa7edd984cc76e115 (patch)
treec8fe833392419e6c1fc673599260fbc1aba81eb1 /src/DabMultiplexer.cpp
parent9d3d0dc592771a704f2a399318ab876753656e13 (diff)
parentb084bd07570cd031cbba4cc0617418883d82a9c7 (diff)
downloaddabmux-5972c0042396e8445b34916fa7edd984cc76e115.tar.gz
dabmux-5972c0042396e8445b34916fa7edd984cc76e115.tar.bz2
dabmux-5972c0042396e8445b34916fa7edd984cc76e115.zip
Merge 'shunt010/CarouselPriority' into next
Diffstat (limited to 'src/DabMultiplexer.cpp')
-rw-r--r--src/DabMultiplexer.cpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/DabMultiplexer.cpp b/src/DabMultiplexer.cpp
index 9a06cfe..dc19751 100644
--- a/src/DabMultiplexer.cpp
+++ b/src/DabMultiplexer.cpp
@@ -166,6 +166,20 @@ void DabMultiplexer::prepare(bool require_tai_clock)
{
parse_ptree(m_config.pt, ensemble);
+ /* Create the appropriate FIG carousel based on config.
+ * This must happen after parse_ptree() which sets ensemble->fic_scheduler
+ */
+ m_scheduler_type = ensemble->fic_scheduler;
+ auto time_func = [&]() { return m_time.get_milliseconds_seconds(); };
+
+ if (m_scheduler_type == FIC::FIGSchedulerType::Priority) {
+ etiLog.level(info) << "Using priority-based FIG scheduler";
+ m_fig_carousel_priority.reset(new FIC::FIGCarouselPriority(ensemble, time_func));
+ } else {
+ etiLog.level(info) << "Using classic FIG scheduler";
+ m_fig_carousel_classic.reset(new FIC::FIGCarousel(ensemble, time_func));
+ }
+
rcs.enrol(this);
rcs.enrol(ensemble.get());
@@ -512,6 +526,17 @@ void DabMultiplexer::reload_linking()
}
}
+/* Helper method for FIG carousel write_fibs - abstracts the scheduler type */
+size_t DabMultiplexer::fig_carousel_write_fibs(uint8_t* buf, uint64_t current_frame, bool fib3_present)
+{
+ if (m_fig_carousel_priority) {
+ return m_fig_carousel_priority->write_fibs(buf, current_frame, fib3_present);
+ } else if (m_fig_carousel_classic) {
+ return m_fig_carousel_classic->write_fibs(buf, current_frame, fib3_present);
+ }
+ return 0;
+}
+
/* Each call creates one ETI frame */
void DabMultiplexer::mux_frame(std::vector<std::shared_ptr<DabOutput> >& outputs)
{
@@ -730,9 +755,9 @@ void DabMultiplexer::mux_frame(std::vector<std::shared_ptr<DabOutput> >& outputs
edi_tagDETI.fic_data = &etiFrame[index];
edi_tagDETI.fic_length = FICL * 4;
- // Insert all FIBs
+ // Insert all FIBs using the selected scheduler
const bool fib3_present = (ensemble->transmission_mode == TransmissionMode_e::TM_III);
- index += fig_carousel.write_fibs(&etiFrame[index], currentFrame, fib3_present);
+ index += fig_carousel_write_fibs(&etiFrame[index], currentFrame, fib3_present);
/**********************************************************************
****** Input Data Reading *******************************************