[PATCH] allow choosing any OSS slider in standard OSS plugin

Michael Leuchtenburg <[email protected]>
Newsgroups gmane.comp.multimedia.xmms.devel
Message-ID <[email protected]>
This is a patch that allows the user to set the volume slider to any OSS
slider, instead of only allowing a toggle between Master and PCM. I find
it useful on my SB Live because I use Pcm2 to control dsp2, where I
send music.

-- michael
xmms_volume_patch.diff (text/plain, 4.5 KB)
diff -r xmms-1.2.7/Output/OSS/configure.c xmms-1.2.7-patched/Output/OSS/configure.c
23c23
< static GtkWidget *mixer_usemaster_check, *buffer_size_spin, *buffer_pre_spin;
---
> static GtkWidget *mixer_output_channel_entry, *buffer_size_spin, *buffer_pre_spin;
26c26
< static gint audio_device, mixer_device;
---
> static gint audio_device, mixer_device, mixer_output_channel;
38,39c38
< 	oss_cfg.use_master =
< 		gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mixer_usemaster_check));
---
> 	oss_cfg.mixer_output_channel = mixer_output_channel;
67c66
< 	xmms_cfg_write_boolean(cfgfile,"OSS","use_master",oss_cfg.use_master);
---
> 	xmms_cfg_write_int(cfgfile,"OSS","mixer_output_channel",oss_cfg.mixer_output_channel);
77a77,81
> static void configure_win_mixer_channel_cb(GtkWidget * widget, gint oss_index)
> {
>         mixer_output_channel = oss_index;
> }
> 
158a163,215
> static char* get_mixer_device(void)
> {
> 	char *name;
> 	
> 	if (oss_cfg.use_alt_mixer_device && oss_cfg.alt_mixer_device)
> 		name = g_strdup(oss_cfg.alt_mixer_device);
> 	else if (oss_cfg.mixer_device > 0)
> 		name = g_strdup_printf("%s%d", DEV_MIXER, oss_cfg.mixer_device);
> 	else
> 		name = g_strdup(DEV_MIXER);
> 
> 	return name;
> }
> 
> static void build_channel_menu(gint preset, GtkWidget * channel_menu, GtkSignalFunc sigfunc)
> {
>         GtkWidget *menu, *item;
> 	gint menu_index, oss_index, history_index;
> 	gchar *devname;
> 	int fd, devs;
> 	char *dev_labels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS;
> 
> 	devname = get_mixer_device();
> 	fd = open(devname, O_RDONLY);
> 	g_free(devname);
> 
> 	menu = gtk_menu_new();
> 
> 	if(fd != -1) {
> 	  ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devs);
> 	  menu_index = 0;
> 	  for (oss_index = 0; oss_index < SOUND_MIXER_NRDEVICES; oss_index++) {
> 	    if ((1 << oss_index) & devs) {
> 	      item = gtk_menu_item_new_with_label(dev_labels[oss_index]);
> 	      gtk_signal_connect(GTK_OBJECT(item), "activate", sigfunc, (gpointer) oss_index);
> 	      gtk_widget_show(item);
> 	      gtk_menu_append(GTK_MENU(menu), item);
> 	      if (preset == oss_index) {
> 		history_index = menu_index;
> 	      }
> 	      menu_index++;
> 	    }
> 	  }
> 	}
> 	else { 
> 	  item = gtk_menu_item_new_with_label("Current");
> 	  gtk_widget_show(item);
> 	  gtk_menu_append(GTK_MENU(menu), item);
> 	}
> 	gtk_option_menu_set_menu(GTK_OPTION_MENU(channel_menu), menu);
> 	gtk_option_menu_set_history(GTK_OPTION_MENU(channel_menu), history_index);
> }
> 
293c350
< 	mixer_frame = gtk_frame_new(_("Mixer Settings:"));
---
> 	mixer_frame = gtk_frame_new(_("Output Channel:"));
298,301c355
< 	mixer_usemaster_check=gtk_check_button_new_with_label(_("Volume controls Master not PCM"));
< 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mixer_usemaster_check),oss_cfg.use_master);
< 	gtk_table_attach_defaults(GTK_TABLE(mixer_table), mixer_usemaster_check, 0, 1, 0, 1);
< 	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), mixer_frame, gtk_label_new(_("Mixer")));
---
> 	mixer_output_channel_entry=gtk_option_menu_new();
302a357,360
> 	build_channel_menu(oss_cfg.mixer_output_channel, mixer_output_channel_entry, configure_win_mixer_channel_cb);
> 
> 	gtk_table_attach_defaults(GTK_TABLE(mixer_table), mixer_output_channel_entry, 0, 1, 0, 1);
> 	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), mixer_frame, gtk_label_new(_("Mixer")));
diff -r xmms-1.2.7/Output/OSS/init.c xmms-1.2.7-patched/Output/OSS/init.c
35c35
< 	oss_cfg.use_master=0;
---
> 	oss_cfg.mixer_output_channel = SOUND_MIXER_PCM;
43c43
< 		xmms_cfg_read_boolean(cfgfile, "OSS", "use_master", &oss_cfg.use_master);
---
> 		xmms_cfg_read_int(cfgfile, "OSS", "mixer_output_channel", &oss_cfg.mixer_output_channel);
Only in xmms-1.2.7-patched/Output/OSS/: Makefile
diff -r xmms-1.2.7/Output/OSS/mixer.c xmms-1.2.7-patched/Output/OSS/mixer.c
51,54c51,52
< 		if ((devs & SOUND_MASK_PCM) && (oss_cfg.use_master==0))
< 			cmd = SOUND_MIXER_READ_PCM;
< 		else if ((devs & SOUND_MASK_VOLUME) && (oss_cfg.use_master==1))
< 			cmd = SOUND_MIXER_READ_VOLUME;
---
> 		if (devs & (1 << oss_cfg.mixer_output_channel))
> 			cmd = MIXER_READ(oss_cfg.mixer_output_channel);
78,81c76,77
< 		if ((devs & SOUND_MASK_PCM) && (oss_cfg.use_master==0))
< 			cmd = SOUND_MIXER_WRITE_PCM;
< 		else if ((devs & SOUND_MASK_VOLUME) && (oss_cfg.use_master==1))
< 			cmd = SOUND_MIXER_WRITE_VOLUME;
---
> 		if (devs & (1 << oss_cfg.mixer_output_channel))
> 			cmd = MIXER_WRITE(oss_cfg.mixer_output_channel);
diff -r xmms-1.2.7/Output/OSS/OSS.h xmms-1.2.7-patched/Output/OSS/OSS.h
60c60
< 	gboolean use_master;
---
> 	gint mixer_output_channel;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.