From ae1c76ff830d146d41e88d6fba724c0a54bce868 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:45:20 +0200 Subject: Adding upstream version 1:43.6. Signed-off-by: Daniel Baumann --- panels/sound/cc-output-test-dialog.c | 160 +++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 panels/sound/cc-output-test-dialog.c (limited to 'panels/sound/cc-output-test-dialog.c') diff --git a/panels/sound/cc-output-test-dialog.c b/panels/sound/cc-output-test-dialog.c new file mode 100644 index 0000000..b8a518e --- /dev/null +++ b/panels/sound/cc-output-test-dialog.c @@ -0,0 +1,160 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2018 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include +#include + +#include "cc-output-test-dialog.h" +#include "cc-sound-resources.h" +#include "cc-speaker-test-button.h" + +struct _CcOutputTestDialog +{ + GtkDialog parent_instance; + + CcSpeakerTestButton *front_center_speaker_button; + CcSpeakerTestButton *front_left_speaker_button; + CcSpeakerTestButton *front_left_of_center_speaker_button; + CcSpeakerTestButton *front_right_of_center_speaker_button; + CcSpeakerTestButton *front_right_speaker_button; + CcSpeakerTestButton *lfe_speaker_button; + CcSpeakerTestButton *rear_center_speaker_button; + CcSpeakerTestButton *rear_left_speaker_button; + CcSpeakerTestButton *rear_right_speaker_button; + CcSpeakerTestButton *side_left_speaker_button; + CcSpeakerTestButton *side_right_speaker_button; + + GvcMixerUIDevice *device; + GSoundContext *context; +}; + +G_DEFINE_TYPE (CcOutputTestDialog, cc_output_test_dialog, GTK_TYPE_DIALOG) + +static void +cc_output_test_dialog_dispose (GObject *object) +{ + CcOutputTestDialog *self = CC_OUTPUT_TEST_DIALOG (object); + + g_clear_object (&self->device); + g_clear_object (&self->context); + + G_OBJECT_CLASS (cc_output_test_dialog_parent_class)->dispose (object); +} + +void +cc_output_test_dialog_class_init (CcOutputTestDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = cc_output_test_dialog_dispose; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/sound/cc-output-test-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, CcOutputTestDialog, front_center_speaker_button); + gtk_widget_class_bind_template_child (widget_class, CcOutputTestDialog, front_left_speaker_button); + gtk_widget_class_bind_template_child (widget_class, CcOutputTestDialog, front_left_of_center_speaker_button); + gtk_widget_class_bind_template_child (widget_class, CcOutputTestDialog, front_right_of_center_speaker_button); + gtk_widget_class_bind_template_child (widget_class, CcOutputTestDialog, front_right_speaker_button); + gtk_widget_class_bind_template_child (widget_class, CcOutputTestDialog, lfe_speaker_button); + gtk_widget_class_bind_template_child (widget_class, CcOutputTestDialog, rear_center_speaker_button); + gtk_widget_class_bind_template_child (widget_class, CcOutputTestDialog, rear_left_speaker_button); + gtk_widget_class_bind_template_child (widget_class, CcOutputTestDialog, rear_right_speaker_button); + gtk_widget_class_bind_template_child (widget_class, CcOutputTestDialog, side_left_speaker_button); + gtk_widget_class_bind_template_child (widget_class, CcOutputTestDialog, side_right_speaker_button); + + g_type_ensure (CC_TYPE_SPEAKER_TEST_BUTTON); +} + +void +cc_output_test_dialog_init (CcOutputTestDialog *self) +{ + GtkSettings *settings; + g_autofree gchar *theme_name = NULL; + + g_resources_register (cc_sound_get_resource ()); + + gtk_widget_init_template (GTK_WIDGET (self)); + + self->context = gsound_context_new (NULL, NULL); + gsound_context_set_driver (self->context, "pulse", NULL); + gsound_context_set_attributes (self->context, NULL, + GSOUND_ATTR_APPLICATION_ID, "org.gnome.VolumeControl", + NULL); + settings = gtk_settings_get_for_display (gdk_display_get_default ()); + g_object_get (G_OBJECT (settings), + "gtk-sound-theme-name", &theme_name, + NULL); + if (theme_name != NULL) + gsound_context_set_attributes (self->context, NULL, + GSOUND_ATTR_CANBERRA_XDG_THEME_NAME, theme_name, + NULL); + + cc_speaker_test_button_set_channel_position (self->front_left_speaker_button, self->context, PA_CHANNEL_POSITION_FRONT_LEFT); + cc_speaker_test_button_set_channel_position (self->front_left_of_center_speaker_button, self->context, PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER); + cc_speaker_test_button_set_channel_position (self->front_center_speaker_button, self->context, PA_CHANNEL_POSITION_FRONT_CENTER); + cc_speaker_test_button_set_channel_position (self->front_right_of_center_speaker_button, self->context, PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER); + cc_speaker_test_button_set_channel_position (self->front_right_speaker_button, self->context, PA_CHANNEL_POSITION_FRONT_RIGHT); + cc_speaker_test_button_set_channel_position (self->side_left_speaker_button, self->context, PA_CHANNEL_POSITION_SIDE_LEFT); + cc_speaker_test_button_set_channel_position (self->side_right_speaker_button, self->context, PA_CHANNEL_POSITION_SIDE_RIGHT); + cc_speaker_test_button_set_channel_position (self->lfe_speaker_button, self->context, PA_CHANNEL_POSITION_LFE); + cc_speaker_test_button_set_channel_position (self->rear_left_speaker_button, self->context, PA_CHANNEL_POSITION_REAR_LEFT); + cc_speaker_test_button_set_channel_position (self->rear_center_speaker_button, self->context, PA_CHANNEL_POSITION_REAR_CENTER); + cc_speaker_test_button_set_channel_position (self->rear_right_speaker_button, self->context, PA_CHANNEL_POSITION_REAR_RIGHT); +} + +CcOutputTestDialog * +cc_output_test_dialog_new (GvcMixerUIDevice *device, + GvcMixerStream *stream) +{ + CcOutputTestDialog *self; + const GvcChannelMap *map = NULL; + g_autofree gchar *title = NULL; + + self = g_object_new (CC_TYPE_OUTPUT_TEST_DIALOG, + "use-header-bar", 1, + NULL); + self->device = g_object_ref (device); + + title = g_strdup_printf (_("Testing %s"), gvc_mixer_ui_device_get_description (device)); + gtk_window_set_title (GTK_WINDOW (self), title); + + map = gvc_mixer_stream_get_channel_map (stream); + gtk_widget_set_visible (GTK_WIDGET (self->front_left_speaker_button), gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_FRONT_LEFT)); + gtk_widget_set_visible (GTK_WIDGET (self->front_left_of_center_speaker_button), gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER)); + gtk_widget_set_visible (GTK_WIDGET (self->front_center_speaker_button), gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_FRONT_CENTER)); + gtk_widget_set_visible (GTK_WIDGET (self->front_right_of_center_speaker_button), gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER)); + gtk_widget_set_visible (GTK_WIDGET (self->front_right_speaker_button), gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_FRONT_RIGHT)); + gtk_widget_set_visible (GTK_WIDGET (self->side_left_speaker_button), gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_SIDE_LEFT)); + gtk_widget_set_visible (GTK_WIDGET (self->side_right_speaker_button), gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_SIDE_RIGHT)); + gtk_widget_set_visible (GTK_WIDGET (self->lfe_speaker_button), gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_LFE)); + gtk_widget_set_visible (GTK_WIDGET (self->rear_left_speaker_button), gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_REAR_LEFT)); + gtk_widget_set_visible (GTK_WIDGET (self->rear_center_speaker_button), gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_REAR_CENTER)); + gtk_widget_set_visible (GTK_WIDGET (self->rear_right_speaker_button), gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_REAR_RIGHT)); + + /* Replace the center channel with a mono channel */ + if (gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_MONO)) + { + if (gvc_channel_map_has_position (map, PA_CHANNEL_POSITION_FRONT_CENTER)) + g_warning ("Testing output with both front center and mono channels - front center is hidden"); + cc_speaker_test_button_set_channel_position (self->front_center_speaker_button, self->context, PA_CHANNEL_POSITION_MONO); + gtk_widget_set_visible (GTK_WIDGET (self->front_center_speaker_button), TRUE); + } + + return self; +} -- cgit v1.2.3