mirror of
				https://github.com/alsa-project/alsa-tools.git
				synced 2025-10-29 05:40:25 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			1139 lines
		
	
	
	
		
			38 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1139 lines
		
	
	
	
		
			38 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*****************************************************************************
 | |
|    envy24control.c - Env24 chipset (ICE1712) control utility
 | |
|    Copyright (C) 2000 by Jaroslav Kysela <perex@suse.cz>
 | |
|    
 | |
|    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 General Public License for more details.
 | |
|    
 | |
|    You should have received a copy of the GNU General Public License
 | |
|    along with this program; if not, write to the Free Software
 | |
|    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | |
| ******************************************************************************/
 | |
| 
 | |
| #include "envy24control.h"
 | |
| #define _GNU_SOURCE
 | |
| #include <getopt.h>
 | |
| 
 | |
| ice1712_eeprom_t card_eeprom;
 | |
| snd_ctl_t *ctl;
 | |
| 
 | |
| GtkWidget *window;
 | |
| 
 | |
| GtkWidget *mixer_mix_drawing;
 | |
| GtkWidget *mixer_clear_peaks_button;
 | |
| GtkWidget *mixer_drawing[20];
 | |
| GtkObject *mixer_adj[20][2];
 | |
| GtkWidget *mixer_vscale[20][2];
 | |
| GtkWidget *mixer_solo_toggle[20][2];
 | |
| GtkWidget *mixer_mute_toggle[20][2];
 | |
| GtkWidget *mixer_stereo_toggle[20];
 | |
| 
 | |
| GtkWidget *router_radio[10][12];
 | |
| 
 | |
| GtkWidget *hw_master_clock_xtal_radio;
 | |
| GtkWidget *hw_master_clock_spdif_radio;
 | |
| GtkWidget *hw_master_clock_word_radio;
 | |
| GtkWidget *hw_master_clock_status_label;
 | |
| 
 | |
| GtkObject *hw_volume_change_adj;
 | |
| GtkWidget *hw_volume_change_spin;
 | |
| 
 | |
| GtkWidget *hw_spdif_profi_nonaudio_radio;
 | |
| GtkWidget *hw_spdif_profi_audio_radio;
 | |
| 
 | |
| GtkWidget *hw_profi_stream_stereo_radio;
 | |
| GtkWidget *hw_profi_stream_notid_radio;
 | |
| 
 | |
| GtkWidget *hw_profi_emphasis_none_radio;
 | |
| GtkWidget *hw_profi_emphasis_5015_radio;
 | |
| GtkWidget *hw_profi_emphasis_ccitt_radio;
 | |
| GtkWidget *hw_profi_emphasis_notid_radio;
 | |
| 
 | |
| GtkWidget *hw_consumer_copyright_on_radio;
 | |
| GtkWidget *hw_consumer_copyright_off_radio;
 | |
| 
 | |
| GtkWidget *hw_consumer_copy_1st_radio;
 | |
| GtkWidget *hw_consumer_copy_original_radio;
 | |
| 
 | |
| GtkWidget *hw_consumer_emphasis_none_radio;
 | |
| GtkWidget *hw_consumer_emphasis_5015_radio;
 | |
| 
 | |
| GtkWidget *hw_consumer_category_dat_radio;
 | |
| GtkWidget *hw_consumer_category_pcm_radio;
 | |
| GtkWidget *hw_consumer_category_cd_radio;
 | |
| GtkWidget *hw_consumer_category_general_radio;
 | |
| 
 | |
| GtkWidget *hw_spdif_professional_radio;
 | |
| GtkWidget *hw_spdif_consumer_radio;
 | |
| GtkWidget *hw_spdif_output_notebook;
 | |
| 
 | |
| GtkWidget *hw_spdif_input_coaxial_radio;
 | |
| GtkWidget *hw_spdif_input_optical_radio;
 | |
| 
 | |
| 
 | |
| 
 | |
| static void create_mixer_frame(GtkWidget *fixed, int stream)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkObject *adj;
 | |
| 	GtkWidget *vscale;
 | |
| 	GtkWidget *drawing;
 | |
| 	GtkWidget *label;
 | |
| 	GtkWidget *toggle;
 | |
| 	GtkWidget *hseparator;
 | |
| 	char str[64], drawname[32];
 | |
| 
 | |
| 	if (stream <= 10) {
 | |
| 		sprintf(str, "PCM Out %i", stream);
 | |
| 	} else if (stream <= 18) {
 | |
| 		sprintf(str, "H/W In %i", stream - 10);
 | |
| 	} else if (stream == 19) {
 | |
| 		strcpy(str, "S/PDIF In L");
 | |
| 	} else if (stream == 20) {
 | |
| 		strcpy(str, "S/PDIF In R");
 | |
| 	} else {
 | |
| 		strcpy(str, "???");
 | |
| 	}
 | |
| 
 | |
| 	frame = gtk_frame_new(str);
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 2 + (stream - 1) * 102, 2);
 | |
| 	gtk_widget_set_uposition(frame, 2 + (stream - 1) * 102, 2);
 | |
| 	gtk_widget_set_usize(frame, 98, 288);
 | |
| 	gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);	
 | |
| 
 | |
| 	adj = gtk_adjustment_new(96, 0, 96, 1, 16, 0);
 | |
| 	mixer_adj[stream-1][0] = adj;
 | |
| 	vscale = gtk_vscale_new(GTK_ADJUSTMENT(adj));
 | |
| 	mixer_vscale[stream-1][0] = vscale;
 | |
|         gtk_widget_show(vscale);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), vscale, 8, 8);
 | |
| 	gtk_widget_set_uposition(vscale, 7, 8);
 | |
| 	gtk_widget_set_usize(vscale, 18, 146);	
 | |
