sdlaudio: add -audiodev sdl,out.buffer-count option
Currently there is a crackling noise with SDL2 audio playback. Commit bcf19777df: "audio/sdlaudio: Allow audio playback with SDL2" already mentioned the crackling noise. Add an out.buffer-count option to give users a chance to select sane settings for glitch free audio playback. The idea was taken from the coreaudio backend. The in.buffer-count option will be used with one of the next patches. Signed-off-by: Volker Rümelin <vr_qemu@t-online.de> Acked-by: Markus Armbruster <armbru@redhat.com> Message-id: 9315afe5-5958-c0b4-ea1e-14769511a9d5@t-online.de Message-Id: <20210110100239.27588-3-vr_qemu@t-online.de> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
ff69c481a2
commit
5a0926c23f
|
@ -2003,7 +2003,7 @@ void audio_create_pdos(Audiodev *dev)
|
||||||
CASE(JACK, jack, Jack);
|
CASE(JACK, jack, Jack);
|
||||||
CASE(OSS, oss, Oss);
|
CASE(OSS, oss, Oss);
|
||||||
CASE(PA, pa, Pa);
|
CASE(PA, pa, Pa);
|
||||||
CASE(SDL, sdl, );
|
CASE(SDL, sdl, Sdl);
|
||||||
CASE(SPICE, spice, );
|
CASE(SPICE, spice, );
|
||||||
CASE(WAV, wav, );
|
CASE(WAV, wav, );
|
||||||
|
|
||||||
|
|
|
@ -286,7 +286,8 @@ static void handle_sdl(Audiodev *dev)
|
||||||
{
|
{
|
||||||
/* SDL is output only */
|
/* SDL is output only */
|
||||||
get_samples_to_usecs("QEMU_SDL_SAMPLES", &dev->u.sdl.out->buffer_length,
|
get_samples_to_usecs("QEMU_SDL_SAMPLES", &dev->u.sdl.out->buffer_length,
|
||||||
&dev->u.sdl.out->has_buffer_length, dev->u.sdl.out);
|
&dev->u.sdl.out->has_buffer_length,
|
||||||
|
qapi_AudiodevSdlPerDirectionOptions_base(dev->u.sdl.out));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* wav */
|
/* wav */
|
||||||
|
|
|
@ -337,7 +337,7 @@ AudiodevPerDirectionOptions *glue(audio_get_pdo_, TYPE)(Audiodev *dev)
|
||||||
case AUDIODEV_DRIVER_PA:
|
case AUDIODEV_DRIVER_PA:
|
||||||
return qapi_AudiodevPaPerDirectionOptions_base(dev->u.pa.TYPE);
|
return qapi_AudiodevPaPerDirectionOptions_base(dev->u.pa.TYPE);
|
||||||
case AUDIODEV_DRIVER_SDL:
|
case AUDIODEV_DRIVER_SDL:
|
||||||
return dev->u.sdl.TYPE;
|
return qapi_AudiodevSdlPerDirectionOptions_base(dev->u.sdl.TYPE);
|
||||||
case AUDIODEV_DRIVER_SPICE:
|
case AUDIODEV_DRIVER_SPICE:
|
||||||
return dev->u.spice.TYPE;
|
return dev->u.spice.TYPE;
|
||||||
case AUDIODEV_DRIVER_WAV:
|
case AUDIODEV_DRIVER_WAV:
|
||||||
|
|
|
@ -276,12 +276,18 @@ static int sdl_init_out(HWVoiceOut *hw, struct audsettings *as,
|
||||||
int endianness;
|
int endianness;
|
||||||
int err;
|
int err;
|
||||||
AudioFormat effective_fmt;
|
AudioFormat effective_fmt;
|
||||||
|
AudiodevSdlPerDirectionOptions *spdo = s->dev->u.sdl.out;
|
||||||
struct audsettings obt_as;
|
struct audsettings obt_as;
|
||||||
|
|
||||||
req.freq = as->freq;
|
req.freq = as->freq;
|
||||||
req.format = aud_to_sdlfmt (as->fmt);
|
req.format = aud_to_sdlfmt (as->fmt);
|
||||||
req.channels = as->nchannels;
|
req.channels = as->nchannels;
|
||||||
req.samples = audio_buffer_samples(s->dev->u.sdl.out, as, 11610);
|
/*
|
||||||
|
* This is wrong. SDL samples are QEMU frames. The buffer size will be
|
||||||
|
* the requested buffer size multiplied by the number of channels.
|
||||||
|
*/
|
||||||
|
req.samples = audio_buffer_samples(
|
||||||
|
qapi_AudiodevSdlPerDirectionOptions_base(spdo), as, 11610);
|
||||||
req.callback = sdl_callback;
|
req.callback = sdl_callback;
|
||||||
req.userdata = sdl;
|
req.userdata = sdl;
|
||||||
|
|
||||||
|
@ -301,7 +307,8 @@ static int sdl_init_out(HWVoiceOut *hw, struct audsettings *as,
|
||||||
obt_as.endianness = endianness;
|
obt_as.endianness = endianness;
|
||||||
|
|
||||||
audio_pcm_init_info (&hw->info, &obt_as);
|
audio_pcm_init_info (&hw->info, &obt_as);
|
||||||
hw->samples = obt.samples;
|
hw->samples = (spdo->has_buffer_count ? spdo->buffer_count : 4) *
|
||||||
|
obt.samples;
|
||||||
|
|
||||||
s->initialized = 1;
|
s->initialized = 1;
|
||||||
s->exit = 0;
|
s->exit = 0;
|
||||||
|
|
|
@ -301,6 +301,37 @@
|
||||||
'*out': 'AudiodevPaPerDirectionOptions',
|
'*out': 'AudiodevPaPerDirectionOptions',
|
||||||
'*server': 'str' } }
|
'*server': 'str' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @AudiodevSdlPerDirectionOptions:
|
||||||
|
#
|
||||||
|
# Options of the SDL audio backend that are used for both playback and
|
||||||
|
# recording.
|
||||||
|
#
|
||||||
|
# @buffer-count: number of buffers (default 4)
|
||||||
|
#
|
||||||
|
# Since: 6.0
|
||||||
|
##
|
||||||
|
{ 'struct': 'AudiodevSdlPerDirectionOptions',
|
||||||
|
'base': 'AudiodevPerDirectionOptions',
|
||||||
|
'data': {
|
||||||
|
'*buffer-count': 'uint32' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @AudiodevSdlOptions:
|
||||||
|
#
|
||||||
|
# Options of the SDL audio backend.
|
||||||
|
#
|
||||||
|
# @in: options of the recording stream
|
||||||
|
#
|
||||||
|
# @out: options of the playback stream
|
||||||
|
#
|
||||||
|
# Since: 6.0
|
||||||
|
##
|
||||||
|
{ 'struct': 'AudiodevSdlOptions',
|
||||||
|
'data': {
|
||||||
|
'*in': 'AudiodevSdlPerDirectionOptions',
|
||||||
|
'*out': 'AudiodevSdlPerDirectionOptions' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @AudiodevWavOptions:
|
# @AudiodevWavOptions:
|
||||||
#
|
#
|
||||||
|
@ -385,6 +416,6 @@
|
||||||
'jack': 'AudiodevJackOptions',
|
'jack': 'AudiodevJackOptions',
|
||||||
'oss': 'AudiodevOssOptions',
|
'oss': 'AudiodevOssOptions',
|
||||||
'pa': 'AudiodevPaOptions',
|
'pa': 'AudiodevPaOptions',
|
||||||
'sdl': 'AudiodevGenericOptions',
|
'sdl': 'AudiodevSdlOptions',
|
||||||
'spice': 'AudiodevGenericOptions',
|
'spice': 'AudiodevGenericOptions',
|
||||||
'wav': 'AudiodevWavOptions' } }
|
'wav': 'AudiodevWavOptions' } }
|
||||||
|
|
|
@ -588,6 +588,7 @@ DEF("audiodev", HAS_ARG, QEMU_OPTION_audiodev,
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_AUDIO_SDL
|
#ifdef CONFIG_AUDIO_SDL
|
||||||
"-audiodev sdl,id=id[,prop[=value][,...]]\n"
|
"-audiodev sdl,id=id[,prop[=value][,...]]\n"
|
||||||
|
" in|out.buffer-count= number of buffers\n"
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_SPICE
|
#ifdef CONFIG_SPICE
|
||||||
"-audiodev spice,id=id[,prop[=value][,...]]\n"
|
"-audiodev spice,id=id[,prop[=value][,...]]\n"
|
||||||
|
@ -745,7 +746,12 @@ SRST
|
||||||
``-audiodev sdl,id=id[,prop[=value][,...]]``
|
``-audiodev sdl,id=id[,prop[=value][,...]]``
|
||||||
Creates a backend using SDL. This backend is available on most
|
Creates a backend using SDL. This backend is available on most
|
||||||
systems, but you should use your platform's native backend if
|
systems, but you should use your platform's native backend if
|
||||||
possible. This backend has no backend specific properties.
|
possible.
|
||||||
|
|
||||||
|
SDL specific options are:
|
||||||
|
|
||||||
|
``in|out.buffer-count=count``
|
||||||
|
Sets the count of the buffers.
|
||||||
|
|
||||||
``-audiodev spice,id=id[,prop[=value][,...]]``
|
``-audiodev spice,id=id[,prop[=value][,...]]``
|
||||||
Creates a backend that sends audio through SPICE. This backend
|
Creates a backend that sends audio through SPICE. This backend
|
||||||
|
|
Loading…
Reference in New Issue