On 27/01/2026 18:24, [email protected] wrote:

From: Marc-AndrĂ© Lureau <[email protected]>

The ALSA audio backend uses its own logging infrastructure (AUD_log,
AUD_vlog, dolog, ldebug) and a custom alsa_dump_info() debug helper.
This approach is inconsistent with the rest of QEMU and makes the
output harder to filter and configure.

Replace the custom logging with standard QEMU error reporting:
- Use error_report() / error_printf() for errors
- Use warn_report() for non-fatal warnings (invalid formats,
   rejected parameters, unexpected states)
- Convert ldebug() calls and alsa_dump_info() to trace events

Remove DEBUG_ALSA and AUDIO_CAP macros which are no longer needed.

Signed-off-by: Marc-AndrĂ© Lureau <[email protected]>
---
  audio/alsaaudio.c  | 169 ++++++++++++++++++---------------------------
  audio/trace-events |   5 ++
  2 files changed, 72 insertions(+), 102 deletions(-)

diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c
index d3697a148da..3058af58e0b 100644
--- a/audio/alsaaudio.c
+++ b/audio/alsaaudio.c
@@ -26,17 +26,15 @@
  #include <alsa/asoundlib.h>
  #include "qemu/main-loop.h"
  #include "qemu/module.h"
+#include "qemu/error-report.h"
  #include "qemu/audio.h"
  #include "qom/object.h"
  #include "trace.h"
#pragma GCC diagnostic ignored "-Waddress" -#define AUDIO_CAP "alsa"
  #include "audio_int.h"
-#define DEBUG_ALSA 0
-
  #define TYPE_AUDIO_ALSA "audio-alsa"
  OBJECT_DECLARE_SIMPLE_TYPE(AudioALSA, AUDIO_ALSA)
@@ -81,33 +79,29 @@ struct alsa_params_obt {
      snd_pcm_uframes_t samples;
  };
-static void G_GNUC_PRINTF (2, 3) alsa_logerr (int err, const char *fmt, ...)
+static void G_GNUC_PRINTF(2, 3) alsa_logerr(int err, const char *fmt, ...)
  {
      va_list ap;
- va_start (ap, fmt);
-    AUD_vlog (AUDIO_CAP, fmt, ap);
-    va_end (ap);
-
-    AUD_log (AUDIO_CAP, "Reason: %s\n", snd_strerror (err));
+    error_printf("alsa: ");
+    va_start(ap, fmt);
+    error_vprintf(fmt, ap);
+    va_end(ap);
+    error_printf(" Reason: %s", snd_strerror(err));
+    error_printf("\n");
  }
-static void G_GNUC_PRINTF (3, 4) alsa_logerr2 (
-    int err,
-    const char *typ,
-    const char *fmt,
-    ...
-    )
+static void G_GNUC_PRINTF(3, 4) alsa_logerr2(int err, const char *typ,
+                                             const char *fmt, ...)
  {
      va_list ap;
- AUD_log (AUDIO_CAP, "Could not initialize %s\n", typ);
-
-    va_start (ap, fmt);
-    AUD_vlog (AUDIO_CAP, fmt, ap);
-    va_end (ap);
-
-    AUD_log (AUDIO_CAP, "Reason: %s\n", snd_strerror (err));
+    error_printf("alsa: Could not initialize %s:", typ);
+    va_start(ap, fmt);
+    error_vprintf(fmt, ap);
+    va_end(ap);
+    error_printf(" Reason: %s", snd_strerror(err));
+    error_printf("\n");
  }
static void alsa_fini_poll (struct pollhlp *hlp)
@@ -130,7 +124,7 @@ static void alsa_anal_close1 (snd_pcm_t **handlep)
  {
      int err = snd_pcm_close (*handlep);
      if (err) {
-        alsa_logerr (err, "Failed to close PCM handle %p\n", *handlep);
+        alsa_logerr(err, "Failed to close PCM handle %p", *handlep);
      }
      *handlep = NULL;
  }
