aboutsummaryrefslogtreecommitdiff
path: root/audio
diff options
context:
space:
mode:
authorVolker Rümelin <vr_qemu@t-online.de>2023-01-21 10:47:25 +0100
committerMarc-André Lureau <marcandre.lureau@redhat.com>2023-03-06 10:30:23 +0400
commitb9ae74e2e497154f77b109743c77fa97c71d71c1 (patch)
treeaa0cc1642ad8e54ba470468e2e7ed9f8bd1f9df4 /audio
parentcc99139bae83cdc6116d6435b594837d54bd035c (diff)
audio: log unimplemented audio device sample rates
Some emulated audio devices allow guests to select very low sample rates that the audio subsystem doesn't support. The lowest supported sample rate depends on the audio backend used and in most cases can be changed with various -audiodev arguments. Until now, the audio_bug function emits an error message similar to the following error message A bug was just triggered in audio_calloc Save all your work and restart without audio I am sorry Context: audio_pcm_sw_alloc_resources_out passed invalid arguments to audio_calloc nmemb=0 size=16 (len=0) audio: Could not allocate buffer for `ac97.po' (0 samples) and the audio subsystem continues without sound for the affected device. The fact that the selected sample rate is not supported is not a guest error. Instead of displaying an error message, the missing audio support is now logged. Simply continuing without sound is correct, since the audio stream won't transport anything reasonable at such high resample ratios anyway. The AUD_open_* functions return NULL like before. The opened audio device will not be registered in the audio subsystem and consequently the audio frontend callback functions will not be called. The AUD_read and AUD_write functions return early in this case. This is necessary because, for example, the Sound Blaster 16 emulation calls AUD_write from the DMA callback function. Acked-by: Christian Schoenebeck <qemu_oss@crudebyte.com> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20230121094735.11644-1-vr_qemu@t-online.de>
Diffstat (limited to 'audio')
-rw-r--r--audio/audio.c1
-rw-r--r--audio/audio_template.h13
2 files changed, 14 insertions, 0 deletions
diff --git a/audio/audio.c b/audio/audio.c
index 4290309d18..81f5c0bb1e 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -33,6 +33,7 @@
#include "qapi/qapi-visit-audio.h"
#include "qapi/qapi-commands-audio.h"
#include "qemu/cutils.h"
+#include "qemu/log.h"
#include "qemu/module.h"
#include "qemu/help_option.h"
#include "sysemu/sysemu.h"
diff --git a/audio/audio_template.h b/audio/audio_template.h
index 42b4712acb..dbfb4fee4c 100644
--- a/audio/audio_template.h
+++ b/audio/audio_template.h
@@ -115,6 +115,19 @@ static int glue (audio_pcm_sw_alloc_resources_, TYPE) (SW *sw)
#else
samples = (int64_t)sw->HWBUF->size * sw->ratio >> 32;
#endif
+ if (samples == 0) {
+ HW *hw = sw->hw;
+ size_t f_fe_min;
+
+ /* f_fe_min = ceil(1 [frames] * f_be [Hz] / size_be [frames]) */
+ f_fe_min = (hw->info.freq + HWBUF->size - 1) / HWBUF->size;
+ qemu_log_mask(LOG_UNIMP,
+ AUDIO_CAP ": The guest selected a " NAME " sample rate"
+ " of %d Hz for %s. Only sample rates >= %zu Hz are"
+ " supported.\n",
+ sw->info.freq, sw->name, f_fe_min);
+ return -1;
+ }
sw->buf = audio_calloc(__func__, samples, sizeof(struct st_sample));
if (!sw->buf) {