]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts: sort out tuning of muxes from multiple points
authorAdam Sutton <dev@adamsutton.me.uk>
Sat, 8 Jun 2013 11:24:35 +0000 (12:24 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Sat, 8 Jun 2013 11:24:35 +0000 (12:24 +0100)
There is now a common routine for starting a mux instance, it is assumed
that certain checks have already been performed before calling this
routine. However it does perform a double check that this mux is not
already tuned on another instance. If it is it updates the passed ptr
with that instance.

src/input/mpegts.h
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_service.c

index a30501cf36268f18752f0800e4a7162d34a99140..40d74f476e236287ec04935a057b818562f1b9ef 100644 (file)
@@ -458,6 +458,7 @@ mpegts_mux_instance_t *mpegts_mux_instance_create0
   (struct type*)mpegts_mux_instance_create0(calloc(1, sizeof(struct type)),\
                                             &type##_class, uuid,\
                                             mi, mm);
+int mpegts_mux_instance_start ( mpegts_mux_instance_t **mmiptr );
 
 int mpegts_mux_set_tsid ( mpegts_mux_t *mm, uint16_t tsid );
 int mpegts_mux_set_onid ( mpegts_mux_t *mm, uint16_t onid );
index 829e0b92f086621f7751a67b274de0f7771b0787..e8f9d5c92e9d9e784f8690ec1c5dfa2ae4ef80db 100644 (file)
@@ -55,6 +55,50 @@ mpegts_mux_instance_create0
   return mmi;
 }
 
+int
+mpegts_mux_instance_start ( mpegts_mux_instance_t **mmiptr )
+{
+  int r;
+  char buf[256], buf2[256];;
+  mpegts_mux_instance_t *mmi = *mmiptr;
+  mpegts_mux_t           *mm = mmi->mmi_mux;
+  mpegts_network_t       *mn = mm->mm_network;
+  mm->mm_display_name(mm, buf, sizeof(buf));
+
+  /* Already active */
+  if (mm->mm_active) {
+    *mmiptr = mm->mm_active;
+    tvhdebug("mpegts", "%s - already active", buf);
+    return 0;
+  }
+
+  /* Start */
+  mmi->mmi_input->mi_display_name(mmi->mmi_input, buf2, sizeof(buf2));
+  tvhinfo("mpegts", "%s - tuning on %s", buf, buf2);
+  r = mmi->mmi_input->mi_start_mux(mmi->mmi_input, mmi);
+  if (!r) return r;
+
+  /* Start */
+  tvhdebug("mpegts", "%s - started", buf);
+  LIST_INSERT_HEAD(&mmi->mmi_input->mi_mux_active, mmi,
+                    mmi_active_link);
+  mm->mm_active = mmi;
+
+  /* Initial scanning */
+  if (mm->mm_initial_scan_status == MM_SCAN_PENDING) {
+    tvhtrace("mpegts", "%s - adding to current scan Q", buf);
+    TAILQ_REMOVE(&mn->mn_initial_scan_pending_queue, mm,
+                 mm_initial_scan_link);
+    mm->mm_initial_scan_status = MM_SCAN_CURRENT;
+    TAILQ_INSERT_TAIL(&mn->mn_initial_scan_current_queue, mm,
+                      mm_initial_scan_link);
+    gtimer_arm(&mm->mm_initial_scan_timeout,
+               mpegts_mux_initial_scan_timeout, mm, 30);
+  }
+
+  return 0;
+}
+
 /* ****************************************************************************
  * Class definition
  * ***************************************************************************/