@@ -145,7 +139,7 @@ static int alsa_recover (snd_pcm_t *handle)
  {
      int err = snd_pcm_prepare (handle);
      if (err < 0) {
-        alsa_logerr (err, "Failed to prepare handle %p\n", handle);
+        alsa_logerr(err, "Failed to prepare handle %p", handle);
          return -1;
      }
      return 0;
@@ -155,7 +149,7 @@ static int alsa_resume (snd_pcm_t *handle)
  {
      int err = snd_pcm_resume (handle);
      if (err < 0) {
-        alsa_logerr (err, "Failed to resume handle %p\n", handle);
+        alsa_logerr(err, "Failed to resume handle %p", handle);
          return -1;
      }
      return 0;
@@ -170,7 +164,7 @@ static void alsa_poll_handler (void *opaque)
count = poll (hlp->pfds, hlp->count, 0);
      if (count < 0) {
-        dolog ("alsa_poll_handler: poll %s\n", strerror (errno));
+        warn_report("alsa_poll_handler: poll %s", strerror(errno));
          return;
      }
@@ -183,7 +177,7 @@ static void alsa_poll_handler (void *opaque)
      err = snd_pcm_poll_descriptors_revents (hlp->handle, hlp->pfds,
                                              hlp->count, &revents);
      if (err < 0) {
-        alsa_logerr (err, "snd_pcm_poll_descriptors_revents");
+        alsa_logerr(err, "snd_pcm_poll_descriptors_revents");
          return;
      }
@@ -215,7 +209,7 @@ static void alsa_poll_handler (void *opaque)
          break;
default:
-        dolog ("Unexpected state %d\n", state);
+        warn_report("alsa: Unexpected state %d", state);
      }
  }
@@ -226,8 +220,8 @@ static int alsa_poll_helper (snd_pcm_t *handle, struct pollhlp *hlp, int mask) count = snd_pcm_poll_descriptors_count (handle);
      if (count <= 0) {
-        dolog ("Could not initialize poll mode\n"
-               "Invalid number of poll descriptors %d\n", count);
+        warn_report("alsa: Could not initialize poll mode: "
+                    "Invalid number of poll descriptors %d", count);
          return -1;
      }
@@ -235,8 +229,7 @@ static int alsa_poll_helper (snd_pcm_t *handle, struct pollhlp *hlp, int mask) err = snd_pcm_poll_descriptors (handle, pfds, count);
      if (err < 0) {
-        alsa_logerr (err, "Could not initialize poll mode\n"
-                     "Could not obtain poll descriptors\n");
+        alsa_logerr(err, "Could not initialize poll mode: Could not obtain poll 
descriptors");
          g_free (pfds);
          return -1;
      }
@@ -298,10 +291,7 @@ static snd_pcm_format_t aud_to_alsafmt(AudioFormat fmt, 
bool big_endian)
          return big_endian ? SND_PCM_FORMAT_FLOAT_BE : SND_PCM_FORMAT_FLOAT_LE;
default:
-        dolog ("Internal logic error: Bad audio format %d\n", fmt);
-#ifdef DEBUG_AUDIO
-        abort ();
-#endif
+        warn_report("alsa: Internal logic error: Bad audio format %d", fmt);
          return SND_PCM_FORMAT_U8;
      }
  }
@@ -371,29 +361,13 @@ static int alsa_to_audfmt (snd_pcm_format_t alsafmt, 
AudioFormat *fmt,
          break;
default:
-        dolog ("Unrecognized audio format %d\n", alsafmt);
+        warn_report("alsa: Unrecognized audio format %d", alsafmt);
          return -1;
      }
return 0;
  }
-static void alsa_dump_info (struct alsa_params_req *req,
-                            struct alsa_params_obt *obt,
-                            snd_pcm_format_t obtfmt,
-                            AudiodevAlsaPerDirectionOptions *apdo)
-{
-    dolog("parameter | requested value | obtained value\n");
-    dolog("format    |      %10d |     %10d\n", req->fmt, obtfmt);
-    dolog("channels  |      %10d |     %10d\n",
-          req->nchannels, obt->nchannels);
-    dolog("frequency |      %10d |     %10d\n", req->freq, obt->freq);
-    dolog("============================================\n");
-    dolog("requested: buffer len %" PRId32 " period len %" PRId32 "\n",
-          apdo->buffer_length, apdo->period_length);
-    dolog("obtained: samples %ld\n", obt->samples);
-}
-
  static void alsa_set_threshold (snd_pcm_t *handle, snd_pcm_uframes_t 
threshold)
  {
      int err;
@@ -403,23 +377,22 @@ static void alsa_set_threshold (snd_pcm_t *handle, 
snd_pcm_uframes_t threshold)
err = snd_pcm_sw_params_current (handle, sw_params);
      if (err < 0) {
-        dolog ("Could not fully initialize DAC\n");
-        alsa_logerr (err, "Failed to get current software parameters\n");
+        error_report("alsa: Could not fully initialize DAC");
+        alsa_logerr(err, "Failed to get current software parameters");
          return;
      }
err = snd_pcm_sw_params_set_start_threshold (handle, sw_params, threshold);
      if (err < 0) {
-        dolog ("Could not fully initialize DAC\n");
-        alsa_logerr (err, "Failed to set software threshold to %ld\n",
-                     threshold);
+        error_report("alsa: Could not fully initialize DAC");
+        alsa_logerr(err, "Failed to set software threshold to %ld", threshold);
          return;
      }
err = snd_pcm_sw_params (handle, sw_params);
      if (err < 0) {
-        dolog ("Could not fully initialize DAC\n");
-        alsa_logerr (err, "Failed to set software parameters\n");
+        error_report("alsa: Could not fully initialize DAC");
+        alsa_logerr(err, "Failed to set software parameters");
          return;
      }
  }