| 	gtk_scale_set_value_pos(GTK_SCALE(vscale), GTK_POS_BOTTOM);
 | |
| 	gtk_scale_set_digits(GTK_SCALE(vscale), 0);
 | |
| 	gtk_signal_connect(GTK_OBJECT(adj), "value_changed",
 | |
| 			   GTK_SIGNAL_FUNC(mixer_adjust), (gpointer)((stream << 16) + 0));
 | |
| 
 | |
| 	drawing = gtk_drawing_area_new();
 | |
| 	mixer_drawing[stream-1] = drawing;
 | |
| 	sprintf(drawname, "Mixer%i", stream);
 | |
| 	gtk_widget_set_name(drawing, drawname);
 | |
| 	gtk_widget_show(drawing);
 | |
| 	gtk_signal_connect(GTK_OBJECT(drawing), "expose_event",
 | |
| 			   (GtkSignalFunc)level_meters_expose_event, NULL);
 | |
| 	gtk_signal_connect(GTK_OBJECT(drawing), "configure_event",
 | |
| 			   (GtkSignalFunc)level_meters_configure_event, NULL);
 | |
| 	gtk_widget_set_events(drawing, GDK_EXPOSURE_MASK);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), drawing, 24, 9);
 | |
| 	gtk_widget_set_uposition(drawing, 24, 9);
 | |
| 	gtk_widget_set_usize(drawing, 45, 130);	
 | |
| 
 | |
| 	adj = gtk_adjustment_new(96, 0, 96, 1, 16, 0);
 | |
| 	mixer_adj[stream-1][1] = adj;
 | |
| 	vscale = gtk_vscale_new(GTK_ADJUSTMENT(adj));
 | |
| 	mixer_vscale[stream-1][1] = vscale;
 | |
|         gtk_widget_show(vscale);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), vscale, 70, 8);
 | |
| 	gtk_widget_set_uposition(vscale, 69, 8);
 | |
| 	gtk_widget_set_usize(vscale, 18, 146);	
 | |
| 	gtk_scale_set_value_pos(GTK_SCALE(vscale), GTK_POS_BOTTOM);
 | |
| 	gtk_scale_set_digits(GTK_SCALE(vscale), 0);
 | |
| 	gtk_signal_connect(GTK_OBJECT(adj), "value_changed",
 | |
| 			   GTK_SIGNAL_FUNC(mixer_adjust), (gpointer)((stream << 16) + 1));
 | |
| 
 | |
|         label = gtk_label_new("Left");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), label, 0, 160);
 | |
| 	gtk_widget_set_uposition(label, 0, 160);
 | |
| 	gtk_widget_set_usize(label, 41, 16);	
 | |
| 
 | |
|         label = gtk_label_new("Right");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), label, 45, 160);
 | |
| 	gtk_widget_set_uposition(label, 45, 160);
 | |
| 	gtk_widget_set_usize(label, 41, 16);
 | |
| 
 | |
| 	toggle = gtk_toggle_button_new_with_label("On");
 | |
| 	mixer_solo_toggle[stream-1][0] = toggle;
 | |
| 	gtk_widget_show(toggle);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), toggle, 8, 176);
 | |
| 	gtk_widget_set_uposition(toggle, 8, 176);
 | |
| 	gtk_widget_set_usize(toggle, 36, 22);	
 | |
| 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), FALSE);
 | |
| 	gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
 | |
| 			   (GtkSignalFunc)mixer_toggled_solo, (gpointer)((stream << 16) + 0));
 | |
| 	
 | |
| 	toggle = gtk_toggle_button_new_with_label("On");
 | |
| 	mixer_solo_toggle[stream-1][1] = toggle;
 | |
| 	gtk_widget_show(toggle);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), toggle, 48, 176);
 | |
| 	gtk_widget_set_uposition(toggle, 48, 176);
 | |
| 	gtk_widget_set_usize(toggle, 36, 22);	
 | |
| 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), FALSE);
 | |
| 	gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
 | |
| 			   (GtkSignalFunc)mixer_toggled_solo, (gpointer)((stream << 16) + 1));
 | |
| 	
 | |
| 	toggle = gtk_toggle_button_new_with_label("Mute");
 | |
| 	mixer_mute_toggle[stream-1][0] = toggle;
 | |
| 	gtk_widget_show(toggle);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), toggle, 8, 202);
 | |
| 	gtk_widget_set_uposition(toggle, 8, 202);
 | |
| 	gtk_widget_set_usize(toggle, 36, 22);	
 | |
| 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), TRUE);
 | |
| 	gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
 | |
| 			   (GtkSignalFunc)mixer_toggled_mute, (gpointer)((stream << 16) + 0));
 | |
| 	
 | |
| 	toggle = gtk_toggle_button_new_with_label("Mute");
 | |
| 	mixer_mute_toggle[stream-1][1] = toggle;
 | |
| 	gtk_widget_show(toggle);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), toggle, 48, 202);
 | |
| 	gtk_widget_set_uposition(toggle, 48, 202);
 | |
| 	gtk_widget_set_usize(toggle, 36, 22);	
 | |
| 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), TRUE);
 | |
| 	gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
 | |
| 			   (GtkSignalFunc)mixer_toggled_mute, (gpointer)((stream << 16) + 1));
 | |
| 	
 | |
| 	hseparator = gtk_hseparator_new();
 | |
| 	gtk_widget_show(hseparator);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), hseparator, 0, 222);
 | |
| 	gtk_widget_set_uposition(hseparator, 0, 222);
 | |
| 	gtk_widget_set_usize(hseparator, 92, 16);
 | |
| 
 | |
| 	toggle = gtk_toggle_button_new_with_label("Stereo Gang");
 | |
| 	mixer_stereo_toggle[stream-1] = toggle;
 | |
| 	gtk_widget_show(toggle);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), toggle, 3, 235);
 | |
