summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/out/ao_coreaudio_utils.c4
-rw-r--r--osdep/semaphore.h2
-rw-r--r--osdep/semaphore_osx.c36
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) {