summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
authorMisaki Kasumi <misakikasumi@outlook.com>2024-03-28 05:03:10 +0800
committerder richter <der.richter@gmx.de>2024-03-29 14:03:24 +0100
commit276bbb8884b7c7a35bb0496551ae944f9ab962af (patch)
treebe2e6c44bb8589ed82b4948dca65153b1ba2cedd /audio
parent1ed8607292ae4f9eafd041d304ad68740ffd3fd7 (diff)
downloadmpv-276bbb8884b7c7a35bb0496551ae944f9ab962af.tar.bz2
mpv-276bbb8884b7c7a35bb0496551ae944f9ab962af.tar.xz
ao_coreaudio: handle latency change on hotplug
The device latency may change during hotplugging. This commit updates p->hw_latency_ns each time hotplug_cb is called so that it can reflect updated device latency.
Diffstat (limited to 'audio')
-rw-r--r--audio/out/ao_coreaudio.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/audio/out/ao_coreaudio.c b/audio/out/ao_coreaudio.c
index 4d983faba3..6d0e94ded3 100644
--- a/audio/out/ao_coreaudio.c
+++ b/audio/out/ao_coreaudio.c
@@ -137,6 +137,7 @@ static int control(struct ao *ao, enum aocontrol cmd, void *arg)
static bool init_audiounit(struct ao *ao, AudioStreamBasicDescription asbd);
static void init_physical_format(struct ao *ao);
+static void reinit_latency(struct ao *ao);
static bool reinit_device(struct ao *ao) {
struct priv *p = ao->priv;
@@ -175,6 +176,8 @@ static int init(struct ao *ao)
if (!init_audiounit(ao, asbd))
goto coreaudio_error;
+ reinit_latency(ao);
+
p->queue = dispatch_queue_create("io.mpv.coreaudio_stop_during_idle",
DISPATCH_QUEUE_SERIAL);
@@ -307,8 +310,6 @@ static bool init_audiounit(struct ao *ao, AudioStreamBasicDescription asbd)
CHECK_CA_ERROR_L(coreaudio_error_audiounit,
"can't link audio unit to selected device");
- p->hw_latency_ns = ca_get_hardware_latency(ao);
-
AURenderCallbackStruct render_cb = (AURenderCallbackStruct) {
.inputProc = render_cb_lpcm,
.inputProcRefCon = ao,
@@ -332,6 +333,13 @@ coreaudio_error:
return false;
}
+static void reinit_latency(struct ao *ao)
+{
+ struct priv *p = ao->priv;
+
+ p->hw_latency_ns = ca_get_hardware_latency(ao);
+}
+
static void stop(struct ao *ao)
{
struct priv *p = ao->priv;
@@ -432,8 +440,11 @@ static OSStatus hotplug_cb(AudioObjectID id, UInt32 naddr,
void *ctx)
{
struct ao *ao = ctx;
+ struct priv *p = ao->priv;
MP_VERBOSE(ao, "Handling potential hotplug event...\n");
reinit_device(ao);
+ if (p->audio_unit)
+ reinit_latency(ao);
ao_hotplug_event(ao);
return noErr;
}