From 6f8cf73f54c4b1f80d69ecd30d269f16df70ef6e Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 30 Nov 2017 01:14:33 +0100 Subject: ao: simplify hack for float atomics stdatomic.h defines no atomic_float typedef. We can't just use _Atomic unconditionally, because we support compilers without C11 atomics. So just create a custom atomic_float typedef in the wrapper, which uses _Atomic in the C11 code path. --- audio/out/ao.c | 16 ++-------------- audio/out/internal.h | 4 ++-- osdep/atomic.h | 3 +++ 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/audio/out/ao.c b/audio/out/ao.c index c40eae1b92..7c2100c7d2 100644 --- a/audio/out/ao.c +++ b/audio/out/ao.c @@ -642,19 +642,7 @@ void ao_print_devices(struct mpv_global *global, struct mp_log *log) void ao_set_gain(struct ao *ao, float gain) { - uint_least32_t v = 0; - assert(sizeof(gain) <= sizeof(v)); - memcpy(&v, &gain, sizeof(gain)); - atomic_store(&ao->gain_fi, v); -} - -static float ao_get_gain(struct ao *ao) -{ - uint_least32_t v = atomic_load_explicit(&ao->gain_fi, memory_order_relaxed); - float gain; - assert(sizeof(gain) <= sizeof(v)); - memcpy(&gain, &v, sizeof(gain)); - return gain; + atomic_store(&ao->gain, gain); } #define MUL_GAIN_i(d, num_samples, gain, low, center, high) \ @@ -669,7 +657,7 @@ static float ao_get_gain(struct ao *ao) static void process_plane(struct ao *ao, void *data, int num_samples) { - float gain = ao_get_gain(ao); + float gain = atomic_load_explicit(&ao->gain, memory_order_relaxed); int format = af_fmt_from_planar(ao->format); if (gain == 1.0f) return; diff --git a/audio/out/internal.h b/audio/out/internal.h index 9826630108..33e8a8c6a9 100644 --- a/audio/out/internal.h +++ b/audio/out/internal.h @@ -70,8 +70,8 @@ struct ao { // Internal events (use ao_request_reload(), ao_hotplug_event()) atomic_int events_; - // Float gain multiplicator, reinterpret-casted to int. - atomic_uint_least32_t gain_fi; + // Float gain multiplicator + mp_atomic_float gain; int buffer; double def_buffer; diff --git a/osdep/atomic.h b/osdep/atomic.h index 1d3e158afa..a5608fa78a 100644 --- a/osdep/atomic.h +++ b/osdep/atomic.h @@ -24,6 +24,7 @@ #if HAVE_STDATOMIC #include +typedef _Atomic float mp_atomic_float; #else // Emulate the parts of C11 stdatomic.h needed by mpv. @@ -36,6 +37,8 @@ typedef struct { long long v; } atomic_llong; typedef struct { uint_least32_t v; } atomic_uint_least32_t; typedef struct { unsigned long long v; } atomic_ullong; +typedef struct { float v; } mp_atomic_float; + #define ATOMIC_VAR_INIT(x) \ {.v = (x)} -- cgit v1.2.3