]> git.alsa-project.org Git - alsa-lib.git/commitdiff
mixer API - extend simple enumerated controls for direction tests
authorJaroslav Kysela <perex@perex.cz>
Wed, 24 Aug 2005 10:41:16 +0000 (10:41 +0000)
committerJaroslav Kysela <perex@perex.cz>
Wed, 24 Aug 2005 10:41:16 +0000 (10:41 +0000)
Added snd_mixer_selem_is_enum_playback() and
snd_mixer_selem_is_enum_capture() functions.

include/mixer.h
include/mixer_abst.h
src/Versions
src/mixer/simple.c
src/mixer/simple_none.c

index 219461f1fffbd236a74383bcdca474bc7956e28b..163113861cd00d19f4d423064cb1013615069ac3 100644 (file)
@@ -282,6 +282,8 @@ int snd_mixer_selem_set_capture_volume_range(snd_mixer_elem_t *elem,
                                             long min, long max);
 
 int snd_mixer_selem_is_enumerated(snd_mixer_elem_t *elem);
+int snd_mixer_selem_is_enum_playback(snd_mixer_elem_t *elem);
+int snd_mixer_selem_is_enum_capture(snd_mixer_elem_t *elem);
 int snd_mixer_selem_get_enum_items(snd_mixer_elem_t *elem);
 int snd_mixer_selem_get_enum_item_name(snd_mixer_elem_t *elem, unsigned int idx, size_t maxlen, char *str);
 int snd_mixer_selem_get_enum_item(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, unsigned int *idxp);
index c1f05705bafde91f2a16406b1a25d5a06807e31c..e538d08e63b46d09b8f7647a14a76752ea80c321 100644 (file)
@@ -50,7 +50,8 @@ extern "C" {
 #define SM_CAP_CSWITCH         (1<<9) 
 #define SM_CAP_CSWITCH_JOIN    (1<<10)
 #define SM_CAP_CSWITCH_EXCL    (1<<11)
-#define SM_CAP_ENUM            (1<<12)
+#define SM_CAP_PENUM           (1<<12)
+#define SM_CAP_CENUM           (1<<13)
 /* SM_CAP_* 24-31 => private for module use */
 
 #define SM_OPS_IS_ACTIVE       0
index c85c246cf3eaab0cb079a729af8c5b9d6f9522e6..02e86ba4f8a28e1db53898b2a9f87a380bd1b5b5 100644 (file)
@@ -254,6 +254,8 @@ ALSA_1.0.10 {
 
     snd_mixer_selem_set_playback_dB_all;
     snd_mixer_selem_set_capture_dB_all;
+    snd_mixer_selem_is_enum_playback;
+    snd_mixer_selem_is_enum_capture;
     snd_mixer_selem_compare;
     snd_mixer_sbasic_info;
     snd_mixer_sbasic_get_private;
index 29c273e87abae2d434b931ff1394a7990e9c59e8..621ab219576133cd45650dc20466a3b6a1d932b4 100644 (file)
@@ -102,7 +102,7 @@ int snd_mixer_selem_register(snd_mixer_t *mixer,
 }
 
 #define CHECK_ENUM(xelem) \
-       if (!((sm_selem_t *)(elem)->private_data)->caps & SM_CAP_ENUM) \
+       if (!((sm_selem_t *)(elem)->private_data)->caps & (SM_CAP_PENUM|SM_CAP_CENUM)) \
                return -EINVAL;
 
 #define COND_CAPS(xelem, what) \
@@ -821,6 +821,30 @@ int snd_mixer_selem_is_enumerated(snd_mixer_elem_t *elem)
        return sm_selem_ops(elem)->is(elem, SM_PLAY, SM_OPS_IS_ENUMERATED, 0);
 }
 
+/**
+ * \brief Return true if mixer simple enumerated element belongs to the playback direction
+ * \param elem Mixer simple element handle
+ * \return 0 no playback direction, 1 playback direction
+ */
+int snd_mixer_selem_is_enum_playback(snd_mixer_elem_t *elem)
+{
+       CHECK_BASIC(elem);
+       CHECK_ENUM(elem);
+       return sm_selem_ops(elem)->is(elem, SM_PLAY, SM_OPS_IS_ENUMERATED, 1);
+}
+
+/**
+ * \brief Return true if mixer simple enumerated element belongs to the capture direction
+ * \param elem Mixer simple element handle
+ * \return 0 no capture direction, 1 capture direction
+ */
+int snd_mixer_selem_is_enum_capture(snd_mixer_elem_t *elem)
+{
+       CHECK_BASIC(elem);
+       CHECK_ENUM(elem);
+       return sm_selem_ops(elem)->is(elem, SM_CAPT, SM_OPS_IS_ENUMERATED, 1);
+}
+
 /**
  * \brief Return the number of enumerated items of the given mixer simple element
  * \param elem Mixer simple element handle
index 88724b2957dbcb0aed79606dfcaef186e554a365..eed8f5df7db36e2d154dfb1827514dcb76effcee 100644 (file)
@@ -721,7 +721,8 @@ static int simple_update(snd_mixer_elem_t *melem)
        if (ctl->elem) {
                if (pchannels < ctl->values)
                        pchannels = ctl->values;
-               caps |= SM_CAP_ENUM;
+               /* FIXME: differentiate some controls */
+               caps |= SM_CAP_PENUM|SM_CAP_CENUM;
        }
        if (pchannels > 32)
                pchannels = 32;
@@ -910,6 +911,11 @@ static int is_ops(snd_mixer_elem_t *elem, int dir, int cmd, int val)
                return (unsigned int) val < s->str[dir].channels;
 
        case SM_OPS_IS_ENUMERATED:
+               if (val == 1) {
+                       if (dir == SM_PLAY && (s->selem.caps & SM_CAP_PENUM))
+                               return 1;
+                       return !!(s->selem.caps & SM_CAP_CENUM);
+               }
                return s->ctls[CTL_ENUMLIST].elem != 0;
        
        case SM_OPS_IS_ENUMCNT: