diff options
Diffstat (limited to 'backends/pulse/pulse-device.c')
-rw-r--r-- | backends/pulse/pulse-device.c | 575 |
1 files changed, 192 insertions, 383 deletions
diff --git a/backends/pulse/pulse-device.c b/backends/pulse/pulse-device.c index 96e06c8..5403712 100644 --- a/backends/pulse/pulse-device.c +++ b/backends/pulse/pulse-device.c @@ -17,45 +17,40 @@ #include <string.h> #include <glib.h> +#include <glib/gi18n.h> #include <glib-object.h> -#include <libmatemixer/matemixer-device.h> -#include <libmatemixer/matemixer-device-profile.h> -#include <libmatemixer/matemixer-device-profile-private.h> -#include <libmatemixer/matemixer-enums.h> -#include <libmatemixer/matemixer-port.h> -#include <libmatemixer/matemixer-port-private.h> +#include <libmatemixer/matemixer.h> +#include <libmatemixer/matemixer-private.h> #include <pulse/pulseaudio.h> #include "pulse-connection.h" #include "pulse-device.h" +#include "pulse-device-profile.h" +#include "pulse-device-switch.h" +#include "pulse-port.h" +#include "pulse-stream.h" struct _PulseDevicePrivate { - guint32 index; - gchar *name; - gchar *description; - gchar *icon; - GHashTable *ports; - GList *ports_list; - GHashTable *profiles; - GList *profiles_list; - PulseConnection *connection; - MateMixerDeviceProfile *profile; + guint32 index; + GHashTable *ports; + GHashTable *streams; + GList *streams_list; + GList *switches_list; + PulseConnection *connection; + PulseDeviceSwitch *pswitch; }; enum { PROP_0, - PROP_NAME, - PROP_DESCRIPTION, - PROP_ICON, - PROP_ACTIVE_PROFILE, PROP_INDEX, - PROP_CONNECTION + PROP_CONNECTION, + N_PROPERTIES }; -static void mate_mixer_device_interface_init (MateMixerDeviceInterface *iface); +static GParamSpec *properties[N_PROPERTIES] = { NULL, }; static void pulse_device_class_init (PulseDeviceClass *klass); @@ -72,60 +67,25 @@ static void pulse_device_init (PulseDevice *device); static void pulse_device_dispose (GObject *object); static void pulse_device_finalize (GObject *object); -G_DEFINE_TYPE_WITH_CODE (PulseDevice, pulse_device, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (MATE_MIXER_TYPE_DEVICE, - mate_mixer_device_interface_init)) +G_DEFINE_TYPE (PulseDevice, pulse_device, MATE_MIXER_TYPE_DEVICE) -#if PA_CHECK_VERSION (5, 0, 0) -typedef pa_card_profile_info2 _pa_card_profile_info; -#else -typedef pa_card_profile_info _pa_card_profile_info; -#endif - -static const gchar * pulse_device_get_name (MateMixerDevice *device); -static const gchar * pulse_device_get_description (MateMixerDevice *device); -static const gchar * pulse_device_get_icon (MateMixerDevice *device); +static MateMixerStream *pulse_device_get_stream (MateMixerDevice *mmd, + const gchar *name); -static MateMixerPort * pulse_device_get_port (MateMixerDevice *device, - const gchar *name); -static MateMixerDeviceProfile *pulse_device_get_profile (MateMixerDevice *device, - const gchar *name); +static const GList * pulse_device_list_streams (MateMixerDevice *mmd); +static const GList * pulse_device_list_switches (MateMixerDevice *mmd); -static const GList * pulse_device_list_ports (MateMixerDevice *device); -static const GList * pulse_device_list_profiles (MateMixerDevice *device); +static void pulse_device_load (PulseDevice *device, + const pa_card_info *info); -static MateMixerDeviceProfile *pulse_device_get_active_profile (MateMixerDevice *device); -static gboolean pulse_device_set_active_profile (MateMixerDevice *device, - MateMixerDeviceProfile *profile); - -static void update_port (PulseDevice *device, - pa_card_port_info *p_info); -static void update_profile (PulseDevice *device, - _pa_card_profile_info *p_info); - -static gint compare_ports (gconstpointer a, - gconstpointer b); -static gint compare_profiles (gconstpointer a, - gconstpointer b); - -static void -mate_mixer_device_interface_init (MateMixerDeviceInterface *iface) -{ - iface->get_name = pulse_device_get_name; - iface->get_description = pulse_device_get_description; - iface->get_icon = pulse_device_get_icon; - iface->get_port = pulse_device_get_port; - iface->get_profile = pulse_device_get_profile; - iface->list_ports = pulse_device_list_ports; - iface->list_profiles = pulse_device_list_profiles; - iface->get_active_profile = pulse_device_get_active_profile; - iface->set_active_profile = pulse_device_set_active_profile; -} +static void free_list_streams (PulseDevice *device); +static void free_list_switches (PulseDevice *device); static void pulse_device_class_init (PulseDeviceClass *klass) { - GObjectClass *object_class; + GObjectClass *object_class; + MateMixerDeviceClass *device_class; object_class = G_OBJECT_CLASS (klass); object_class->dispose = pulse_device_dispose; @@ -133,31 +93,32 @@ pulse_device_class_init (PulseDeviceClass *klass) object_class->get_property = pulse_device_get_property; object_class->set_property = pulse_device_set_property; - g_object_class_install_property (object_class, - PROP_INDEX, - g_param_spec_uint ("index", - "Index", - "Device index", - 0, - G_MAXUINT, - 0, - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (object_class, - PROP_CONNECTION, - g_param_spec_object ("connection", - "Connection", - "PulseAudio connection", - PULSE_TYPE_CONNECTION, - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_override_property (object_class, PROP_NAME, "name"); - g_object_class_override_property (object_class, PROP_DESCRIPTION, "description"); - g_object_class_override_property (object_class, PROP_ICON, "icon"); - g_object_class_override_property (object_class, PROP_ACTIVE_PROFILE, "active-profile"); + device_class = MATE_MIXER_DEVICE_CLASS (klass); + device_class->get_stream = pulse_device_get_stream; + device_class->list_streams = pulse_device_list_streams; + device_class->list_switches = pulse_device_list_switches; + + properties[PROP_INDEX] = + g_param_spec_uint ("index", + "Index", + "Index of the device", + 0, + G_MAXUINT, + 0, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + properties[PROP_CONNECTION] = + g_param_spec_object ("connection", + "Connection", + "PulseAudio connection", + PULSE_TYPE_CONNECTION, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, N_PROPERTIES, properties); g_type_class_add_private (object_class, sizeof (PulseDevicePrivate)); } @@ -173,18 +134,6 @@ pulse_device_get_property (GObject *object, device = PULSE_DEVICE (object); switch (param_id) { - case PROP_NAME: - g_value_set_string (value, device->priv->name); - break; - case PROP_DESCRIPTION: - g_value_set_string (value, device->priv->description); - break; - case PROP_ICON: - g_value_set_string (value, device->priv->icon); - break; - case PROP_ACTIVE_PROFILE: - g_value_set_object (value, device->priv->profile); - break; case PROP_INDEX: g_value_set_uint (value, device->priv->index); break; @@ -212,7 +161,6 @@ pulse_device_set_property (GObject *object, device->priv->index = g_value_get_uint (value); break; case PROP_CONNECTION: - /* Construct-only object */ device->priv->connection = g_value_dup_object (value); break; default: @@ -233,10 +181,10 @@ pulse_device_init (PulseDevice *device) g_free, g_object_unref); - device->priv->profiles = g_hash_table_new_full (g_str_hash, - g_str_equal, - g_free, - g_object_unref); + device->priv->streams = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + g_object_unref); } static void @@ -246,20 +194,14 @@ pulse_device_dispose (GObject *object) device = PULSE_DEVICE (object); - if (device->priv->ports_list != NULL) { - g_list_free_full (device->priv->ports_list, g_object_unref); - device->priv->ports_list = NULL; - } g_hash_table_remove_all (device->priv->ports); + g_hash_table_remove_all (device->priv->streams); - if (device->priv->profiles_list != NULL) { - g_list_free_full (device->priv->profiles_list, g_object_unref); - device->priv->profiles_list = NULL; - } - g_hash_table_remove_all (device->priv->profiles); - - g_clear_object (&device->priv->profile); g_clear_object (&device->priv->connection); + g_clear_object (&device->priv->pswitch); + + free_list_streams (device); + free_list_switches (device); G_OBJECT_CLASS (pulse_device_parent_class)->dispose (object); } @@ -271,12 +213,8 @@ pulse_device_finalize (GObject *object) device = PULSE_DEVICE (object); - g_free (device->priv->name); - g_free (device->priv->description); - g_free (device->priv->icon); - - g_hash_table_destroy (device->priv->ports); - g_hash_table_destroy (device->priv->profiles); + g_hash_table_unref (device->priv->ports); + g_hash_table_unref (device->priv->streams); G_OBJECT_CLASS (pulse_device_parent_class)->finalize (object); } @@ -285,123 +223,86 @@ PulseDevice * pulse_device_new (PulseConnection *connection, const pa_card_info *info) { PulseDevice *device; + const gchar *label; + const gchar *icon; g_return_val_if_fail (PULSE_IS_CONNECTION (connection), NULL); g_return_val_if_fail (info != NULL, NULL); + label = pa_proplist_gets (info->proplist, PA_PROP_DEVICE_DESCRIPTION); + if G_UNLIKELY (label == NULL) + label = info->name; + + icon = pa_proplist_gets (info->proplist, PA_PROP_DEVICE_ICON_NAME); + if G_UNLIKELY (icon == NULL) + icon = "audio-card"; + /* Consider the device index as unchanging parameter */ device = g_object_new (PULSE_TYPE_DEVICE, - "connection", connection, "index", info->index, + "connection", connection, + "name", info->name, + "label", label, + "icon", icon, NULL); - /* Other data may change at any time, so let's make a use of our update function */ + pulse_device_load (device, info); pulse_device_update (device, info); return device; } -gboolean +void pulse_device_update (PulseDevice *device, const pa_card_info *info) { - MateMixerDeviceProfile *profile = NULL; - const gchar *prop; - guint32 i; - - g_return_val_if_fail (PULSE_IS_DEVICE (device), FALSE); - g_return_val_if_fail (info != NULL, FALSE); - - /* Let all the information update before emitting notify signals */ - g_object_freeze_notify (G_OBJECT (device)); - - /* Name */ - if (g_strcmp0 (device->priv->name, info->name) != 0) { - g_free (device->priv->name); - device->priv->name = g_strdup (info->name); - - g_object_notify (G_OBJECT (device), "name"); - } - - /* Description */ - prop = pa_proplist_gets (info->proplist, PA_PROP_DEVICE_DESCRIPTION); - - if (G_UNLIKELY (prop == NULL)) - prop = info->name; - - if (g_strcmp0 (device->priv->description, prop) != 0) { - g_free (device->priv->description); - device->priv->description = g_strdup (prop); - - g_object_notify (G_OBJECT (device), "description"); - } - - /* Icon */ - prop = pa_proplist_gets (info->proplist, PA_PROP_DEVICE_ICON_NAME); - - if (G_UNLIKELY (prop == NULL)) - prop = "audio-card"; - - if (g_strcmp0 (device->priv->icon, prop) != 0) { - g_free (device->priv->icon); - device->priv->icon = g_strdup (prop); - - g_object_notify (G_OBJECT (device), "icon"); - } - -#if PA_CHECK_VERSION (2, 0, 0) - /* List of ports */ - for (i = 0; i < info->n_ports; i++) { - update_port (device, info->ports[i]); - } -#endif + g_return_if_fail (PULSE_IS_DEVICE (device)); + g_return_if_fail (info != NULL); - /* List of profiles */ - for (i = 0; i < info->n_profiles; i++) { #if PA_CHECK_VERSION (5, 0, 0) - pa_card_profile_info2 *p_info = info->profiles2[i]; - - /* PulseAudio 5.0 includes a new pa_card_profile_info2 which only - * differs in the new available flag, we use it not to include profiles - * which are unavailable */ - if (p_info->available == 0) - continue; + if G_LIKELY (info->active_profile2 != NULL) + pulse_device_switch_set_active_profile_by_name (device->priv->pswitch, + info->active_profile2->name); #else - /* The old profile list is an array of structs, not pointers */ - pa_card_profile_info *p_info = &info->profiles[i]; + if G_LIKELY (info->active_profile != NULL) + pulse_device_switch_set_active_profile_by_name (device->priv->pswitch, + info->active_profile->name); #endif - update_profile (device, p_info); - } - - /* Figure out whether the currently active profile has changed */ - profile = NULL; +} -#if PA_CHECK_VERSION (5, 0, 0) - if (G_LIKELY (info->active_profile2 != NULL)) - profile = g_hash_table_lookup (device->priv->profiles, info->active_profile2->name); -#else - if (G_LIKELY (info->active_profile != NULL)) - profile = g_hash_table_lookup (device->priv->profiles, info->active_profile->name); -#endif +void +pulse_device_add_stream (PulseDevice *device, PulseStream *stream) +{ + const gchar *name; - if (profile != device->priv->profile) { - g_clear_object (&device->priv->profile); + g_return_if_fail (PULSE_IS_DEVICE (device)); + g_return_if_fail (PULSE_IS_STREAM (stream)); - if (G_LIKELY (profile != NULL)) - device->priv->profile = g_object_ref (profile); + name = mate_mixer_stream_get_name (MATE_MIXER_STREAM (stream)); - g_object_notify (G_OBJECT (device), "active-profile"); - } + free_list_streams (device); - g_object_thaw_notify (G_OBJECT (device)); - return TRUE; + g_hash_table_insert (device->priv->streams, g_strdup (name), stream); + g_signal_emit_by_name (G_OBJECT (device), + "stream-added", + name); } -PulseConnection * -pulse_device_get_connection (PulseDevice *device) +void +pulse_device_remove_stream (PulseDevice *device, PulseStream *stream) { - g_return_val_if_fail (PULSE_IS_DEVICE (device), NULL); + const gchar *name; - return device->priv->connection; + g_return_if_fail (PULSE_IS_DEVICE (device)); + g_return_if_fail (PULSE_IS_STREAM (stream)); + + name = mate_mixer_stream_get_name (MATE_MIXER_STREAM (stream)); + + free_list_streams (device); + + g_hash_table_remove (device->priv->streams, name); + g_signal_emit_by_name (G_OBJECT (device), + "stream-removed", + name); } guint32 @@ -412,222 +313,130 @@ pulse_device_get_index (PulseDevice *device) return device->priv->index; } -static const gchar * -pulse_device_get_name (MateMixerDevice *device) -{ - g_return_val_if_fail (PULSE_IS_DEVICE (device), NULL); - - return PULSE_DEVICE (device)->priv->name; -} - -static const gchar * -pulse_device_get_description (MateMixerDevice *device) -{ - g_return_val_if_fail (PULSE_IS_DEVICE (device), NULL); - - return PULSE_DEVICE (device)->priv->description; -} - -static const gchar * -pulse_device_get_icon (MateMixerDevice *device) +PulseConnection * +pulse_device_get_connection (PulseDevice *device) { g_return_val_if_fail (PULSE_IS_DEVICE (device), NULL); - return PULSE_DEVICE (device)->priv->icon; + return device->priv->connection; } -static MateMixerPort * -pulse_device_get_port (MateMixerDevice *device, const gchar *name) +PulsePort * +pulse_device_get_port (PulseDevice *device, const gchar *name) { g_return_val_if_fail (PULSE_IS_DEVICE (device), NULL); - g_return_val_if_fail (name != NULL, NULL); - return g_hash_table_lookup (PULSE_DEVICE (device)->priv->ports, name); + return g_hash_table_lookup (device->priv->ports, name); } -static MateMixerDeviceProfile * -pulse_device_get_profile (MateMixerDevice *device, const gchar *name) +static MateMixerStream * +pulse_device_get_stream (MateMixerDevice *mmd, const gchar *name) { - g_return_val_if_fail (PULSE_IS_DEVICE (device), NULL); + g_return_val_if_fail (PULSE_IS_DEVICE (mmd), NULL); g_return_val_if_fail (name != NULL, NULL); - return g_hash_table_lookup (PULSE_DEVICE (device)->priv->profiles, name); + return g_hash_table_lookup (PULSE_DEVICE (mmd)->priv->streams, name); } static const GList * -pulse_device_list_ports (MateMixerDevice *device) +pulse_device_list_streams (MateMixerDevice *mmd) { - PulseDevice *pulse; - - g_return_val_if_fail (PULSE_IS_DEVICE (device), NULL); - - pulse = PULSE_DEVICE (device); + PulseDevice *device; - if (pulse->priv->ports_list == NULL) { - GList *list = g_hash_table_get_values (pulse->priv->ports); + g_return_val_if_fail (PULSE_IS_DEVICE (mmd), NULL); - if (list != NULL) { - g_list_foreach (list, (GFunc) g_object_ref, NULL); + device = PULSE_DEVICE (mmd); - pulse->priv->ports_list = g_list_sort (list, compare_ports); - } + if (device->priv->streams_list == NULL) { + device->priv->streams_list = g_hash_table_get_values (device->priv->streams); + if (device->priv->streams_list != NULL) + g_list_foreach (device->priv->streams_list, (GFunc) g_object_ref, NULL); } - - return (const GList *) pulse->priv->ports_list; + return device->priv->streams_list; } static const GList * -pulse_device_list_profiles (MateMixerDevice *device) +pulse_device_list_switches (MateMixerDevice *mmd) { - PulseDevice *pulse; - - g_return_val_if_fail (PULSE_IS_DEVICE (device), NULL); - - pulse = PULSE_DEVICE (device); - - if (pulse->priv->profiles_list == NULL) { - GList *list = g_hash_table_get_values (pulse->priv->profiles); - - if (list != NULL) { - g_list_foreach (list, (GFunc) g_object_ref, NULL); - - pulse->priv->profiles_list = g_list_sort (list, compare_profiles); - } - } + g_return_val_if_fail (PULSE_IS_DEVICE (mmd), NULL); - return (const GList *) pulse->priv->profiles_list; + return PULSE_DEVICE (mmd)->priv->switches_list; } -static MateMixerDeviceProfile * -pulse_device_get_active_profile (MateMixerDevice *device) +static void +pulse_device_load (PulseDevice *device, const pa_card_info *info) { - g_return_val_if_fail (PULSE_IS_DEVICE (device), NULL); + guint i; - return PULSE_DEVICE (device)->priv->profile; -} +#if PA_CHECK_VERSION (2, 0, 0) + for (i = 0; i < info->n_ports; i++) { + PulsePort *port; + const gchar *name; + const gchar *icon; -static gboolean -pulse_device_set_active_profile (MateMixerDevice *device, MateMixerDeviceProfile *profile) -{ - PulseDevice *pulse; - const gchar *name; - gboolean ret; + name = info->ports[i]->name; + icon = pa_proplist_gets (info->ports[i]->proplist, "device.icon_name"); - g_return_val_if_fail (PULSE_IS_DEVICE (device), FALSE); - g_return_val_if_fail (MATE_MIXER_IS_DEVICE_PROFILE (profile), FALSE); + port = pulse_port_new (name, + info->ports[i]->description, + icon, + info->ports[i]->priority); - pulse = PULSE_DEVICE (device); + g_hash_table_insert (device->priv->ports, g_strdup (name), port); + } +#endif - name = mate_mixer_device_profile_get_name (profile); + /* Create the device profile switch */ + if (info->n_profiles > 0) { + device->priv->pswitch = pulse_device_switch_new ("profile", + _("Profile"), + device); - /* Make sure the profile belongs to the device */ - if (g_hash_table_lookup (pulse->priv->profiles, name) == NULL) { - g_warning ("Profile %s does not belong to device %s", name, pulse->priv->name); - return FALSE; + device->priv->switches_list = g_list_prepend (NULL, g_object_ref (device->priv->pswitch)); } - ret = pulse_connection_set_card_profile (pulse->priv->connection, - pulse->priv->name, - name); - if (ret == TRUE) { - if (pulse->priv->profile != NULL) - g_object_unref (pulse->priv->profile); + for (i = 0; i < info->n_profiles; i++) { + PulseDeviceProfile *profile; + +#if PA_CHECK_VERSION (5, 0, 0) + pa_card_profile_info2 *p_info = info->profiles2[i]; + + /* PulseAudio 5.0 includes a new pa_card_profile_info2 which only + * differs in the new available flag, we use it not to include profiles + * which are unavailable */ + if (p_info->available == 0) + continue; +#else + /* The old profile list is an array of structs, not pointers */ + pa_card_profile_info *p_info = &info->profiles[i]; +#endif - pulse->priv->profile = g_object_ref (profile); + profile = pulse_device_profile_new (p_info->name, + p_info->description, + p_info->priority); - g_object_notify (G_OBJECT (device), "active-profile"); + pulse_device_switch_add_profile (device->priv->pswitch, profile); } - return ret; } static void -update_port (PulseDevice *device, pa_card_port_info *p_info) +free_list_streams (PulseDevice *device) { - MateMixerPort *port; - MateMixerPortFlags flags = MATE_MIXER_PORT_NO_FLAGS; - const gchar *icon; - - icon = pa_proplist_gets (p_info->proplist, "device.icon_name"); - - if (p_info->available == PA_PORT_AVAILABLE_YES) - flags |= MATE_MIXER_PORT_AVAILABLE; - - if (p_info->direction & PA_DIRECTION_INPUT) - flags |= MATE_MIXER_PORT_INPUT; - if (p_info->direction & PA_DIRECTION_OUTPUT) - flags |= MATE_MIXER_PORT_OUTPUT; - - port = g_hash_table_lookup (device->priv->ports, p_info->name); - - if (port != NULL) { - /* Update existing port */ - _mate_mixer_port_update_description (port, p_info->description); - _mate_mixer_port_update_icon (port, icon); - _mate_mixer_port_update_priority (port, p_info->priority); - _mate_mixer_port_update_flags (port, flags); - } else { - /* Add previously unknown port to the hash table */ - port = _mate_mixer_port_new (p_info->name, - p_info->description, - icon, - p_info->priority, - flags); - - g_hash_table_insert (device->priv->ports, g_strdup (p_info->name), port); - } + if (device->priv->streams_list == NULL) + return; + + g_list_free_full (device->priv->streams_list, g_object_unref); + + device->priv->streams_list = NULL; } static void -update_profile (PulseDevice *device, _pa_card_profile_info *p_info) +free_list_switches (PulseDevice *device) { - MateMixerDeviceProfile *profile; - - profile = g_hash_table_lookup (device->priv->profiles, p_info->name); - - if (profile != NULL) { - /* Update existing profile */ - _mate_mixer_device_profile_update_description (profile, p_info->description); - _mate_mixer_device_profile_update_priority (profile, p_info->priority); - _mate_mixer_device_profile_update_num_input_streams (profile, p_info->n_sources); - _mate_mixer_device_profile_update_num_output_streams (profile, p_info->n_sinks); - } else { - /* Add previously unknown profile to the hash table */ - profile = _mate_mixer_device_profile_new (p_info->name, - p_info->description, - p_info->priority, - p_info->n_sources, - p_info->n_sinks); - - g_hash_table_insert (device->priv->profiles, g_strdup (p_info->name), profile); - } -} + if (device->priv->switches_list == NULL) + return; -static gint -compare_ports (gconstpointer a, gconstpointer b) -{ - MateMixerPort *p1 = MATE_MIXER_PORT (a); - MateMixerPort *p2 = MATE_MIXER_PORT (b); - - gint ret = (gint) (mate_mixer_port_get_priority (p2) - - mate_mixer_port_get_priority (p1)); - if (ret != 0) - return ret; - else - return strcmp (mate_mixer_port_get_name (p1), - mate_mixer_port_get_name (p2)); -} + g_list_free_full (device->priv->switches_list, g_object_unref); -static gint -compare_profiles (gconstpointer a, gconstpointer b) -{ - MateMixerDeviceProfile *p1 = MATE_MIXER_DEVICE_PROFILE (a); - MateMixerDeviceProfile *p2 = MATE_MIXER_DEVICE_PROFILE (b); - - gint ret = (gint) (mate_mixer_device_profile_get_priority (p2) - - mate_mixer_device_profile_get_priority (p1)); - if (ret != 0) - return ret; - else - return strcmp (mate_mixer_device_profile_get_name (p1), - mate_mixer_device_profile_get_name (p2)); + device->priv->switches_list = NULL; } |