[libvirt] [libvirt-designer PATCHv3 2/9] Implement gvir_designer_domain_add_sound()

Michal Privoznik mprivozn at redhat.com
Tue Jun 4 17:10:52 UTC 2013


On 04.06.2013 16:33, Christophe Fergeau wrote:
> ---
>  examples/virtxml.c                         |   3 +
>  libvirt-designer/libvirt-designer-domain.c | 131 +++++++++++++++++++++++++++++
>  libvirt-designer/libvirt-designer-domain.h |   2 +
>  libvirt-designer/libvirt-designer.sym      |   1 +
>  4 files changed, 137 insertions(+)
> 
> diff --git a/examples/virtxml.c b/examples/virtxml.c
> index 6fb0551..d127406 100644
> --- a/examples/virtxml.c
> +++ b/examples/virtxml.c
> @@ -642,6 +642,9 @@ main(int argc, char *argv[])
>      gvir_designer_domain_setup_machine(domain, &error);
>      CHECK_ERROR;
>  
> +    g_object_unref(gvir_designer_domain_add_sound(domain, &error));
> +    CHECK_ERROR;
> +
>      if (arch_str) {
>          gvir_designer_domain_setup_container_full(domain, arch_str, &error);
>          CHECK_ERROR;
> diff --git a/libvirt-designer/libvirt-designer-domain.c b/libvirt-designer/libvirt-designer-domain.c
> index e4f72e6..684c458 100644
> --- a/libvirt-designer/libvirt-designer-domain.c
> +++ b/libvirt-designer/libvirt-designer-domain.c
> @@ -388,6 +388,7 @@ static void gvir_designer_domain_add_console(GVirDesignerDomain *design)
>      g_object_unref(G_OBJECT(console));
>  }
>  
> +
>  static void gvir_designer_domain_add_input(GVirDesignerDomain *design)
>  {
>      GVirConfigDomainInput *input;
> @@ -932,6 +933,136 @@ cleanup:
>  }
>  
>  
> +static OsinfoDevice *
> +gvir_designer_domain_get_preferred_soundcard(GVirDesignerDomain *design,
> +                                             GError **error)
> +{
> +    OsinfoDevice *device = NULL;
> +    OsinfoDeviceLink *dev_link;
> +
> +    dev_link = gvir_designer_domain_get_preferred_device(design,
> +                                                         "audio",
> +                                                         error);
> +    if (dev_link == NULL)
> +        goto cleanup;
> +
> +    device = osinfo_devicelink_get_target(dev_link);
> +
> +cleanup:
> +    if (dev_link != NULL)
> +        g_object_unref(dev_link);
> +
> +    return device;
> +}
> +
> +static OsinfoDeviceList *
> +gvir_designer_domain_get_fallback_devices(GVirDesignerDomain *design,
> +                                          const char *class,
> +                                          GError **error)
> +{
> +    OsinfoDeviceList *devices = NULL;
> +    OsinfoFilter *filter;
> +
> +    filter = osinfo_filter_new();
> +    osinfo_filter_add_constraint(filter, OSINFO_DEVICE_PROP_CLASS, class);
> +    devices = gvir_designer_domain_get_supported_devices(design, filter);
> +    g_object_unref(G_OBJECT(filter));
> +
> +    if (devices == NULL ||
> +        osinfo_list_get_length(OSINFO_LIST(devices)) == 0) {
> +        goto cleanup;
> +    }
> +
> +    return devices;
> +
> +cleanup:
> +    if (devices != NULL)
> +        g_object_unref(devices);
> +
> +    return NULL;
> +}
> +
> +
> +static OsinfoDevice *
> +gvir_designer_domain_get_fallback_soundcard(GVirDesignerDomain *domain,
> +                                            GError **error)
> +{
> +    OsinfoEntity *dev = NULL;
> +    OsinfoDeviceList *devices = NULL;
> +
> +    devices = gvir_designer_domain_get_fallback_devices(domain, "audio", error);
> +    if (devices == NULL)
> +        goto cleanup;
> +
> +    dev = osinfo_list_get_nth(OSINFO_LIST(devices), 0);
> +    g_object_ref(G_OBJECT(dev));
> +
> +cleanup:
> +    if (devices != NULL)
> +        g_object_unref(G_OBJECT(devices));
> +
> +    return OSINFO_DEVICE(dev);
> +}
> +
> +
> +static GVirConfigDomainSoundModel
> +gvir_designer_sound_model_from_soundcard(OsinfoDevice *soundcard)
> +{
> +    const char *name;
> +
> +    name = osinfo_device_get_name(soundcard);
> +    if (g_strcmp0(name, "ac97") == 0) {
> +        return GVIR_CONFIG_DOMAIN_SOUND_MODEL_AC97;
> +    } else if (g_strcmp0(name, "ich6") == 0) {
> +        return GVIR_CONFIG_DOMAIN_SOUND_MODEL_ICH6;
> +    } else if (g_strcmp0(name, "es1370") == 0) {
> +        return GVIR_CONFIG_DOMAIN_SOUND_MODEL_ES1370;
> +    } else if (g_strcmp0(name, "sb16") == 0) {
> +        return GVIR_CONFIG_DOMAIN_SOUND_MODEL_SB16;
> +    } else {
> +        g_warning("Unknown soundcard %s, falling back to PC speaker", name);
> +        return GVIR_CONFIG_DOMAIN_SOUND_MODEL_PCSPK;
> +    }
> +}
> +
> +
> +/**
> + * gvir_designer_domain_add_sound:
> + * @design: (transfer none): the domain designer instance
> + * @error: return location for a #GError, or NULL
> + *
> + * Add a new soundcard to the domain.
> + *
> + * Returns: (transfer full): the pointer to the new soundcard.
> + * If something fails NULL is returned and @error is set.
> + */
> +GVirConfigDomainSound *
> +gvir_designer_domain_add_sound(GVirDesignerDomain *design, GError **error)
> +{
> +    GVirConfigDomainSound *sound;
> +    OsinfoDevice *soundcard;
> +    GVirConfigDomainSoundModel model;
> +
> +    g_return_val_if_fail(GVIR_DESIGNER_IS_DOMAIN(design), NULL);
> +
> +    soundcard = gvir_designer_domain_get_preferred_soundcard(design, NULL);
> +    if (soundcard == NULL)
> +        soundcard = gvir_designer_domain_get_fallback_soundcard(design, NULL);
> +
> +    if (soundcard == NULL)
> +        return NULL;

I think we are returning NULL without @error set here. I can't see where
gvir_designer_domain_get_fallback_soundard sets @error esp. when it is
not being passed :)

