ssize_t idnode_set_find_index( idnode_set_t *is, idnode_t *in );
static inline int idnode_set_exists ( idnode_set_t *is, idnode_t *in )
{ return idnode_set_find_index(is, in) >= 0; }
+static inline int idnode_set_empty ( idnode_set_t *is )
+ { return is->is_count == 0; }
void idnode_set_sort ( idnode_set_t *is, idnode_sort_t *s );
void idnode_set_sort_by_title ( idnode_set_t *is, const char *lang );
htsmsg_t *idnode_set_as_htsmsg ( idnode_set_t *is );
mpegts_apids_t *s_pids;
idnode_set_t s_masters;
- LIST_HEAD(, mpegts_service) s_slaves;
- LIST_ENTRY(mpegts_service) s_slaves_link;
+ idnode_set_t s_slaves;
mpegts_apids_t *s_slaves_pids;
/*
mms->s_unlink(mms, ms);
}
idnode_set_clear(&ms->s_masters);
+ idnode_set_clear(&ms->s_slaves);
/* Remove PID lists */
mpegts_pid_destroy(&ms->s_pids);
pthread_mutex_lock(&slave->s_stream_mutex);
pthread_mutex_lock(&master->s_stream_mutex);
assert(!idnode_set_exists(&slave->s_masters, &master->s_id));
- assert(LIST_SAFE_ENTRY(slave, s_slaves_link));
idnode_set_alloc(&slave->s_masters, 16);
idnode_set_add(&slave->s_masters, &master->s_id, NULL, NULL);
- LIST_INSERT_HEAD(&master->s_slaves, slave, s_slaves_link);
+ idnode_set_alloc(&master->s_slaves, 16);
+ idnode_set_add(&master->s_slaves, &slave->s_id, NULL, NULL);
pthread_mutex_unlock(&master->s_stream_mutex);
mpegts_service_update_slave_pids(slave, 0);
pthread_mutex_unlock(&slave->s_stream_mutex);
mpegts_service_update_slave_pids(slave, 1);
pthread_mutex_lock(&master->s_stream_mutex);
idnode_set_remove(&slave->s_masters, &master->s_id);
- if (slave->s_masters.is_count == 0)
+ if (idnode_set_empty(&slave->s_masters))
idnode_set_clear(&slave->s_masters);
- LIST_SAFE_REMOVE(slave, s_slaves_link);
+ idnode_set_remove(&master->s_slaves, &slave->s_id);
+ if (idnode_set_empty(&master->s_slaves))
+ idnode_set_clear(&master->s_slaves);
pthread_mutex_unlock(&master->s_stream_mutex);
pthread_mutex_unlock(&slave->s_stream_mutex);
return 0;
pthread_mutex_lock(&t->s_stream_mutex);
service_set_streaming_status_flags((service_t*)t, TSS_MUX_PACKETS);
- if (!LIST_EMPTY(&t->s_slaves)) {
+ if (!idnode_set_empty(&t->s_slaves)) {
/* If PID is owned by a slave service, let parent service to
* deliver this PID (decrambling)
*/
rtsp_manage_descramble(session_t *rs)
{
idnode_set_t *found;
- mpegts_service_t *s, *snext, *master;
+ mpegts_service_t *s, *master;
slave_subscription_t *sub;
mpegts_apids_t pmt_pids;
size_t si;
}
/* Remove already used or no-longer required services */
- for (s = LIST_FIRST(&master->s_slaves); s; s = snext) {
- snext = LIST_NEXT(s, s_slaves_link);
- if (idnode_set_remove(found, &s->s_id))
+ for (si = 0; si < master->s_slaves.is_count; si++) {
+ s = (mpegts_service_t *)master->s_slaves.is_array[si];
+ if (idnode_set_remove(found, &s->s_id)) {
used++;
- else if (!idnode_set_exists(found, &s->s_id))
+ } else if (!idnode_set_exists(found, &s->s_id)) {
rtsp_slave_remove(rs, master, s);
+ si--;
+ }
}
/* Add new ones */