[vlc-devel] [PATCH] auhal: add the "auhal-buffer-frame-size" option

Thomas Guillem thomas at gllm.fr
Tue Jul 21 16:01:25 CEST 2020


This option can be used to change the I/O buffer size.

cf. https://developer.apple.com/library/archive/technotes/tn2321/_index.html
---
 modules/audio_output/audiounit_ios.m    |  2 +-
 modules/audio_output/auhal.c            |  8 ++++++++
 modules/audio_output/coreaudio_common.c | 16 +++++++++++++++-
 modules/audio_output/coreaudio_common.h |  2 +-
 4 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/modules/audio_output/audiounit_ios.m b/modules/audio_output/audiounit_ios.m
index e0547b514f0..6de6af0aec7 100644
--- a/modules/audio_output/audiounit_ios.m
+++ b/modules/audio_output/audiounit_ios.m
@@ -536,7 +536,7 @@ Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
         vlc_tick_from_sec([p_sys->avInstance outputLatency]);
     msg_Dbg(p_aout, "Current device has a latency of %lld us", latency_us);
 
-    ret = au_Initialize(p_aout, p_sys->au_unit, fmt, layout, latency_us, NULL);
+    ret = au_Initialize(p_aout, p_sys->au_unit, fmt, layout, latency_us, 0, NULL);
     if (ret != VLC_SUCCESS)
         goto error;
 
diff --git a/modules/audio_output/auhal.c b/modules/audio_output/auhal.c
index ab614c92a00..0bf3b2b809a 100644
--- a/modules/audio_output/auhal.c
+++ b/modules/audio_output/auhal.c
@@ -46,6 +46,10 @@
 #define DEVICE_TEXT N_("Last audio device")
 #define DEVICE_LONGTEXT DEVICE_TEXT
 
+#define BUFFER_FRAME_SIZE_TEXT "Auhal I/O buffer size in frames"
+#define BUFFER_FRAME_SIZE_LONGTEXT "A low value (16-32) reduces audio latency," \
+    "a higher value (> 1024) improves power consumption"
+
 static int      Open                    (vlc_object_t *);
 static void     Close                   (vlc_object_t *);
 
@@ -59,6 +63,8 @@ vlc_module_begin ()
     add_integer("auhal-volume", AOUT_VOLUME_DEFAULT,
                 VOLUME_TEXT, VOLUME_LONGTEXT, true)
     change_integer_range(0, AOUT_VOLUME_MAX)
+    add_integer("auhal-buffer-frame-size", 0 /* system default */,
+                BUFFER_FRAME_SIZE_TEXT, BUFFER_FRAME_SIZE_LONGTEXT, true)
     add_string("auhal-audio-device", "", DEVICE_TEXT, DEVICE_LONGTEXT, true)
     add_string("auhal-warned-devices", "", NULL, NULL, true)
     change_private()
@@ -1112,7 +1118,9 @@ StartAnalog(audio_output_t *p_aout, audio_sample_format_t *fmt)
 
     /* Do the last VLC aout setups */
     bool warn_configuration;
+
     int ret = au_Initialize(p_aout, p_sys->au_unit, fmt, layout, 0,
+                            var_InheritInteger(p_aout, "auhal-buffer-frame-size"),
                             &warn_configuration);
     if (ret != VLC_SUCCESS)
         goto error;
diff --git a/modules/audio_output/coreaudio_common.c b/modules/audio_output/coreaudio_common.c
index 797c3e623d3..8d8be946edf 100644
--- a/modules/audio_output/coreaudio_common.c
+++ b/modules/audio_output/coreaudio_common.c
@@ -840,7 +840,7 @@ SetupInputLayout(audio_output_t *p_aout, const audio_sample_format_t *fmt,
 int
 au_Initialize(audio_output_t *p_aout, AudioUnit au, audio_sample_format_t *fmt,
               const AudioChannelLayout *outlayout, vlc_tick_t i_dev_latency_us,
-              bool *warn_configuration)
+              unsigned buffer_frame_size, bool *warn_configuration)
 {
     int ret;
     AudioChannelLayoutTag inlayout_tag;
@@ -938,6 +938,20 @@ au_Initialize(audio_output_t *p_aout, AudioUnit au, audio_sample_format_t *fmt,
         return VLC_EGENERIC;
     }
 
+    if (buffer_frame_size > 0)
+    {
+        UInt32 buffer_size = buffer_frame_size;
+        err = AudioUnitSetProperty(au, kAudioDevicePropertyBufferFrameSize,
+                                   kAudioUnitScope_Output, 0, &buffer_size,
+                                   sizeof(buffer_size));
+        if (err != noErr)
+        {
+            ca_LogErr("failed to setup buffer frame size");
+            return VLC_EGENERIC;
+        }
+    }
+
+
     /* AU init */
     err = AudioUnitInitialize(au);
 
diff --git a/modules/audio_output/coreaudio_common.h b/modules/audio_output/coreaudio_common.h
index 4bd61394937..272399689f8 100644
--- a/modules/audio_output/coreaudio_common.h
+++ b/modules/audio_output/coreaudio_common.h
@@ -111,6 +111,6 @@ AudioUnit au_NewOutputInstance(audio_output_t *p_aout, OSType comp_sub_type);
 int  au_Initialize(audio_output_t *p_aout, AudioUnit au,
                    audio_sample_format_t *fmt,
                    const AudioChannelLayout *outlayout, vlc_tick_t i_dev_latency_us,
-                   bool *warn_configuration);
+                   unsigned buffer_frame_size, bool *warn_configuration);
 
 void au_Uninitialize(audio_output_t *p_aout, AudioUnit au);
-- 
2.27.0



More information about the vlc-devel mailing list