diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 04d18460..6dc92ed7 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -542,6 +542,7 @@ mpegts_mux_t *mpegts_mux_create0 { mpegts_mux_t *mm = mpegts_mux_find(u); if (mm) mm->mm_delete(mm); } void mpegts_mux_initial_scan_done ( mpegts_mux_t *mm ); +void mpegts_mux_initial_scan_fail ( mpegts_mux_t *mm ); void mpegts_mux_delete ( mpegts_mux_t *mm ); diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index ab52083e..c776b86e 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -295,7 +295,7 @@ static int mpegts_mux_start ( mpegts_mux_t *mm, const char *reason, int weight ) { - int pass, fail; + int pass, fail, havefree = 0; char buf[256]; mpegts_mux_instance_t *mmi, *tune; @@ -319,7 +319,11 @@ mpegts_mux_start mm->mm_create_instances(mm); if (!LIST_FIRST(&mm->mm_instances)) { tvhtrace("mpegts", "%s - has no instances", buf); - return SM_CODE_NO_FREE_ADAPTER; + return SM_CODE_TUNING_FAILED; + // Note: we report a permanent inability to tune at this + // time, rather than a lack of free tuners + // this stops the init scan thinking we can't + // proceed } /* Find */ @@ -329,15 +333,17 @@ mpegts_mux_start while (pass < 2) { tune = NULL; if (!mmi) mmi = LIST_FIRST(&mm->mm_instances); - + /* First pass - free only */ if (!pass) { - if (!mmi->mmi_tune_failed && - mmi->mmi_input->mi_is_enabled(mmi->mmi_input) && + if (mmi->mmi_input->mi_is_enabled(mmi->mmi_input) && mmi->mmi_input->mi_is_free(mmi->mmi_input)) { - tune = mmi; - tvhtrace("mpegts", "%s - found free mmi %p", buf, mmi); + havefree = 1; + if (!mmi->mmi_tune_failed) { + tune = mmi; + tvhtrace("mpegts", "%s - found free mmi %p", buf, mmi); + } } /* Second pass - non-free */ @@ -368,7 +374,7 @@ mpegts_mux_start if (!tune) { tvhdebug("mpegts", "%s - no free input (fail=%d)", buf, fail); - return SM_CODE_NO_FREE_ADAPTER; + return havefree ? SM_CODE_TUNING_FAILED : SM_CODE_NO_FREE_ADAPTER; } return 0; @@ -522,6 +528,26 @@ mpegts_mux_initial_scan_done ( mpegts_mux_t *mm ) idnode_updated(&mm->mm_network->mn_id); } +void +mpegts_mux_initial_scan_fail ( mpegts_mux_t *mm ) +{ + char buf[256]; + mpegts_network_t *mn = mm->mm_network; + + /* Stop */ + mm->mm_display_name(mm, buf, sizeof(buf)); + tvhinfo("mpegts", "%s - initial scan failed (remove mux)", buf); + gtimer_disarm(&mm->mm_initial_scan_timeout); + mn->mn_initial_scan_num--; + mm->mm_initial_scan_status = MM_SCAN_DONE; + + /* Save */ + mm->mm_initial_scan_done = 1; + mm->mm_config_save(mm); + idnode_updated(&mm->mm_id); + idnode_updated(&mm->mm_network->mn_id); +} + /* ************************************************************************** * Creation / Config * *************************************************************************/ @@ -640,11 +666,12 @@ int mpegts_mux_subscribe ( mpegts_mux_t *mm, const char *name, int weight ) { + int err = 0; th_subscription_t *s; s = subscription_create_from_mux(mm, weight, name, NULL, SUBSCRIPTION_NONE, - NULL, NULL, NULL); - return s != NULL ? 0 : 1; + NULL, NULL, NULL, &err); + return s ? 0 : err; } void diff --git a/src/input/mpegts/mpegts_network.c b/src/input/mpegts/mpegts_network.c index 78f458c2..9d6a3615 100644 --- a/src/input/mpegts/mpegts_network.c +++ b/src/input/mpegts/mpegts_network.c @@ -236,15 +236,28 @@ mpegts_network_delete static void mpegts_network_initial_scan(void *aux) { + int r; mpegts_network_t *mn = aux; mpegts_mux_t *mm; tvhtrace("mpegts", "setup initial scan for %p", mn); while((mm = TAILQ_FIRST(&mn->mn_initial_scan_pending_queue)) != NULL) { assert(mm->mm_initial_scan_status == MM_SCAN_PENDING); - if (mpegts_mux_subscribe(mm, "initscan", 1)) + r = mpegts_mux_subscribe(mm, "initscan", 1); + + /* Stop scanning here */ + if (r == SM_CODE_NO_FREE_ADAPTER) break; - assert(mm->mm_initial_scan_status == MM_SCAN_CURRENT); + + /* Started */ + if (!r) { + assert(mm->mm_initial_scan_status == MM_SCAN_CURRENT); + continue; + } + + /* Remove */ + TAILQ_REMOVE(&mn->mn_initial_scan_pending_queue, mm, mm_initial_scan_link); + mpegts_mux_initial_scan_fail(mm); } gtimer_arm(&mn->mn_initial_scan_timer, mpegts_network_initial_scan, mn, 10); } diff --git a/src/subscriptions.c b/src/subscriptions.c index 1b34f155..062c9924 100644 --- a/src/subscriptions.c +++ b/src/subscriptions.c @@ -553,11 +553,12 @@ subscription_create_from_mux (mpegts_mux_t *mm, unsigned int weight, const char *name, - streaming_target_t *st, + streaming_target_t *st, int flags, - const char *hostname, - const char *username, - const char *client) + const char *hostname, + const char *username, + const char *client, + int *err) { th_subscription_t *s; streaming_message_t *sm; @@ -566,8 +567,10 @@ subscription_create_from_mux /* Tune */ r = mm->mm_start(mm, name, weight); - if (r) + if (r) { + if (err) *err = r; return NULL; + } /* Create subscription */ s = subscription_create(weight, name, st, flags, NULL, diff --git a/src/subscriptions.h b/src/subscriptions.h index 5287c6f2..74644d27 100644 --- a/src/subscriptions.h +++ b/src/subscriptions.h @@ -128,7 +128,7 @@ th_subscription_t *subscription_create_from_mux int flags, const char *hostname, const char *username, - const char *client); + const char *client, int *err); #endif th_subscription_t *subscription_create(int weight, const char *name, diff --git a/src/webui/webui.c b/src/webui/webui.c index 6d388984..85fd8161 100644 --- a/src/webui/webui.c +++ b/src/webui/webui.c @@ -732,7 +732,7 @@ http_stream_mux(http_connection_t *hc, mpegts_mux_t *mm) tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, 50); s = subscription_create_from_mux(mm, weight, "HTTP", &sq.sq_st, 0, addrbuf, hc->hc_username, - http_arg_get(&hc->hc_args, "User-Agent")); + http_arg_get(&hc->hc_args, "User-Agent"), NULL); if (!s) return HTTP_STATUS_BAD_REQUEST; name = tvh_strdupa(s->ths_title);