X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=pulse.c;h=53478dcda6082d2097246c1998d7dd404c717f45;hb=9462e20b38064dc32852b1f60ad590d65e943f60;hp=479a5e1055c9daf3ec08219f91d6cf6814b88874;hpb=8c6ae9672d2e5326b9216c27718e40fb1c3a18b2;p=ursary.git diff --git a/pulse.c b/pulse.c index 479a5e1..53478dc 100644 --- a/pulse.c +++ b/pulse.c @@ -1,10 +1,10 @@ /* * Asynchronous Interface to PulseAudio * - * (c) 2014 Martin Mares + * (c) 2014--2018 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 port=%s", + s->idx, s->name, s->channels, s->volume, s->base_volume, s->mute, s->suspended, s->active_port); 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", @@ -226,8 +236,9 @@ static void pulse_sink_cb(pa_context *ctx UNUSED, const pa_sink_info *i, int eol return; } - DBG("Pulse: SINK #%u: %s (%s) flags=%08x channels=%u volume=%u mute=%d base_vol=%u state=%u", - i->index, i->name, i->description, i->flags, i->channel_map.channels, i->volume.values[0], i->mute, i->base_volume, i->state); + DBG("Pulse: SINK #%u: %s (%s) flags=%08x channels=%u volume=%u mute=%d base_vol=%u state=%u port=%s", + i->index, i->name, i->description, i->flags, i->channel_map.channels, i->volume.values[0], i->mute, i->base_volume, i->state, + (i->active_port ? i->active_port->name : "none")); pulse_dump_proplist(i->proplist); struct pulse_sink *s = pulse_sink_lookup(i->index); @@ -238,6 +249,8 @@ 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); + SET_STRING(s->active_port, (i->active_port ? i->active_port->name : "none")); schedule_update(); } @@ -273,12 +286,18 @@ void pulse_sink_set_mute(int idx, bool mute) PULSE_ASYNC_RUN(pa_context_set_sink_mute_by_index, idx, mute, pulse_success_cb); } +void pulse_sink_set_port(int idx, const char *port) +{ + PULSE_ASYNC_RUN(pa_context_set_sink_port_by_index, idx, port, pulse_success_cb); +} + /*** Clients ***/ #define HASH_NODE struct pulse_client #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 @@ -315,15 +334,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 ***/ @@ -431,6 +453,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();