mirror of https://github.com/mpv-player/mpv
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>
This commit is contained in:
parent
6c91314900
commit
e35aca3cb4
|
@ -49,8 +49,8 @@ static OSStatus render_cb_lpcm(void *ctx, AudioUnitRenderActionFlags *aflags,
|
||||||
planes[n] = buffer_list->mBuffers[n].mData;
|
planes[n] = buffer_list->mBuffers[n].mData;
|
||||||
|
|
||||||
int64_t end = mp_time_us();
|
int64_t end = mp_time_us();
|
||||||
end += ca_frames_to_us(ao, frames);
|
|
||||||
end += p->device_latency * 1e6;
|
end += p->device_latency * 1e6;
|
||||||
|
end += ca_get_latency(ts) + ca_frames_to_us(ao, frames);
|
||||||
ao_read_data(ao, planes, frames, end);
|
ao_read_data(ao, planes, frames, end);
|
||||||
return noErr;
|
return noErr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
#if HAVE_COREAUDIO
|
#if HAVE_COREAUDIO
|
||||||
#include "audio/out/ao_coreaudio_properties.h"
|
#include "audio/out/ao_coreaudio_properties.h"
|
||||||
#include <CoreAudio/HostTime.h>
|
#include <CoreAudio/HostTime.h>
|
||||||
|
#else
|
||||||
|
#include <mach/mach_time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CFStringRef cfstr_from_cstr(char *str)
|
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;
|
return frames / (float) ao->samplerate * 1e6;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HAVE_COREAUDIO
|
|
||||||
int64_t ca_get_latency(const AudioTimeStamp *ts)
|
int64_t ca_get_latency(const AudioTimeStamp *ts)
|
||||||
{
|
{
|
||||||
|
#if HAVE_COREAUDIO
|
||||||
uint64_t out = AudioConvertHostTimeToNanos(ts->mHostTime);
|
uint64_t out = AudioConvertHostTimeToNanos(ts->mHostTime);
|
||||||
uint64_t now = AudioConvertHostTimeToNanos(AudioGetCurrentHostTime());
|
uint64_t now = AudioConvertHostTimeToNanos(AudioGetCurrentHostTime());
|
||||||
|
|
||||||
|
@ -320,8 +322,22 @@ int64_t ca_get_latency(const AudioTimeStamp *ts)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return (out - now) * 1e-3;
|
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)
|
bool ca_stream_supports_compressed(struct ao *ao, AudioStreamID stream)
|
||||||
{
|
{
|
||||||
AudioStreamRangedDescription *formats = NULL;
|
AudioStreamRangedDescription *formats = NULL;
|
||||||
|
|
|
@ -65,9 +65,7 @@ bool ca_asbd_is_better(AudioStreamBasicDescription *req,
|
||||||
AudioStreamBasicDescription *new);
|
AudioStreamBasicDescription *new);
|
||||||
|
|
||||||
int64_t ca_frames_to_us(struct ao *ao, uint32_t frames);
|
int64_t ca_frames_to_us(struct ao *ao, uint32_t frames);
|
||||||
#if HAVE_COREAUDIO
|
|
||||||
int64_t ca_get_latency(const AudioTimeStamp *ts);
|
int64_t ca_get_latency(const AudioTimeStamp *ts);
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_COREAUDIO
|
#if HAVE_COREAUDIO
|
||||||
bool ca_stream_supports_compressed(struct ao *ao, AudioStreamID stream);
|
bool ca_stream_supports_compressed(struct ao *ao, AudioStreamID stream);
|
||||||
|
|
Loading…
Reference in New Issue