From aa23c8f91d136937c5ff47983ff0bb6d30267239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 23 Apr 2025 18:22:53 +0200 Subject: [PATCH 1/5] tests: Test sound feedback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guido Günther --- tests/meson.build | 1 + tests/test-fbd-feedback-sound.c | 60 +++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 tests/test-fbd-feedback-sound.c diff --git a/tests/meson.build b/tests/meson.build index a4f8bda..f338166 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -76,6 +76,7 @@ if get_option('tests') fbd_tests = [ 'fbd-feedback-led', 'fbd-feedback-profile', + 'fbd-feedback-sound', 'fbd-feedback-vibra', 'fbd-feedback-theme', 'fbd-event', diff --git a/tests/test-fbd-feedback-sound.c b/tests/test-fbd-feedback-sound.c new file mode 100644 index 0000000..b2ee080 --- /dev/null +++ b/tests/test-fbd-feedback-sound.c @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2025 The Phosh Developers + * + * SPDX-License-Identifier: GPL-3.0+ + * + * Author: Guido Günther + */ + +#define GMOBILE_USE_UNSTABLE_API +#include "fbd-feedback-manager.h" +#include "fbd-feedback-sound.h" + +#include + + +static void +test_fbd_feedback_sound_event (void) +{ + /* Create manager upfront so we can dispose it, otherwise creating + * any feedback would create it implicitly */ + FbdFeedbackManager *manager = fbd_feedback_manager_get_default (); + g_autoptr (GError) err = NULL; + g_autoptr (JsonNode) node = NULL; + GObject *object; + g_autofree char *event_name = NULL, *file_name = NULL, *effect = NULL; + + node = json_from_string ("{" + " \"event-name\" : \"message-new-cellbroadcast\"," + " \"type\" : \"Sound\"," + " \"effect\" : \"cellbroadcast\"" + "}", &err); + g_assert_no_error (err); + + object = json_gobject_deserialize (FBD_TYPE_FEEDBACK_SOUND, node); + g_test_assert_expected_messages (); + + g_object_get (object, + "event-name", &event_name, + "file-name", &file_name, + "effect", &effect, + NULL); + + g_assert_cmpstr (event_name, ==, "message-new-cellbroadcast"); + g_assert_cmpstr (effect, ==, "cellbroadcast"); + g_assert_null (file_name); + + g_assert_finalize_object (object); + g_assert_finalize_object (manager); +} + + +gint +main (gint argc, gchar *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/feedbackd/fbd/feedback-sound/event", test_fbd_feedback_sound_event); + + return g_test_run (); +} From 0f031521e74608e4806a8c3a40629e1c35339477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 23 Apr 2025 18:13:29 +0200 Subject: [PATCH 2/5] feedback-sound: Modernize prop definitions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gbp-Dch: Ignore Signed-off-by: Guido Günther --- src/fbd-feedback-sound.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/fbd-feedback-sound.c b/src/fbd-feedback-sound.c index 8d26184..05c0242 100644 --- a/src/fbd-feedback-sound.c +++ b/src/fbd-feedback-sound.c @@ -143,14 +143,21 @@ fbd_feedback_sound_class_init (FbdFeedbackSoundClass *klass) base_class->end = fbd_feedback_sound_end; base_class->is_available = fbd_feedback_sound_is_available; + /** + * FbdFeedbackSound:effect: + * + * The sound effect name + */ props[PROP_EFFECT] = - g_param_spec_string ( - "effect", - "Effect", - "The sound effects name", - "", - G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - + g_param_spec_string ("effect", "", "", + NULL, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + /** + * FbdFeedbackSound:file-name: + * + * The file name to use for the sound effect. This overrides the + * effect name. + */ props[PROP_FILE_NAME] = g_param_spec_string ("file-name", "", "", NULL, From 90548620717a9c2b6961df99e354c57fa0e6380c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 23 Apr 2025 18:13:45 +0200 Subject: [PATCH 3/5] feedback-sound: Allow to set media role MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This will allow us to specify the role when playing the sound. Signed-off-by: Guido Günther --- src/fbd-feedback-sound.c | 26 ++++++++++++++++++++++++++ src/fbd-feedback-sound.h | 1 + tests/test-fbd-feedback-sound.c | 7 +++++-- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/fbd-feedback-sound.c b/src/fbd-feedback-sound.c index 05c0242..d67187a 100644 --- a/src/fbd-feedback-sound.c +++ b/src/fbd-feedback-sound.c @@ -24,6 +24,7 @@ enum { PROP_0, PROP_EFFECT, PROP_FILE_NAME, + PROP_MEDIA_ROLE, PROP_LAST_PROP, }; static GParamSpec *props[PROP_LAST_PROP]; @@ -33,6 +34,7 @@ typedef struct _FbdFeedbackSound { char *effect; char *file_name; + char *media_role; } FbdFeedbackSound; G_DEFINE_TYPE (FbdFeedbackSound, fbd_feedback_sound, FBD_TYPE_FEEDBACK_BASE); @@ -91,6 +93,9 @@ fbd_feedback_sound_set_property (GObject *object, case PROP_FILE_NAME: self->file_name = g_value_dup_string (value); break; + case PROP_MEDIA_ROLE: + self->media_role = g_value_dup_string (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -112,6 +117,9 @@ fbd_feedback_sound_get_property (GObject *object, case PROP_FILE_NAME: g_value_set_string (value, fbd_feedback_sound_get_file_name (self)); break; + case PROP_MEDIA_ROLE: + g_value_set_string (value, fbd_feedback_sound_get_media_role (self)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -125,6 +133,7 @@ fbd_feedback_sound_finalize (GObject *object) g_clear_pointer (&self->effect, g_free); g_clear_pointer (&self->file_name, g_free); + g_clear_pointer (&self->media_role, g_free); G_OBJECT_CLASS (fbd_feedback_sound_parent_class)->finalize (object); } @@ -162,6 +171,15 @@ fbd_feedback_sound_class_init (FbdFeedbackSoundClass *klass) g_param_spec_string ("file-name", "", "", NULL, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + /** + * FbdFeedbackSound:media-role: + * + * The media-role to use when playing the sound. + */ + props[PROP_MEDIA_ROLE] = + g_param_spec_string ("media-role", "", "", + NULL, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, PROP_LAST_PROP, props); } @@ -185,8 +203,16 @@ fbd_feedback_sound_get_effect (FbdFeedbackSound *self) return self->effect; } + const char * fbd_feedback_sound_get_file_name (FbdFeedbackSound *self) { return self->file_name; } + + +const char * +fbd_feedback_sound_get_media_role (FbdFeedbackSound *self) +{ + return self->media_role; +} diff --git a/src/fbd-feedback-sound.h b/src/fbd-feedback-sound.h index c713c05..4799255 100644 --- a/src/fbd-feedback-sound.h +++ b/src/fbd-feedback-sound.h @@ -16,5 +16,6 @@ G_DECLARE_FINAL_TYPE (FbdFeedbackSound, fbd_feedback_sound, FBD, FEEDBACK_SOUND, FbdFeedbackSound *fbd_feedback_sound_new_from_file_name (const char *filename); const char *fbd_feedback_sound_get_effect (FbdFeedbackSound *self); const char *fbd_feedback_sound_get_file_name (FbdFeedbackSound *self); +const char *fbd_feedback_sound_get_media_role (FbdFeedbackSound *self); G_END_DECLS diff --git a/tests/test-fbd-feedback-sound.c b/tests/test-fbd-feedback-sound.c index b2ee080..e80b7ce 100644 --- a/tests/test-fbd-feedback-sound.c +++ b/tests/test-fbd-feedback-sound.c @@ -22,12 +22,13 @@ test_fbd_feedback_sound_event (void) g_autoptr (GError) err = NULL; g_autoptr (JsonNode) node = NULL; GObject *object; - g_autofree char *event_name = NULL, *file_name = NULL, *effect = NULL; + g_autofree char *event_name = NULL, *file_name = NULL, *effect = NULL, *media_role = NULL; node = json_from_string ("{" " \"event-name\" : \"message-new-cellbroadcast\"," " \"type\" : \"Sound\"," - " \"effect\" : \"cellbroadcast\"" + " \"effect\" : \"cellbroadcast\"," + " \"media-role\" : \"emergency\"" "}", &err); g_assert_no_error (err); @@ -38,11 +39,13 @@ test_fbd_feedback_sound_event (void) "event-name", &event_name, "file-name", &file_name, "effect", &effect, + "media-role", &media_role, NULL); g_assert_cmpstr (event_name, ==, "message-new-cellbroadcast"); g_assert_cmpstr (effect, ==, "cellbroadcast"); g_assert_null (file_name); + g_assert_cmpstr (media_role, ==, "emergency"); g_assert_finalize_object (object); g_assert_finalize_object (manager); From e23c3401f9a834f71c368653c9d2310ab62e6bcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 23 Apr 2025 18:15:28 +0200 Subject: [PATCH 4/5] fbd-dev-sound: Set special media role when present MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We default to "event". Signed-off-by: Guido Günther --- src/fbd-dev-sound.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/fbd-dev-sound.c b/src/fbd-dev-sound.c index 98ca038..3e11c0d 100644 --- a/src/fbd-dev-sound.c +++ b/src/fbd-dev-sound.c @@ -203,6 +203,7 @@ fbd_dev_sound_play (FbdDevSound *self, FbdFeedbackSound *feedback, FbdDevSoundPl { FbdAsyncData *data; const char *filename; + const char *role; g_return_val_if_fail (FBD_IS_DEV_SOUND (self), FALSE); g_return_val_if_fail (GSOUND_IS_CONTEXT (self->ctx), FALSE); @@ -212,6 +213,10 @@ fbd_dev_sound_play (FbdDevSound *self, FbdFeedbackSound *feedback, FbdDevSoundPl if (!g_hash_table_insert (self->playbacks, feedback, data)) g_warning ("Feedback %p already present", feedback); + role = fbd_feedback_sound_get_media_role (feedback); + if (!role) + role = "event"; + filename = fbd_feedback_sound_get_file_name (feedback); if (filename) { gsound_context_play_full (self->ctx, data->cancel, @@ -219,7 +224,7 @@ fbd_dev_sound_play (FbdDevSound *self, FbdFeedbackSound *feedback, FbdDevSoundPl data, GSOUND_ATTR_MEDIA_FILENAME, filename, GSOUND_ATTR_EVENT_DESCRIPTION, "Feedbackd custom sound feedback", - GSOUND_ATTR_MEDIA_ROLE, "event", + GSOUND_ATTR_MEDIA_ROLE, role, NULL); } else { gsound_context_play_full (self->ctx, data->cancel, @@ -227,7 +232,7 @@ fbd_dev_sound_play (FbdDevSound *self, FbdFeedbackSound *feedback, FbdDevSoundPl data, GSOUND_ATTR_EVENT_ID, fbd_feedback_sound_get_effect (feedback), GSOUND_ATTR_EVENT_DESCRIPTION, "Feedbackd sound feedback", - GSOUND_ATTR_MEDIA_ROLE, "event", + GSOUND_ATTR_MEDIA_ROLE, role, NULL); } return TRUE; From 1e057eaa0c2bc20214674c2ad255bfef9d3aed47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Thu, 24 Apr 2025 10:11:45 +0200 Subject: [PATCH 5/5] doc: Document media-role property MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guido Günther --- doc/feedback-themes.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/feedback-themes.rst b/doc/feedback-themes.rst index 31fd868..bb9546b 100644 --- a/doc/feedback-themes.rst +++ b/doc/feedback-themes.rst @@ -45,6 +45,7 @@ Sound feedbacks specify an event name from a XDG sound theme. Sound themes are described in the ``Sound theme spec`` at https://freedesktop.org/wiki/Specifications/sound-theme-spec/ - `event-name`: The sound event name to use. +- `media-role`: The media role to set played audio stream. Defaults to `event`. VibraRumble feedback ~~~~~~~~~~~~~~~~~~~~