Usability improvement

Improved the usability of alsamixer:

- the mute/unmute appears in a separate box below the volume bar
  more obviously
- the capture switch appears below the volume bar, too
- the controls without volume doesn't show volume bars
- fixed bugs with all view mode
- fixed the calculation of volume bar size
- show left/right scrollable status
- code clean up
This commit is contained in:
Takashi Iwai 2005-01-03 12:00:08 +00:00
parent 82c3b093db
commit bc70fd0429
2 changed files with 273 additions and 175 deletions

View file

@ -58,12 +58,12 @@ volume filled in that box. The volume percentages are displayed below
the volume bar for left and right channels. For a mono control, only
one value is shown there.
When a mixer control is turned off, \fIM\fP (mute) appears in the top
of its volume bar. Stereo controls may have two \fIM\fP's for left
and right channels. You can toggle the switch via \fIm\fP key.
When a mixer control is turned off, \fIM\fP (mute) appears below the
volume bar. When it's turned on, \fIO\fP in green appears instead.
You can toggle the switch via \fIm\fP key.
When a mixer control has capture capability, the capture flag appears
over the volume bar. When the capture is turned off,
below the volume bar, too. When the capture is turned off,
\-\-\-\-\-\- is shown. \fICAPTUR\fP in red appears when the
capture switch is turned on. In addition, \fIL\fP and \fIR\fP letters
appear in left and right side to indicate that left and the right

View file