| 	gtk_widget_set_uposition(toggle, 3, 235);
 | |
| 	gtk_widget_set_usize(toggle, 88, 32);
 | |
| 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), TRUE);
 | |
| }
 | |
| 
 | |
| static void create_mixer(GtkWidget *main, GtkWidget *notebook, int page)
 | |
| {
 | |
| 	GtkWidget *label;
 | |
| 	GtkWidget *hpaned;
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed;
 | |
| 	GtkWidget *drawing;
 | |
| 	GtkWidget *hseparator;
 | |
| 	GtkWidget *button;
 | |
| 	GtkWidget *scrollwin;
 | |
| 	GtkWidget *viewport;
 | |
| 	int stream;
 | |
| 
 | |
| 	hpaned = gtk_hpaned_new();
 | |
| 	gtk_widget_show(hpaned);
 | |
| 	gtk_container_add(GTK_CONTAINER(notebook), hpaned);
 | |
| 	gtk_paned_set_gutter_size(GTK_PANED(hpaned), 4);
 | |
| 	gtk_paned_set_position(GTK_PANED(hpaned), 108);
 | |
|         label = gtk_label_new("Monitor Mixer");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), page), label);
 | |
| 
 | |
| 	/* create digital mixer frame */
 | |
| 	frame = gtk_frame_new("Digital Mixer");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_container_add(GTK_CONTAINER(hpaned), frame);
 | |
| 	gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
 | |
| 
 | |
| 	/* create controls in the digital mixer frame */
 | |
| 	fixed = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed);	
 | |
| 
 | |
| 	drawing = gtk_drawing_area_new();
 | |
| 	mixer_mix_drawing = drawing;
 | |
| 	gtk_widget_set_name(drawing, "DigitalMixer");
 | |
| 	gtk_signal_connect(GTK_OBJECT(drawing), "expose_event",
 | |
| 			   (GtkSignalFunc)level_meters_expose_event, NULL);
 | |
| 	gtk_signal_connect(GTK_OBJECT(drawing), "configure_event",
 | |
| 			   (GtkSignalFunc)level_meters_configure_event, NULL);
 | |
| 	gtk_widget_set_events(drawing, GDK_EXPOSURE_MASK);
 | |
| 	gtk_widget_show(drawing);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), drawing, 4, 2);
 | |
| 	gtk_widget_set_uposition(drawing, 4, 2);
 | |
| 	gtk_widget_set_usize(drawing, 98, 226);	
 | |
| 
 | |
|         label = gtk_label_new("Left");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), label, 0, 232);
 | |
| 	gtk_widget_set_uposition(label, 0, 232);
 | |
| 	gtk_widget_set_usize(label, 34, 16);	
 | |
| 
 | |
|         label = gtk_label_new("Right");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), label, 60, 232);
 | |
| 	gtk_widget_set_uposition(label, 60, 232);
 | |
| 	gtk_widget_set_usize(label, 34, 16);
 | |
| 
 | |
| 	hseparator = gtk_hseparator_new();
 | |
| 	gtk_widget_show(hseparator);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), hseparator, 0, 244);
 | |
| 	gtk_widget_set_uposition(hseparator, 0, 244);
 | |
| 	gtk_widget_set_usize(hseparator, 104, 16);
 | |
| 
 | |
| 	button = gtk_button_new_with_label("Reset Peaks");
 | |
| 	mixer_clear_peaks_button = button;
 | |
| 	gtk_widget_show(button);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), button, 3, 256);
 | |
| 	gtk_widget_set_uposition(button, 3, 256);
 | |
| 	gtk_widget_set_usize(button, 98, 35);	
 | |
| 	gtk_signal_connect(GTK_OBJECT(button), "clicked",
 | |
| 			   GTK_SIGNAL_FUNC(level_meters_reset_peaks), NULL);
 | |
| 
 | |
| 	/* build scrolling area */
 | |
| 	scrollwin = gtk_scrolled_window_new(NULL, NULL);
 | |
| 	gtk_widget_show(scrollwin);
 | |
| 	gtk_container_add(GTK_CONTAINER(hpaned), scrollwin);
 | |
| 	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
 | |
| 
 | |
| 	viewport = gtk_viewport_new(NULL, NULL);
 | |
| 	gtk_widget_show(viewport);
 | |
| 	gtk_container_add(GTK_CONTAINER(scrollwin), viewport);
 | |
| 
 | |
| 	fixed = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed);
 | |
| 	gtk_container_add(GTK_CONTAINER(viewport), fixed);	
 | |
| 	
 | |
| 	for (stream = 1; stream <= 20; stream++)
 | |
| 		create_mixer_frame(fixed, stream);
 | |
| }
 | |
| 
 | |
| static void create_router_frame(GtkWidget *fixed, int stream)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkWidget *radio;
 | |
| 	GtkWidget *hseparator;
 | |
| 	GSList *group = NULL;
 | |
| 	char str[64], str1[64];
 | |
| 	int idx;
 | |
| 	static char *table[10] = {
 | |
| 		"S/PDIF In L",
 | |
| 		"S/PDIF In R",
 | |
| 		"H/W In 1",
 | |
| 		"H/W In 2",
 | |
| 		"H/W In 3",
 | |
| 		"H/W In 4",
 | |
| 		"H/W In 5",
 | |
| 		"H/W In 6",
 | |
| 		"H/W In 7",
 | |
| 		"H/W In 8"
 | |
| 	};
 | |
| 
 | |
| 	if (stream <= 8) {
 | |
| 		sprintf(str, "H/W Out %i (%s)", stream, stream & 1 ? "L" : "R");
 | |
| 	} else if (stream == 9) {
 | |
| 		strcpy(str, "S/PDIF Out L");
 | |
| 	} else if (stream == 10) {
 | |
| 		strcpy(str, "S/PDIF Out R");
 | |
| 	} else {
 | |
| 		strcpy(str, "???");
 | |
| 	}
 | |