> +
> +    sound = gvir_config_domain_sound_new();
> +    model = gvir_designer_sound_model_from_soundcard(soundcard);
> +    gvir_config_domain_sound_set_model(sound, model);
> +
> +    gvir_config_domain_add_device(design->priv->config,
> +                                  GVIR_CONFIG_DOMAIN_DEVICE(sound));
> +
> +    return sound;
> +}
> +
> +
>  static gchar *
>  gvir_designer_domain_next_disk_target(GVirDesignerDomain *design,
>                                        GVirConfigDomainDiskBus bus)
> diff --git a/libvirt-designer/libvirt-designer-domain.h b/libvirt-designer/libvirt-designer-domain.h
> index c7b0e5c..c0d06e8 100644
> --- a/libvirt-designer/libvirt-designer-domain.h
> +++ b/libvirt-designer/libvirt-designer-domain.h
> @@ -125,6 +125,8 @@ GVirConfigDomainInterface *gvir_designer_domain_add_interface_network(GVirDesign
>                                                                        const char *network,
>                                                                        GError **error);
>  
> +GVirConfigDomainSound *gvir_designer_domain_add_sound(GVirDesignerDomain *design, GError **error);
> +
>  gboolean gvir_designer_domain_setup_resources(GVirDesignerDomain *design,
>                                                GVirDesignerDomainResources req,
>                                                GError **error);
> diff --git a/libvirt-designer/libvirt-designer.sym b/libvirt-designer/libvirt-designer.sym
> index d1aa916..0a8b49e 100644
> --- a/libvirt-designer/libvirt-designer.sym
> +++ b/libvirt-designer/libvirt-designer.sym
> @@ -20,6 +20,7 @@ LIBVIRT_DESIGNER_0.0.2 {
>  	gvir_designer_domain_add_floppy_file;
>  	gvir_designer_domain_add_floppy_device;
>  	gvir_designer_domain_add_interface_network;
> +	gvir_designer_domain_add_sound;
>  	gvir_designer_domain_setup_resources;
>  	gvir_designer_domain_resources_get_type;
>  
> 




More information about the libvir-list mailing list