]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
read FE status directly after tune
authorAndreas Öman <andreas@lonelycoder.com>
Tue, 20 Nov 2007 15:17:22 +0000 (15:17 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Tue, 20 Nov 2007 15:17:22 +0000 (15:17 +0000)
dvb.c
tvhead.h

diff --git a/dvb.c b/dvb.c
index fb2f0499a7a1dd2cb366e49f893f24353acf1188..c740d095589cb5aff021e24ffe4b20b0218fa122 100644 (file)
--- a/dvb.c
+++ b/dvb.c
@@ -65,46 +65,53 @@ static void dvb_mux_scanner(void *aux, int64_t now);
 
 static void dvb_fec_monitor(void *aux, int64_t now);
 
+static void
+tda_parse_status(th_dvb_adapter_t *tda, fe_status_t fe_status)
+{
+  th_dvb_mux_instance_t *tdmi;
+  int v;
+
+  tdmi = tda->tda_mux_current;
+  if(tdmi != NULL) {
+
+    if(fe_status & FE_HAS_LOCK) {
+      tdmi->tdmi_status = NULL;
+    } else if(fe_status & FE_HAS_SYNC)
+      tdmi->tdmi_status = "No lock, but sync ok";
+    else if(fe_status & FE_HAS_VITERBI)
+      tdmi->tdmi_status = "No lock, but FEC stable";
+    else if(fe_status & FE_HAS_CARRIER)
+      tdmi->tdmi_status = "No lock, but carrier present";
+    else if(fe_status & FE_HAS_SIGNAL)
+      tdmi->tdmi_status = "No lock, but faint signal present";
+    else
+      tdmi->tdmi_status = "No signal";
+
+    /* Reset FEC Error counter */
+
+    ioctl(tda->tda_fe_fd, FE_READ_UNCORRECTED_BLOCKS, &v);
+  }
+}
+
+
+
 static void
 dvb_frontend_event(int events, void *opaque, int fd)
 {
   th_dvb_adapter_t *tda = opaque;
   struct dvb_frontend_event ev;
-  th_dvb_mux_instance_t *tdmi;
-  int r, v;
+  int r;
 
   if(!(events & DISPATCH_PRI))
     return;
 
-  r = ioctl(fd, FE_GET_EVENT, &ev);
-  if(r == 0) {
-
-    pthread_mutex_lock(&tda->tda_mux_lock);
+  pthread_mutex_lock(&tda->tda_mux_lock);
 
-    tdmi = tda->tda_mux_current;
-    if(tdmi != NULL) {
-      tdmi->tdmi_fe_status = ev.status;
-    
-      if(tdmi->tdmi_fe_status & FE_HAS_LOCK) {
-       tdmi->tdmi_status = NULL;
-      } else if(tdmi->tdmi_fe_status & FE_HAS_SYNC)
-       tdmi->tdmi_status = "No lock, but sync ok";
-      else if(tdmi->tdmi_fe_status & FE_HAS_VITERBI)
-       tdmi->tdmi_status = "No lock, but FEC stable";
-      else if(tdmi->tdmi_fe_status & FE_HAS_CARRIER)
-       tdmi->tdmi_status = "No lock, but carrier present";
-      else if(tdmi->tdmi_fe_status & FE_HAS_SIGNAL)
-       tdmi->tdmi_status = "No lock, but faint signal present";
-      else
-       tdmi->tdmi_status = "No signal";
-
-      /* Reset FEC Error counter */
-
-      ioctl(tda->tda_fe_fd, FE_READ_UNCORRECTED_BLOCKS, &v);
-    }
+  r = ioctl(fd, FE_GET_EVENT, &ev);
+  if(r == 0)
+    tda_parse_status(tda, ev.status);
 
-    pthread_mutex_unlock(&tda->tda_mux_lock);
-  }
+  pthread_mutex_unlock(&tda->tda_mux_lock);
 }
 
 
@@ -277,7 +284,8 @@ dvb_tune_tdmi(th_dvb_mux_instance_t *tdmi, int maylog, tdmi_state_t state)
 {
   th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
   th_dvb_mux_t *tdm  = tdmi->tdmi_mux;
-  int i, v;
+  fe_status_t fe_status;
+  int i;
   
   if(tda->tda_mux_current == tdmi)
     return 0;
@@ -310,8 +318,10 @@ dvb_tune_tdmi(th_dvb_mux_instance_t *tdmi, int maylog, tdmi_state_t state)
 
   time(&tdmi->tdmi_got_adapter);
 
-  /* Reset FEC counter */
-  ioctl(tda->tda_fe_fd, FE_READ_UNCORRECTED_BLOCKS, &v);
+  if(ioctl(tda->tda_fe_fd, FE_READ_STATUS, &fe_status) < 0)
+    fe_status = 0;
+
+  tda_parse_status(tda, fe_status);
 
   pthread_mutex_unlock(&tda->tda_mux_lock);
   return 0;
@@ -863,10 +873,10 @@ tdmi_initial_scan_timeout(void *aux, int64_t now)
 
   dtimer_disarm(&tdmi->tdmi_initial_scan_timer);
 
-  err = "Unknown error";
-
   if(tdmi->tdmi_status != NULL)
     err = tdmi->tdmi_status;
+  else
+    err = "No signal";
 
   syslog(LOG_DEBUG, "\"%s\" on \"%s\" Initial scan timed out -- %s",
         tdmi->tdmi_mux->tdm_name, tda->tda_name, err);
index 8eccdc1ee495a31e52fd7e6d974b01bd89caeb9c..e62c3ae545809793835795120d4f7a77f041472b 100644 (file)
--- a/tvhead.h
+++ b/tvhead.h
@@ -139,7 +139,6 @@ typedef struct th_dvb_mux_instance {
   struct th_dvb_mux *tdmi_mux;
   struct th_dvb_adapter *tdmi_adapter;
 
-  fe_status_t tdmi_fe_status;
   uint16_t tdmi_snr, tdmi_signal;
   uint32_t tdmi_ber, tdmi_uncorrected_blocks;