| 	sprintf(str1, "PCM Out %i", stream);
 | |
| 
 | |
| 	frame = gtk_frame_new(str);
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 2 + (stream - 1) * 101, 2);
 | |
| 	gtk_widget_set_uposition(frame, 2 + (stream - 1) * 101, 2);
 | |
| 	gtk_widget_set_usize(frame, 98, 284);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);	
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, str1);
 | |
| 	router_radio[stream-1][0] = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 0, 0);
 | |
| 	gtk_widget_set_uposition(radio, 0, 0);
 | |
| 	gtk_widget_set_usize(radio, 93, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)patchbay_toggled, (gpointer)((stream << 16) + 0));
 | |
| 
 | |
| 	hseparator = gtk_hseparator_new();
 | |
| 	gtk_widget_show(hseparator);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), hseparator, 0, 21);
 | |
| 	gtk_widget_set_uposition(hseparator, 0, 21);
 | |
| 	gtk_widget_set_usize(hseparator, 94, 16);
 | |
| 
 | |
| 	if (stream == 1 || stream == 2 || stream == 9 || stream == 10) {
 | |
| 		radio = gtk_radio_button_new_with_label(group, stream & 1 ? "Digital Mix L" : "Digital Mix R");
 | |
| 		router_radio[stream-1][1] = radio;
 | |
| 		group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 		gtk_widget_show(radio);
 | |
| 		gtk_fixed_put(GTK_FIXED(fixed1), radio, 0, 32);
 | |
| 		gtk_widget_set_uposition(radio, 0, 32);
 | |
| 		gtk_widget_set_usize(radio, 93, 24);
 | |
| 		gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 				   (GtkSignalFunc)patchbay_toggled, (gpointer)((stream << 16) + 1));
 | |
| 	}
 | |
| 
 | |
| 	hseparator = gtk_hseparator_new();
 | |
| 	gtk_widget_show(hseparator);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), hseparator, 0, 52);
 | |
| 	gtk_widget_set_uposition(hseparator, 0, 52);
 | |
| 	gtk_widget_set_usize(hseparator, 94, 16);
 | |
| 
 | |
| 	for (idx = 0; idx < 10; idx++) {
 | |
| 		radio = gtk_radio_button_new_with_label(group, table[idx]);
 | |
| 		router_radio[stream-1][2+idx] = radio;
 | |
| 		group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 		gtk_widget_show(radio);
 | |
| 		gtk_fixed_put(GTK_FIXED(fixed1), radio, 0, 64 + (idx * 20));
 | |
| 		gtk_widget_set_uposition(radio, 0, 64 + (idx * 20));
 | |
| 		gtk_widget_set_usize(radio, 93, 24);
 | |
| 		gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 				   (GtkSignalFunc)patchbay_toggled, (gpointer)((stream << 16) + 2 + idx));
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static void create_router(GtkWidget *main, GtkWidget *notebook, int page)
 | |
| {
 | |
| 	GtkWidget *label;
 | |
| 	GtkWidget *scrollwin;
 | |
| 	GtkWidget *viewport;
 | |
| 	GtkWidget *fixed;
 | |
| 	int stream;
 | |
| 
 | |
| 	scrollwin = gtk_scrolled_window_new(NULL, NULL);
 | |
| 	gtk_widget_show(scrollwin);
 | |
| 	gtk_container_add(GTK_CONTAINER(notebook), scrollwin);
 | |
| 	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
 | |
|         label = gtk_label_new("Patchbay / Router");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), page), label);
 | |
| 	viewport = gtk_viewport_new(NULL, NULL);
 | |
| 	gtk_widget_show(viewport);
 | |
| 	gtk_container_add(GTK_CONTAINER(scrollwin), viewport);
 | |
| 	fixed = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed);
 | |
| 	gtk_container_add(GTK_CONTAINER(viewport), fixed);	
 | |
| 
 | |
| 	for (stream = 1; stream <= 10; stream++)
 | |
| 		create_router_frame(fixed, stream);
 | |
| }
 | |
| 
 | |
| static void create_master_clock(GtkWidget *fixed)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkWidget *radio;
 | |
| 	GtkWidget *viewport;
 | |
| 	GtkWidget *fixed2;
 | |
| 	GtkWidget *label;
 | |
| 	GSList *group = NULL;
 | |
| 
 | |
| 	frame = gtk_frame_new("Master Clock");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 8, 8);
 | |
| 	gtk_widget_set_uposition(frame, 8, 8);
 | |
| 	gtk_widget_set_usize(frame, 111, 125);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);	
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Internal Xtal");
 | |
| 	hw_master_clock_xtal_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 0);
 | |
| 	gtk_widget_set_uposition(radio, 8, 0);
 | |
| 	gtk_widget_set_usize(radio, 92, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)master_clock_toggled, (gpointer)"Xtal");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "S/PDIF In");
 | |
| 	hw_master_clock_spdif_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 24);
 | |
| 	gtk_widget_set_uposition(radio, 8, 24);
 | |
| 	gtk_widget_set_usize(radio, 92, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)master_clock_toggled, (gpointer)"SPDIF");
 | |
| 
 | |
| 	if (card_eeprom.subvendor != ICE1712_SUBDEVICE_DELTA1010)
 | |
| 		return;
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Word Clock");
 | |
| 	hw_master_clock_word_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 48);
 | |
| 	gtk_widget_set_uposition(radio, 8, 48);
 | |
| 	gtk_widget_set_usize(radio, 92, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)master_clock_toggled, (gpointer)"WordClock");
 | |
| 
 | |
| 	viewport = gtk_viewport_new(NULL, NULL);
 | |
