mpegts: stop network scanning from failing due to bad mux

This commit is contained in:
Adam Sutton 2013-09-10 23:27:12 +01:00
parent 1253a97177
commit 8e00dc64d9
6 changed files with 63 additions and 19 deletions

View file

@ -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 );

View file

@ -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

View file

@ -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);
}

View file

@ -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,

View file

@ -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,

View file

@ -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);