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.
This commit is contained in:
wm4 2017-11-30 01:14:33 +01:00
parent 963eb15006
commit 6f8cf73f54
3 changed files with 7 additions and 16 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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)}