| 	gtk_widget_show(viewport);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), viewport, 9, 75);
 | |
| 	gtk_widget_set_uposition(viewport, 9, 75);
 | |
| 	gtk_widget_set_usize(viewport, 90, 26);
 | |
| 
 | |
| 	fixed2 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed2);
 | |
| 	gtk_container_add(GTK_CONTAINER(viewport), fixed2);	
 | |
| 
 | |
|         label = gtk_label_new("Locked");
 | |
|         hw_master_clock_status_label = label;
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed2), label, 0, 3);
 | |
| 	gtk_widget_set_uposition(label, 0, 3);
 | |
| 	gtk_widget_set_usize(label, 86, 16);
 | |
| }
 | |
| 
 | |
| static void create_volume_change(GtkWidget *fixed)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkObject *adj;
 | |
| 	GtkWidget *spin;
 | |
| 	GtkWidget *label;
 | |
| 
 | |
| 	frame = gtk_frame_new("Volume Change");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 8, 144);
 | |
| 	gtk_widget_set_uposition(frame, 8, 144);
 | |
| 	gtk_widget_set_usize(frame, 111, 132);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);	
 | |
| 
 | |
| 	adj = gtk_adjustment_new(16, 0, 255, 1, 10, 10);
 | |
| 	hw_volume_change_adj = adj;
 | |
| 	spin = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
 | |
| 	hw_volume_change_spin = spin;
 | |
| 	gtk_widget_show(spin);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), spin, 48, 40);
 | |
| 	gtk_widget_set_uposition(spin, 48, 40);
 | |
| 	gtk_widget_set_usize(spin, 53, 22);
 | |
| 	gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE);
 | |
| 	gtk_signal_connect(GTK_OBJECT(adj), "value_changed",
 | |
| 			   GTK_SIGNAL_FUNC(volume_change_rate_adj), NULL);
 | |
| 	
 | |
|         label = gtk_label_new("Rate:");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), label, 0, 3);
 | |
| 	gtk_widget_set_uposition(label, 0, 42);
 | |
| 	gtk_widget_set_usize(label, 41, 16);
 | |
| }
 | |
| 
 | |
| static void create_spdif_output_settings_profi_data(GtkWidget *fixed)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkWidget *radio;
 | |
| 	GSList *group = NULL;
 | |
| 
 | |
| 	frame = gtk_frame_new("Data Mode");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 10, 10);
 | |
| 	gtk_widget_set_uposition(frame, 10, 10);
 | |
| 	gtk_widget_set_usize(frame, 100, 81);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);	
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Non-audio");
 | |
| 	hw_spdif_profi_nonaudio_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 8);
 | |
| 	gtk_widget_set_uposition(radio, 8, 8);
 | |
| 	gtk_widget_set_usize(radio, 84, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)profi_data_toggled, (gpointer)"Non-audio");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Audio");
 | |
| 	hw_spdif_profi_audio_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 32);
 | |
| 	gtk_widget_set_uposition(radio, 8, 32);
 | |
| 	gtk_widget_set_usize(radio, 84, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)profi_data_toggled, (gpointer)"Audio");
 | |
| }
 | |
| 
 | |
| static void create_spdif_output_settings_profi_stream(GtkWidget *fixed)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkWidget *radio;
 | |
| 	GSList *group = NULL;
 | |
| 
 | |
| 	frame = gtk_frame_new("Stream");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 120, 10);
 | |
| 	gtk_widget_set_uposition(frame, 120, 10);
 | |
| 	gtk_widget_set_usize(frame, 116, 81);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);	
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Stereophonic");
 | |
| 	hw_profi_stream_stereo_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 8);
 | |
| 	gtk_widget_set_uposition(radio, 8, 8);
 | |
| 	gtk_widget_set_usize(radio, 96, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)profi_stream_toggled, (gpointer)"Stereo");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Not indicated");
 | |
| 	hw_profi_stream_notid_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 32);
 | |
| 	gtk_widget_set_uposition(radio, 8, 32);
 | |
| 	gtk_widget_set_usize(radio, 96, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)profi_stream_toggled, (gpointer)"NOTID");
 | |
| }
 | |
| 
 | |
| static void create_spdif_output_settings_profi_emphasis(GtkWidget *fixed)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkWidget *radio;
 | |
| 	GSList *group = NULL;
 | |
| 
 | |
| 	frame = gtk_frame_new("Emphasis");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 10, 10);
 | |
| 	gtk_widget_set_uposition(frame, 246, 10);
 | |
| 	gtk_widget_set_usize(frame, 114, 131);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);	
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "No emphasis");
 | |
| 	hw_profi_emphasis_none_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 8);
 | |
| 	gtk_widget_set_uposition(radio, 8, 8);
 | |
| 	gtk_widget_set_usize(radio, 94, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)profi_emphasis_toggled, (gpointer)"No");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "50/15us");
 | |
| 	hw_profi_emphasis_5015_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 32);
 | |
| 	gtk_widget_set_uposition(radio, 8, 32);
 | |
| 	gtk_widget_set_usize(radio, 94, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)profi_emphasis_toggled, (gpointer)"5015");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "CCITT J.17");
 | |
| 	hw_profi_emphasis_ccitt_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 56);
 | |
| 	gtk_widget_set_uposition(radio, 8, 56);
 | |
| 	gtk_widget_set_usize(radio, 94, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)profi_emphasis_toggled, (gpointer)"CCITT");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Not indicated");
 | |
| 	hw_profi_emphasis_notid_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 80);
 | |
| 	gtk_widget_set_uposition(radio, 8, 80);
 | |
| 	gtk_widget_set_usize(radio, 94, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)profi_emphasis_toggled, (gpointer)"NOTID");
 | |
| }
 | |
| 
 | |
| static void create_spdif_output_settings_profi(GtkWidget *notebook, int page)
 | |