@@ -451,13 +424,13 @@ static int alsa_open(bool in, struct alsa_params_req *req,
          SND_PCM_NONBLOCK
          );
      if (err < 0) {
-        alsa_logerr2 (err, typ, "Failed to open `%s':\n", pcm_name);
+        alsa_logerr2(err, typ, "Failed to open `%s'", pcm_name);
          return -1;
      }
err = snd_pcm_hw_params_any (handle, hw_params);
      if (err < 0) {
-        alsa_logerr2 (err, typ, "Failed to initialize hardware parameters\n");
+        alsa_logerr2(err, typ, "Failed to initialize hardware parameters");
          goto err;
      }
@@ -467,18 +440,18 @@ static int alsa_open(bool in, struct alsa_params_req *req,
          SND_PCM_ACCESS_RW_INTERLEAVED
          );
      if (err < 0) {
-        alsa_logerr2 (err, typ, "Failed to set access type\n");
+        alsa_logerr2(err, typ, "Failed to set access type");
          goto err;
      }
err = snd_pcm_hw_params_set_format (handle, hw_params, req->fmt);
      if (err < 0) {
-        alsa_logerr2 (err, typ, "Failed to set format %d\n", req->fmt);
+        alsa_logerr2(err, typ, "Failed to set format %d", req->fmt);
      }
err = snd_pcm_hw_params_set_rate_near (handle, hw_params, &freq, 0);
      if (err < 0) {
-        alsa_logerr2 (err, typ, "Failed to set frequency %d\n", req->freq);
+        alsa_logerr2(err, typ, "Failed to set frequency %d", req->freq);
          goto err;
      }
@@ -488,8 +461,7 @@ static int alsa_open(bool in, struct alsa_params_req *req,
          &nchannels
          );
      if (err < 0) {
-        alsa_logerr2 (err, typ, "Failed to set number of channels %d\n",
-                      req->nchannels);
+        alsa_logerr2(err, typ, "Failed to set number of channels %d", 
req->nchannels);
          goto err;
      }
@@ -501,14 +473,14 @@ static int alsa_open(bool in, struct alsa_params_req *req,
              handle, hw_params, &btime, &dir);
if (err < 0) {
-            alsa_logerr2(err, typ, "Failed to set buffer time to %" PRId32 
"\n",
+            alsa_logerr2(err, typ, "Failed to set buffer time to %" PRId32,
                           apdo->buffer_length);
              goto err;
          }
if (apdo->has_buffer_length && btime != apdo->buffer_length) {
-            dolog("Requested buffer time %" PRId32
-                  " was rejected, using %u\n", apdo->buffer_length, btime);
+            warn_report("alsa: Requested buffer time %" PRId32 " was rejected, 
using %u",
+                        apdo->buffer_length, btime);
          }
      }
@@ -520,43 +492,43 @@ static int alsa_open(bool in, struct alsa_params_req *req,
                                                       &dir);
if (err < 0) {
-            alsa_logerr2(err, typ, "Failed to set period time to %" PRId32 
"\n",
+            alsa_logerr2(err, typ, "Failed to set period time to %" PRId32,
                           apdo->period_length);
              goto err;
          }
if (apdo->has_period_length && ptime != apdo->period_length) {
-            dolog("Requested period time %" PRId32 " was rejected, using %d\n",
-                  apdo->period_length, ptime);
+            warn_report("alsa: Requested period time %" PRId32 " was rejected, 
using %d",
+                        apdo->period_length, ptime);
          }
      }
