summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-11-30 01:14:33 +0100
committerwm4 <wm4@nowhere>2017-11-30 01:20:03 +0100
commit6f8cf73f54c4b1f80d69ecd30d269f16df70ef6e (patch)
tree48cc61b0f1f0196b27b8381f840a42cb47bfafa9
parent963eb15006342b694a9b396af596a4f049acb23a (diff)
downloadmpv-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.c16
-rw-r--r--audio/out/internal.h4
-rw-r--r--osdep/atomic.h3
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)}