diff options
author | Aman Gupta <aman@tmm1.net> | 2019-02-08 15:15:58 -0800 |
---|---|---|
committer | Aman Gupta <aman@tmm1.net> | 2019-04-05 10:29:44 +0700 |
commit | e35aca3cb4a6e93a2eda8c14c69ab0fbadf7c2ee (patch) | |
tree | 4d088da90f0276ff2de343ad036022d17987dcde /audio/out | |
parent | 6c913149001b242aa777d6a1e67f62162c1e6694 (diff) | |
download | mpv-e35aca3cb4a6e93a2eda8c14c69ab0fbadf7c2ee.tar.bz2 mpv-e35aca3cb4a6e93a2eda8c14c69ab0fbadf7c2ee.tar.xz |
ao/audiounit: improve a/v sync
This more closely mimics ao_coreaudio, on which this driver was
originally based.
Signed-off-by: Aman Gupta <aman@tmm1.net>
Diffstat (limited to 'audio/out')
-rw-r--r-- | audio/out/ao_audiounit.m | 2 | ||||
-rw-r--r-- | audio/out/ao_coreaudio_utils.c | 18 | ||||
-rw-r--r-- | audio/out/ao_coreaudio_utils.h | 2 |
3 files changed, 18 insertions, 4 deletions
diff --git a/audio/out/ao_audiounit.m b/audio/out/ao_audiounit.m index 70a80f29f6..677b2281d2 100644 --- a/audio/out/ao_audiounit.m +++ b/audio/out/ao_audiounit.m @@ -49,8 +49,8 @@ static OSStatus render_cb_lpcm(void *ctx, AudioUnitRenderActionFlags *aflags, planes[n] = buffer_list->mBuffers[n].mData; int64_t end = mp_time_us(); - end += ca_frames_to_us(ao, frames); end += p->device_latency * 1e6; + end += ca_get_latency(ts) + ca_frames_to_us(ao, frames); ao_read_data(ao, planes, frames, end); return noErr; } diff --git a/audio/out/ao_coreaudio_utils.c b/audio/out/ao_coreaudio_utils.c index d458b581ae..b55bf1c0df 100644 --- a/audio/out/ao_coreaudio_utils.c +++ b/audio/out/ao_coreaudio_utils.c @@ -31,6 +31,8 @@ #if HAVE_COREAUDIO #include "audio/out/ao_coreaudio_properties.h" #include <CoreAudio/HostTime.h> +#else +#include <mach/mach_time.h> #endif CFStringRef cfstr_from_cstr(char *str) @@ -310,9 +312,9 @@ int64_t ca_frames_to_us(struct ao *ao, uint32_t frames) return frames / (float) ao->samplerate * 1e6; } -#if HAVE_COREAUDIO int64_t ca_get_latency(const AudioTimeStamp *ts) { +#if HAVE_COREAUDIO uint64_t out = AudioConvertHostTimeToNanos(ts->mHostTime); uint64_t now = AudioConvertHostTimeToNanos(AudioGetCurrentHostTime()); @@ -320,8 +322,22 @@ int64_t ca_get_latency(const AudioTimeStamp *ts) return 0; return (out - now) * 1e-3; +#else + static mach_timebase_info_data_t timebase; + if (timebase.denom == 0) + mach_timebase_info(&timebase); + + uint64_t out = ts->mHostTime; + uint64_t now = mach_absolute_time(); + + if (now > out) + return 0; + + return (out - now) * timebase.numer / timebase.denom / 1e3; +#endif } +#if HAVE_COREAUDIO bool ca_stream_supports_compressed(struct ao *ao, AudioStreamID stream) { AudioStreamRangedDescription *formats = NULL; diff --git a/audio/out/ao_coreaudio_utils.h b/audio/out/ao_coreaudio_utils.h index 68f5b076ec..cd1f5f282f 100644 --- a/audio/out/ao_coreaudio_utils.h +++ b/audio/out/ao_coreaudio_utils.h @@ -65,9 +65,7 @@ bool ca_asbd_is_better(AudioStreamBasicDescription *req, AudioStreamBasicDescription *new); int64_t ca_frames_to_us(struct ao *ao, uint32_t frames); -#if HAVE_COREAUDIO int64_t ca_get_latency(const AudioTimeStamp *ts); -#endif #if HAVE_COREAUDIO bool ca_stream_supports_compressed(struct ao *ao, AudioStreamID stream); |