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 ++-- 2 files changed, 4 insertions(+), 16 deletions(-) (limited to 'audio') 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; -- cgit v1.2.3