Correct a few places with locking and bar refresh

This commit is contained in:
Stanislav Ochotnický 2021-10-10 13:35:37 +02:00
parent 04d47cba3c
commit d66b86de1f

View file

@ -146,23 +146,31 @@ server_info_callback(pa_context *c, const pa_server_info *i, void *userdata)
struct private *p = mod->private; struct private *p = mod->private;
pa_operation *o; pa_operation *o;
mtx_lock(&mod->lock);
// If they match defaults that means there are no sinks/sources // If they match defaults that means there are no sinks/sources
if (strcmp(i->default_sink_name, "@DEFAULT_SINK@") == 0) { if (strcmp(i->default_sink_name, "@DEFAULT_SINK@") == 0) {
mtx_lock(&mod->lock);
p->sink_online = false; p->sink_online = false;
p->sink_index = 0; p->sink_index = 0;
mtx_unlock(&mod->lock);
mod->bar->refresh(mod->bar); mod->bar->refresh(mod->bar);
} }
if (strcmp(i->default_source_name, "@DEFAULT_SOURCE@") == 0) { if (strcmp(i->default_source_name, "@DEFAULT_SOURCE@") == 0) {
mtx_lock(&mod->lock);
p->source_online = false; p->source_online = false;
p->source_index = 0; p->source_index = 0;
mtx_unlock(&mod->lock);
mod->bar->refresh(mod->bar); mod->bar->refresh(mod->bar);
} }
if (!p->current_sink_name || strcmp(i->default_sink_name, p->current_sink_name) != 0) { if (!p->current_sink_name || strcmp(i->default_sink_name, p->current_sink_name) != 0) {
LOG_DBG("Default sink changed (%s) - calling get_sink_info_by_name", i->default_sink_name); LOG_DBG("Default sink changed (%s) - calling get_sink_info_by_name", i->default_sink_name);
mtx_lock(&mod->lock);
free(p->current_sink_name); free(p->current_sink_name);
p->current_sink_name = strdup(i->default_sink_name); p->current_sink_name = strdup(i->default_sink_name);
mtx_unlock(&mod->lock);
if (!(o = pa_context_get_sink_info_by_name(c, p->sink_name, sink_info_callback, if (!(o = pa_context_get_sink_info_by_name(c, p->sink_name, sink_info_callback,
userdata))) { userdata))) {
LOG_ERR("pa_context_get_sink_info_by_name() failed: %s", LOG_ERR("pa_context_get_sink_info_by_name() failed: %s",
@ -173,8 +181,11 @@ server_info_callback(pa_context *c, const pa_server_info *i, void *userdata)
strcmp(i->default_source_name, p->current_source_name) != 0) { strcmp(i->default_source_name, p->current_source_name) != 0) {
LOG_DBG("Default source changed (%s) - calling get_sink_info_by_name", LOG_DBG("Default source changed (%s) - calling get_sink_info_by_name",
i->default_source_name); i->default_source_name);
mtx_lock(&mod->lock);
free(p->current_source_name); free(p->current_source_name);
p->current_source_name = strdup(i->default_source_name); p->current_source_name = strdup(i->default_source_name);
mtx_unlock(&mod->lock);
if (!(o = pa_context_get_source_info_by_name(c, p->source_name, source_info_callback, if (!(o = pa_context_get_source_info_by_name(c, p->source_name, source_info_callback,
userdata))) { userdata))) {
LOG_ERR("pa_context_get_source_info_by_name() failed: %s", LOG_ERR("pa_context_get_source_info_by_name() failed: %s",
@ -182,8 +193,6 @@ server_info_callback(pa_context *c, const pa_server_info *i, void *userdata)
} }
pa_operation_unref(o); pa_operation_unref(o);
} }
mtx_unlock(&mod->lock);
} }
/* /*
@ -200,13 +209,16 @@ pa_subscription_callback(pa_context *c, pa_subscription_event_type_t t, uint idx
struct private *p = mod->private; struct private *p = mod->private;
pa_operation *o; pa_operation *o;
mtx_lock(&mod->lock);
switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) {
case PA_SUBSCRIPTION_EVENT_SINK: case PA_SUBSCRIPTION_EVENT_SINK:
if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
if (idx == p->sink_index) { if (idx == p->sink_index) {
mtx_lock(&mod->lock);
p->sink_online = false; p->sink_online = false;
p->sink_index = 0; p->sink_index = 0;
mtx_unlock(&mod->lock);
mod->bar->refresh(mod->bar);
} }
} }
@ -223,8 +235,12 @@ pa_subscription_callback(pa_context *c, pa_subscription_event_type_t t, uint idx
case PA_SUBSCRIPTION_EVENT_SOURCE: case PA_SUBSCRIPTION_EVENT_SOURCE:
if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
if (idx == p->source_index) { if (idx == p->source_index) {
mtx_lock(&mod->lock);
p->source_online = false; p->source_online = false;
p->source_index = 0; p->source_index = 0;
mtx_unlock(&mod->lock);
mod->bar->refresh(mod->bar);
} }
} }
@ -237,6 +253,7 @@ pa_subscription_callback(pa_context *c, pa_subscription_event_type_t t, uint idx
} }
pa_operation_unref(o); pa_operation_unref(o);
} }
break;
case PA_SUBSCRIPTION_EVENT_SERVER: case PA_SUBSCRIPTION_EVENT_SERVER:
// Update when server state changes - for example changes in default sink/source // Update when server state changes - for example changes in default sink/source
if (!(o = pa_context_get_server_info(c, server_info_callback, userdata))) { if (!(o = pa_context_get_server_info(c, server_info_callback, userdata))) {
@ -245,7 +262,6 @@ pa_subscription_callback(pa_context *c, pa_subscription_event_type_t t, uint idx
pa_operation_unref(o); pa_operation_unref(o);
break; break;
} }
mtx_unlock(&mod->lock);
} }
/* This is called whenever the context status changes - we connect/disconnect etc */ /* This is called whenever the context status changes - we connect/disconnect etc */
@ -264,6 +280,8 @@ context_state_callback(pa_context *c, void *userdata)
mtx_lock(&mod->lock); mtx_lock(&mod->lock);
p->online = false; p->online = false;
mtx_unlock(&mod->lock); mtx_unlock(&mod->lock);
mod->bar->refresh(mod->bar);
break; break;
case PA_CONTEXT_READY: { case PA_CONTEXT_READY: {
@ -272,6 +290,10 @@ context_state_callback(pa_context *c, void *userdata)
mtx_lock(&mod->lock); mtx_lock(&mod->lock);
p->online = true; p->online = true;
mtx_unlock(&mod->lock); mtx_unlock(&mod->lock);
// Usually not needed since later callbacks refresh the bar, but it doesn't hurt just in case
mod->bar->refresh(mod->bar);
LOG_DBG("pulse connection established."); LOG_DBG("pulse connection established.");
pa_context_set_subscribe_callback(c, pa_subscription_callback, mod); pa_context_set_subscribe_callback(c, pa_subscription_callback, mod);
if (!(o = pa_context_subscribe(c, if (!(o = pa_context_subscribe(c,
@ -295,16 +317,6 @@ context_state_callback(pa_context *c, void *userdata)
} }
case PA_CONTEXT_TERMINATED: case PA_CONTEXT_TERMINATED:
mtx_lock(&mod->lock);
p->online = false;
p->sink_online = false;
p->source_online = false;
mtx_unlock(&mod->lock);
LOG_INFO("pulse connection terminated.");
mod->bar->refresh(mod->bar);
// TODO - possibly schedule a recurring reconnect attempt?
break;
case PA_CONTEXT_FAILED: case PA_CONTEXT_FAILED:
default: default:
mtx_lock(&mod->lock); mtx_lock(&mod->lock);