diff options
Diffstat (limited to 'audio/out')
-rw-r--r-- | audio/out/ao_coreaudio.c | 6 | ||||
-rw-r--r-- | audio/out/ao_coreaudio_exclusive.c | 19 | ||||
-rw-r--r-- | audio/out/ao_coreaudio_utils.c | 22 | ||||
-rw-r--r-- | audio/out/ao_coreaudio_utils.h | 1 |
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); |