Author: dannym
Date: 2006-08-31 18:46:44 +0000 (Thu, 31 Aug 2006)
New Revision: 22968

Modified:
   xfce4-mixer/trunk/lib/vc_alsa.c
Log:
try to support capture controls (alsa weird :))



Modified: xfce4-mixer/trunk/lib/vc_alsa.c
===================================================================
--- xfce4-mixer/trunk/lib/vc_alsa.c     2006-08-31 18:26:58 UTC (rev 22967)
+++ xfce4-mixer/trunk/lib/vc_alsa.c     2006-08-31 18:46:44 UTC (rev 22968)
@@ -268,86 +268,142 @@
 
 static int vc_get_volume(char const *which)
 {
-       long pmin,pmax;
-       long lval;
-       int pb;
+       int playback_enable;
+       int capture_enable;
+       long playback_min;
+       long playback_max;
+       long capture_min;
+       long capture_max;
+       long playback_value;
+       long capture_value;
+
        snd_mixer_selem_channel_id_t chn;
-       snd_mixer_elem_t *xelem = NULL;
+       snd_mixer_elem_t *xelem;
 
-       if (!handle) return 0;
+       if (handle == NULL) {
+               return 0;
+       }
 
-       if (which) {
+       if (which != NULL) {
                xelem = find_control (which);
        } else {
                xelem = elem;
        }
 
-       if (!xelem) return 0;
+       if (xelem == NULL) {
+               return 0;
+       }
 
-       snd_mixer_selem_get_playback_volume_range(xelem, &pmin, &pmax);
-       pmin = 0;
+       snd_mixer_selem_get_playback_volume_range (xelem, &playback_min, 
&playback_max);
+       snd_mixer_selem_get_capture_volume_range (xelem, &capture_min, 
&capture_max);
 
+       playback_min = 0;
+       capture_min = 0;
+
        /* if (snd_mixer_selem_has_playback_volume(xelem)) { */
        for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) {
-               if (!snd_mixer_selem_has_playback_channel(xelem, chn)) continue;
-       
-               snd_mixer_selem_get_playback_volume(xelem, chn, &lval); 
+               if (!snd_mixer_selem_has_playback_channel(xelem, chn)) {
+                       continue;
+               }
 
-               pb = TRUE;
-               snd_mixer_selem_get_playback_switch (xelem, chn, &pb);
-               if (!pb) {
+               snd_mixer_selem_get_playback_volume(xelem, chn, 
&playback_value); 
+
+               playback_enable = TRUE;
+               snd_mixer_selem_get_playback_switch (xelem, chn, 
&playback_enable);
+               if (playback_enable == 0) {
                        return 0;
                }
 
                /*error("%ld,%ld,%ld,%ld", pmin,pmax,lval,(lval - pmin) * 100 / 
(pmax-pmin));*/
-               if (pmax > pmin) {
-                       return (lval - pmin) * 100 / (pmax-pmin);
+               if (playback_max > playback_min) {
+                       return (playback_value - playback_min) * 100 / 
(playback_max - playback_min);
                } else {
-                       return lval;
+                       return playback_value;
                }
        }
+
+       /* if this point is reached, only capture setting remain, so use those 
*/
+       for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) {
+               if (!snd_mixer_selem_has_capture_channel(xelem, chn)) {
+                       continue;
+               }
+
+               snd_mixer_selem_get_capture_volume(xelem, chn, &capture_value); 
+
+               capture_enable = TRUE;
+               snd_mixer_selem_get_capture_switch (xelem, chn, 
&capture_enable);
+               if (capture_enable == 0) {
+                       return 0;
+               }
+
+               /*error("%ld,%ld,%ld,%ld", pmin,pmax,lval,(lval - pmin) * 100 / 
(pmax-pmin));*/
+               if (capture_max > capture_min) {
+                       return (capture_value - capture_min) * 100 / 
(capture_max - capture_min);
+               } else {
+                       return capture_value;
+               }
+       }
+
        return 0;
 }
 
 static void vc_set_volume(char const *which, int vol_p)
 {
-       long pmin,pmax;
-       long lval;
-       snd_mixer_selem_channel_id_t chn;
-       snd_mixer_elem_t *xelem = NULL;
-       double vold;
+       long playback_min;
+       long playback_max;
+       long capture_min;
+       long capture_max;
+       long playback_value;
+       long capture_value;
+       double playback_value_double;
+       double capture_value_double;
+
+       /*snd_mixer_selem_channel_id_t chn;*/
+       snd_mixer_elem_t *xelem;
        
-       if (!handle) return;
-       
-       if (which) {
+       if (handle == NULL) {
+               return;
+       }
+
+       if (which != NULL) {
                xelem = find_control (which);
        } else {
                xelem = elem;
        }
        
-       if (!xelem) return;
+       if (xelem == NULL) {
+               return;
+       }
 
-       snd_mixer_selem_get_playback_volume_range(xelem, &pmin, &pmax);
-       pmin = 0;
+       snd_mixer_selem_get_playback_volume_range (xelem, &playback_min, 
&playback_max);
+       snd_mixer_selem_get_capture_volume_range (xelem, &capture_min, 
&capture_max);
 
+       playback_min = 0;
+       capture_min = 0;
+
        /*vol_p = (lval - pmin) * 100 / (pmax - pmin);*/
-       vold = vol_p;
-       if (vol_p != 0)
-               vold += 0.999999;
+       playback_value_double = vol_p;
+       capture_value_double = vol_p;
+       if (vol_p != 0) {
+               playback_value_double += 0.999999;
+               capture_value_double += 0.999999;
+       }
                
-       lval = (long) pmin + (vold) * (pmax - pmin) / 100;
+       playback_value = (long) playback_min + (playback_value_double) * 
(playback_max - playback_min) / 100;
+       capture_value = (long) capture_min + (capture_value_double) * 
(capture_max - capture_min) / 100;
 
        /*
        snd_mixer_selem_get_playback_switch(Ex_elem, SND_MIXER_SCHN_MONO, 
&status);
        */
        
        /* use _all functions for sami's card ... */
-       if (lval == pmin) /* mute */
+       if (playback_value == 0) /* mute */
                snd_mixer_selem_set_playback_switch_all (xelem, 0);
        else /* unmute, just in case. */
                snd_mixer_selem_set_playback_switch_all (xelem, 1);
                
-       snd_mixer_selem_set_playback_volume_all (xelem, lval);
+       snd_mixer_selem_set_playback_volume_all (xelem, playback_value);
+       snd_mixer_selem_set_capture_volume_all (xelem, capture_value);
 
 #if 0          
        for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) {

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to