]> git.alsa-project.org Git - alsa-utils.git/commitdiff
Fix unexpected abort of alsamixer
authorTakashi Iwai <tiwai@suse.de>
Wed, 15 Jun 2005 12:49:07 +0000 (12:49 +0000)
committerTakashi Iwai <tiwai@suse.de>
Wed, 15 Jun 2005 12:49:07 +0000 (12:49 +0000)
Fixed unexpected abort of alsamixer when no playback or capture elements
are available.  Also fixed the wrong use of temporary array in
displaying item name.

alsamixer/alsamixer.c

index 694e3e9cd2584ca41ffa7eff3b67b4faf6bdf8af..2b51fb739b42835273a6385e6ae2c3b8b1df10dc 100644 (file)
@@ -721,14 +721,9 @@ static void draw_blank(int x, int y, int lines)
     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, char *extra_info)
+/* show the current view mode */
+static void display_view_info(void)
 {
-  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:  Playback  Capture  All ");
   mixer_dc (DC_TEXT);
@@ -743,6 +738,16 @@ static void display_item_info(int elem_index, snd_mixer_selem_id_t *sid, char *e
     mvaddstr (3, 27, "[All]");
     break;
   }
+}
+
+/* show the information of the focused item */
+static void display_item_info(int elem_index, snd_mixer_selem_id_t *sid, char *extra_info)
+{
+  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 (4, 2, "Item: ");
   mixer_dc (DC_TEXT);
@@ -788,7 +793,7 @@ static void display_enum_list(snd_mixer_elem_t *elem, int y, int x)
 {
   int cury, ch, err;
 
-  draw_blank(x, y, mixer_cbar_height + 5);
+  draw_blank(x, y, mixer_cbar_height + (mixer_view == VIEW_PLAYBACK ? 5 : 6));
   
   cury = y - 4;
   for (ch = 0; ch < 2; ch++) {
@@ -962,26 +967,21 @@ mixer_update_cbar (int elem_index)
        snd_mixer_selem_get_playback_switch(elem, chn_right, &swr);
       extra_info = !swl && !swr ? " [Off]" : "";
     }
-    if (mixer_type[elem_index] == MIXER_ELEM_ENUM) {
-      while (1) {
-       unsigned int eidx, err, length;
-        char tmp[50];
-       tmp[0]=' ';
-       tmp[1]='[';
-        err = snd_mixer_selem_get_enum_item(elem, 0, &eidx);
-        if (err < 0)
-          break;
-        if (snd_mixer_selem_get_enum_item_name(elem, eidx, sizeof(tmp) - 3, tmp+2) < 0)
-          break;
-        tmp[48] = 0;
+    if (type == MIXER_ELEM_ENUM) {
+      unsigned int eidx, length;
+      char tmp[50];
+      tmp[0]=' ';
+      tmp[1]='[';
+      if (! snd_mixer_selem_get_enum_item(elem, 0, &eidx) &&
+         ! snd_mixer_selem_get_enum_item_name(elem, eidx, sizeof(tmp) - 3, tmp+2)) {
+       tmp[48] = 0;
        length=strlen(tmp);
        tmp[length]=']';
        tmp[length+1]=0;
-        extra_info = tmp;
-       break;
-      }
+       display_item_info(elem_index, sid, tmp);
+      } else
+       display_item_info(elem_index, sid, extra_info);
     }
-    display_item_info(elem_index, sid, extra_info);
   }
 
   /* get channel bar position
@@ -1078,6 +1078,7 @@ mixer_update_cbars (void)
   static int o_y = 0;
   int i, x, y;
   
+  display_view_info();
   if (!mixer_cbar_get_pos (mixer_focus_elem, &x, &y))
     {
       if (mixer_focus_elem < mixer_first_vis_elem)
@@ -1932,6 +1933,7 @@ mixer_iteration (void)
       /* ignore */
       break;
     case 27:   /* Escape */
+    case KEY_F (10):
       finished = 1;
       key = 0;
       break;
@@ -1963,11 +1965,6 @@ mixer_iteration (void)
         mixer_view = mixer_view_saved = VIEW_PLAYBACK;
         mixer_changed_state=1;
         mixer_reinit ();
-        if (mixer_n_view_elems == 0) {
-          mixer_view = mixer_view_saved = VIEW_CAPTURE;
-          mixer_changed_state=1;
-          mixer_reinit ();
-        }
       } 
       key = 0;
       break;
@@ -1978,11 +1975,6 @@ mixer_iteration (void)
         mixer_view = mixer_view_saved = VIEW_CAPTURE;
         mixer_changed_state=1;
         mixer_reinit ();
-        if (mixer_n_view_elems == 0) {
-          mixer_view = mixer_view_saved = VIEW_PLAYBACK;
-          mixer_changed_state=1;
-          mixer_reinit ();
-        }
       } 
       key = 0;
       break;
@@ -2190,7 +2182,10 @@ mixer_iteration (void)
   if (old_view != mixer_view)
     mixer_clear (FALSE);
   
-  mixer_focus_elem = CLAMP (mixer_focus_elem, 0, mixer_n_view_elems - 1);
+  if (! mixer_n_view_elems)
+    mixer_focus_elem = 0;
+  else
+    mixer_focus_elem = CLAMP (mixer_focus_elem, 0, mixer_n_view_elems - 1);
   
   return finished;
 }
@@ -2270,7 +2265,7 @@ main (int    argc,
   mixer_init ();
   mixer_reinit ();
   
-  if (mixer_n_view_elems == 0) {
+  if (mixer_n_elems == 0) {
     fprintf(stderr, "No mixer elems found\n");
     mixer_abort (ERR_NONE, "", 0);
   }
@@ -2321,4 +2316,4 @@ main (int    argc,
   while (!mixer_iteration ());
   
   mixer_abort (ERR_NONE, "", 0);
-};
+}