diff options
-rw-r--r-- | audio/out/ao_coreaudio_utils.c | 4 | ||||
-rw-r--r-- | osdep/semaphore.h | 2 | ||||
-rw-r--r-- | osdep/semaphore_osx.c | 36 |
3 files changed, 18 insertions, 24 deletions
diff --git a/audio/out/ao_coreaudio_utils.c b/audio/out/ao_coreaudio_utils.c index f2ab6f6315..14db8e39cd 100644 --- a/audio/out/ao_coreaudio_utils.c +++ b/audio/out/ao_coreaudio_utils.c @@ -500,7 +500,7 @@ bool ca_change_physical_format_sync(struct ao *ao, AudioStreamID stream, /* The AudioStreamSetProperty is not only asynchronous, * it is also not Atomic, in its behaviour. */ - struct timespec timeout = mp_rel_time_to_timespec(2.0); + int64_t wait_until = mp_time_ns() + MP_TIME_S_TO_NS(2); AudioStreamBasicDescription actual_format = {0}; while (1) { err = CA_GET(stream, kAudioStreamPropertyPhysicalFormat, &actual_format); @@ -511,7 +511,7 @@ bool ca_change_physical_format_sync(struct ao *ao, AudioStreamID stream, if (format_set) break; - if (mp_sem_timedwait(&wakeup, &timeout)) { + if (mp_sem_timedwait(&wakeup, wait_until)) { MP_VERBOSE(ao, "reached timeout\n"); break; } diff --git a/osdep/semaphore.h b/osdep/semaphore.h index 6945d1ff85..6970317f04 100644 --- a/osdep/semaphore.h +++ b/osdep/semaphore.h @@ -28,7 +28,7 @@ typedef struct { int mp_sem_init(mp_sem_t *sem, int pshared, unsigned int value); int mp_sem_wait(mp_sem_t *sem); int mp_sem_trywait(mp_sem_t *sem); -int mp_sem_timedwait(mp_sem_t *sem, const struct timespec *abs_timeout); +int mp_sem_timedwait(mp_sem_t *sem, int64_t until); int mp_sem_post(mp_sem_t *sem); int mp_sem_destroy(mp_sem_t *sem); diff --git a/osdep/semaphore_osx.c b/osdep/semaphore_osx.c index 1e2015bddd..e8ba7b72b5 100644 --- a/osdep/semaphore_osx.c +++ b/osdep/semaphore_osx.c @@ -23,7 +23,9 @@ #include <sys/time.h> #include <errno.h> -#include "osdep/io.h" +#include <common/common.h> +#include "io.h" +#include "timer.h" int mp_sem_init(mp_sem_t *sem, int pshared, unsigned int value) { @@ -44,7 +46,7 @@ int mp_sem_init(mp_sem_t *sem, int pshared, unsigned int value) int mp_sem_wait(mp_sem_t *sem) { - return mp_sem_timedwait(sem, NULL); + return mp_sem_timedwait(sem, MP_START_TIME - 1); } int mp_sem_trywait(mp_sem_t *sem) @@ -67,32 +69,24 @@ int mp_sem_trywait(mp_sem_t *sem) return r; } -int mp_sem_timedwait(mp_sem_t *sem, const struct timespec *abs_timeout) +int mp_sem_timedwait(mp_sem_t *sem, int64_t until) { while (1) { if (!mp_sem_trywait(sem)) return 0; - int timeout_ms = -1; - if (abs_timeout) { - timeout_ms = 0; - - // OSX does not provide clock_gettime() either. - struct timeval tv; - gettimeofday(&tv, NULL); - - if (abs_timeout->tv_sec >= tv.tv_sec) { - long long msec = (abs_timeout->tv_sec - tv.tv_sec) * 1000LL + - abs_timeout->tv_nsec / 1000LL / 1000LL - tv.tv_usec / 1000LL; - if (msec > INT_MAX) - msec = INT_MAX; - if (msec < 0) - msec = 0; - timeout_ms = msec; - } + int timeout = 0; + if (until == MP_START_TIME - 1) { + timeout = -1; + } else if (until >= MP_START_TIME) { + timeout = (until - mp_time_ns()) / MP_TIME_MS_TO_NS(1); + timeout = MPCLAMP(timeout, 0, INT_MAX); + } else { + assert(false && "Invalid mp_time value!"); } + struct pollfd fd = {.fd = sem->wakeup_pipe[0], .events = POLLIN}; - int r = poll(&fd, 1, timeout_ms); + int r = poll(&fd, 1, timeout); if (r < 0) return -1; if (r == 0) { |