From 3ba0ae6e62808e6227706240fce88661b33a2152 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sun, 23 Nov 2014 17:01:31 +0100 Subject: [PATCH] service: try to fix the service_restart START/STOP msg mismatch --- src/input/mpegts/dvb_psi.c | 7 +++---- src/service.c | 23 +++++++++++++---------- src/service.h | 2 +- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 6020d09f..337be732 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -1124,7 +1124,7 @@ int dvb_pmt_callback (mpegts_table_t *mt, const uint8_t *ptr, int len, int tableid) { - int r, sect, last, ver, had_components; + int r, sect, last, ver; uint16_t sid; mpegts_mux_t *mm = mt->mt_mux; mpegts_service_t *s; @@ -1143,11 +1143,10 @@ dvb_pmt_callback /* Process */ tvhdebug("pmt", "sid %04X (%d)", sid, sid); pthread_mutex_lock(&s->s_stream_mutex); - had_components = !!TAILQ_FIRST(&s->s_components); r = psi_parse_pmt(mt->mt_mux, s, ptr, len); pthread_mutex_unlock(&s->s_stream_mutex); if (r) - service_restart((service_t*)s, had_components); + service_restart((service_t*)s); /* Finish */ return dvb_table_end(mt, st, sect); @@ -2373,7 +2372,7 @@ psi_parse_pmt update&PMT_UPDATE_CAID_DELETED ? ", CAID deleted":"", update&PMT_REORDERED ? ", PIDs reordered":""); - service_request_save((service_t*)t, 0); + service_request_save((service_t*)t, 1); // Only restart if something that our clients worry about did change if(update & ~(PMT_UPDATE_NEW_CA_STREAM | diff --git a/src/service.c b/src/service.c index cf1805e1..db1438c5 100644 --- a/src/service.c +++ b/src/service.c @@ -1153,19 +1153,22 @@ service_set_streaming_status_flags_(service_t *t, int set) * (i.e. an AC3 stream disappears, etc) */ void -service_restart(service_t *t, int had_components) +service_restart(service_t *t) { + int had_components; + pthread_mutex_lock(&t->s_stream_mutex); - if(had_components) { - streaming_pad_deliver(&t->s_streaming_pad, - streaming_msg_create_code(SMT_STOP, - SM_CODE_SOURCE_RECONFIGURED)); - } + had_components = TAILQ_FIRST(&t->s_filt_components) != NULL; service_build_filter(t); if(TAILQ_FIRST(&t->s_filt_components) != NULL) { + if (had_components) + streaming_pad_deliver(&t->s_streaming_pad, + streaming_msg_create_code(SMT_STOP, + SM_CODE_SOURCE_RECONFIGURED)); + streaming_pad_deliver(&t->s_streaming_pad, streaming_msg_create_data(SMT_START, service_build_stream_start(t))); @@ -1255,7 +1258,7 @@ service_request_save(service_t *t, int restart) TAILQ_INSERT_TAIL(&pending_save_queue, t, s_ps_link); service_ref(t); pthread_cond_signal(&pending_save_cond); - } else if(restart) { + } else if (restart) { t->s_ps_onqueue = 2; // upgrade to restart too } @@ -1291,6 +1294,7 @@ service_saver(void *aux) { service_t *t; int restart; + pthread_mutex_lock(&pending_save_mutex); while(tvheadend_running) { @@ -1310,9 +1314,8 @@ service_saver(void *aux) if(t->s_status != SERVICE_ZOMBIE) t->s_config_save(t); - if(t->s_status == SERVICE_RUNNING && restart) { - service_restart(t, 1); - } + if(t->s_status == SERVICE_RUNNING && restart) + service_restart(t); service_unref(t); pthread_mutex_unlock(&global_lock); diff --git a/src/service.h b/src/service.h index e3ce74b9..950f40f2 100644 --- a/src/service.h +++ b/src/service.h @@ -546,7 +546,7 @@ service_reset_streaming_status_flags(service_t *t, int flag) struct streaming_start; struct streaming_start *service_build_stream_start(service_t *t); -void service_restart(service_t *t, int had_components); +void service_restart(service_t *t); void service_stream_destroy(service_t *t, elementary_stream_t *st);