X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fpulse.c;h=33980143b70c6e52eb30f3ce512509e8d0d1fb2b;hb=ac8998ef03374abca56da9929812c6fcba936031;hp=34e302b110302e7aa687fd875817256e343be6eb;hpb=611e863ace93c18a71697bb9a3f8ffa18f03da6d;p=i3%2Fi3status diff --git a/src/pulse.c b/src/pulse.c index 34e302b..3398014 100644 --- a/src/pulse.c +++ b/src/pulse.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include "i3status.h" #include "queue.h" @@ -19,6 +20,7 @@ static pa_threaded_mainloop *main_loop = NULL; static pa_context *context = NULL; static pa_mainloop_api *api = NULL; static bool context_ready = false; +static bool mainloop_thread_running = false; static uint32_t default_sink_idx = DEFAULT_SINK_INDEX; TAILQ_HEAD(tailhead, indexed_volume_s) cached_volume = TAILQ_HEAD_INITIALIZER(cached_volume); @@ -89,9 +91,7 @@ static void store_volume_from_sink_cb(pa_context *c, save_volume(DEFAULT_SINK_INDEX, composed_volume)) | save_volume(info->index, composed_volume)) { /* if the volume or mute flag changed, wake the main thread */ - pthread_mutex_lock(&i3status_sleep_mutex); - pthread_cond_broadcast(&i3status_sleep_cond); - pthread_mutex_unlock(&i3status_sleep_mutex); + pthread_kill(main_thread, SIGUSR1); } } @@ -153,6 +153,7 @@ static void context_state_callback(pa_context *c, void *userdata) { case PA_CONTEXT_SETTING_NAME: case PA_CONTEXT_TERMINATED: default: + context_ready = false; break; case PA_CONTEXT_READY: { @@ -170,7 +171,10 @@ static void context_state_callback(pa_context *c, void *userdata) { } break; case PA_CONTEXT_FAILED: - pulseaudio_error_log(c); + /* server disconnected us, attempt to reconnect */ + context_ready = false; + pa_context_unref(context); + context = NULL; break; } } @@ -236,12 +240,14 @@ bool pulse_initialize(void) { pulseaudio_error_log(context); return false; } - if (pa_threaded_mainloop_start(main_loop) < 0) { + if (!mainloop_thread_running && + pa_threaded_mainloop_start(main_loop) < 0) { pulseaudio_error_log(context); pa_threaded_mainloop_free(main_loop); main_loop = NULL; return false; } + mainloop_thread_running = true; } return true; }