struct th_dvb_adapter *tdmi_adapter;
- uint16_t tdmi_snr, tdmi_signal;
+ uint16_t tdmi_signal;
uint32_t tdmi_ber, tdmi_unc;
float tdmi_unc_avg;
+ float tdmi_snr;
#define TDMI_FEC_ERR_HISTOGRAM_SIZE 10
uint32_t tdmi_fec_err_histogram[TDMI_FEC_ERR_HISTOGRAM_SIZE];
char *tda_fe_path;
int tda_fe_fd;
int tda_type;
+ int tda_snr_valid;
struct dvb_frontend_info *tda_fe_info;
int tda_adapter_num;
dvb_adapter_checkspeed(tda);
+
+ if(!strcmp(tda->tda_fe_info->name, "Sony CXD2820R (DVB-T/T2)"))
+ tda->tda_snr_valid = 1;
+
tvhlog(LOG_INFO, "dvb",
- "Found adapter %s (%s) via %s", path, tda->tda_fe_info->name,
- hostconnection2str(tda->tda_hostconnection));
+ "Found adapter %s (%s) via %s%s", path, tda->tda_fe_info->name,
+ hostconnection2str(tda->tda_hostconnection),
+ tda->tda_snr_valid ? ", Reports valid SNR values" : "");
TAILQ_INSERT_TAIL(&dvb_adapters, tda, tda_global_link);
}
/* signal/noise ratio */
- if(ioctl(tda->tda_fe_fd, FE_READ_SNR, &v) == -1 && v != tdmi->tdmi_snr) {
- tdmi->tdmi_snr = v;
- notify = 1;
+ if(tda->tda_snr_valid) {
+ if(ioctl(tda->tda_fe_fd, FE_READ_SNR, &v) != -1) {
+ float snr = v / 10.0;
+ if(tdmi->tdmi_snr != snr) {
+ tdmi->tdmi_snr = snr;
+ notify = 1;
+ }
+ }
}
}
htsmsg_add_str(m, "id", tdmi->tdmi_identifier);
htsmsg_add_u32(m, "quality", tdmi->tdmi_quality);
htsmsg_add_u32(m, "signal", tdmi->tdmi_signal);
- htsmsg_add_u32(m, "snr", tdmi->tdmi_snr);
+
+ if(tda->tda_snr_valid)
+ htsmsg_add_dbl(m, "snr", tdmi->tdmi_snr);
htsmsg_add_u32(m, "ber", tdmi->tdmi_ber);
htsmsg_add_u32(m, "unc", tdmi->tdmi_unc);
notify_by_msg("dvbMux", m);
m = htsmsg_create_map();
htsmsg_add_str(m, "identifier", tda->tda_identifier);
htsmsg_add_u32(m, "signal", MIN(tdmi->tdmi_signal * 100 / 65535, 100));
- htsmsg_add_u32(m, "snr", tdmi->tdmi_snr);
+ if(tda->tda_snr_valid)
+ htsmsg_add_dbl(m, "snr", tdmi->tdmi_snr);
htsmsg_add_u32(m, "ber", tdmi->tdmi_ber);
htsmsg_add_u32(m, "unc", tdmi->tdmi_unc);
htsmsg_add_dbl(m, "uncavg", tdmi->tdmi_unc_avg);