| {
 | |
| 	GtkWidget *fixed;
 | |
| 	GtkWidget *label;
 | |
| 
 | |
| 	fixed = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed);
 | |
| 	gtk_container_add(GTK_CONTAINER(notebook), fixed);
 | |
|         label = gtk_label_new("Professional");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), page), label);
 | |
| 
 | |
| 	create_spdif_output_settings_profi_data(fixed);
 | |
| 	create_spdif_output_settings_profi_stream(fixed);
 | |
| 	create_spdif_output_settings_profi_emphasis(fixed);
 | |
| }
 | |
| 
 | |
| static void create_spdif_output_settings_consumer_copyright(GtkWidget *fixed)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkWidget *radio;
 | |
| 	GSList *group = NULL;
 | |
| 
 | |
| 	frame = gtk_frame_new("Copyright");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 10, 10);
 | |
| 	gtk_widget_set_uposition(frame, 10, 10);
 | |
| 	gtk_widget_set_usize(frame, 124, 79);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Copyrighted");
 | |
| 	hw_consumer_copyright_on_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 8);
 | |
| 	gtk_widget_set_uposition(radio, 8, 8);
 | |
| 	gtk_widget_set_usize(radio, 106, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)consumer_copyright_toggled, (gpointer)"Copyright");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Copy permitted");
 | |
| 	hw_consumer_copyright_off_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 32);
 | |
| 	gtk_widget_set_uposition(radio, 8, 32);
 | |
| 	gtk_widget_set_usize(radio, 106, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)consumer_copyright_toggled, (gpointer)"Permitted");
 | |
| }
 | |
| 
 | |
| static void create_spdif_output_settings_consumer_copy(GtkWidget *fixed)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkWidget *radio;
 | |
| 	GSList *group = NULL;
 | |
| 
 | |
| 	frame = gtk_frame_new("Copy");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 10, 96);
 | |
| 	gtk_widget_set_uposition(frame, 10, 96);
 | |
| 	gtk_widget_set_usize(frame, 124, 79);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "1-st generation");
 | |
| 	hw_consumer_copy_1st_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 8);
 | |
| 	gtk_widget_set_uposition(radio, 8, 8);
 | |
| 	gtk_widget_set_usize(radio, 106, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)consumer_copy_toggled, (gpointer)"1st");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Original");
 | |
| 	hw_consumer_copy_original_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 32);
 | |
| 	gtk_widget_set_uposition(radio, 8, 32);
 | |
| 	gtk_widget_set_usize(radio, 106, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)consumer_copy_toggled, (gpointer)"Original");
 | |
| }
 | |
| 
 | |
| static void create_spdif_output_settings_consumer_emphasis(GtkWidget *fixed)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkWidget *radio;
 | |
| 	GSList *group = NULL;
 | |
| 
 | |
| 	frame = gtk_frame_new("Emphasis");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 144, 10);
 | |
| 	gtk_widget_set_uposition(frame, 144, 10);
 | |
| 	gtk_widget_set_usize(frame, 130, 80);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "No emphasis");
 | |
| 	hw_consumer_emphasis_none_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 8);
 | |
| 	gtk_widget_set_uposition(radio, 8, 8);
 | |
| 	gtk_widget_set_usize(radio, 92, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)consumer_emphasis_toggled, (gpointer)"No");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "50/15us");
 | |
| 	hw_consumer_emphasis_5015_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 32);
 | |
| 	gtk_widget_set_uposition(radio, 8, 32);
 | |
| 	gtk_widget_set_usize(radio, 92, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)consumer_emphasis_toggled, (gpointer)"5015");
 | |
| }
 | |
| 
 | |
| static void create_spdif_output_settings_consumer_category(GtkWidget *fixed)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkWidget *radio;
 | |
| 	GSList *group = NULL;
 | |
| 
 | |
| 	frame = gtk_frame_new("Category");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 283, 10);
 | |
| 	gtk_widget_set_uposition(frame, 283, 10);
 | |
| 	gtk_widget_set_usize(frame, 130, 126);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);	
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "DAT");
 | |
| 	hw_consumer_category_dat_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 8);
 | |
| 	gtk_widget_set_uposition(radio, 8, 8);
 | |
| 	gtk_widget_set_usize(radio, 102, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)consumer_category_toggled, (gpointer)"DAT");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "PCM encoder");
 | |
| 	hw_consumer_category_pcm_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 32);
 | |
| 	gtk_widget_set_uposition(radio, 8, 32);
 | |
| 	gtk_widget_set_usize(radio, 102, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)consumer_category_toggled, (gpointer)"PCM");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "CD (ICE-908)");
 | |
| 	hw_consumer_category_cd_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 56);
 | |
| 	gtk_widget_set_uposition(radio, 8, 56);
 | |
| 	gtk_widget_set_usize(radio, 102, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)consumer_category_toggled, (gpointer)"CD");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "General");
 | |
| 	hw_consumer_category_general_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 80);
 | |
| 	gtk_widget_set_uposition(radio, 8, 80);
 | |
| 	gtk_widget_set_usize(radio, 102, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)consumer_category_toggled, (gpointer)"General");
 | |
| }
 | |
| 
 | |
| static void create_spdif_output_settings_consumer(GtkWidget *notebook, int page)
 | |
| {
 | |
| 	GtkWidget *fixed;
 | |
| 	GtkWidget *label;
 | |
| 
 | |
| 	fixed = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed);
 | |
| 	gtk_container_add(GTK_CONTAINER(notebook), fixed);
 | |
| 	label = gtk_label_new("Consumer");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), page), label);
 | |
| 
 | |
| 	create_spdif_output_settings_consumer_copyright(fixed);
 | |
| 	create_spdif_output_settings_consumer_copy(fixed);
 | |
