X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=pulse.c;h=d6a26b613c28bf488b433c6f465cd44bf7f7684a;hb=5b9beac5726dc1220e271056a19347e0249237f7;hp=21005ba79a50f02bfad9fe8da0b4da5b3521c089;hpb=50a7f7ea8a572ce3cab7045ac8cce14cf73ef8a1;p=ursary.git diff --git a/pulse.c b/pulse.c index 21005ba..d6a26b6 100644 --- a/pulse.c +++ b/pulse.c @@ -4,7 +4,7 @@ * (c) 2014 Martin Mares */ -#define LOCAL_DEBUG +#undef LOCAL_DEBUG #include #include @@ -17,6 +17,16 @@ #include "ursaryd.h" +enum pulse_state { + PS_OFFLINE, + PS_SUBSCRIBE, + PS_GET_CLIENTS, + PS_GET_SINKS, + PS_GET_SINK_INPUTS, + PS_GET_SERVER, + PS_ONLINE, +}; + enum pulse_state pulse_state; #define PULSE_STATE(s) do { pulse_state = s; DBG("Pulse: " #s); } while (0) @@ -81,8 +91,8 @@ void pulse_dump(void) msg(L_DEBUG, "## Client #%d: %s host=%s", c->idx, c->name, c->host); CLIST_FOR_EACH(struct pulse_sink *, s, pulse_sink_list) - msg(L_DEBUG, "## Sink #%d: %s channels=%u volume=%u base_vol=%u mute=%u", - s->idx, s->name, s->channels, s->volume, s->base_volume, s->mute); + msg(L_DEBUG, "## Sink #%d: %s channels=%u volume=%u base_vol=%u mute=%u suspended=%u", + s->idx, s->name, s->channels, s->volume, s->base_volume, s->mute, s->suspended); CLIST_FOR_EACH(struct pulse_sink_input *, s, pulse_sink_input_list) msg(L_DEBUG, "## Sink input #%d: %s client=%d sink=%d channels=%u volume=%u mute=%u", @@ -134,6 +144,7 @@ void pulse_server_set_default_sink(const char *name) #define HASH_PREFIX(x) pulse_sink_input_##x #define HASH_KEY_ATOMIC idx #define HASH_WANT_CLEANUP +#define HASH_WANT_FIND #define HASH_WANT_LOOKUP #define HASH_WANT_REMOVE #define HASH_ZERO_FILL @@ -173,9 +184,14 @@ static void pulse_sink_input_cb(pa_context *ctx UNUSED, const pa_sink_input_info static void pulse_sink_input_gone(int idx) { DBG("Pulse: REMOVE SINK INPUT #%d", idx); - struct pulse_sink_input *s = pulse_sink_input_lookup(idx); - clist_remove(&s->n); - pulse_sink_input_remove(s); + struct pulse_sink_input *s = pulse_sink_input_find(idx); + if (s) + { + clist_remove(&s->n); + pulse_sink_input_remove(s); + } + else + DBG("Pulse: Removing sink which does not exist"); schedule_update(); } @@ -232,6 +248,7 @@ static void pulse_sink_cb(pa_context *ctx UNUSED, const pa_sink_info *i, int eol s->volume = pa_cvolume_avg(&i->volume); s->base_volume = i->base_volume; s->mute = i->mute; + s->suspended = (i->state == PA_SINK_SUSPENDED); schedule_update(); } @@ -273,6 +290,7 @@ void pulse_sink_set_mute(int idx, bool mute) #define HASH_PREFIX(x) pulse_client_##x #define HASH_KEY_ATOMIC idx #define HASH_WANT_CLEANUP +#define HASH_WANT_FIND #define HASH_WANT_LOOKUP #define HASH_WANT_REMOVE #define HASH_ZERO_FILL @@ -309,15 +327,18 @@ static void pulse_client_cb(pa_context *ctx UNUSED, const pa_client_info *i, int static void pulse_client_gone(int idx) { DBG("Pulse: REMOVE CLIENT #%d", idx); - struct pulse_client *c = pulse_client_lookup(idx); - clist_remove(&c->n); - pulse_client_remove(c); - schedule_update(); + struct pulse_client *c = pulse_client_find(idx); + if (c) + { + clist_remove(&c->n); + pulse_client_remove(c); + schedule_update(); + } } struct pulse_client *pulse_client_by_idx(int idx) { - return pulse_client_lookup(idx); + return pulse_client_find(idx); } /*** Events ***/ @@ -425,6 +446,11 @@ static void pulse_connect(struct main_timer *t) pa_context_connect(pulse_ctx, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL); } +bool pulse_is_ready(void) +{ + return (pulse_state == PS_ONLINE); +} + void pulse_init(void) { pmain_init();