diff --git a/src/input/mpegts/dvb.h b/src/input/mpegts/dvb.h index 2f6a7337..fc52004f 100644 --- a/src/input/mpegts/dvb.h +++ b/src/input/mpegts/dvb.h @@ -492,6 +492,10 @@ int dvb_delsys2type ( enum dvb_fe_delivery_system ds ); int dvb_mux_conf_str ( dvb_mux_conf_t *conf, char *buf, size_t bufsize ); +int dvb_sat_position( const dvb_mux_conf_t *mc ); + +const char *dvb_sat_position_to_str( int position, char *buf, size_t buflen ); + #endif /* ENABLE_MPEGTS_DVB */ void dvb_done ( void ); diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index caa3b161..5431c3c1 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -811,10 +811,9 @@ dvb_nit_callback if (idnode_is_instance(&mm->mm_id, &dvb_mux_dvbs_class)) { dvb_mux_conf_t *mc = &((dvb_mux_t *)mm)->lm_tuning; if (mc->u.dmc_fe_qpsk.orbital_dir) { - int pos = mc->u.dmc_fe_qpsk.orbital_pos; - if (mc->u.dmc_fe_qpsk.orbital_dir == 'W') - pos = -pos; - snprintf(dauth, sizeof(dauth), "dvb-bouquet://dvbs,%d/%s", pos, name); + char buf[16]; + dvb_sat_position_to_str(dvb_sat_position(mc), buf, sizeof(buf)); + snprintf(dauth, sizeof(dauth), "dvb-bouquet://dvbs,%s/%s", buf, name); } } else if (idnode_is_instance(&mux->mm_id, &dvb_mux_dvbt_class)) { snprintf(dauth, sizeof(dauth), "dvb-bouquet://dvbt/%s", name); @@ -1801,12 +1800,9 @@ psi_tables_dvb ( mpegts_mux_t *mm ) #if ENABLE_MPEGTS_DVB if (idnode_is_instance(&mm->mm_id, &dvb_mux_dvbs_class)) { dvb_mux_conf_t *mc = &((dvb_mux_t *)mm)->lm_tuning; - if (mc->dmc_fe_type == DVB_TYPE_S) { - int pos = mc->u.dmc_fe_qpsk.orbital_pos; - if (mc->u.dmc_fe_qpsk.orbital_dir == 'W') - pos = -pos; - dvb_fastscan_each(mm, pos, mc->dmc_fe_freq, psi_tables_dvb_fastscan); - } + if (mc->dmc_fe_type == DVB_TYPE_S) + dvb_fastscan_each(mm, dvb_sat_position(mc), + mc->dmc_fe_freq, psi_tables_dvb_fastscan); } #endif } diff --git a/src/input/mpegts/dvb_support.c b/src/input/mpegts/dvb_support.c index 7af24e5b..89ca76bd 100644 --- a/src/input/mpegts/dvb_support.c +++ b/src/input/mpegts/dvb_support.c @@ -842,6 +842,32 @@ dvb_mux_conf_str ( dvb_mux_conf_t *dmc, char *buf, size_t bufsize ) } } +int +dvb_sat_position(const dvb_mux_conf_t *mc) +{ + int pos = mc->u.dmc_fe_qpsk.orbital_pos; + assert(mc->dmc_fe_type == DVB_TYPE_S); + if (!mc->u.dmc_fe_qpsk.orbital_dir) + return INT_MAX; + if (mc->u.dmc_fe_qpsk.orbital_dir == 'W') + return -pos; + return pos; +} + +const char * +dvb_sat_position_to_str(int position, char *buf, size_t buflen) +{ + const int dec = position % 10; + + if (!buf || !buflen) + return ""; + snprintf(buf, buflen, "%d", position / 10); + if (dec) + snprintf(buf + strlen(buf), buflen - strlen(buf), ".%d", dec); + snprintf(buf + strlen(buf), buflen - strlen(buf), "%c", dec < 0 ? 'W' : 'E'); + return buf; +} + #endif /* ENABLE_MPEGTS_DVB */ /**