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 /audio | |
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.
Diffstat (limited to 'audio')
-rw-r--r-- | audio/out/ao.c | 16 | ||||
-rw-r--r-- | audio/out/internal.h | 4 |
2 files changed, 4 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; |