diff options
author | wm4 <wm4@nowhere> | 2015-05-11 23:27:41 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-05-11 23:27:41 +0200 |
commit | ca9964a4fb6b1faa0155da43b3c815db0075e2d5 (patch) | |
tree | 0497215035217334f42be392173466a2e1533496 /audio/out | |
parent | cc24ec5b3cf7709bbd16a9505a6acc8156f63af1 (diff) | |
download | mpv-ca9964a4fb6b1faa0155da43b3c815db0075e2d5.tar.bz2 mpv-ca9964a4fb6b1faa0155da43b3c815db0075e2d5.tar.xz |
ao: make better use of atomics
The main reason for this was compatibility; but some associated problems
have been solved in the previous commit.
Diffstat (limited to 'audio/out')
-rw-r--r-- | audio/out/ao.c | 23 | ||||
-rw-r--r-- | audio/out/internal.h | 2 |
2 files changed, 11 insertions, 14 deletions
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; } -// Request that the player core destroys and recreates the AO. Fully thread-safe. -void ao_request_reload(struct ao *ao) +static void ao_add_events(struct ao *ao, int events) { - atomic_store(&ao->request_reload, true); + 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) +{ + 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; |