From b4b3889f3ce9358169eeb9cde1c451fad73f77e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B4mulo=20Borges?= Date: Sun, 28 Sep 2025 12:25:49 -0300 Subject: [PATCH] pactl: add JSON output format Previously, using the -f json or --format=json flags did not return JSON for the following commands: - get-sink-volume - get-source-volume - get-sink-mute - get-source-mute This change adds proper JSON output for these commands. --- src/utils/pactl.c | 66 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/src/utils/pactl.c b/src/utils/pactl.c index d3736bc48..922817fa7 100644 --- a/src/utils/pactl.c +++ b/src/utils/pactl.c @@ -1841,8 +1841,18 @@ static void get_sink_mute_callback(pa_context *c, const pa_sink_info *i, int is_ pa_assert(i); - printf(("Mute: %s\n"), - pa_yes_no_localised(i->mute)); + if (format == JSON) { + pa_json_encoder *encoder = pa_json_encoder_new(); + pa_json_encoder_begin_element_object(encoder); + pa_json_encoder_add_member_bool(encoder, "mute", i->mute); + pa_json_encoder_end_object(encoder); + char* json_str = pa_json_encoder_to_string_free(encoder); + printf("%s\n", json_str); + pa_xfree(json_str); + } else { + printf(("Mute: %s\n"), + pa_yes_no_localised(i->mute)); + } complete_action(); } @@ -1860,10 +1870,21 @@ static void get_sink_volume_callback(pa_context *c, const pa_sink_info *i, int i pa_assert(i); char cv[PA_CVOLUME_SNPRINT_VERBOSE_MAX]; - printf(("Volume: %s\n" - " balance %0.2f\n"), - pa_cvolume_snprint_verbose(cv, sizeof(cv), &i->volume, &i->channel_map, true), - pa_cvolume_get_balance(&i->volume, &i->channel_map)); + if (format == JSON) { + pa_json_encoder *encoder = pa_json_encoder_new(); + pa_json_encoder_begin_element_object(encoder); + pa_json_encoder_add_member_raw_json(encoder, "volume", pa_cvolume_to_json_object(&i->volume, &i->channel_map, i->flags & PA_SINK_DECIBEL_VOLUME)); + pa_json_encoder_add_member_double(encoder, "balance", pa_cvolume_get_balance(&i->volume, &i->channel_map), 2); + pa_json_encoder_end_object(encoder); + char* json_str = pa_json_encoder_to_string_free(encoder); + printf("%s\n", json_str); + pa_xfree(json_str); + } else { + printf(("Volume: %s\n" + " balance %0.2f\n"), + pa_cvolume_snprint_verbose(cv, sizeof(cv), &i->volume, &i->channel_map, true), + pa_cvolume_get_balance(&i->volume, &i->channel_map)); + } complete_action(); } @@ -1907,8 +1928,18 @@ static void get_source_mute_callback(pa_context *c, const pa_source_info *i, int pa_assert(i); - printf(("Mute: %s\n"), - pa_yes_no_localised(i->mute)); + if (format == JSON) { + pa_json_encoder *encoder = pa_json_encoder_new(); + pa_json_encoder_begin_element_object(encoder); + pa_json_encoder_add_member_bool(encoder, "mute", i->mute); + pa_json_encoder_end_object(encoder); + char* json_str = pa_json_encoder_to_string_free(encoder); + printf("%s\n", json_str); + pa_xfree(json_str); + } else { + printf(("Mute: %s\n"), + pa_yes_no_localised(i->mute)); + } complete_action(); } @@ -1926,10 +1957,21 @@ static void get_source_volume_callback(pa_context *c, const pa_source_info *i, i pa_assert(i); char cv[PA_CVOLUME_SNPRINT_VERBOSE_MAX]; - printf(("Volume: %s\n" - " balance %0.2f\n"), - pa_cvolume_snprint_verbose(cv, sizeof(cv), &i->volume, &i->channel_map, true), - pa_cvolume_get_balance(&i->volume, &i->channel_map)); + if (format == JSON) { + pa_json_encoder *encoder = pa_json_encoder_new(); + pa_json_encoder_begin_element_object(encoder); + pa_json_encoder_add_member_raw_json(encoder, "volume", pa_cvolume_to_json_object(&i->volume, &i->channel_map, i->flags & PA_SINK_DECIBEL_VOLUME)); + pa_json_encoder_add_member_double(encoder, "balance", pa_cvolume_get_balance(&i->volume, &i->channel_map), 2); + pa_json_encoder_end_object(encoder); + char* json_str = pa_json_encoder_to_string_free(encoder); + printf("%s\n", json_str); + pa_xfree(json_str); + } else { + printf(("Volume: %s\n" + " balance %0.2f\n"), + pa_cvolume_snprint_verbose(cv, sizeof(cv), &i->volume, &i->channel_map, true), + pa_cvolume_get_balance(&i->volume, &i->channel_map)); + } complete_action(); }