From c516ceade9bff68aeadab12e4b499dd095a4ab3a Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 16 Apr 2014 10:28:18 +0200 Subject: [PATCH] Improve the mux create routine to handle the unset and auto values --- src/input/mpegts/mpegts_network_dvb.c | 58 +++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/src/input/mpegts/mpegts_network_dvb.c b/src/input/mpegts/mpegts_network_dvb.c index 68ad79da..8d5c0091 100644 --- a/src/input/mpegts/mpegts_network_dvb.c +++ b/src/input/mpegts/mpegts_network_dvb.c @@ -253,11 +253,61 @@ dvb_network_create_mux dmc->dmc_fe_type = lm->lm_tuning.dmc_fe_type; // Note: keep original freq, else it can bounce around if diff transponders // report it slightly differently. - // TODO: Note: should we also leave AUTO settings as is? - if (memcmp(&lm->lm_tuning, dmc, sizeof(lm->lm_tuning))) { - memcpy(&lm->lm_tuning, dmc, sizeof(lm->lm_tuning)); - save = 1; +#if ENABLE_TRACE + #define COMPARE(x) ({ \ + int xr = dmc->x != lm->lm_tuning.x; \ + if (xr) { \ + lm->lm_tuning.x = dmc->x; \ + tvhtrace("mpegts", "create mux dmc->" #x " (%li) != lm->lm_tuning." #x \ + " (%li)", (long)dmc->x, (long)lm->lm_tuning.x); \ + } xr; }) + #define COMPAREN(x) ({ \ + int xr = dmc->x != 0 && dmc->x != 1 && dmc->x != lm->lm_tuning.x; \ + if (xr) { \ + lm->lm_tuning.x = dmc->x; \ + tvhtrace("mpegts", "create mux dmc->" #x " (%li) != lm->lm_tuning." #x \ + " (%li)", (long)dmc->x, (long)lm->lm_tuning.x); \ + } xr; }) +#else + #define COMPARE(x) ({ \ + int xr = dmc->x != lm->lm_tuning.x; \ + if (xr) lm->lm_tuning.x = dmc->x; \ + xr; }) + /* note - zero means NONE, one means AUTO */ + #define COMPAREN(x) ({ \ + int xr = dmc->x != 0 && dmc->x != 1 && dmc->x != lm->lm_tuning.x; \ + if (xr) lm->lm_tuning.x = dmc->x; \ + xr; }) +#endif + save |= COMPAREN(dmc_fe_modulation); + save |= COMPAREN(dmc_fe_inversion); + save |= COMPAREN(dmc_fe_rolloff); + save |= COMPAREN(dmc_fe_pilot); + switch (dmc->dmc_fe_type) { + case DVB_TYPE_T: + save |= COMPAREN(u.dmc_fe_ofdm.bandwidth); + save |= COMPAREN(u.dmc_fe_ofdm.code_rate_HP); + save |= COMPAREN(u.dmc_fe_ofdm.code_rate_LP); + save |= COMPAREN(u.dmc_fe_ofdm.transmission_mode); + save |= COMPAREN(u.dmc_fe_ofdm.guard_interval); + save |= COMPAREN(u.dmc_fe_ofdm.hierarchy_information); + break; + case DVB_TYPE_S: + save |= COMPARE(u.dmc_fe_qpsk.polarisation); + save |= COMPARE(u.dmc_fe_qpsk.orbital_pos); + save |= COMPARE(u.dmc_fe_qpsk.orbital_dir); + save |= COMPARE(u.dmc_fe_qpsk.symbol_rate); + save |= COMPAREN(u.dmc_fe_qpsk.fec_inner); + break; + case DVB_TYPE_C: + save |= COMPARE(u.dmc_fe_qam.symbol_rate); + save |= COMPAREN(u.dmc_fe_qam.fec_inner); + break; + default: + abort(); } + #undef COMPARE + #undef COMPAREN } if (save) mm->mm_config_save(mm);