diff --git a/audio/out/ao.c b/audio/out/ao.c index e2d01d65a3..f82637eb2a 100644 --- a/audio/out/ao.c +++ b/audio/out/ao.c @@ -385,28 +385,26 @@ bool ao_eof_reached(struct ao *ao) // Query the AO_EVENT_*s as requested by the events parameter, and return them. int ao_query_and_reset_events(struct ao *ao, int events) { - int actual_events = 0; - if (atomic_load(&ao->request_reload)) // don't need to reset it - actual_events |= AO_EVENT_RELOAD; - if (atomic_load(&ao->request_hotplug)) - actual_events |= AO_EVENT_HOTPLUG; - return actual_events & events; + return atomic_fetch_and(&ao->events_, ~(unsigned)events) & events; +} + +static void ao_add_events(struct ao *ao, int events) +{ + atomic_fetch_or(&ao->events_, events); + if (ao->input_ctx) + mp_input_wakeup(ao->input_ctx); } // Request that the player core destroys and recreates the AO. Fully thread-safe. void ao_request_reload(struct ao *ao) { - atomic_store(&ao->request_reload, true); - if (ao->input_ctx) - mp_input_wakeup(ao->input_ctx); + ao_add_events(ao, AO_EVENT_RELOAD); } // Notify the player that the device list changed. Fully thread-safe. void ao_hotplug_event(struct ao *ao) { - atomic_store(&ao->request_hotplug, true); - if (ao->input_ctx) - mp_input_wakeup(ao->input_ctx); + ao_add_events(ao, AO_EVENT_HOTPLUG); } bool ao_chmap_sel_adjust(struct ao *ao, const struct mp_chmap_sel *s, @@ -503,7 +501,6 @@ bool ao_hotplug_check_update(struct ao_hotplug *hp) { if (hp->ao && ao_query_and_reset_events(hp->ao, AO_EVENT_HOTPLUG)) { hp->needs_update = true; - atomic_store(&hp->ao->request_hotplug, false); return true; } return false; diff --git a/audio/out/internal.h b/audio/out/internal.h index 820ac051bf..49131ba293 100644 --- a/audio/out/internal.h +++ b/audio/out/internal.h @@ -59,7 +59,7 @@ struct ao { char *redirect; // Internal events (use ao_request_reload(), ao_hotplug_event()) - atomic_bool request_reload, request_hotplug; + atomic_int events_; int buffer; double def_buffer; diff --git a/osdep/atomics.h b/osdep/atomics.h index 6997ba97b2..e0bef8a879 100644 --- a/osdep/atomics.h +++ b/osdep/atomics.h @@ -34,6 +34,7 @@ typedef struct { volatile unsigned long v, t; } atomic_ulong; typedef struct { volatile int v, t; } atomic_int; +typedef struct { volatile unsigned int v, t; } atomic_uint; typedef struct { volatile _Bool v, t; } atomic_bool; typedef struct { volatile long long v, t; } atomic_llong; typedef struct { volatile uint_least32_t v, t; } atomic_uint_least32_t;