diff --git a/src/gvc/gvc-mixer-card.c b/src/gvc/gvc-mixer-card.c index f198f1b1c..56502e3e4 100644 --- a/src/gvc/gvc-mixer-card.c +++ b/src/gvc/gvc-mixer-card.c @@ -157,7 +157,7 @@ gvc_mixer_card_get_profile (GvcMixerCard *card) GList *l; g_return_val_if_fail (GVC_IS_MIXER_CARD (card), NULL); - g_return_val_if_fail (card->priv->profiles != NULL, FALSE); + g_return_val_if_fail (card->priv->profiles != NULL, NULL); for (l = card->priv->profiles; l != NULL; l = l->next) { GvcMixerCardProfile *p = l->data; @@ -266,7 +266,7 @@ gvc_mixer_card_change_profile (GvcMixerCard *card, const GList * gvc_mixer_card_get_profiles (GvcMixerCard *card) { - g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE); + g_return_val_if_fail (GVC_IS_MIXER_CARD (card), NULL); return card->priv->profiles; } diff --git a/src/gvc/gvc-mixer-control.c b/src/gvc/gvc-mixer-control.c index d8d80f6af..0e6416544 100644 --- a/src/gvc/gvc-mixer-control.c +++ b/src/gvc/gvc-mixer-control.c @@ -615,13 +615,13 @@ static void update_default_source_from_name (GvcMixerControl *control, const char *name) { - gboolean changed; + gboolean changed = FALSE; if ((control->priv->default_source_name == NULL && name != NULL) || (control->priv->default_source_name != NULL && name == NULL) - || strcmp (control->priv->default_source_name, name) != 0) { + || (name != NULL && strcmp (control->priv->default_source_name, name) != 0)) { changed = TRUE; } @@ -640,13 +640,13 @@ static void update_default_sink_from_name (GvcMixerControl *control, const char *name) { - gboolean changed; + gboolean changed = FALSE; if ((control->priv->default_sink_name == NULL && name != NULL) || (control->priv->default_sink_name != NULL && name == NULL) - || strcmp (control->priv->default_sink_name, name) != 0) { + || (name != NULL && strcmp (control->priv->default_sink_name, name) != 0)) { changed = TRUE; } @@ -710,6 +710,58 @@ add_stream (GvcMixerControl *control, gvc_mixer_stream_get_id (stream)); } +static void +set_icon_name_from_proplist (GvcMixerStream *stream, + pa_proplist *l, + const char *default_icon_name) +{ + const char *t; + + if ((t = pa_proplist_gets (l, PA_PROP_DEVICE_ICON_NAME))) { + goto finish; + } + + if ((t = pa_proplist_gets (l, PA_PROP_MEDIA_ICON_NAME))) { + goto finish; + } + + if ((t = pa_proplist_gets (l, PA_PROP_WINDOW_ICON_NAME))) { + goto finish; + } + + if ((t = pa_proplist_gets (l, PA_PROP_APPLICATION_ICON_NAME))) { + goto finish; + } + + if ((t = pa_proplist_gets (l, PA_PROP_MEDIA_ROLE))) { + + if (strcmp (t, "video") == 0 || + strcmp (t, "phone") == 0) { + goto finish; + } + + if (strcmp (t, "music") == 0) { + t = "audio"; + goto finish; + } + + if (strcmp (t, "game") == 0) { + t = "applications-games"; + goto finish; + } + + if (strcmp (t, "event") == 0) { + t = "dialog-information"; + goto finish; + } + } + + t = default_icon_name; + + finish: + gvc_mixer_stream_set_icon_name (stream, t); +} + static void update_sink (GvcMixerControl *control, const pa_sink_info *info) @@ -767,7 +819,7 @@ update_sink (GvcMixerControl *control, gvc_mixer_stream_set_name (stream, info->name); gvc_mixer_stream_set_card_index (stream, info->card); gvc_mixer_stream_set_description (stream, info->description); - gvc_mixer_stream_set_icon_name (stream, "audio-card"); + set_icon_name_from_proplist (stream, info->proplist, "audio-card"); gvc_mixer_stream_set_volume (stream, (guint)max_volume); gvc_mixer_stream_set_is_muted (stream, info->mute); gvc_mixer_stream_set_can_decibel (stream, !!(info->flags & PA_SINK_DECIBEL_VOLUME)); @@ -856,7 +908,7 @@ update_source (GvcMixerControl *control, gvc_mixer_stream_set_name (stream, info->name); gvc_mixer_stream_set_card_index (stream, info->card); gvc_mixer_stream_set_description (stream, info->description); - gvc_mixer_stream_set_icon_name (stream, "audio-input-microphone"); + set_icon_name_from_proplist (stream, info->proplist, "audio-input-microphone"); gvc_mixer_stream_set_volume (stream, (guint)max_volume); gvc_mixer_stream_set_is_muted (stream, info->mute); gvc_mixer_stream_set_can_decibel (stream, !!(info->flags & PA_SOURCE_DECIBEL_VOLUME)); @@ -880,54 +932,6 @@ update_source (GvcMixerControl *control, } } -static void -set_icon_name_from_proplist (GvcMixerStream *stream, - pa_proplist *l, - const char *default_icon_name) -{ - const char *t; - - if ((t = pa_proplist_gets (l, PA_PROP_MEDIA_ICON_NAME))) { - goto finish; - } - - if ((t = pa_proplist_gets (l, PA_PROP_WINDOW_ICON_NAME))) { - goto finish; - } - - if ((t = pa_proplist_gets (l, PA_PROP_APPLICATION_ICON_NAME))) { - goto finish; - } - - if ((t = pa_proplist_gets (l, PA_PROP_MEDIA_ROLE))) { - - if (strcmp (t, "video") == 0 || - strcmp (t, "phone") == 0) { - goto finish; - } - - if (strcmp (t, "music") == 0) { - t = "audio"; - goto finish; - } - - if (strcmp (t, "game") == 0) { - t = "applications-games"; - goto finish; - } - - if (strcmp (t, "event") == 0) { - t = "dialog-information"; - goto finish; - } - } - - t = default_icon_name; - - finish: - gvc_mixer_stream_set_icon_name (stream, t); -} - static void set_is_event_stream_from_proplist (GvcMixerStream *stream, pa_proplist *l) @@ -1121,7 +1125,7 @@ update_card (GvcMixerControl *control, const pa_card_info *info) { GvcMixerCard *card; - gboolean is_new; + gboolean is_new = FALSE; #if 1 guint i; const char *key; @@ -1989,6 +1993,11 @@ gvc_mixer_control_dispose (GObject *object) { GvcMixerControl *control = GVC_MIXER_CONTROL (object); + if (control->priv->reconnect_id != 0) { + g_source_remove (control->priv->reconnect_id); + control->priv->reconnect_id = 0; + } + if (control->priv->pa_context != NULL) { pa_context_unref (control->priv->pa_context); control->priv->pa_context = NULL; @@ -2230,3 +2239,20 @@ gvc_mixer_control_new (const char *name) NULL); return GVC_MIXER_CONTROL (control); } + +/* FIXME: Remove when PA 0.9.23 is used */ +#ifndef PA_VOLUME_UI_MAX +#define PA_VOLUME_UI_MAX pa_sw_volume_from_dB(+11.0) +#endif + +gdouble +gvc_mixer_control_get_vol_max_norm (GvcMixerControl *control) +{ + return (gdouble) PA_VOLUME_NORM; +} + +gdouble +gvc_mixer_control_get_vol_max_amplified (GvcMixerControl *control) +{ + return (gdouble) PA_VOLUME_UI_MAX; +} diff --git a/src/gvc/gvc-mixer-control.h b/src/gvc/gvc-mixer-control.h index d32b20493..3aa2c948e 100644 --- a/src/gvc/gvc-mixer-control.h +++ b/src/gvc/gvc-mixer-control.h @@ -91,6 +91,9 @@ gboolean gvc_mixer_control_set_default_sink (GvcMixerControl *con gboolean gvc_mixer_control_set_default_source (GvcMixerControl *control, GvcMixerStream *stream); +gdouble gvc_mixer_control_get_vol_max_norm (GvcMixerControl *control); +gdouble gvc_mixer_control_get_vol_max_amplified (GvcMixerControl *control); + G_END_DECLS #endif /* __GVC_MIXER_CONTROL_H */ diff --git a/src/gvc/gvc-mixer-event-role.c b/src/gvc/gvc-mixer-event-role.c index 071722e48..5a2876758 100644 --- a/src/gvc/gvc-mixer-event-role.c +++ b/src/gvc/gvc-mixer-event-role.c @@ -156,25 +156,12 @@ gvc_mixer_event_role_get_property (GObject *object, } } -static GObject * -gvc_mixer_event_role_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_params) -{ - GObject *object; - - object = G_OBJECT_CLASS (gvc_mixer_event_role_parent_class)->constructor (type, n_construct_properties, construct_params); - - return object; -} - static void gvc_mixer_event_role_class_init (GvcMixerEventRoleClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass); - object_class->constructor = gvc_mixer_event_role_constructor; object_class->finalize = gvc_mixer_event_role_finalize; object_class->set_property = gvc_mixer_event_role_set_property; object_class->get_property = gvc_mixer_event_role_get_property; diff --git a/src/gvc/gvc-mixer-sink-input.c b/src/gvc/gvc-mixer-sink-input.c index 5cd665c9c..03ba3b2f2 100644 --- a/src/gvc/gvc-mixer-sink-input.c +++ b/src/gvc/gvc-mixer-sink-input.c @@ -43,7 +43,6 @@ struct GvcMixerSinkInputPrivate static void gvc_mixer_sink_input_class_init (GvcMixerSinkInputClass *klass); static void gvc_mixer_sink_input_init (GvcMixerSinkInput *mixer_sink_input); static void gvc_mixer_sink_input_finalize (GObject *object); -static void gvc_mixer_sink_input_dispose (GObject *object); G_DEFINE_TYPE (GvcMixerSinkInput, gvc_mixer_sink_input, GVC_TYPE_MIXER_STREAM) @@ -107,26 +106,12 @@ gvc_mixer_sink_input_change_is_muted (GvcMixerStream *stream, return TRUE; } -static GObject * -gvc_mixer_sink_input_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_params) -{ - GObject *object; - - object = G_OBJECT_CLASS (gvc_mixer_sink_input_parent_class)->constructor (type, n_construct_properties, construct_params); - - return object; -} - static void gvc_mixer_sink_input_class_init (GvcMixerSinkInputClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass); - object_class->constructor = gvc_mixer_sink_input_constructor; - object_class->dispose = gvc_mixer_sink_input_dispose; object_class->finalize = gvc_mixer_sink_input_finalize; stream_class->push_volume = gvc_mixer_sink_input_push_volume; @@ -141,15 +126,6 @@ gvc_mixer_sink_input_init (GvcMixerSinkInput *sink_input) sink_input->priv = GVC_MIXER_SINK_INPUT_GET_PRIVATE (sink_input); } -static void -gvc_mixer_sink_input_dispose (GObject *object) -{ - g_return_if_fail (object != NULL); - g_return_if_fail (GVC_IS_MIXER_SINK_INPUT (object)); - - G_OBJECT_CLASS (gvc_mixer_sink_input_parent_class)->dispose (object); -} - static void gvc_mixer_sink_input_finalize (GObject *object) { diff --git a/src/gvc/gvc-mixer-sink.c b/src/gvc/gvc-mixer-sink.c index 5b74a5ec6..a6f14935f 100644 --- a/src/gvc/gvc-mixer-sink.c +++ b/src/gvc/gvc-mixer-sink.c @@ -43,7 +43,6 @@ struct GvcMixerSinkPrivate static void gvc_mixer_sink_class_init (GvcMixerSinkClass *klass); static void gvc_mixer_sink_init (GvcMixerSink *mixer_sink); static void gvc_mixer_sink_finalize (GObject *object); -static void gvc_mixer_sink_dispose (GObject *object); G_DEFINE_TYPE (GvcMixerSink, gvc_mixer_sink, GVC_TYPE_MIXER_STREAM) @@ -139,26 +138,12 @@ gvc_mixer_sink_change_port (GvcMixerStream *stream, #endif /* PA_MICRO > 15 */ } -static GObject * -gvc_mixer_sink_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_params) -{ - GObject *object; - - object = G_OBJECT_CLASS (gvc_mixer_sink_parent_class)->constructor (type, n_construct_properties, construct_params); - - return object; -} - static void gvc_mixer_sink_class_init (GvcMixerSinkClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass); - object_class->constructor = gvc_mixer_sink_constructor; - object_class->dispose = gvc_mixer_sink_dispose; object_class->finalize = gvc_mixer_sink_finalize; stream_class->push_volume = gvc_mixer_sink_push_volume; @@ -174,15 +159,6 @@ gvc_mixer_sink_init (GvcMixerSink *sink) sink->priv = GVC_MIXER_SINK_GET_PRIVATE (sink); } -static void -gvc_mixer_sink_dispose (GObject *object) -{ - g_return_if_fail (object != NULL); - g_return_if_fail (GVC_IS_MIXER_SINK (object)); - - G_OBJECT_CLASS (gvc_mixer_sink_parent_class)->dispose (object); -} - static void gvc_mixer_sink_finalize (GObject *object) { diff --git a/src/gvc/gvc-mixer-source-output.c b/src/gvc/gvc-mixer-source-output.c index 8d76763bb..536487b70 100644 --- a/src/gvc/gvc-mixer-source-output.c +++ b/src/gvc/gvc-mixer-source-output.c @@ -60,25 +60,12 @@ gvc_mixer_source_output_change_is_muted (GvcMixerStream *stream, return TRUE; } -static GObject * -gvc_mixer_source_output_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_params) -{ - GObject *object; - - object = G_OBJECT_CLASS (gvc_mixer_source_output_parent_class)->constructor (type, n_construct_properties, construct_params); - - return object; -} - static void gvc_mixer_source_output_class_init (GvcMixerSourceOutputClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass); - object_class->constructor = gvc_mixer_source_output_constructor; object_class->finalize = gvc_mixer_source_output_finalize; stream_class->push_volume = gvc_mixer_source_output_push_volume; diff --git a/src/gvc/gvc-mixer-source.c b/src/gvc/gvc-mixer-source.c index 6fed25e7b..ebb05a6a8 100644 --- a/src/gvc/gvc-mixer-source.c +++ b/src/gvc/gvc-mixer-source.c @@ -43,7 +43,6 @@ struct GvcMixerSourcePrivate static void gvc_mixer_source_class_init (GvcMixerSourceClass *klass); static void gvc_mixer_source_init (GvcMixerSource *mixer_source); static void gvc_mixer_source_finalize (GObject *object); -static void gvc_mixer_source_dispose (GObject *object); G_DEFINE_TYPE (GvcMixerSource, gvc_mixer_source, GVC_TYPE_MIXER_STREAM) @@ -139,26 +138,12 @@ gvc_mixer_source_change_port (GvcMixerStream *stream, #endif /* PA_MICRO > 15 */ } -static GObject * -gvc_mixer_source_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_params) -{ - GObject *object; - - object = G_OBJECT_CLASS (gvc_mixer_source_parent_class)->constructor (type, n_construct_properties, construct_params); - - return object; -} - static void gvc_mixer_source_class_init (GvcMixerSourceClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass); - object_class->constructor = gvc_mixer_source_constructor; - object_class->dispose = gvc_mixer_source_dispose; object_class->finalize = gvc_mixer_source_finalize; stream_class->push_volume = gvc_mixer_source_push_volume; @@ -174,15 +159,6 @@ gvc_mixer_source_init (GvcMixerSource *source) source->priv = GVC_MIXER_SOURCE_GET_PRIVATE (source); } -static void -gvc_mixer_source_dispose (GObject *object) -{ - g_return_if_fail (object != NULL); - g_return_if_fail (GVC_IS_MIXER_SOURCE (object)); - - G_OBJECT_CLASS (gvc_mixer_source_parent_class)->dispose (object); -} - static void gvc_mixer_source_finalize (GObject *object) { diff --git a/src/gvc/gvc-mixer-stream.c b/src/gvc/gvc-mixer-stream.c index 3b4953aa0..3637bb4cc 100644 --- a/src/gvc/gvc-mixer-stream.c +++ b/src/gvc/gvc-mixer-stream.c @@ -390,6 +390,15 @@ gvc_mixer_stream_get_icon_name (GvcMixerStream *stream) return stream->priv->icon_name; } +GIcon * +gvc_mixer_stream_get_gicon (GvcMixerStream *stream) +{ + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL); + if (stream->priv->icon_name == NULL) + return NULL; + return g_themed_icon_new_with_default_fallbacks (stream->priv->icon_name); +} + gboolean gvc_mixer_stream_set_icon_name (GvcMixerStream *stream, const char *icon_name) @@ -496,7 +505,7 @@ gvc_mixer_stream_change_port (GvcMixerStream *stream, const GList * gvc_mixer_stream_get_ports (GvcMixerStream *stream) { - g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); + g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL); return stream->priv->ports; } diff --git a/src/gvc/gvc-mixer-stream.h b/src/gvc/gvc-mixer-stream.h index 53b7eb6d6..1c38e6b8d 100644 --- a/src/gvc/gvc-mixer-stream.h +++ b/src/gvc/gvc-mixer-stream.h @@ -24,6 +24,7 @@ #include #include "gvc-pulseaudio-fake.h" #include "gvc-channel-map.h" +#include G_BEGIN_DECLS @@ -84,6 +85,7 @@ gboolean gvc_mixer_stream_change_is_muted (GvcMixerStream *stream, gboolean gvc_mixer_stream_is_running (GvcMixerStream *stream); const char * gvc_mixer_stream_get_name (GvcMixerStream *stream); const char * gvc_mixer_stream_get_icon_name (GvcMixerStream *stream); +GIcon * gvc_mixer_stream_get_gicon (GvcMixerStream *stream); const char * gvc_mixer_stream_get_description (GvcMixerStream *stream); const char * gvc_mixer_stream_get_application_id (GvcMixerStream *stream); gboolean gvc_mixer_stream_is_event_stream (GvcMixerStream *stream);