diff options
author | wm4 <wm4@nowhere> | 2017-11-30 01:14:33 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2017-11-30 01:20:03 +0100 |
commit | 6f8cf73f54c4b1f80d69ecd30d269f16df70ef6e (patch) | |
tree | 48cc61b0f1f0196b27b8381f840a42cb47bfafa9 | |
parent | 963eb15006342b694a9b396af596a4f049acb23a (diff) | |
download | mpv-6f8cf73f54c4b1f80d69ecd30d269f16df70ef6e.tar.bz2 mpv-6f8cf73f54c4b1f80d69ecd30d269f16df70ef6e.tar.xz |
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.
-rw-r--r-- | audio/out/ao.c | 16 | ||||
-rw-r--r-- | audio/out/internal.h | 4 | ||||
-rw-r--r-- | 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 <stdatomic.h> +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)} |