diff options
-rw-r--r-- | src/active-sink.c | 27 | ||||
-rw-r--r-- | src/active-sink.h | 4 | ||||
-rw-r--r-- | src/pulseaudio-mgr.c | 47 |
3 files changed, 51 insertions, 27 deletions
diff --git a/src/active-sink.c b/src/active-sink.c index ee211ef..8ba88d8 100644 --- a/src/active-sink.c +++ b/src/active-sink.c @@ -25,6 +25,7 @@ typedef struct _ActiveSinkPrivate ActiveSinkPrivate; struct _ActiveSinkPrivate { + sink_details* details; }; #define ACTIVE_SINK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ACTIVE_SINK_TYPE, ActiveSinkPrivate)) @@ -52,11 +53,21 @@ active_sink_class_init (ActiveSinkClass *klass) static void active_sink_init(ActiveSink *self) { + ActiveSinkPrivate* priv = ACTIVE_SINK_GET_PRIVATE(sink); + priv->details = NULL; } static void active_sink_dispose (GObject *object) { + ActiveSink * self = ACTIVE_SINK(object); + ActiveSinkPrivate* priv = ACTIVE_SINK_GET_PRIVATE(sink); + + if (priv->details != NULL) { + g_free (priv->details->name); + g_free (priv->details); + } + G_OBJECT_CLASS (active_sink_parent_class)->dispose (object); } @@ -65,3 +76,19 @@ active_sink_finalize (GObject *object) { G_OBJECT_CLASS (active_sink_parent_class)->finalize (object); } + +void +active_sink_update_details (ActiveSink* sink, sink_details* details) +{ + ActiveSinkPrivate* priv = ACTIVE_SINK_GET_PRIVATE(sink); + priv->details = details; +} + +void gboolean +active_sink_is_populated (ActiveSink* sink) +{ + ActiveSinkPrivate* priv = ACTIVE_SINK_GET_PRIVATE(sink); + return (priv->details != NULL) +} + +
\ No newline at end of file diff --git a/src/active-sink.h b/src/active-sink.h index 12083b8..6aed0b6 100644 --- a/src/active-sink.h +++ b/src/active-sink.h @@ -55,9 +55,11 @@ typedef struct { pa_volume_t base_volume; } sink_details; - GType active_sink_get_type (void) G_GNUC_CONST; +void active_sink_update_details (ActiveSink* sink, sink_details* details); +void gboolean active_sink_is_populated (ActiveSink* sink) + G_END_DECLS #endif diff --git a/src/pulseaudio-mgr.c b/src/pulseaudio-mgr.c index 216c025..59faaf0 100644 --- a/src/pulseaudio-mgr.c +++ b/src/pulseaudio-mgr.c @@ -99,7 +99,15 @@ reconnect_to_pulse (gpointer user_data) static void populate_active_sink (const pa_sink_info *info, ActiveSink* sink) { - + sink_details *details; + details = g_new0 (sink_details, 1); + details->index = info->index; + details->name = g_strdup (info->name); + details->mute = !!info->mute; + details->volume = construct_mono_volume (&info->volume); + details->base_volume = info->base_volume; + details->channel_map = info->channel_map; + active_sink_update_details (sink, details); } /**********************************************************************************************************************/ @@ -225,6 +233,9 @@ pm_server_info_callback (pa_context *c, pa_operation_unref(operation); } +// If the server doesn't have a default sink to give us +// we should attempt to pick up the first of the list of sinks which doesn't have +// the name 'auto_null' static void pm_sink_info_callback (pa_context *c, const pa_sink_info *sink, @@ -235,17 +246,11 @@ pm_sink_info_callback (pa_context *c, return; } else { - /* g_debug("About to add an item to our hash");*/ - sink_info *value; - value = g_new0(sink_info, 1); - value->index = sink->index; - value->name = g_strdup(sink->name); - value->mute = !!sink->mute; - value->volume = construct_mono_volume(&sink->volume); - value->base_volume = sink->base_volume; - value->channel_map = sink->channel_map; - g_hash_table_insert(sink_hash, GINT_TO_POINTER(sink->index), value); - /* g_debug("After adding an item to our hash");*/ + ActiveSink* a_sink = ACTIVESINK (userdata); + if (active_sink_is_populated (a_sink) && + g_ascii_strncasecmp("auto_null", sink->name, 9) != 0){ + populate_active_sink (info, ACTIVESINK (userdata)); + } } } @@ -256,21 +261,11 @@ pm_default_sink_info_callback (pa_context *c, void *userdata) { if (eol > 0) { + // TODO what happens here - high and dry! return; - } else { - DEFAULT_SINK_INDEX = info->index; - /* g_debug("Just set the default sink index to %i", DEFAULT_SINK_INDEX); */ - GList *keys = g_hash_table_get_keys(sink_hash); - gint position = g_list_index(keys, GINT_TO_POINTER(info->index)); - // Only update sink-list if the index is not in our already fetched list. - if (position < 0) { - pa_operation_unref(pa_context_get_sink_info_list(c, pulse_sink_info_callback, NULL)); - } else { - sound_service_dbus_update_pa_state(dbus_service, - determine_sink_availability(), - default_sink_is_muted(), - get_default_sink_volume()); - } + } + else { + populate_active_sink (info, ACTIVESINK (userdata)); } } |