summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/out/ao_coreaudio.c6
-rw-r--r--audio/out/ao_coreaudio_exclusive.c19
-rw-r--r--audio/out/ao_coreaudio_utils.c22
-rw-r--r--audio/out/ao_coreaudio_utils.h1
4 files changed, 25 insertions, 23 deletions
diff --git a/audio/out/ao_coreaudio.c b/audio/out/ao_coreaudio.c
index 1cf38326a2..c592c0ef84 100644
--- a/audio/out/ao_coreaudio.c
+++ b/audio/out/ao_coreaudio.c
@@ -56,12 +56,8 @@ static int64_t ca_get_hardware_latency(struct ao *ao) {
&size);
CHECK_CA_ERROR("cannot get audio unit latency");
- uint32_t frames = 0;
- err = CA_GET_O(p->device, kAudioDevicePropertyLatency, &frames);
- CHECK_CA_ERROR("cannot get device latency");
-
uint64_t audiounit_latency_us = audiounit_latency_sec * 1e6;
- uint64_t device_latency_us = ca_frames_to_us(ao, frames);
+ uint64_t device_latency_us = ca_get_device_latency_us(ao, p->device);
MP_VERBOSE(ao, "audiounit latency [us]: %lld\n", audiounit_latency_us);
MP_VERBOSE(ao, "device latency [us]: %lld\n", device_latency_us);
diff --git a/audio/out/ao_coreaudio_exclusive.c b/audio/out/ao_coreaudio_exclusive.c
index 031bc67b9e..f8aba87188 100644
--- a/audio/out/ao_coreaudio_exclusive.c
+++ b/audio/out/ao_coreaudio_exclusive.c
@@ -320,24 +320,7 @@ static int init(struct ao *ao)
goto coreaudio_error;
}
- uint32_t latency_frames = 0;
- uint32_t latency_properties[] = {
- kAudioDevicePropertyLatency,
- kAudioDevicePropertyBufferFrameSize,
- kAudioDevicePropertySafetyOffset,
- };
- for (int n = 0; n < MP_ARRAY_SIZE(latency_properties); n++) {
- uint32_t temp;
- err = CA_GET_O(p->device, latency_properties[n], &temp);
- CHECK_CA_WARN("cannot get device latency");
- if (err == noErr) {
- latency_frames += temp;
- MP_VERBOSE(ao, "Latency property %s: %d frames\n",
- fourcc_repr(latency_properties[n]), (int)temp);
- }
- }
-
- p->hw_latency_us = ca_frames_to_us(ao, latency_frames);
+ p->hw_latency_us = ca_get_device_latency_us(ao, p->device);
MP_VERBOSE(ao, "base latency: %d microseconds\n", (int)p->hw_latency_us);
err = enable_property_listener(ao, true);
diff --git a/audio/out/ao_coreaudio_utils.c b/audio/out/ao_coreaudio_utils.c
index 2c3a5b4c50..f6463a314a 100644
--- a/audio/out/ao_coreaudio_utils.c
+++ b/audio/out/ao_coreaudio_utils.c
@@ -448,6 +448,28 @@ OSStatus ca_enable_mixing(struct ao *ao, AudioDeviceID device, bool changed)
return noErr;
}
+int64_t ca_get_device_latency_us(struct ao *ao, AudioDeviceID device)
+{
+ uint32_t latency_frames = 0;
+ uint32_t latency_properties[] = {
+ kAudioDevicePropertyLatency,
+ kAudioDevicePropertyBufferFrameSize,
+ kAudioDevicePropertySafetyOffset,
+ };
+ for (int n = 0; n < MP_ARRAY_SIZE(latency_properties); n++) {
+ uint32_t temp;
+ OSStatus err = CA_GET_O(device, latency_properties[n], &temp);
+ CHECK_CA_WARN("cannot get device latency");
+ if (err == noErr) {
+ latency_frames += temp;
+ MP_VERBOSE(ao, "Latency property %s: %d frames\n",
+ fourcc_repr(latency_properties[n]), (int)temp);
+ }
+ }
+
+ return ca_frames_to_us(ao, latency_frames);
+}
+
static OSStatus ca_change_format_listener(
AudioObjectID object, uint32_t n_addresses,
const AudioObjectPropertyAddress addresses[],
diff --git a/audio/out/ao_coreaudio_utils.h b/audio/out/ao_coreaudio_utils.h
index 477531e9f2..a0b5aa002c 100644
--- a/audio/out/ao_coreaudio_utils.h
+++ b/audio/out/ao_coreaudio_utils.h
@@ -74,6 +74,7 @@ OSStatus ca_lock_device(AudioDeviceID device, pid_t *pid);
OSStatus ca_unlock_device(AudioDeviceID device, pid_t *pid);
OSStatus ca_disable_mixing(struct ao *ao, AudioDeviceID device, bool *changed);
OSStatus ca_enable_mixing(struct ao *ao, AudioDeviceID device, bool changed);
+int64_t ca_get_device_latency_us(struct ao *ao, AudioDeviceID device);
bool ca_change_physical_format_sync(struct ao *ao, AudioStreamID stream,
AudioStreamBasicDescription change_format);