err = snd_pcm_hw_params (handle, hw_params);
      if (err < 0) {
-        alsa_logerr2 (err, typ, "Failed to apply audio parameters\n");
+        alsa_logerr2(err, typ, "Failed to apply audio parameters");
          goto err;
      }
err = snd_pcm_hw_params_get_buffer_size (hw_params, &obt_buffer_size);
      if (err < 0) {
-        alsa_logerr2 (err, typ, "Failed to get buffer size\n");
+        alsa_logerr2(err, typ, "Failed to get buffer size");
          goto err;
      }
err = snd_pcm_hw_params_get_format (hw_params, &obtfmt);
      if (err < 0) {
-        alsa_logerr2 (err, typ, "Failed to get format\n");
+        alsa_logerr2(err, typ, "Failed to get format");
          goto err;
      }
if (alsa_to_audfmt (obtfmt, &obt->fmt, &obt->endianness)) {
-        dolog ("Invalid format was returned %d\n", obtfmt);
+        error_report("alsa: Invalid format was returned %d", obtfmt);
          goto err;
      }
err = snd_pcm_prepare (handle);
      if (err < 0) {
-        alsa_logerr2 (err, typ, "Could not prepare handle %p\n", handle);
+        alsa_logerr2(err, typ, "Could not prepare handle %p", handle);
          goto err;
      }
@@ -574,11 +546,9 @@ static int alsa_open(bool in, struct alsa_params_req *req, *handlep = handle; - if (DEBUG_ALSA || obtfmt != req->fmt ||
-        obt->nchannels != req->nchannels || obt->freq != req->freq) {
-        dolog ("Audio parameters for %s\n", typ);
-        alsa_dump_info(req, obt, obtfmt, apdo);
-    }
+    trace_alsa_info_params(req->fmt, obtfmt, req->nchannels, obt->nchannels,
+                           req->freq, obt->freq);
+    trace_alsa_info_samples(apdo->buffer_length, apdo->period_length, 
obt->samples);
return 0; @@ -601,8 +571,7 @@ static size_t alsa_buffer_get_free(HWVoiceOut *hw)
              }
          }
          if (avail < 0) {
-            alsa_logerr(avail,
-                        "Could not obtain number of available frames\n");
+            alsa_logerr(avail, "Could not obtain number of available frames");
              avail = 0;
          }
      }
@@ -643,8 +612,7 @@ static size_t alsa_write(HWVoiceOut *hw, void *buf, size_t 
len)
case -EPIPE:
                  if (alsa_recover(alsa->handle)) {
-                    alsa_logerr(written, "Failed to write %zu frames\n",
-                                len_frames);
+                    alsa_logerr(written, "Failed to write %zu frames", 
len_frames);
                      return pos;
                  }
                  trace_alsa_xrun_out();
@@ -656,8 +624,7 @@ static size_t alsa_write(HWVoiceOut *hw, void *buf, size_t 
len)
                   * recovery
                   */
                  if (alsa_resume(alsa->handle)) {
-                    alsa_logerr(written, "Failed to write %zu frames\n",
-                                len_frames);
+                    alsa_logerr(written, "Failed to write %zu frames", 
len_frames);
                      return pos;
                  }
                  trace_alsa_resume_out();
@@ -667,8 +634,7 @@ static size_t alsa_write(HWVoiceOut *hw, void *buf, size_t 
len)
                  return pos;
default:
-                alsa_logerr(written, "Failed to write %zu frames from %p\n",
-                            len, src);
+                alsa_logerr(written, "Failed to write %zu frames from %p", 
len_frames, src);
                  return pos;
              }
          }
@@ -687,7 +653,7 @@ static void alsa_fini_out (HWVoiceOut *hw)
  {
      ALSAVoiceOut *alsa = (ALSAVoiceOut *) hw;
- ldebug ("alsa_fini\n");
+    trace_alsa_fini_out();
      alsa_anal_close (&alsa->handle, &alsa->pollhlp);
  }
