This patch fixes several bugs in the vmixer GUI and removes the "misc"
button from the main window when the card has no global controls.
Signed-off-by: Giuliano Pochini <pochini(a)shiny.it>
--- alsa-tools-1.0.19/echomixer/echomixer.c__orig 2009-02-27 22:51:47.000000000 +0100
+++ alsa-tools-1.0.19/echomixer/echomixer.c 2009-03-01 16:29:42.000000000 +0100
@@ -129,38 +129,8 @@ struct mixel {
snd_ctl_t *ctlhandle;
-#if __GNUC__ == 3 // gcc 2.x doesn't like unnamed unions inside structures
-
-struct mixerControl_s {
- union { // Currently selected channels
- int vchannel;
- int input;
- };
- union { // Number of channels
- int vchannels;
- int inputs;
- };
- int output, outputs;
- int id;
- GtkWidget *window;
- GtkWidget *volume[ECHO_MAXAUDIOOUTPUTS];
- GtkWidget *label[ECHO_MAXAUDIOOUTPUTS];
- GtkObject *adj[ECHO_MAXAUDIOOUTPUTS];
- GtkWidget *outsel[ECHO_MAXAUDIOOUTPUTS];
- union {
- GtkWidget *inpsel[ECHO_MAXAUDIOINPUTS];
- GtkWidget *vchsel[ECHO_MAXAUDIOOUTPUTS];
- };
- struct mixel mixer[ECHO_MAXAUDIOOUTPUTS][ECHO_MAXAUDIOOUTPUTS];
-} mixerControl, vmixerControl;
-
-#else
-
struct mixerControl_s {
- int vchannel;
- int input;
- int vchannels;
- int inputs;
+ int input, inputs;
int output, outputs;
int id;
GtkWidget *window;
@@ -173,9 +143,6 @@ struct mixerControl_s {
struct mixel mixer[ECHO_MAXAUDIOOUTPUTS][ECHO_MAXAUDIOOUTPUTS];
} mixerControl, vmixerControl;
-#endif
-
-
struct VolumeControl_s {
int input, output; // Currently selected channels
int inputs, outputs;
@@ -677,8 +644,8 @@ gint DrawMixer(gpointer unused) {
gdk_draw_rectangle(Mixpixmap, gc, TRUE, XCELLTOT*(mixerControl.output+1), YCELLTOT*mixerControl.input, XCELLTOT, Mixheight);
if (vmixerId) {
gdk_gc_set_foreground(gc, &Hilight2);
- gdk_draw_rectangle(Mixpixmap, gc, TRUE, 0, YCELLTOT*(GMixerSection.VmixerFirst+vmixerControl.vchannel), XCELLTOT*(vmixerControl.output+1), YCELLTOT);
- gdk_draw_rectangle(Mixpixmap, gc, TRUE, XCELLTOT*(vmixerControl.output+1), YCELLTOT*(GMixerSection.VmixerFirst+vmixerControl.vchannel), XCELLTOT, Mixheight);
+ gdk_draw_rectangle(Mixpixmap, gc, TRUE, 0, YCELLTOT*(GMixerSection.VmixerFirst+vmixerControl.input), XCELLTOT*(vmixerControl.output+1), YCELLTOT);
+ gdk_draw_rectangle(Mixpixmap, gc, TRUE, XCELLTOT*(vmixerControl.output+1), YCELLTOT*(GMixerSection.VmixerFirst+vmixerControl.input), XCELLTOT, Mixheight);
}
// Draw the grid
@@ -720,7 +687,7 @@ gint DrawMixer(gpointer unused) {
// Draw vchannels levels and peaks (Vmixer cards only)
if (vmixerId) {
- for (i=0; i<vmixerControl.vchannels; i++)
+ for (i=0; i<vmixerControl.inputs; i++)
DrawBar(0, i+GMixerSection.VmixerFirst, VirLevel[i], VirPeak[i], DONT_DRAW);
}
@@ -739,7 +706,7 @@ gint DrawMixer(gpointer unused) {
// Draw vmixer elements (Vmixer cards only)
if (vmixerId) {
for (o=0; o<GMixerSection.Outputs; o++)
- for (i=0; i<vmixerControl.vchannels; i++) {
+ for (i=0; i<vmixerControl.inputs; i++) {
dB=Add_dB(vmixerControl.mixer[o][i].Gain, VirLevel[i]);
DrawBar(o+1, i+GMixerSection.VmixerFirst, dB, DONT_DRAW, vmixerControl.mixer[o][i].Gain);
}
@@ -945,7 +912,7 @@ static gint Gmixer_button_press(GtkWidge
} else if (GMixerRow>=GMixerSection.VmixerFirst && GMixerRow<=GMixerSection.VmixerLast) {
if (GMixerColumn!=vmixerControl.output)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(vmixerControl.outsel[GMixerColumn]), TRUE);
- if (GMixerRow!=vmixerControl.vchannel)
+ if (GMixerRow!=vmixerControl.input)
gtk_widget_grab_focus(GTK_WIDGET(vmixerControl.volume[GMixerRow-GMixerSection.VmixerFirst]));
}
@@ -967,13 +934,13 @@ static gint Gmixer_button_press(GtkWidge
return TRUE;
// See the note above
- if (GMixerRow<GMixerSection.Inputs) {
+ if (GMixerRow<GMixerSection.VmixerFirst) {
if (GMixerRow!=mixerControl.input)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mixerControl.inpsel[GMixerRow]), TRUE);
if (GMixerColumn!=mixerControl.output)
gtk_widget_grab_focus(GTK_WIDGET(mixerControl.volume[GMixerColumn]));
} else if (GMixerRow>=GMixerSection.VmixerFirst && GMixerRow<=GMixerSection.VmixerLast) {
- if (GMixerRow!=vmixerControl.vchannel)
+ if (GMixerRow!=vmixerControl.input+GMixerSection.VmixerFirst)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(vmixerControl.vchsel[GMixerRow-GMixerSection.VmixerFirst]), TRUE);
if (GMixerColumn!=vmixerControl.output)
gtk_widget_grab_focus(GTK_WIDGET(vmixerControl.volume[GMixerColumn]));
@@ -1035,11 +1002,11 @@ static gint Gmixer_motion_notify(GtkWidg
gtk_adjustment_set_value(GTK_ADJUSTMENT(mixerControl.adj[mixerControl.output]), (gfloat)val);
#endif
} else if (GMixerRow>=GMixerSection.VmixerFirst && GMixerRow<=GMixerSection.VmixerLast) {
- val=INVERT(vmixerControl.mixer[vmixerControl.output][vmixerControl.vchannel].Gain);
+ val=INVERT(vmixerControl.mixer[vmixerControl.output][vmixerControl.input].Gain);
val+=y-mouseY;
mouseY=y;
#ifdef REVERSE
- gtk_adjustment_set_value(GTK_ADJUSTMENT(vmixerControl.adj[vmixerControl.vchannel]), (gfloat)val);
+ gtk_adjustment_set_value(GTK_ADJUSTMENT(vmixerControl.adj[vmixerControl.input]), (gfloat)val);
#else
gtk_adjustment_set_value(GTK_ADJUSTMENT(vmixerControl.adj[vmixerControl.output]), (gfloat)val);
#endif
@@ -1259,7 +1226,7 @@ void Vmixer_volume_changed(GtkWidget *wi
v=channel;
o=vmixerControl.output;
#else
- v=vmixerControl.vchannel;
+ v=vmixerControl.input;
o=channel;
#endif
@@ -1281,8 +1248,8 @@ void Vmixer_volume_changed(GtkWidget *wi
void Vmixer_volume_clicked(GtkWidget *widget, gpointer ch) {
#ifdef REVERSE
- vmixerControl.vchannel=(int)(long)ch;
- UI_DEBUG(("Vmixer_volume_clicked vch=%d\n",vmixerControl.vchannel));
+ vmixerControl.input=(int)(long)ch;
+ UI_DEBUG(("Vmixer_volume_clicked vch=%d\n",vmixerControl.input));
#else
vmixerControl.output=(int)(long)ch;
UI_DEBUG(("Vmixer_volume_clicked out=%d\n",vmixerControl.output));
@@ -1306,7 +1273,7 @@ void Vmixer_output_selector_clicked(GtkW
snd_ctl_elem_id_alloca(&id);
snd_ctl_elem_value_alloca(&control);
snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
- for (c=vmixerControl.vchannels-1; c>=0; c--) {
+ for (c=vmixerControl.inputs-1; c>=0; c--) {
val=INVERT(vmixerControl.mixer[vmixerControl.output][c].Gain);
gtk_adjustment_set_value(GTK_ADJUSTMENT(vmixerControl.adj[c]), (gfloat)val);
}
@@ -1319,16 +1286,16 @@ void Vmixer_vchannel_selector_clicked(Gt
snd_ctl_elem_id_t *id;
snd_ctl_elem_value_t *control;
- if (vmixerControl.vchannel==(int)(long)ch)
+ if (vmixerControl.input==(int)(long)ch)
return;
- vmixerControl.vchannel=(int)(long)ch;
+ vmixerControl.input=(int)(long)ch;
- UI_DEBUG(("Vmixer_selector_clicked vch=%d\n",vmixerControl.vchannel));
+ UI_DEBUG(("Vmixer_selector_clicked vch=%d\n",vmixerControl.input));
snd_ctl_elem_id_alloca(&id);
snd_ctl_elem_value_alloca(&control);
snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
for (c=vmixerControl.outputs-1; c>=0; c--) {
- val=INVERT(vmixerControl.mixer[c][vmixerControl.vchannel].Gain);
+ val=INVERT(vmixerControl.mixer[c][vmixerControl.input].Gain);
gtk_adjustment_set_value(GTK_ADJUSTMENT(vmixerControl.adj[c]), (gfloat)val);
}
}
@@ -1722,7 +1689,7 @@ int OpenControls(const char *card, const
vmixerId=vmixerControl.id=numid;
CTLID_DEBUG(("First Vmixer id=%d\n", vmixerId));
vmixerControl.outputs=snd_ctl_elem_info_get_dimension(info, 0);
- vmixerControl.vchannels=snd_ctl_elem_info_get_dimension(info, 1);
+ vmixerControl.inputs=snd_ctl_elem_info_get_dimension(info, 1);
}
} else if (!strcmp("PCM Playback Volume", snd_ctl_elem_id_get_name(id))) {
pcmoutId=pcmoutControl.id=numid;
@@ -1808,7 +1775,7 @@ int OpenControls(const char *card, const
#ifndef REAL
vmixerId=1000;
-vmixerControl.vchannels=12;
+vmixerControl.inputs=12;
vmixerControl.outputs=mixerControl.outputs=nLOut=10;
metersStreams=3;
metersNumber=16;
@@ -1828,8 +1795,8 @@ printf("nIn=%d fdIn=%d nLOut=%d nPOut=%d
printf("** Warning - Vmixer cards without LineOut volume control are not supported !\n");
if (vmixerId) {
- if (vmixerControl.vchannels!=nPOut || vmixerControl.outputs!=nLOut) {
- printf("** Error - vmixer/channels mismatch: vmp=%d npo=%d vmo=%d nlo=%d !!\n", vmixerControl.vchannels, nPOut, vmixerControl.outputs, nLOut);
+ if (vmixerControl.inputs!=nPOut || vmixerControl.outputs!=nLOut) {
+ printf("** Error - vmixer/channels mismatch: vmp=%d npo=%d vmo=%d nlo=%d !!\n", vmixerControl.inputs, nPOut, vmixerControl.outputs, nLOut);
return(1);
}
}
@@ -1850,7 +1817,7 @@ printf("nIn=%d fdIn=%d nLOut=%d nPOut=%d
if (vmixerId)
for (o=0, numid=vmixerId; o<vmixerControl.outputs; o++) {
- for (i=0; i<vmixerControl.vchannels; i++) {
+ for (i=0; i<vmixerControl.inputs; i++) {
vmixerControl.mixer[o][i].id=numid++;
}
}
@@ -1931,10 +1898,10 @@ printf("components = %s\n", snd_ctl_card
Mixerw_geom.st=NOPOS;
Vmixerw_geom.st=NOPOS;
VUwindow=GMwindow=0;
- GMixerSection.Inputs=fdIn+2; // The correct value is set by Digital_mode_activate()
- GMixerSection.Outputs=fdOut+2;
+ GMixerSection.Inputs=nIn; // The correct value is set by Digital_mode_activate()
+ GMixerSection.Outputs=nLOut;
GMixerSection.VmixerFirst=nIn;
- GMixerSection.VmixerLast=nIn+vmixerControl.vchannels-1;
+ GMixerSection.VmixerLast=nIn+vmixerControl.inputs-1;
GMixerSection.LineOut=GMixerSection.VmixerLast+1;
// Read current mixer setting.
@@ -2523,7 +2490,7 @@ printf("components = %s\n", snd_ctl_card
gtk_widget_show(hbox);
gtk_container_add(GTK_CONTAINER(frame), hbox);
- for (i=0; i<vmixerControl.vchannels; i++) {
+ for (i=0; i<vmixerControl.inputs; i++) {
vbox=gtk_vbox_new(FALSE, 0);
gtk_widget_show(vbox);
gtk_container_add(GTK_CONTAINER(hbox), vbox);
@@ -2582,7 +2549,7 @@ printf("components = %s\n", snd_ctl_card
gtk_container_add(GTK_CONTAINER(frame), vbsel);
bgroup=0;
- for (i=0; i<vmixerControl.vchannels; i++) {
+ for (i=0; i<vmixerControl.inputs; i++) {
sprintf(str, "V%d", i);
if (i)
bgroup=gtk_radio_button_group(GTK_RADIO_BUTTON(vmixerControl.vchsel[i-1]));
@@ -2626,7 +2593,7 @@ printf("components = %s\n", snd_ctl_card
gtk_box_pack_start(GTK_BOX(vbox), vmixerControl.label[i], FALSE, FALSE, 0);
}
gtk_widget_set_usize(GTK_WIDGET(vmixerControl.volume[0]), 0, 170); // Set minimum y size
- vmixerControl.vchannel=-1;
+ vmixerControl.input=-1;
Vmixer_vchannel_selector_clicked(0, 0);
#endif
}
@@ -2693,13 +2660,15 @@ printf("components = %s\n", snd_ctl_card
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
// Misc controls button
- button=gtk_toggle_button_new_with_label("Misc");
- gtk_widget_show(button);
- gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
- gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)Miscwindow);
- Miscw_geom.toggler=button;
- if (Miscw_geom.st==1)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+ if (p4InId || p4OutId || phantomId || (dmodeId && ndmodes>1) || (clocksrcId && nclocksrc>1) || (spdifmodeId && nspdifmodes>1)) {
+ button=gtk_toggle_button_new_with_label("Misc");
+ gtk_widget_show(button);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
+ gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)Miscwindow);
+ Miscw_geom.toggler=button;
+ if (Miscw_geom.st==1)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+ }
if (mixerId) {
// Graphical mixer button
--
Giuliano.