summaryrefslogtreecommitdiffstats
path: root/audio/out/ao_coreaudio.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/out/ao_coreaudio.c')
-rw-r--r--audio/out/ao_coreaudio.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/audio/out/ao_coreaudio.c b/audio/out/ao_coreaudio.c
index 59846cd605..b2d78aa872 100644
--- a/audio/out/ao_coreaudio.c
+++ b/audio/out/ao_coreaudio.c
@@ -15,6 +15,8 @@
* with mpv. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <CoreAudio/HostTime.h>
+
#include "config.h"
#include "ao.h"
#include "internal.h"
@@ -38,13 +40,29 @@ struct priv {
bool ca_layout_to_mp_chmap(struct ao *ao, AudioChannelLayout *layout,
struct mp_chmap *chmap);
+static int64_t ca_get_latency(const AudioTimeStamp *ts)
+{
+ uint64_t out = AudioConvertHostTimeToNanos(ts->mHostTime);
+ uint64_t now = AudioConvertHostTimeToNanos(AudioGetCurrentHostTime());
+
+ if (now > out)
+ return 0;
+
+ return (out - now) * 1e-3;
+}
+
static OSStatus render_cb_lpcm(void *ctx, AudioUnitRenderActionFlags *aflags,
const AudioTimeStamp *ts, UInt32 bus,
UInt32 frames, AudioBufferList *buffer_list)
{
struct ao *ao = ctx;
AudioBuffer buf = buffer_list->mBuffers[0];
- ao_read_data(ao, &buf.mData, frames, ts->mSampleTime);
+
+ const int64_t playback_us = frames / (float) ao->samplerate * 1e6;
+ const int64_t latency_us = ca_get_latency(ts);
+
+ const int64_t end = mp_time_us() + playback_us + latency_us;
+ ao_read_data(ao, &buf.mData, frames, end);
return noErr;
}