@@ -117,8 +161,7 @@ static int
 mpegts_mux_start ( mpegts_mux_t *mm, const char *reason, int weight )
 {
   int pass, fail;
-  char buf[256], buf2[256];
-  mpegts_network_t      *mn = mm->mm_network;
+  char buf[256];
   mpegts_mux_instance_t *mmi, *tune;
 
   mm->mm_display_name(mm, buf, sizeof(buf));
@@ -175,18 +218,9 @@ mpegts_mux_start ( mpegts_mux_t *mm, const char *reason, int weight )
     
     /* Tune */
     if (tune) {
-      tune->mmi_input->mi_display_name(tune->mmi_input, buf2, sizeof(buf2));
-      tvhinfo("mpegts", "%s - tuning on %s", buf, buf2);
-      if (!tune->mmi_input->mi_start_mux(tune->mmi_input, mmi)) {
-        tvhdebug("mpegts", "%s - started", buf);
-        LIST_INSERT_HEAD(&tune->mmi_input->mi_mux_active, tune,
-                         mmi_active_link);
-        mm->mm_active = tune;
-        break;
-      }
-      tvhwarn("mpegts", "%s - failed to start, try another", buf);
+      if (!(fail = mpegts_mux_instance_start(&tune))) break;
       tune = NULL;
-      fail = 1;
+      tvhwarn("mpegts", "%s - failed to start, try another", buf);
     }
 
     /* Next */
@@ -199,15 +233,6 @@ mpegts_mux_start ( mpegts_mux_t *mm, const char *reason, int weight )
     return SM_CODE_NO_FREE_ADAPTER;
   }
 
-  /* Initial scanning */
-  if (mm->mm_initial_scan_status == MM_SCAN_PENDING) {
-    tvhtrace("mpegts", "%s - adding to current scan Q", buf);
-    TAILQ_REMOVE(&mn->mn_initial_scan_pending_queue, mm, mm_initial_scan_link);
-    mm->mm_initial_scan_status = MM_SCAN_CURRENT;
-    TAILQ_INSERT_TAIL(&mn->mn_initial_scan_current_queue, mm, mm_initial_scan_link);
-    gtimer_arm(&mm->mm_initial_scan_timeout, mpegts_mux_initial_scan_timeout, mm, 30);
-  }
-
   return 0;
 }
 
index c7f63de66a0b0aa3a8ea3cbd64c3c6455f3253dc..abad123032804eda6c6d46d789aad772b79be35d 100644 (file)
@@ -105,7 +105,7 @@ mpegts_service_start(service_t *t, int instance)
   int r;
   mpegts_service_t      *s = (mpegts_service_t*)t;
   mpegts_mux_t          *m = s->s_dvb_mux;
-  mpegts_mux_instance_t *mi;
+  mpegts_mux_instance_t *mmi;
 
   /* Validate */
   assert(s->s_status      == SERVICE_IDLE);
@@ -113,27 +113,27 @@ mpegts_service_start(service_t *t, int instance)
   lock_assert(&global_lock);
 
   /* Find */
-  LIST_FOREACH(mi, &m->mm_instances, mmi_mux_link)
-    if (mi->mmi_input->mi_instance == instance)
+  LIST_FOREACH(mmi, &m->mm_instances, mmi_mux_link)
+    if (mmi->mmi_input->mi_instance == instance)
       break;
-  assert(mi != NULL);
-  if (mi == NULL)
+  assert(mmi != NULL);
+  if (mmi == NULL)
     return SM_CODE_UNDEFINED_ERROR;
 
   /* Start Mux */
-  r = mi->mmi_input->mi_start_mux(mi->mmi_input, mi);
+  r = mpegts_mux_instance_start(&mmi);
 
   /* Start */
   if (!r) {
 
     /* Add to active set */
-    pthread_mutex_lock(&mi->mmi_input->mi_delivery_mutex);
-    LIST_INSERT_HEAD(&mi->mmi_input->mi_transports, t, s_active_link);
-    s->s_dvb_active_input = mi->mmi_input;
-    pthread_mutex_unlock(&mi->mmi_input->mi_delivery_mutex);
+    pthread_mutex_lock(&mmi->mmi_input->mi_delivery_mutex);
+    LIST_INSERT_HEAD(&mmi->mmi_input->mi_transports, t, s_active_link);
+    s->s_dvb_active_input = mmi->mmi_input;
+    pthread_mutex_unlock(&mmi->mmi_input->mi_delivery_mutex);
 
     /* Open service */
-    mi->mmi_input->mi_open_service(mi->mmi_input, s);
+    mmi->mmi_input->mi_open_service(mmi->mmi_input, s);
   }
 
   return r;