@ -146,7 +146,8 @@
#define MIXER_MIN_X (18) /* abs minimum: 18 */
#define MIXER_TEXT_Y (10)
#define MIXER_MIN_Y (MIXER_TEXT_Y + 3) /* abs minimum: 11 */
#define MIXER_CBAR_STD_HGT (10)
#define MIXER_MIN_Y (MIXER_TEXT_Y + 6) /* abs minimum: 16 */
#define MIXER_BLACK (COLOR_BLACK)
#define MIXER_DARK_RED (COLOR_RED)
@ -186,6 +187,7 @@ static int mixer_max_y = 0;
static int mixer_ofs_x = 0;
static float mixer_extra_space = 0;
static int mixer_cbar_height = 0;
static int mixer_text_y = MIXER_TEXT_Y;
static char card_id[64] = "default";
static snd_mixer_t *mixer_handle;
@ -263,8 +265,8 @@ static char *mixer_help_text =
" Return return to main screen\n"
" Space toggle Capture facility\n"
" Tab toggle ExactMode\n"
" m M mute both channels\n"
" < > mute left/right channel\n"
" m M toggle mute on both channels\n"
" < > toggle mute on left/right channel\n"
" Up increase left and right volume\n"
" Down decrease left and right volume\n"
" Right move (scroll) to the right next channel\n"
@ -281,6 +283,7 @@ enum {
DC_BACK,
DC_TEXT,
DC_PROMPT,
DC_CBAR_FRAME,
DC_CBAR_MUTE,
DC_CBAR_NOMUTE,
DC_CBAR_CAPTURE,
@ -334,8 +337,9 @@ mixer_init_draw_contexts (void)
mixer_init_dc ('.', DC_BACK, MIXER_WHITE, MIXER_BLACK, A_NORMAL);
mixer_init_dc ('.', DC_TEXT, MIXER_YELLOW, MIXER_BLACK, A_BOLD);
mixer_init_dc ('.', DC_PROMPT, MIXER_DARK_CYAN, MIXER_BLACK, A_NORMAL);
mixer_init_dc ('M', DC_CBAR_MUTE, MIXER_CYAN, MIXER_BLACK, A_BOLD);
mixer_init_dc (ACS_HLINE, DC_CBAR_NOMUTE, MIXER_CYAN, MIXER_BLACK, A_BOLD);
mixer_init_dc ('.', DC_CBAR_FRAME, MIXER_CYAN, MIXER_BLACK, A_BOLD);
mixer_init_dc ('M', DC_CBAR_MUTE, MIXER_DARK_CYAN, MIXER_BLACK, A_NORMAL);
mixer_init_dc ('O', DC_CBAR_NOMUTE, MIXER_WHITE, MIXER_GREEN, A_BOLD);
mixer_init_dc ('x', DC_CBAR_CAPTURE, MIXER_DARK_RED, MIXER_BLACK, A_BOLD);
mixer_init_dc ('-', DC_CBAR_NOCAPTURE, MIXER_GRAY, MIXER_BLACK, A_NORMAL);
mixer_init_dc (' ', DC_CBAR_EMPTY, MIXER_GRAY, MIXER_BLACK, A_DIM);
@ -348,7 +352,6 @@ mixer_init_draw_contexts (void)
mixer_init_dc ('.', DC_ANY_4, MIXER_WHITE, MIXER_BLUE, A_BOLD);
}
#define DC_CBAR_FRAME (DC_CBAR_MUTE)
#define DC_FRAME (DC_PROMPT)
@ -458,12 +461,12 @@ mixer_cbar_get_pos (int elem_index,
x = mixer_ofs_x;
x += (3 + 2 + 3 + 1) * elem_index + mixer_extra_space * (elem_index + 1);
if (MIXER_TEXT_Y + 10 < mixer_max_y)
y = mixer_max_y / 2 + 3;
if (mixer_text_y + MIXER_CBAR_STD_HGT < mixer_max_y)
y = (mixer_text_y + mixer_cbar_height) / 2 - 1 + mixer_max_y / 2;
else
y = (mixer_max_y + 1) / 2 + 3;
y += mixer_cbar_height / 2;
y = mixer_text_y - 1 + mixer_cbar_height;
if (y >= mixer_max_y - 1)
y = mixer_max_y - 2;
if (x_p)
*x_p = x;
if (y_p)
@ -633,7 +636,7 @@ mixer_write_cbar (int elem_index)
/* mute
*/
if (mixer_type[elem_index] & MIXER_ELEM_MUTE_SWITCH) {
if (mixer_toggle_mute && snd_mixer_selem_has_playback_switch(elem)) {
if (mixer_toggle_mute) {
if (snd_mixer_selem_has_playback_switch_joined(elem)) {
snd_mixer_selem_get_playback_switch(elem, chn_left, &sw);
snd_mixer_selem_set_playback_switch_all(elem, !sw);
@ -690,14 +693,83 @@ mixer_write_cbar (int elem_index)
}
static void draw_blank(int x, int y, int lines)
{
int i;
mixer_dc (DC_TEXT);
for (i = 0; i < lines; i++)
mvaddstr (y - i, x, " ");
}
/* show the information of the focused item */
static void display_item_info(int elem_index, snd_mixer_selem_id_t *sid, int is_off)
{
char string[64], idxstr[10];
int idx;
int i, xlen = mixer_max_x - 8;
if (xlen > sizeof(string) - 1)
xlen = sizeof(string) - 1;
mixer_dc (DC_PROMPT);
mvaddstr (3, 2, "View: ");
mixer_dc (DC_TEXT);
switch (mixer_view) {
case VIEW_PLAYBACK:
mvaddstr (3, 8, "Playback");
break;
case VIEW_CAPTURE:
mvaddstr (3, 8, "Capture");
break;
default:
mvaddstr (3, 8, "All");
break;
}
mixer_dc (DC_PROMPT);
mvaddstr (4, 2, "Item: ");
mixer_dc (DC_TEXT);
idx = snd_mixer_selem_id_get_index(sid);
if (idx > 0)
snprintf(idxstr, sizeof(idxstr), " %i", snd_mixer_selem_id_get_index(sid));
snprintf(string, sizeof(string), "%s%s%s%s",
snd_mixer_selem_id_get_name(sid),
(mixer_type[elem_index] & MIXER_ELEM_CAPTURE_SUFFIX) ? " Capture" : "",
idx > 0 ? idxstr : "",
is_off ? " [Off]" : "");
for (i = strlen(string); i < sizeof(string) - 1; i++)
string[i] = ' ';
string[xlen] = '\0';
addstr(string);
}
/* show the bar item name */
static void display_item_name(int x, int y, int elem_index, snd_mixer_selem_id_t *sid)
{
const char *suffix;
char string1[9], string[9];
int i;
mixer_dc (elem_index == mixer_focus_elem ? DC_CBAR_FOCUS_LABEL : DC_CBAR_LABEL);
if (mixer_type[elem_index] & MIXER_ELEM_CAPTURE_SUFFIX)
suffix = " Capture";
else
suffix = "";
if (snd_mixer_selem_id_get_index(sid) > 0)
snprintf(string1, sizeof(string1), "%s%s %d", snd_mixer_selem_id_get_name(sid),
suffix, snd_mixer_selem_id_get_index(sid));
else
snprintf(string1, sizeof(string1), "%s%s", snd_mixer_selem_id_get_name(sid), suffix);
string[8] = 0;
for (i = 0; i < 8; i++)
string[i] = ' ';
memcpy(string + (8 - strlen (string1)) / 2, string1, strlen(string1));
mvaddstr (y, x, string);
}
static void display_enum_list(snd_mixer_elem_t *elem, int y, int x)
{
int i, cury, ch, err;
int cury, ch, err;
/* clear */
mixer_dc(DC_TEXT);
for (i = mixer_cbar_height + 3, cury = y; i > 0; i--, cury--)
mvaddstr(cury, x, " ");
draw_blank(x, y, mixer_cbar_height + 6);
cury = y - 4;
for (ch = 0; ch < 2; ch++) {
@ -715,17 +787,96 @@ static void display_enum_list(snd_mixer_elem_t *elem, int y, int x)
}
}
static void draw_volume_bar(int x, int y, int elem_index, long vleft, long vright)
{
int i, dc;
mixer_dc (DC_CBAR_FRAME);
if (mixer_type[elem_index] & MIXER_ELEM_MUTE_SWITCH) {
mvaddch (y, x + 2, ACS_LTEE);
mvaddch (y, x + 5, ACS_RTEE);
} else {
mvaddch (y, x + 2, ACS_LLCORNER);
mvaddch (y, x + 3, ACS_HLINE);
mvaddch (y, x + 4, ACS_HLINE);
mvaddch (y, x + 5, ACS_LRCORNER);
}
y--;
for (i = 0; i < mixer_cbar_height; i++)
{
mvaddstr (y - i, x, " ");
mvaddch (y - i, x + 2, ACS_VLINE);
mvaddch (y - i, x + 5, ACS_VLINE);
}
for (i = 0; i < mixer_cbar_height; i++)
{
if (i + 1 >= 0.8 * mixer_cbar_height)
dc = DC_ANY_3;
else if (i + 1 >= 0.4 * mixer_cbar_height)
dc = DC_ANY_2;
else
dc = DC_ANY_1;
mvaddch (y, x + 3, mixer_dc (vleft > i * 100 / mixer_cbar_height ? dc : DC_CBAR_EMPTY));
mvaddch (y, x + 4, mixer_dc (vright > i * 100 / mixer_cbar_height ? dc : DC_CBAR_EMPTY));
y--;
}
mixer_dc (DC_CBAR_FRAME);
mvaddstr (y, x, " ");
mvaddch (y, x + 2, ACS_ULCORNER);
mvaddch (y, x + 3, ACS_HLINE);
mvaddch (y, x + 4, ACS_HLINE);
mvaddch (y, x + 5, ACS_URCORNER);
}
static void draw_playback_switch(int x, int y, int elem_index, int swl, int swr)
{
int dc;
mixer_dc (DC_CBAR_FRAME);
mvaddch (y, x + 2, ACS_LLCORNER);
mvaddch (y, x + 3, ACS_HLINE);
mvaddch (y, x + 4, ACS_HLINE);
mvaddch (y, x + 5, ACS_LRCORNER);
mvaddstr (y - 1, x, " ");
mvaddch (y - 1, x + 2, ACS_VLINE);
mvaddch (y - 1, x + 5, ACS_VLINE);
mvaddstr (y - 2, x, " ");
mvaddch (y - 2, x + 2, ACS_ULCORNER);
mvaddch (y - 2, x + 3, ACS_HLINE);
mvaddch (y - 2, x + 4, ACS_HLINE);
mvaddch (y - 2, x + 5, ACS_URCORNER);
dc = swl ? DC_CBAR_NOMUTE : DC_CBAR_MUTE;
mvaddch (y - 1, x + 3, mixer_dc (dc));
dc = swr ? DC_CBAR_NOMUTE : DC_CBAR_MUTE;
mvaddch (y - 1, x + 4, mixer_dc (dc));
}
static void draw_capture_switch(int x, int y, int elem_index, int swl, int swr)
{
int i;
if (swl || swr) {
mixer_dc (DC_CBAR_CAPTURE);
mvaddstr (y, x + 1, "CAPTUR");
} else {
for (i = 0; i < 6; i++)
mvaddch(y, x + i + 1, mixer_dc(DC_CBAR_NOCAPTURE));
}
mixer_dc (DC_CBAR_CAPTURE);
mvaddch (y - 1, x + 1, swl ? 'L' : ' ');
mvaddch (y - 1, x + 6, swr ? 'R' : ' ');
}
static void
mixer_update_cbar (int elem_index)
{
char string[128], string1[64], *suffix;
int dc;
snd_mixer_elem_t *elem;
long vleft, vright;
int type;
snd_mixer_selem_id_t *sid;
snd_mixer_selem_channel_id_t chn_left, chn_right;
int x, y, i;
int x, y;
int swl, swr;
/* set new scontrol indices and read info
@ -781,47 +932,16 @@ mixer_update_cbar (int elem_index)
/* update the focused full bar name
*/
if (elem_index == mixer_focus_elem) {
int xlen = mixer_max_x - 8;
if (xlen > 63)
xlen = 63;
mixer_dc (DC_PROMPT);
mvaddstr (3, 2, "View: ");
mixer_dc (DC_TEXT);
switch (mixer_view) {
case VIEW_PLAYBACK:
mvaddstr (3, 8, "Playback");
break;
case VIEW_CAPTURE:
mvaddstr (3, 8, "Capture");
break;
default:
mvaddstr (3, 8, "All");
break;
}
mixer_dc (DC_PROMPT);
mvaddstr (4, 2, "Item: ");
mixer_dc (DC_TEXT);
string1[8] = 0;
for (i = 0; i < 63; i++)
string1[i] = ' ';
string1[xlen] = '\0';
strcpy(string, snd_mixer_selem_id_get_name(sid));
if (mixer_type[elem_index] & MIXER_ELEM_CAPTURE_SUFFIX)
strcat(string, " Capture");
if (snd_mixer_selem_id_get_index(sid) > 0)
sprintf(string + strlen(string), " %i", snd_mixer_selem_id_get_index(sid));
if ((mixer_type[elem_index] & MIXER_ELEM_MUTE_SWITCH)
&& snd_mixer_selem_has_playback_switch(elem)) {
/* control muted? */
swl = swr = 1;
if (mixer_type[elem_index] & MIXER_ELEM_MUTE_SWITCH) {
snd_mixer_selem_get_playback_switch(elem, chn_left, &swl);
swr = 0;
swr = swl;
if (chn_right != SND_MIXER_SCHN_UNKNOWN)
snd_mixer_selem_get_playback_switch(elem, chn_right, &swr);
if (! swl && ! swr)
sprintf(string + strlen(string), " [Off]");
}
string[xlen] = '\0';
strncpy(string1, string, strlen(string));
addstr(string1);
display_item_info(elem_index, sid, !swl && !swr);
}
/* get channel bar position
@ -831,138 +951,84 @@ mixer_update_cbar (int elem_index)
/* channel bar name
*/
mixer_dc (elem_index == mixer_focus_elem ? DC_CBAR_FOCUS_LABEL : DC_CBAR_LABEL);
if (mixer_type[elem_index] & MIXER_ELEM_CAPTURE_SUFFIX)
suffix = " Capture";
else
suffix = "";
if (snd_mixer_selem_id_get_index(sid) > 0)
sprintf(string1, "%s%s %d", snd_mixer_selem_id_get_name(sid), suffix, snd_mixer_selem_id_get_index(sid));
else
sprintf(string1, "%s%s", snd_mixer_selem_id_get_name(sid), suffix);
string1[8] = 0;
for (i = 0; i < 8; i++)
{
string[i] = ' ';
}
sprintf (string + (8 - strlen (string1)) / 2, "%s ", string1);
string[8] = 0;
mvaddstr (y, x, string);
display_item_name(x, y, elem_index, sid);
y--;
/* enum list? */
if (type == MIXER_ELEM_ENUM) {
display_enum_list(elem, y, x);
return; /* no more to display */
}
/* current channel values
*/
mixer_dc (DC_BACK);
mvaddstr (y, x, " ");
if (mixer_type[elem_index] & MIXER_ELEM_HAS_VOLUME) {
char string[4];
mixer_dc (DC_TEXT);
if (chn_right == SND_MIXER_SCHN_UNKNOWN) {
/* mono */
sprintf (string, "%ld", vleft);
snprintf (string, sizeof(string), "%ld", vleft);
mvaddstr (y, x + 4 - strlen (string) / 2, string);
} else {
/* stereo */
sprintf (string, "%ld", vleft);
snprintf (string, sizeof(string), "%ld", vleft);
mvaddstr (y, x + 3 - strlen (string), string);
mixer_dc (DC_CBAR_FRAME);
mvaddch (y, x + 3, '<');
mvaddch (y, x + 4, '>');
mixer_dc (DC_TEXT);
sprintf (string, "%ld", vright);
snprintf (string, sizeof(string), "%ld", vright);
mvaddstr (y, x + 5, string);
}
}
y--;
if (type == MIXER_ELEM_ENUM) {
display_enum_list(elem, y, x);
return;
}
/* left/right bar
*/
mixer_dc (DC_CBAR_FRAME);
mvaddstr (y, x, " ");
mvaddch (y, x + 2, ACS_LLCORNER);
mvaddch (y, x + 3, ACS_HLINE);
mvaddch (y, x + 4, ACS_HLINE);
mvaddch (y, x + 5, ACS_LRCORNER);
y--;
for (i = 0; i < mixer_cbar_height; i++)
{
mvaddstr (y - i, x, " ");
mvaddch (y - i, x + 2, ACS_VLINE);
mvaddch (y - i, x + 5, ACS_VLINE);
}
string[2] = 0;
for (i = 0; i < mixer_cbar_height; i++)
{
if (i + 1 >= 0.8 * mixer_cbar_height)
dc = DC_ANY_3;
else if (i + 1 >= 0.4 * mixer_cbar_height)
dc = DC_ANY_2;
else
dc = DC_ANY_1;
mvaddch (y, x + 3, mixer_dc (vleft > i * 100 / mixer_cbar_height ? dc : DC_CBAR_EMPTY));
mvaddch (y, x + 4, mixer_dc (vright > i * 100 / mixer_cbar_height ? dc : DC_CBAR_EMPTY));
y--;
}
/* muted?
*/
mixer_dc (DC_BACK);
mvaddstr (y, x, " ");
if ((mixer_type[elem_index] & MIXER_ELEM_MUTE_SWITCH)
&& snd_mixer_selem_has_playback_switch(elem)) {
mixer_dc (DC_CBAR_FRAME);
mvaddch (y, x + 2, ACS_ULCORNER);
snd_mixer_selem_get_playback_switch(elem, chn_left, &swl);
dc = swl ? DC_CBAR_NOMUTE : DC_CBAR_MUTE;
mvaddch (y, x + 3, mixer_dc (dc));
if (chn_right != SND_MIXER_SCHN_UNKNOWN) {
snd_mixer_selem_get_playback_switch(elem, chn_right, &swr);
dc = swr ? DC_CBAR_NOMUTE : DC_CBAR_MUTE;
}
mvaddch (y, x + 4, mixer_dc (dc));
mixer_dc (DC_CBAR_FRAME);
mvaddch (y, x + 5, ACS_URCORNER);
} else {
mixer_dc (DC_CBAR_FRAME);
mvaddch (y, x + 2, ACS_ULCORNER);
mvaddch (y, x + 3, ACS_HLINE);
mvaddch (y, x + 4, ACS_HLINE);
mvaddch (y, x + 5, ACS_URCORNER);
}
y--;
/* capture input?
*/
if ((mixer_type[elem_index] & MIXER_ELEM_CAPTURE_SWITCH) &&
snd_mixer_selem_has_capture_switch(elem)) {
int has_r_sw = chn_right != SND_MIXER_SCHN_UNKNOWN &&
snd_mixer_selem_has_capture_channel(elem, chn_right);
snd_mixer_selem_get_capture_switch(elem, chn_left, &swl);
if (has_r_sw)
snd_mixer_selem_get_capture_switch(elem, chn_right, &swr);
if (swl || (has_r_sw && swr)) {
mixer_dc (DC_CBAR_CAPTURE);
mvaddstr (y, x + 1, "CAPTUR");
if (swl) {
mvaddstr (y + 1, x + 1, "L");
if (! has_r_sw)
mvaddstr (y + 1, x + 6, "R");
}
if (has_r_sw && swr)
mvaddstr (y + 1, x + 6, "R");
} else {
for (i = 0; i < 6; i++)
mvaddch (y, x + 1 + i, mixer_dc (DC_CBAR_NOCAPTURE));
}
} else {
mixer_dc (DC_BACK);
mvaddstr (y, x, " ");
if (mixer_view == VIEW_CAPTURE || mixer_view == VIEW_CHANNELS) {
if ((mixer_type[elem_index] & MIXER_ELEM_CAPTURE_SWITCH) &&
snd_mixer_selem_has_capture_switch(elem)) {
int has_r_sw = chn_right != SND_MIXER_SCHN_UNKNOWN &&
snd_mixer_selem_has_capture_channel(elem, chn_right);
snd_mixer_selem_get_capture_switch(elem, chn_left, &swl);
if (has_r_sw)
snd_mixer_selem_get_capture_switch(elem, chn_right, &swr);
else
swr = swl;
draw_capture_switch(x, y, elem_index, swl, swr);
} else
draw_blank(x, y, 2);
y--;
}
/* mute switch */
if (mixer_view == VIEW_PLAYBACK || mixer_view == VIEW_CHANNELS) {
if (mixer_type[elem_index] & MIXER_ELEM_MUTE_SWITCH) {
snd_mixer_selem_get_playback_switch(elem, chn_left, &swl);
if (chn_right != SND_MIXER_SCHN_UNKNOWN)
snd_mixer_selem_get_playback_switch(elem, chn_right, &swr);
else
swr = swl;
draw_playback_switch(x, y, elem_index, swl, swr);
} else {
mixer_dc (DC_CBAR_FRAME);
mvaddstr (y, x + 2, " ");
draw_blank(x, y - 1, 2);
}
y -= 2;
}
/* left/right volume bar
*/
if (mixer_type[elem_index] & MIXER_ELEM_HAS_VOLUME)
draw_volume_bar(x, y, elem_index, vleft, vright);
else {
if (mixer_view == VIEW_CAPTURE)
mvaddstr (y, x + 2, " ");
draw_blank(x, y - 1, mixer_cbar_height + 1);
}
y--;
}
static void
@ -1016,8 +1082,6 @@ mixer_draw_frame (void)
int i;
int max_len;
mixer_dc (DC_FRAME);
/* card name
*/
mixer_dc (DC_PROMPT);
@ -1042,7 +1106,7 @@ mixer_draw_frame (void)
/* lines
*/
mixer_dc (DC_PROMPT);
mixer_dc (DC_FRAME);
for (i = 1; i < mixer_max_y - 1; i++)
{
mvaddch (i, 0, ACS_VLINE);
@ -1056,7 +1120,6 @@ mixer_draw_frame (void)
/* corners
*/
mixer_dc (DC_PROMPT);
mvaddch (0, 0, ACS_ULCORNER);
mvaddch (0, mixer_max_x - 1, ACS_URCORNER);
mvaddch (mixer_max_y - 1, 0, ACS_LLCORNER);
@ -1069,6 +1132,30 @@ mixer_draw_frame (void)
mvaddch (mixer_max_y - 1, mixer_max_x - 2, ACS_LRCORNER);
}
/* left/right scroll indicators */
switch (mixer_view) {
case VIEW_PLAYBACK:
case VIEW_CAPTURE:
case VIEW_CHANNELS:
if (mixer_cbar_height > 0) {
int ind_hgt = (mixer_cbar_height + 1) / 2;
int ind_ofs = mixer_max_y / 2 - ind_hgt/2;
/* left scroll possible? */
if (mixer_first_vis_elem > 0) {
for (i = 0; i < ind_hgt; i++)
mvaddch (i + ind_ofs, 0, '<');
}
/* right scroll possible? */
if (mixer_first_vis_elem + mixer_n_vis_elems < mixer_n_view_elems) {
for (i = 0; i < ind_hgt; i++)
mvaddch (i + ind_ofs, mixer_max_x - 1, '>');
}
}
break;
default:
break;
}
/* program title
*/
sprintf (string, "%s v%s (Press Escape to quit)", PRGNAME_UPPER, VERSION);
@ -1476,10 +1563,15 @@ recalc_screen_size (void)
mixer_n_vis_elems = CLAMP (mixer_n_vis_elems, 1, mixer_n_view_elems);
mixer_extra_space = mixer_max_x - mixer_ofs_x * 2 + 1 - mixer_n_vis_elems * 9;
mixer_extra_space = MAX (0, mixer_extra_space / (mixer_n_vis_elems + 1));
if (MIXER_TEXT_Y + 10 < mixer_max_y)
mixer_cbar_height = 10 + MAX (0, mixer_max_y - MIXER_TEXT_Y - 10 ) / 2;
mixer_text_y = MIXER_TEXT_Y;
if (mixer_view == VIEW_PLAYBACK || mixer_view == VIEW_CHANNELS)
mixer_text_y += 2; /* row for mute switch */
if (mixer_view == VIEW_CAPTURE || mixer_view == VIEW_CHANNELS)
mixer_text_y++; /* row for capture switch */
if (mixer_text_y + MIXER_CBAR_STD_HGT < mixer_max_y)
mixer_cbar_height = MIXER_CBAR_STD_HGT + MAX (1, mixer_max_y - mixer_text_y - MIXER_CBAR_STD_HGT + 1) / 2;
else
mixer_cbar_height = MAX (1, mixer_max_y - MIXER_TEXT_Y);
mixer_cbar_height = MAX (1, mixer_max_y - mixer_text_y);
}
static void
@ -1585,6 +1677,12 @@ __again:
if (snd_mixer_selem_has_playback_volume(elem))
mixer_type[elem_index] |= MIXER_ELEM_HAS_VOLUME;
}
if (mixer_view == VIEW_CHANNELS) {
if (nelems_added == 0 &&
! snd_mixer_selem_has_capture_volume(elem) &&
snd_mixer_selem_has_capture_switch(elem))
mixer_type[elem_index] |= MIXER_ELEM_CAPTURE_SWITCH;
}
elem_index++;
nelems_added++;
if (elem_index >= mixer_n_elems)
@ -2067,7 +2165,7 @@ main (int argc,
case '?':
case 'h':
fprintf (stderr, "%s v%s\n", PRGNAME_UPPER, VERSION);
fprintf (stderr, "Usage: %s [-h] [-c <card: 0...7 or id>] [-D <mixer device>] [-g] [-s]\n", PRGNAME);
fprintf (stderr, "Usage: %s [-h] [-c <card: 0...7>] [-D <mixer device>] [-g] [-s] [-V <view>]\n", PRGNAME);
mixer_abort (ERR_NONE, "", 0);
case 'c':
{