update&PMT_UPDATE_CAID_PID ? ", CAID PID changed":"",
update&PMT_REORDERED ? ", PIDs reordered":"");
- service_request_save((service_t*)t, 1);
+ service_request_save((service_t*)t, 0);
// Only restart if something that our clients worry about did change
if(update & ~(PMT_UPDATE_NEW_CA_STREAM |
t->s_verified = 1;
}
- /* FIXME: Move pending_restart handling to another place? */
- if (atomic_set(&t->s_pending_restart, 0) && !ret)
- tvhdebug(mt->mt_subsys, "%s: Service \"%s\" forced restart",
- mt->mt_name, service_nicename((service_t*)t));
-
*_update = update;
return ret;
}
/* Validate */
assert(s->s_source_type == S_MPEG_TS);
- lock_assert(&global_lock);
/* Update */
memset(si, 0, sizeof(struct source_info));
default: fsize = 0;
}
- if (fsize && st->es_audio_version != layer) {
+ if (fsize && st->es_audio_version < layer) {
st->es_audio_version = layer;
atomic_set(&t->s_pending_restart, 1);
}
st->es_width = width;
st->es_height = height;
st->es_frame_duration = duration;
- service_request_save(st->es_service, 1);
+ service_request_save(st->es_service, 0);
+ atomic_set(&st->es_service->s_pending_restart, 1);
}
}
}
/**
- * Restart output on a service.
+ * Restart output on a service (streams only).
* Happens if the stream composition changes.
* (i.e. an AC3 stream disappears, etc)
*/
void
-service_restart(service_t *t)
+service_restart_streams(service_t *t)
{
streaming_message_t *sm;
- int had_components;
-
- if(t->s_type != STYPE_STD)
- goto refresh;
-
- pthread_mutex_lock(&t->s_stream_mutex);
-
- had_components = TAILQ_FIRST(&t->s_filt_components) != NULL &&
- t->s_running;
+ int had_components = TAILQ_FIRST(&t->s_filt_components) != NULL &&
+ t->s_running;
service_build_filter(t);
streaming_service_deliver(t, sm);
t->s_running = 0;
}
+}
- pthread_mutex_unlock(&t->s_stream_mutex);
+/**
+ * Restart output on a service.
+ * Happens if the stream composition changes.
+ * (i.e. an AC3 stream disappears, etc)
+ */
+void
+service_restart(service_t *t)
+{
+ if (t->s_type == STYPE_STD) {
+ pthread_mutex_lock(&t->s_stream_mutex);
+ service_restart_streams(t);
+ pthread_mutex_unlock(&t->s_stream_mutex);
- descrambler_caid_changed(t);
+ descrambler_caid_changed(t);
+ }
-refresh:
- if(t->s_refresh_feed != NULL)
+ if (t->s_refresh_feed != NULL)
t->s_refresh_feed(t);
descrambler_service_start(t);
void service_restart(service_t *t);
+void service_restart_streams(service_t *t);
+
void service_stream_destroy(service_t *t, elementary_stream_t *st);
void service_request_save(service_t *t, int restart);
void
streaming_service_deliver(service_t *t, streaming_message_t *sm)
{
+ if (atomic_set(&t->s_pending_restart, 0))
+ service_restart_streams(t);
streaming_pad_deliver(&t->s_streaming_pad, sm);
}