Message ID | 42ac663a85e646b5594c57ce1c61ee492c9a0a1f.1371561676.git.gmsoft@tuxicoman.be (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Acked-by: André Roth <neolynx@gmail.com> On Tue, 18 Jun 2013 16:19:08 +0200 Guy Martin <gmsoft@tuxicoman.be> wrote: > This patch copies the parms provided into a temporary buffer. This buffer will then > be used for any modification that needs to be performed. It makes the function > dvb_fe_set_parms() thread-safe. Also, since the DTV_FREQUENCY is not modified, it fixes > a bug where dvbv5-scan retrieves the frequency from the parms and write it to the > channel file. > > Signed-off-by: Guy Martin <gmsoft@tuxicoman.be> > --- > lib/include/dvb-sat.h | 1 - > lib/libdvbv5/dvb-fe.c | 71 ++++++++++++++++++++++---------------------------- > lib/libdvbv5/dvb-sat.c | 11 -------- > 3 files changed, 31 insertions(+), 52 deletions(-) > > diff --git a/lib/include/dvb-sat.h b/lib/include/dvb-sat.h > index 23df228..8b20c9e 100644 > --- a/lib/include/dvb-sat.h > +++ b/lib/include/dvb-sat.h > @@ -49,7 +49,6 @@ int print_lnb(int i); > void print_all_lnb(void); > const struct dvb_sat_lnb *dvb_sat_get_lnb(int i); > int dvb_sat_set_parms(struct dvb_v5_fe_parms *parms); > -int dvb_sat_get_parms(struct dvb_v5_fe_parms *parms); > > #ifdef __cplusplus > } > diff --git a/lib/libdvbv5/dvb-fe.c b/lib/libdvbv5/dvb-fe.c > index b786a85..408423f 100644 > --- a/lib/libdvbv5/dvb-fe.c > +++ b/lib/libdvbv5/dvb-fe.c > @@ -551,7 +551,7 @@ int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms) > delivery_system_name[parms->current_sys]); > dvb_fe_prt_parms(parms); > } > - goto ret; > + return 0; > } > /* DVBv3 call */ > if (ioctl(parms->fd, FE_GET_FRONTEND, &v3_parms) == -1) { > @@ -592,32 +592,27 @@ int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms) > return -EINVAL; > } > > -ret: > - /* For satellite, need to recover from LNBf IF frequency */ > - if (dvb_fe_is_satellite(parms->current_sys)) > - return dvb_sat_get_parms(parms); > - > return 0; > } > > int dvb_fe_set_parms(struct dvb_v5_fe_parms *parms) > { > + /* Use a temporary copy of the parameters so we can safely perform > + * adjustments for satellite */ > + struct dvb_v5_fe_parms tmp_parms = *parms; > + > struct dtv_properties prop; > struct dvb_frontend_parameters v3_parms; > - uint32_t freq; > uint32_t bw; > > - struct dtv_property fe_prop[DTV_MAX_COMMAND]; > - > - if (dvb_fe_is_satellite(parms->current_sys)) { > - dvb_fe_retrieve_parm(parms, DTV_FREQUENCY, &freq); > - dvb_sat_set_parms(parms); > - } > + if (dvb_fe_is_satellite(tmp_parms.current_sys)) > + dvb_sat_set_parms(&tmp_parms); > > - int n = dvb_copy_fe_props(parms->dvb_prop, parms->n_props, fe_prop); > + /* Filter out any user DTV_foo property such as DTV_POLARIZATION */ > + tmp_parms.n_props = dvb_copy_fe_props(tmp_parms.dvb_prop, tmp_parms.n_props, tmp_parms.dvb_prop); > > - prop.props = fe_prop; > - prop.num = n; > + prop.props = tmp_parms.dvb_prop; > + prop.num = tmp_parms.n_props; > prop.props[prop.num].cmd = DTV_TUNE; > prop.num++; > > @@ -628,53 +623,49 @@ int dvb_fe_set_parms(struct dvb_v5_fe_parms *parms) > dvb_fe_prt_parms(parms); > return -1; > } > - goto ret; > + return 0; > } > /* DVBv3 call */ > > - dvb_fe_retrieve_parm(parms, DTV_FREQUENCY, &v3_parms.frequency); > - dvb_fe_retrieve_parm(parms, DTV_INVERSION, &v3_parms.inversion); > - switch (parms->current_sys) { > + dvb_fe_retrieve_parm(&tmp_parms, DTV_FREQUENCY, &v3_parms.frequency); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_INVERSION, &v3_parms.inversion); > + switch (tmp_parms.current_sys) { > case SYS_DVBS: > - dvb_fe_retrieve_parm(parms, DTV_SYMBOL_RATE, &v3_parms.u.qpsk.symbol_rate); > - dvb_fe_retrieve_parm(parms, DTV_INNER_FEC, &v3_parms.u.qpsk.fec_inner); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_SYMBOL_RATE, &v3_parms.u.qpsk.symbol_rate); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_INNER_FEC, &v3_parms.u.qpsk.fec_inner); > break; > case SYS_DVBC_ANNEX_AC: > - dvb_fe_retrieve_parm(parms, DTV_SYMBOL_RATE, &v3_parms.u.qam.symbol_rate); > - dvb_fe_retrieve_parm(parms, DTV_INNER_FEC, &v3_parms.u.qam.fec_inner); > - dvb_fe_retrieve_parm(parms, DTV_MODULATION, &v3_parms.u.qam.modulation); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_SYMBOL_RATE, &v3_parms.u.qam.symbol_rate); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_INNER_FEC, &v3_parms.u.qam.fec_inner); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_MODULATION, &v3_parms.u.qam.modulation); > break; > case SYS_ATSC: > case SYS_ATSCMH: > case SYS_DVBC_ANNEX_B: > - dvb_fe_retrieve_parm(parms, DTV_MODULATION, &v3_parms.u.vsb.modulation); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_MODULATION, &v3_parms.u.vsb.modulation); > break; > case SYS_DVBT: > for (bw = 0; fe_bandwidth_name[bw] != 0; bw++) { > if (fe_bandwidth_name[bw] == v3_parms.u.ofdm.bandwidth) > break; > } > - dvb_fe_retrieve_parm(parms, DTV_BANDWIDTH_HZ, &bw); > - dvb_fe_retrieve_parm(parms, DTV_CODE_RATE_HP, &v3_parms.u.ofdm.code_rate_HP); > - dvb_fe_retrieve_parm(parms, DTV_CODE_RATE_LP, &v3_parms.u.ofdm.code_rate_LP); > - dvb_fe_retrieve_parm(parms, DTV_MODULATION, &v3_parms.u.ofdm.constellation); > - dvb_fe_retrieve_parm(parms, DTV_TRANSMISSION_MODE, &v3_parms.u.ofdm.transmission_mode); > - dvb_fe_retrieve_parm(parms, DTV_GUARD_INTERVAL, &v3_parms.u.ofdm.guard_interval); > - dvb_fe_retrieve_parm(parms, DTV_HIERARCHY, &v3_parms.u.ofdm.hierarchy_information); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_BANDWIDTH_HZ, &bw); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_CODE_RATE_HP, &v3_parms.u.ofdm.code_rate_HP); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_CODE_RATE_LP, &v3_parms.u.ofdm.code_rate_LP); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_MODULATION, &v3_parms.u.ofdm.constellation); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_TRANSMISSION_MODE, &v3_parms.u.ofdm.transmission_mode); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_GUARD_INTERVAL, &v3_parms.u.ofdm.guard_interval); > + dvb_fe_retrieve_parm(&tmp_parms, DTV_HIERARCHY, &v3_parms.u.ofdm.hierarchy_information); > break; > default: > return -EINVAL; > } > - if (ioctl(parms->fd, FE_SET_FRONTEND, &v3_parms) == -1) { > + if (ioctl(tmp_parms.fd, FE_SET_FRONTEND, &v3_parms) == -1) { > dvb_perror("FE_SET_FRONTEND"); > - if (parms->verbose) > - dvb_fe_prt_parms(parms); > + if (tmp_parms.verbose) > + dvb_fe_prt_parms(&tmp_parms); > return -1; > } > -ret: > - /* For satellite, need to recover from LNBf IF frequency */ > - if (dvb_fe_is_satellite(parms->current_sys)) > - dvb_fe_store_parm(parms, DTV_FREQUENCY, freq); > > return 0; > } > diff --git a/lib/libdvbv5/dvb-sat.c b/lib/libdvbv5/dvb-sat.c > index f84b5a4..3cbcf03 100644 > --- a/lib/libdvbv5/dvb-sat.c > +++ b/lib/libdvbv5/dvb-sat.c > @@ -394,17 +394,6 @@ ret: > return rc; > } > > -int dvb_sat_get_parms(struct dvb_v5_fe_parms *parms) > -{ > - uint32_t freq = 0; > - > - dvb_fe_retrieve_parm(parms, DTV_FREQUENCY, &freq); > - freq = abs(freq + parms->freq_offset); > - dvb_fe_store_parm(parms, DTV_FREQUENCY, freq); > - > - return 0; > -} > - > const char *dvbsat_polarization_name[5] = { > "OFF", > "H", -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/lib/include/dvb-sat.h b/lib/include/dvb-sat.h index 23df228..8b20c9e 100644 --- a/lib/include/dvb-sat.h +++ b/lib/include/dvb-sat.h @@ -49,7 +49,6 @@ int print_lnb(int i); void print_all_lnb(void); const struct dvb_sat_lnb *dvb_sat_get_lnb(int i); int dvb_sat_set_parms(struct dvb_v5_fe_parms *parms); -int dvb_sat_get_parms(struct dvb_v5_fe_parms *parms); #ifdef __cplusplus } diff --git a/lib/libdvbv5/dvb-fe.c b/lib/libdvbv5/dvb-fe.c index b786a85..408423f 100644 --- a/lib/libdvbv5/dvb-fe.c +++ b/lib/libdvbv5/dvb-fe.c @@ -551,7 +551,7 @@ int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms) delivery_system_name[parms->current_sys]); dvb_fe_prt_parms(parms); } - goto ret; + return 0; } /* DVBv3 call */ if (ioctl(parms->fd, FE_GET_FRONTEND, &v3_parms) == -1) { @@ -592,32 +592,27 @@ int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms) return -EINVAL; } -ret: - /* For satellite, need to recover from LNBf IF frequency */ - if (dvb_fe_is_satellite(parms->current_sys)) - return dvb_sat_get_parms(parms); - return 0; } int dvb_fe_set_parms(struct dvb_v5_fe_parms *parms) { + /* Use a temporary copy of the parameters so we can safely perform + * adjustments for satellite */ + struct dvb_v5_fe_parms tmp_parms = *parms; + struct dtv_properties prop; struct dvb_frontend_parameters v3_parms; - uint32_t freq; uint32_t bw; - struct dtv_property fe_prop[DTV_MAX_COMMAND]; - - if (dvb_fe_is_satellite(parms->current_sys)) { - dvb_fe_retrieve_parm(parms, DTV_FREQUENCY, &freq); - dvb_sat_set_parms(parms); - } + if (dvb_fe_is_satellite(tmp_parms.current_sys)) + dvb_sat_set_parms(&tmp_parms); - int n = dvb_copy_fe_props(parms->dvb_prop, parms->n_props, fe_prop); + /* Filter out any user DTV_foo property such as DTV_POLARIZATION */ + tmp_parms.n_props = dvb_copy_fe_props(tmp_parms.dvb_prop, tmp_parms.n_props, tmp_parms.dvb_prop); - prop.props = fe_prop; - prop.num = n; + prop.props = tmp_parms.dvb_prop; + prop.num = tmp_parms.n_props; prop.props[prop.num].cmd = DTV_TUNE; prop.num++; @@ -628,53 +623,49 @@ int dvb_fe_set_parms(struct dvb_v5_fe_parms *parms) dvb_fe_prt_parms(parms); return -1; } - goto ret; + return 0; } /* DVBv3 call */ - dvb_fe_retrieve_parm(parms, DTV_FREQUENCY, &v3_parms.frequency); - dvb_fe_retrieve_parm(parms, DTV_INVERSION, &v3_parms.inversion); - switch (parms->current_sys) { + dvb_fe_retrieve_parm(&tmp_parms, DTV_FREQUENCY, &v3_parms.frequency); + dvb_fe_retrieve_parm(&tmp_parms, DTV_INVERSION, &v3_parms.inversion); + switch (tmp_parms.current_sys) { case SYS_DVBS: - dvb_fe_retrieve_parm(parms, DTV_SYMBOL_RATE, &v3_parms.u.qpsk.symbol_rate); - dvb_fe_retrieve_parm(parms, DTV_INNER_FEC, &v3_parms.u.qpsk.fec_inner); + dvb_fe_retrieve_parm(&tmp_parms, DTV_SYMBOL_RATE, &v3_parms.u.qpsk.symbol_rate); + dvb_fe_retrieve_parm(&tmp_parms, DTV_INNER_FEC, &v3_parms.u.qpsk.fec_inner); break; case SYS_DVBC_ANNEX_AC: - dvb_fe_retrieve_parm(parms, DTV_SYMBOL_RATE, &v3_parms.u.qam.symbol_rate); - dvb_fe_retrieve_parm(parms, DTV_INNER_FEC, &v3_parms.u.qam.fec_inner); - dvb_fe_retrieve_parm(parms, DTV_MODULATION, &v3_parms.u.qam.modulation); + dvb_fe_retrieve_parm(&tmp_parms, DTV_SYMBOL_RATE, &v3_parms.u.qam.symbol_rate); + dvb_fe_retrieve_parm(&tmp_parms, DTV_INNER_FEC, &v3_parms.u.qam.fec_inner); + dvb_fe_retrieve_parm(&tmp_parms, DTV_MODULATION, &v3_parms.u.qam.modulation); break; case SYS_ATSC: case SYS_ATSCMH: case SYS_DVBC_ANNEX_B: - dvb_fe_retrieve_parm(parms, DTV_MODULATION, &v3_parms.u.vsb.modulation); + dvb_fe_retrieve_parm(&tmp_parms, DTV_MODULATION, &v3_parms.u.vsb.modulation); break; case SYS_DVBT: for (bw = 0; fe_bandwidth_name[bw] != 0; bw++) { if (fe_bandwidth_name[bw] == v3_parms.u.ofdm.bandwidth) break; } - dvb_fe_retrieve_parm(parms, DTV_BANDWIDTH_HZ, &bw); - dvb_fe_retrieve_parm(parms, DTV_CODE_RATE_HP, &v3_parms.u.ofdm.code_rate_HP); - dvb_fe_retrieve_parm(parms, DTV_CODE_RATE_LP, &v3_parms.u.ofdm.code_rate_LP); - dvb_fe_retrieve_parm(parms, DTV_MODULATION, &v3_parms.u.ofdm.constellation); - dvb_fe_retrieve_parm(parms, DTV_TRANSMISSION_MODE, &v3_parms.u.ofdm.transmission_mode); - dvb_fe_retrieve_parm(parms, DTV_GUARD_INTERVAL, &v3_parms.u.ofdm.guard_interval); - dvb_fe_retrieve_parm(parms, DTV_HIERARCHY, &v3_parms.u.ofdm.hierarchy_information); + dvb_fe_retrieve_parm(&tmp_parms, DTV_BANDWIDTH_HZ, &bw); + dvb_fe_retrieve_parm(&tmp_parms, DTV_CODE_RATE_HP, &v3_parms.u.ofdm.code_rate_HP); + dvb_fe_retrieve_parm(&tmp_parms, DTV_CODE_RATE_LP, &v3_parms.u.ofdm.code_rate_LP); + dvb_fe_retrieve_parm(&tmp_parms, DTV_MODULATION, &v3_parms.u.ofdm.constellation); + dvb_fe_retrieve_parm(&tmp_parms, DTV_TRANSMISSION_MODE, &v3_parms.u.ofdm.transmission_mode); + dvb_fe_retrieve_parm(&tmp_parms, DTV_GUARD_INTERVAL, &v3_parms.u.ofdm.guard_interval); + dvb_fe_retrieve_parm(&tmp_parms, DTV_HIERARCHY, &v3_parms.u.ofdm.hierarchy_information); break; default: return -EINVAL; } - if (ioctl(parms->fd, FE_SET_FRONTEND, &v3_parms) == -1) { + if (ioctl(tmp_parms.fd, FE_SET_FRONTEND, &v3_parms) == -1) { dvb_perror("FE_SET_FRONTEND"); - if (parms->verbose) - dvb_fe_prt_parms(parms); + if (tmp_parms.verbose) + dvb_fe_prt_parms(&tmp_parms); return -1; } -ret: - /* For satellite, need to recover from LNBf IF frequency */ - if (dvb_fe_is_satellite(parms->current_sys)) - dvb_fe_store_parm(parms, DTV_FREQUENCY, freq); return 0; } diff --git a/lib/libdvbv5/dvb-sat.c b/lib/libdvbv5/dvb-sat.c index f84b5a4..3cbcf03 100644 --- a/lib/libdvbv5/dvb-sat.c +++ b/lib/libdvbv5/dvb-sat.c @@ -394,17 +394,6 @@ ret: return rc; } -int dvb_sat_get_parms(struct dvb_v5_fe_parms *parms) -{ - uint32_t freq = 0; - - dvb_fe_retrieve_parm(parms, DTV_FREQUENCY, &freq); - freq = abs(freq + parms->freq_offset); - dvb_fe_store_parm(parms, DTV_FREQUENCY, freq); - - return 0; -} - const char *dvbsat_polarization_name[5] = { "OFF", "H",
This patch copies the parms provided into a temporary buffer. This buffer will then be used for any modification that needs to be performed. It makes the function dvb_fe_set_parms() thread-safe. Also, since the DTV_FREQUENCY is not modified, it fixes a bug where dvbv5-scan retrieves the frequency from the parms and write it to the channel file. Signed-off-by: Guy Martin <gmsoft@tuxicoman.be> --- lib/include/dvb-sat.h | 1 - lib/libdvbv5/dvb-fe.c | 71 ++++++++++++++++++++++---------------------------- lib/libdvbv5/dvb-sat.c | 11 -------- 3 files changed, 31 insertions(+), 52 deletions(-)