| 	create_spdif_output_settings_consumer_emphasis(fixed);
 | |
| 	create_spdif_output_settings_consumer_category(fixed);
 | |
| }
 | |
| 
 | |
| static void create_spdif_output_settings(GtkWidget *fixed)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkWidget *radio;
 | |
| 	GtkWidget *notebook;
 | |
| 	GSList *group = NULL;
 | |
| 
 | |
| 	frame = gtk_frame_new("S/PDIF Output Settings");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 128, 8);
 | |
| 	gtk_widget_set_uposition(frame, 128, 8);
 | |
| 	gtk_widget_set_usize(frame, 442, 268);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);	
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Professional");
 | |
| 	hw_spdif_professional_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 24, 4);
 | |
| 	gtk_widget_set_uposition(radio, 24, 4);
 | |
| 	gtk_widget_set_usize(radio, 92, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)spdif_output_toggled, (gpointer)"Professional");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Consumer");
 | |
| 	hw_spdif_consumer_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 128, 4);
 | |
| 	gtk_widget_set_uposition(radio, 128, 4);
 | |
| 	gtk_widget_set_usize(radio, 92, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)spdif_output_toggled, (gpointer)"Consumer");
 | |
| 
 | |
| 	notebook = gtk_notebook_new();
 | |
| 	hw_spdif_output_notebook = notebook;
 | |
| 	gtk_widget_show(notebook);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), notebook, 5, 31);
 | |
| 	gtk_widget_set_uposition(notebook, 5, 31);
 | |
| 	gtk_widget_set_usize(notebook, 427, 215);
 | |
| 
 | |
| 	create_spdif_output_settings_profi(notebook, 0);
 | |
| 	create_spdif_output_settings_consumer(notebook, 1);
 | |
| }
 | |
| 
 | |
| static void create_spdif_input_select(GtkWidget *fixed)
 | |
| {
 | |
| 	GtkWidget *frame;
 | |
| 	GtkWidget *fixed1;
 | |
| 	GtkWidget *radio;
 | |
| 	GSList *group = NULL;
 | |
| 	int hide = 1;
 | |
| 
 | |
| 	if (card_eeprom.subvendor == ICE1712_SUBDEVICE_DELTADIO2496)
 | |
| 		hide = 0;
 | |
| 
 | |
| 	frame = gtk_frame_new("S/PDIF Input");
 | |
| 	gtk_widget_show(frame);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), frame, 579, 8);
 | |
| 	gtk_widget_set_uposition(frame, 579, 8);
 | |
| 	gtk_widget_set_usize(frame, 98, 79);
 | |
| 
 | |
| 	fixed1 = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed1);
 | |
| 	gtk_container_add(GTK_CONTAINER(frame), fixed1);	
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Coaxial");
 | |
| 	hw_spdif_input_coaxial_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 8);
 | |
| 	gtk_widget_set_uposition(radio, 8, 8);
 | |
| 	gtk_widget_set_usize(radio, 82, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)spdif_input_toggled, (gpointer)"Coaxial");
 | |
| 
 | |
| 	radio = gtk_radio_button_new_with_label(group, "Optical");
 | |
| 	hw_spdif_input_optical_radio = radio;
 | |
| 	group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
 | |
| 	gtk_widget_show(radio);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed1), radio, 8, 32);
 | |
| 	gtk_widget_set_uposition(radio, 8, 32);
 | |
| 	gtk_widget_set_usize(radio, 82, 24);
 | |
| 	gtk_signal_connect(GTK_OBJECT(radio), "toggled",
 | |
| 			   (GtkSignalFunc)spdif_input_toggled, (gpointer)"Optical");
 | |
| 
 | |
| 	if (hide)
 | |
| 		gtk_widget_hide_all(frame);
 | |
| }
 | |
| 
 | |
| static void create_hardware(GtkWidget *main, GtkWidget *notebook, int page)
 | |
| {
 | |
| 	GtkWidget *label;
 | |
| 	GtkWidget *fixed;
 | |
| 
 | |
| 	fixed = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed);
 | |
| 	gtk_container_add(GTK_CONTAINER(notebook), fixed);
 | |
|         label = gtk_label_new("Hardware Settings");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), page), label);
 | |
| 
 | |
| 	create_master_clock(fixed);
 | |
| 	create_volume_change(fixed);
 | |
| 	create_spdif_output_settings(fixed);
 | |
| 	create_spdif_input_select(fixed);
 | |
| }
 | |
| 
 | |
| static void create_about(GtkWidget *main, GtkWidget *notebook, int page)
 | |
| {
 | |
| 	GtkWidget *label;
 | |
| 	GtkWidget *fixed;
 | |
| 
 | |
| 	fixed = gtk_fixed_new();
 | |
| 	gtk_widget_show(fixed);
 | |
| 	gtk_container_add(GTK_CONTAINER(notebook), fixed);
 | |
|         label = gtk_label_new("About");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), page), label);
 | |
| 
 | |
| 	/* create first line */
 | |
| 	label = gtk_label_new("Envy24 Control Utility " VERSION);
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), label, 0, 72);
 | |
| 	gtk_widget_set_uposition(label, 0, 72);
 | |
| 	gtk_widget_set_usize(label, 736, 16);
 | |
| 
 | |
| 	/* create second line */
 | |
| 	label = gtk_label_new("A GTK Tool for Envy24 PCI Audio Chip");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), label, 0, 104);
 | |
| 	gtk_widget_set_uposition(label, 0, 104);
 | |
| 	gtk_widget_set_usize(label, 736, 16);
 | |
| 
 | |
| 	/* create third line */
 | |
| 	label = gtk_label_new("Copyright (c) 2000 by Jaroslav Kysela <perex@suse.cz>");
 | |
|         gtk_widget_show(label);
 | |
| 	gtk_fixed_put(GTK_FIXED(fixed), label, 0, 152);
 | |
