diff mbox series

[V2,2/3] audio/paaudio: prolong and make latency configurable

Message ID 20190314142634.34537-3-martin@schrodt.org
State New
Headers show
Series Fixes for PulseAudio driver | expand

Commit Message

Martin Schrodt March 14, 2019, 2:26 p.m. UTC
The latency of a connection to the PulseAudio server is determined by the tlength parameter. This was hardcoded to 10ms, which is a bit too tight on my machine, causing audio on host and guest to malfunction. A setting of 15ms works fine here. To allow tweaking, I also made the setting configurable via the new -audiodev config.

Signed-off-by: Martin Schrodt <martin@schrodt.org>
---
 audio/paaudio.c | 18 +++++++-----------
 qapi/audio.json |  6 +++++-
 2 files changed, 12 insertions(+), 12 deletions(-)
diff mbox series

Patch

diff --git a/audio/paaudio.c b/audio/paaudio.c
index 1a799ca3e7..c9007fdb01 100644
--- a/audio/paaudio.c
+++ b/audio/paaudio.c
@@ -500,16 +500,12 @@  static pa_stream *qpa_simple_new (
     if (dir == PA_STREAM_PLAYBACK) {
         r = pa_stream_connect_playback (stream, dev, attr,
                                         PA_STREAM_INTERPOLATE_TIMING
-#ifdef PA_STREAM_ADJUST_LATENCY
                                         |PA_STREAM_ADJUST_LATENCY
-#endif
                                         |PA_STREAM_AUTO_TIMING_UPDATE, NULL, NULL);
     } else {
         r = pa_stream_connect_record (stream, dev, attr,
                                       PA_STREAM_INTERPOLATE_TIMING
-#ifdef PA_STREAM_ADJUST_LATENCY
                                       |PA_STREAM_ADJUST_LATENCY
-#endif
                                       |PA_STREAM_AUTO_TIMING_UPDATE);
     }
 
@@ -549,12 +545,8 @@  static int qpa_init_out(HWVoiceOut *hw, struct audsettings *as,
     ss.channels = as->nchannels;
     ss.rate = as->freq;
 
-    /*
-     * qemu audio tick runs at 100 Hz (by default), so processing
-     * data chunks worth 10 ms of sound should be a good fit.
-     */
-    ba.tlength = pa_usec_to_bytes (10 * 1000, &ss);
-    ba.minreq = pa_usec_to_bytes (5 * 1000, &ss);
+    ba.tlength = pa_usec_to_bytes (ppdo->latency, &ss);
+    ba.minreq = -1;
     ba.maxlength = -1;
     ba.prebuf = -1;
 
@@ -813,7 +805,11 @@  static int qpa_validate_per_direction_opts (Audiodev *dev, AudiodevPaPerDirectio
 {
     if (!pdo->has_buffer_length) {
         pdo->has_buffer_length = true;
-        pdo->buffer_length = dev->timer_period * 4;
+        pdo->buffer_length = dev->timer_period * 9 / 2;
+    }
+    if (!pdo->has_latency) {
+        pdo->has_latency = true;
+        pdo->latency = 15000;
     }
     return 1;
 }
diff --git a/qapi/audio.json b/qapi/audio.json
index 97aee37288..9fefdf5186 100644
--- a/qapi/audio.json
+++ b/qapi/audio.json
@@ -206,12 +206,16 @@ 
 #
 # @name: name of the sink/source to use
 #
+# @latency: latency you want PulseAudio to achieve in microseconds
+#           (default 15000)
+#
 # Since: 4.0
 ##
 { 'struct': 'AudiodevPaPerDirectionOptions',
   'base': 'AudiodevPerDirectionOptions',
   'data': {
-    '*name': 'str' } }
+    '*name': 'str',
+    '*latency': 'uint32' } }
 
 ##
 # @AudiodevPaOptions: