From 4ba2889b9084db4342dfefa01229dda48a2cf775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20B=C3=BCrgmann?= Date: Sat, 23 Jan 2021 20:53:28 +0000 Subject: [PATCH] implement fbd_dev_sound_stop tracks the FdbFeedbackSounds in a GHashTable in the FdbDevSound --- src/fbd-dev-sound.c | 58 +++++++++++++++++++++++++++++++++++----- src/fbd-feedback-sound.c | 7 ----- 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/fbd-dev-sound.c b/src/fbd-dev-sound.c index 57089ba..c84c747 100644 --- a/src/fbd-dev-sound.c +++ b/src/fbd-dev-sound.c @@ -29,6 +29,8 @@ typedef struct _FbdAsyncData { FbdDevSoundPlayedCallback callback; FbdFeedbackSound *feedback; + FbdDevSound *dev; + GCancellable *playback; } FbdAsyncData; typedef struct _FbdDevSound { @@ -36,6 +38,7 @@ typedef struct _FbdDevSound { GSoundContext *ctx; GSettings *sound_settings; + GHashTable *playbacks; } FbdDevSound; static void initable_iface_init (GInitableIface *iface); @@ -69,6 +72,29 @@ on_sound_theme_name_changed (FbdDevSound *self, g_warning ("Failed to set sound theme name to %s: %s", key, error->message); } +static FbdAsyncData* +fbd_async_data_new (FbdDevSound *dev, FbdFeedbackSound *feedback, FbdDevSoundPlayedCallback callback) +{ + FbdAsyncData* data; + + data = g_new0 (FbdAsyncData, 1); + data->callback = callback; + data->feedback = g_object_ref (feedback); + data->dev = g_object_ref (dev); + data->playback = g_cancellable_new (); + + return data; +} + +static void +fbd_async_data_dispose (FbdAsyncData *object) +{ + g_object_unref (object->feedback); + g_object_unref (object->dev); + g_object_unref (object->playback); + g_free (object); +} + static void fbd_dev_sound_dispose (GObject *object) { @@ -76,6 +102,7 @@ fbd_dev_sound_dispose (GObject *object) g_clear_object (&self->ctx); g_clear_object (&self->sound_settings); + g_clear_object (&self->playbacks); G_OBJECT_CLASS (fbd_dev_sound_parent_class)->dispose (object); } @@ -88,6 +115,7 @@ initable_init (GInitable *initable, FbdDevSound *self = FBD_DEV_SOUND (initable); const char *desktop; + self->playbacks = g_hash_table_new (g_direct_hash, g_direct_equal); self->ctx = gsound_context_new(NULL, error); if (!self->ctx) return FALSE; @@ -152,8 +180,9 @@ on_sound_play_finished_callback (GSoundContext *ctx, } (*data->callback)(data->feedback); - g_object_unref (data->feedback); - g_free (data); + + g_hash_table_remove (data->dev->playbacks, data->feedback); + fbd_async_data_dispose (data); } @@ -165,11 +194,11 @@ fbd_dev_sound_play (FbdDevSound *self, FbdFeedbackSound *feedback, FbdDevSoundPl g_return_val_if_fail (FBD_IS_DEV_SOUND (self), FALSE); g_return_val_if_fail (GSOUND_IS_CONTEXT (self->ctx), FALSE); - data = g_new0 (FbdAsyncData, 1); - data->callback = callback; - data->feedback = g_object_ref (feedback); + data = fbd_async_data_new (self, feedback, callback); - gsound_context_play_full (self->ctx, NULL, + g_hash_table_insert (self->playbacks, feedback, data); + + gsound_context_play_full (self->ctx, data->playback, (GAsyncReadyCallback)on_sound_play_finished_callback, data, GSOUND_ATTR_EVENT_ID, fbd_feedback_sound_get_effect (feedback), @@ -178,3 +207,20 @@ fbd_dev_sound_play (FbdDevSound *self, FbdFeedbackSound *feedback, FbdDevSoundPl NULL); return TRUE; } + +gboolean +fbd_dev_sound_stop(FbdDevSound *self, FbdFeedbackSound *feedback) +{ + FbdAsyncData *data; + + g_return_val_if_fail (FBD_IS_DEV_SOUND (self), FALSE); + + data = g_hash_table_lookup (self->playbacks, feedback); + + if (data == NULL) + return FALSE; + + g_cancellable_cancel (data->playback); + + return TRUE; +} diff --git a/src/fbd-feedback-sound.c b/src/fbd-feedback-sound.c index 24e4317..e362245 100644 --- a/src/fbd-feedback-sound.c +++ b/src/fbd-feedback-sound.c @@ -154,10 +154,3 @@ const char *fbd_feedback_sound_get_effect (FbdFeedbackSound *self) { return self->effect; } - -gboolean -fbd_dev_sound_stop(FbdDevSound *self, FbdFeedbackSound *feedback) -{ - /* TODO: can we use cancellable to actually end playback? */ - return TRUE; -}