| 	gtk_widget_set_uposition(label, 0, 152);
 | |
| 	gtk_widget_set_usize(label, 736, 16);
 | |
| }
 | |
| 
 | |
| static void usage(void)
 | |
| {
 | |
| 	fprintf(stderr, "usage: envy24control [-D control-name]\n");
 | |
| }
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|         GtkWidget *notebook;
 | |
|         char *name, title[128];
 | |
| 	int i, c, err;
 | |
| 	//snd_ctl_t *ctl; // global
 | |
| 	snd_ctl_card_info_t *hw_info;
 | |
| 	snd_ctl_elem_value_t *val;
 | |
| 	int npfds;
 | |
| 	struct pollfd *pfds;
 | |
| 	// snd_mixer_filter_t filter;
 | |
| 	static struct option long_options[] = {
 | |
| 		{"device", 1, 0, 'D'},
 | |
| 	};
 | |
| 
 | |
| 	snd_ctl_card_info_alloca(&hw_info);
 | |
| 	snd_ctl_elem_value_alloca(&val);
 | |
| 
 | |
| 	/* Go through gtk initialization */
 | |
|         gtk_init(&argc, &argv);
 | |
| 
 | |
| 	name = "hw:0";
 | |
| 	while ((c = getopt_long(argc, argv, "D:", long_options, NULL)) != -1) {
 | |
| 		switch (c) {
 | |
| 		case 'D':
 | |
| 			name = optarg;
 | |
| 			break;
 | |
| 		default:
 | |
| 			usage();
 | |
| 			exit(1);
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if ((err = snd_ctl_open(&ctl, name, 0)) < 0) {
 | |
| 		fprintf(stderr, "snd_ctl_open: %s\n", snd_strerror(err));
 | |
| 		exit(EXIT_FAILURE);
 | |
| 	}
 | |
| 	if ((err = snd_ctl_card_info(ctl, hw_info)) < 0) {
 | |
| 		fprintf(stderr, "snd_ctl_card_info: %s\n", snd_strerror(err));
 | |
| 		exit(EXIT_FAILURE);
 | |
| 	}
 | |
| 	if (snd_ctl_card_info_get_type(hw_info) != SND_CARD_TYPE_ICE1712) {
 | |
| 		fprintf(stderr, "invalid card type %d\n", snd_ctl_card_info_get_type(hw_info));
 | |
| 		exit(EXIT_FAILURE);
 | |
| 	}
 | |
| 
 | |
| 	snd_ctl_elem_value_set_interface(val, SND_CTL_ELEM_IFACE_CARD);
 | |
| 	snd_ctl_elem_value_set_name(val, "ICE1712 EEPROM");
 | |
| 	if ((err = snd_ctl_elem_read(ctl, val)) < 0) {
 | |
| 		fprintf(stderr, "Unable to read EEPROM contents: %s\n", snd_strerror(err));
 | |
| 		exit(EXIT_FAILURE);
 | |
| 	}
 | |
| 	memcpy(&card_eeprom, snd_ctl_elem_value_get_bytes(val), 32);
 | |
| 
 | |
| 	/* Initialize code */
 | |
| 	level_meters_init();
 | |
| 	patchbay_init();
 | |
| 	hardware_init();
 | |
| 
 | |
|         /* Make the title */
 | |
|         sprintf(title, "Envy24 Control Utility %s (%s)", VERSION, snd_ctl_card_info_get_longname(hw_info));
 | |
| 
 | |
|         /* Create the main window */
 | |
|         window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 | |
|         gtk_window_set_title(GTK_WINDOW(window), title);
 | |
|         gtk_signal_connect(GTK_OBJECT (window), "delete_event", 
 | |
|                            (GtkSignalFunc) gtk_main_quit, NULL);
 | |
|         signal(SIGINT, (void *)gtk_main_quit);
 | |
|         gtk_widget_set_usize(window, 740, 340);
 | |
|         gtk_window_set_policy(GTK_WINDOW (window), FALSE, FALSE, FALSE);
 | |
|         gtk_widget_realize(window);
 | |
| 
 | |
|         /* Create the notebook */
 | |
|         notebook = gtk_notebook_new();
 | |
|         gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
 | |
|         gtk_widget_show(notebook);
 | |
| 	gtk_container_add(GTK_CONTAINER(window), notebook);
 | |
| 
 | |
| 	create_mixer(window, notebook, 0);
 | |
| 	create_router(window, notebook, 1);
 | |
| 	create_hardware(window, notebook, 2);
 | |
| 	create_about(window, notebook, 3);
 | |
| 
 | |
| 	npfds = snd_ctl_poll_descriptors_count(ctl);
 | |
| 	if (npfds > 0) {
 | |
| 		pfds = alloca(sizeof(*pfds) * npfds);
 | |
| 		npfds = snd_ctl_poll_descriptors(ctl, pfds, npfds);
 | |
| 		for (i = 0; i < npfds; i++)
 | |
| 			gdk_input_add(pfds[i].fd,
 | |
| 				      GDK_INPUT_READ,
 | |
| 				      control_input_callback,
 | |
| 				      ctl);
 | |
| 	}
 | |
| 	gtk_timeout_add(40, level_meters_timeout_callback, NULL);
 | |
| 	gtk_timeout_add(100, master_clock_status_timeout_callback, NULL);
 | |
| 
 | |
| 	level_meters_postinit();
 | |
| 	mixer_postinit();
 | |
| 	patchbay_postinit();
 | |
| 	hardware_postinit();
 | |
| 
 | |
| 	gtk_widget_show(window);
 | |
| 	gtk_main();
 | |
| 
 | |
| 	snd_ctl_close(ctl);
 | |
| 
 | |
| 	return EXIT_SUCCESS;
 | |
| }
 | 