@@ -732,19 +698,19 @@ static int alsa_voice_ctl (snd_pcm_t *handle, const char *typ, int ctl)
      if (ctl == VOICE_CTL_PAUSE) {
          err = snd_pcm_drop (handle);
          if (err < 0) {
-            alsa_logerr (err, "Could not stop %s\n", typ);
+            alsa_logerr(err, "Could not stop %s", typ);
              return -1;
          }
      } else {
          err = snd_pcm_prepare (handle);
          if (err < 0) {
-            alsa_logerr (err, "Could not prepare handle for %s\n", typ);
+            alsa_logerr(err, "Could not prepare handle for %s", typ);
              return -1;
          }
          if (ctl == VOICE_CTL_START) {
              err = snd_pcm_start(handle);
              if (err < 0) {
-                alsa_logerr (err, "Could not start handle for %s\n", typ);
+                alsa_logerr(err, "Could not start handle for %s", typ);
                  return -1;
              }
          }
@@ -758,17 +724,17 @@ static void alsa_enable_out(HWVoiceOut *hw, bool enable)
      ALSAVoiceOut *alsa = (ALSAVoiceOut *) hw;
      AudiodevAlsaPerDirectionOptions *apdo = hw->s->dev->u.alsa.out;
+ trace_alsa_enable_out(enable);
+
      if (enable) {
          bool poll_mode = apdo->try_poll;
- ldebug("enabling voice\n");
          if (poll_mode && alsa_poll_out(hw)) {
              poll_mode = 0;
          }
          hw->poll_mode = poll_mode;
          alsa_voice_ctl(alsa->handle, "playback", VOICE_CTL_PREPARE);
      } else {
-        ldebug("disabling voice\n");
          if (hw->poll_mode) {
              hw->poll_mode = 0;
              alsa_fini_poll(&alsa->pollhlp);
@@ -834,7 +800,7 @@ static size_t alsa_read(HWVoiceIn *hw, void *buf, size_t 
len)
case -EPIPE:
                  if (alsa_recover(alsa->handle)) {
-                    alsa_logerr(nread, "Failed to read %zu frames\n", len);
+                    alsa_logerr(nread, "Failed to read %zu frames", len);
                      return pos;
                  }
                  trace_alsa_xrun_in();
@@ -844,8 +810,7 @@ static size_t alsa_read(HWVoiceIn *hw, void *buf, size_t 
len)
                  return pos;
default:
-                alsa_logerr(nread, "Failed to read %zu frames to %p\n",
-                            len, dst);
+                alsa_logerr(nread, "Failed to read %zu frames to %p", len, 
dst);
                  return pos;
              }
          }
@@ -862,10 +827,11 @@ static void alsa_enable_in(HWVoiceIn *hw, bool enable)
      ALSAVoiceIn *alsa = (ALSAVoiceIn *) hw;
      AudiodevAlsaPerDirectionOptions *apdo = hw->s->dev->u.alsa.in;
+ trace_alsa_enable_in(enable);
+
      if (enable) {
          bool poll_mode = apdo->try_poll;
- ldebug("enabling voice\n");
          if (poll_mode && alsa_poll_in(hw)) {
              poll_mode = 0;
          }
@@ -873,7 +839,6 @@ static void alsa_enable_in(HWVoiceIn *hw, bool enable)
alsa_voice_ctl(alsa->handle, "capture", VOICE_CTL_START);
      } else {
-        ldebug ("disabling voice\n");
          if (hw->poll_mode) {
              hw->poll_mode = 0;
              alsa_fini_poll(&alsa->pollhlp);
diff --git a/audio/trace-events b/audio/trace-events
index f7f639d9605..737e3e60694 100644
--- a/audio/trace-events
+++ b/audio/trace-events
@@ -9,6 +9,11 @@ alsa_read_zero(long len) "Failed to read %ld frames (read 
zero)"
  alsa_xrun_out(void) "Recovering from playback xrun"
  alsa_xrun_in(void) "Recovering from capture xrun"
  alsa_resume_out(void) "Resuming suspended output stream"
+alsa_info_params(int req_fmt, int obt_fmt, int req_channels, int obt_channels, int req_freq, int 
obt_freq) "format %d->%d, channels %d->%d, frequency %d->%d"
+alsa_info_samples(int buffer_length, int period_length, long samples) "requested: 
buffer len %d, period len %d; obtained: %ld samples"
+alsa_fini_out(void) ""
+alsa_enable_out(bool enable) "enable=%d"
+alsa_enable_in(bool enable) "enable=%d"
# ossaudio.c
  oss_version(int version) "OSS version = 0x%x"

Reviewed-by: Mark Cave-Ayland <[email protected]>


ATB,

Mark.


Reply via email to