qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v5 04/14] audio: -audiodev command line option b


From: Zoltán Kővágó
Subject: Re: [Qemu-devel] [PATCH v5 04/14] audio: -audiodev command line option basic implementation
Date: Tue, 26 Feb 2019 02:39:38 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1

On 2019-02-20 22:37, Kővágó, Zoltán wrote:
[...]
> diff --git a/audio/audio.c b/audio/audio.c
> index ce8e6ea8c2..8ad8cbe559 100644
> --- a/audio/audio.c
> +++ b/audio/audio.c
[...]
> @@ -2129,3 +1866,170 @@ void AUD_set_volume_in (SWVoiceIn *sw, int mute, 
> uint8_t lvol, uint8_t rvol)
>          }
>      }
>  }
> +
> +void audio_create_pdos(Audiodev *dev)
> +{
> +    switch (dev->driver) {
> +#define CASE(DRIVER, driver, pdo_name)                              \
> +    case AUDIODEV_DRIVER_##DRIVER:                                  \
> +        dev->u.driver.in = g_malloc0(                               \
> +            sizeof(Audiodev##pdo_name##PerDirectionOptions));       \
This should check has_in before overwriting. It'll work correctly when
called from audio_legacy.c, but when using -audiodev it will overwrite
the options passed by user (and leak memory) when called from
audio_validate_opts. I'll fix it in the next update.

> +        dev->u.driver.has_in = true;                                \
> +        dev->u.driver.out = g_malloc0(                              \
> +            sizeof(AudiodevAlsaPerDirectionOptions));               \
> +        dev->u.driver.has_out = true;                               \
> +        break
> +
> +        CASE(NONE, none, );
> +        CASE(ALSA, alsa, Alsa);
> +        CASE(COREAUDIO, coreaudio, Coreaudio);
> +        CASE(DSOUND, dsound, );
> +        CASE(OSS, oss, Oss);
> +        CASE(PA, pa, Pa);
> +        CASE(SDL, sdl, );
> +        CASE(SPICE, spice, );
> +        CASE(WAV, wav, );
> +
> +    case AUDIODEV_DRIVER__MAX:
> +        abort();
> +    };
> +}
> +
> +static void audio_validate_per_direction_opts(
> +    AudiodevPerDirectionOptions *pdo, Error **errp)
> +{
> +    if (!pdo->has_fixed_settings) {
> +        pdo->has_fixed_settings = true;
> +        pdo->fixed_settings = true;
> +    }
> +    if (!pdo->fixed_settings &&
> +        (pdo->has_frequency || pdo->has_channels || pdo->has_format)) {
> +        error_setg(errp,
> +                   "You can't use frequency, channels or format with 
> fixed-settings=off");
> +        return;
> +    }
> +
> +    if (!pdo->has_frequency) {
> +        pdo->has_frequency = true;
> +        pdo->frequency = 44100;
> +    }
> +    if (!pdo->has_channels) {
> +        pdo->has_channels = true;
> +        pdo->channels = 2;
> +    }
> +    if (!pdo->has_voices) {
> +        pdo->has_voices = true;
> +        pdo->voices = 1;
> +    }
> +    if (!pdo->has_format) {
> +        pdo->has_format = true;
> +        pdo->format = AUDIO_FORMAT_S16;
> +    }
> +}
> +
> +static void audio_validate_opts(Audiodev *dev, Error **errp)
> +{
> +    Error *err = NULL;
> +
> +    audio_create_pdos(dev);
> +
> +    audio_validate_per_direction_opts(audio_get_pdo_in(dev), &err);
> +    if (err) {
> +        error_propagate(errp, err);
> +        return;
> +    }
> +
> +    audio_validate_per_direction_opts(audio_get_pdo_out(dev), &err);
> +    if (err) {
> +        error_propagate(errp, err);
> +        return;
> +    }
> +
> +    if (!dev->has_timer_period) {
> +        dev->has_timer_period = true;
> +        dev->timer_period = 10000; /* 100Hz -> 10ms */
> +    }
> +}
> +
> +void audio_parse_option(const char *opt)
> +{
> +    AudiodevListEntry *e;
> +    Audiodev *dev = NULL;
> +
> +    Visitor *v = qobject_input_visitor_new_str(opt, "driver", &error_fatal);
> +    visit_type_Audiodev(v, NULL, &dev, &error_fatal);
> +    visit_free(v);
> +
> +    audio_validate_opts(dev, &error_fatal);
> +
> +    e = g_malloc0(sizeof(AudiodevListEntry));
> +    e->dev = dev;
> +    QSIMPLEQ_INSERT_TAIL(&audiodevs, e, next);
> +}
> +
[...]

Regards,
Zoltan



reply via email to

[Prev in Thread] Current Thread [Next in Thread]