Update of /cvsroot/alsa/alsa-lib/src/ordinary_mixer
In directory sc8-pr-cvs1:/tmp/cvs-serv29050/src/ordinary_mixer

Modified Files:
        ordinary_mixer.c 
Log Message:
More changes to the ordinary mixer API

Index: ordinary_mixer.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/ordinary_mixer/ordinary_mixer.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ordinary_mixer.c    9 Sep 2003 19:24:40 -0000       1.3
+++ ordinary_mixer.c    13 Oct 2003 12:06:46 -0000      1.4
@@ -206,8 +206,27 @@
  */     
 int sndo_mixer_poll_descriptors(sndo_mixer_t *mixer, struct pollfd *pfds, unsigned 
int space)
 {
-       //return snd_mixer_poll_descriptors(mixer->mixer, pfds, space);
-       return -ENODEV;
+       int err, idx, res;
+
+       if (mixer->hctl_count > 0) {
+               for (idx = res = 0; idx < mixer->hctl_count && space > 0; idx++) {
+                       err = snd_hctl_poll_descriptors(mixer->hctl[idx], pfds, space);
+                       if (err < 0)
+                               return err;
+                       res += err;
+                       space -= err;
+               }
+               return res;
+       } else {
+               struct alisp_seq_iterator *result;
+               long val;
+               err = alsa_lisp_function(mixer->alisp, &result, 
"sndo_mixer_poll_descriptors", "%i", space);
+               if (err < 0)
+                       return err;
+               assert(0);      /* FIXME: pass pfds to application */
+               err = alsa_lisp_seq_integer(result, &val);
+               return err < 0 ? err : val;
+       }
 }
 
 /**
@@ -220,8 +239,120 @@
  */ 
 int sndo_mixer_poll_descriptors_revents(sndo_mixer_t *mixer, struct pollfd *pfds, 
unsigned int nfds, unsigned short *revents)
 {
-       //return snd_mixer_poll_descriptors_revents(mixer->mixer, pfds, nfds, revents);
-       return -ENODEV;
+       int err, idx, count, res;
+
+       if (mixer->hctl_count > 0) {
+               for (idx = res = 0; idx < mixer->hctl_count && nfds > 0; idx++) {
+                       err = snd_hctl_poll_descriptors_count(mixer->hctl[idx]);
+                       if (err < 0)
+                               return err;
+                       count = err;
+                       if (nfds < (unsigned int)err)
+                               return -EINVAL;
+                       err = snd_hctl_poll_descriptors_revents(mixer->hctl[idx], 
pfds, count, revents);
+                       if (err < 0)
+                               return err;
+                       if (err != count)
+                               return -EINVAL;
+                       pfds += count;
+                       nfds -= err;
+                       revents += count;
+                       res += count;
+               }
+               return res;
+       } else {
+               struct alisp_seq_iterator *result;
+               long val, tmp;
+               
+               assert(0);      /* FIXME: pass pfds to alisp too */
+               err = alsa_lisp_function(mixer->alisp, &result, 
"sndo_mixer_poll_descriptors_revents", "%i", nfds);
+               if (err < 0)
+                       return err;
+               err = alsa_lisp_seq_integer(result, &val);
+               if (err >= 0 && alsa_lisp_seq_count(result) > 1) {
+                       alsa_lisp_seq_next(&result);
+                       err = alsa_lisp_seq_integer(result, &tmp);
+                       *revents = tmp;
+               } else {
+                       *revents = 0;
+               }
+               return err < 0 ? err : val;
+       }
+}
+
+#define IOLINES 6
+
+static const char *name_table1[] = {
+       "Master",
+       "PCM",
+       "Line",
+       "Mic"
+       "CD",
+       "AUX"
+};
+
+#define SPEAKERS 14
+
+static const char *name_table2[] = {
+       "Front Left",
+       "Front Center Left",
+       "Front Center",
+       "Front Center Right",
+       "Front Right",
+       "Front Side Left",
+       "Front Side Right",
+       "Rear Side Left",
+       "Rear Side Right",
+       "Rear Left",
+       "Rear Center",
+       "Rear Right",
+       "LFE (Subwoofer)",
+       "Overhead"
+};
+
+#define CSOURCES 5
+
+static const char *name_table3[] = {
+       "Mic",
+       "Line",
+       "CD",
+       "AUX",
+       "Mix",
+};
+
+static int compose_string(char **result, const char *s1, const char *s2, const char 
*s3, const char *s4)
+{
+       int len = strlen(s1) + strlen(s2) + strlen(s3) + strlen(s4);
+       *result = malloc(len + 1);
+       if (*result == NULL)
+               return -ENOMEM;
+       strcpy(*result, s1);
+       strcat(*result, s2);
+       strcat(*result, s3);
+       strcat(*result, s4);
+       return 0;
+}
+
+/**
+ * \brief get ordinary mixer io control value
+ * \param mixer ordinary mixer handle
+ * \param type io type
+ * \param val returned value
+ * \return zero if success, otherwise a negative error code
+ */ 
+int sndo_mixer_io_get_name(enum sndo_mixer_io_type type, char **name)
+{
+       if (type < IOLINES * 0x40) {
+               int tmp = type / 0x40;
+               type %= 0x40;
+               if (type < SPEAKERS)
+                       return compose_string(name, name_table1[tmp], " ", 
name_table2[type], " Volume");
+       } else if (type >= SNDO_MIO_CGAIN_FL && type < SNDO_MIO_CGAIN_FL + SPEAKERS) {
+               return compose_string(name, "Capture Gain ", name_table2[type - 
SNDO_MIO_CGAIN_FL], "", "");
+       } else if (type >= SNDO_MIO_CSOURCE_MIC && type < SNDO_MIO_CSOURCE_MIC + 
CSOURCES) {
+               return compose_string(name, "Capture Source ", name_table3[type - 
SNDO_MIO_CSOURCE_MIC], "", "");
+       }
+       return -ENOENT;
 }
 
 /**
@@ -233,7 +364,18 @@
  */ 
 int sndo_mixer_io_get(sndo_mixer_t *mixer, enum sndo_mixer_io_type type, int *val)
 {
-       return -ENODEV;
+       struct alisp_seq_iterator *result;
+       long val1;
+       int err;
+
+       err = alsa_lisp_function(mixer->alisp, &result, "sndo_mixer_io_set", "%i", 
type);
+       if (err < 0)
+               return err;
+       err = alsa_lisp_seq_integer(result, &val1);
+       if (err < 0)
+               return err;
+       *val = val1;
+       return 0;
 }
 
 /**
@@ -243,9 +385,118 @@
  * \param val desired value
  * \return zero if success, otherwise a negative error code
  */ 
-int sndo_mixer_io_set(sndo_mixer_t *mixer, enum sndo_mixer_io_type type, int val)
+int sndo_mixer_io_set(sndo_mixer_t *mixer, enum sndo_mixer_io_type type, int *val)
 {
-       return -ENODEV;
+       struct alisp_seq_iterator *result;
+       long val1;
+       int err;
+
+       err = alsa_lisp_function(mixer->alisp, &result, "sndo_mixer_io_set", "%i%i", 
type, *val);
+       if (err < 0)
+               return err;
+       err = alsa_lisp_seq_integer(result, &val1);
+       if (err < 0)
+               return err;
+       *val = val1;
+       return 0;
+}
+
+/**
+ * \brief try to set ordinary mixer io control value
+ * \param mixer ordinary mixer handle
+ * \param type io type
+ * \param val desired value
+ * \return zero if success, otherwise a negative error code
+ *
+ * This function does not update the value.
+ * It only returns the real value which will be set.
+ */ 
+int sndo_mixer_io_try_set(sndo_mixer_t *mixer, enum sndo_mixer_io_type type, int *val)
+{
+       struct alisp_seq_iterator *result;
+       long val1;
+       int err;
+
+       err = alsa_lisp_function(mixer->alisp, &result, "sndo_mixer_io_try_set", 
"%i%i", type, *val);
+       if (err < 0)
+               return err;
+       err = alsa_lisp_seq_integer(result, &val1);
+       if (err < 0)
+               return err;
+       *val = val1;
+       return 0;
+}
+
+/**
+ * \brief get ordinary mixer io control value in dB (decibel units)
+ * \param mixer ordinary mixer handle
+ * \param type io type
+ * \param val returned value in dB
+ * \return zero if success, otherwise a negative error code
+ */ 
+int sndo_mixer_io_get_dB(sndo_mixer_t *mixer, enum sndo_mixer_io_type type, int *val)
+{
+       struct alisp_seq_iterator *result;
+       long val1;
+       int err;
+
+       err = alsa_lisp_function(mixer->alisp, &result, "sndo_mixer_io_set_dB", "%i", 
type);
+       if (err < 0)
+               return err;
+       err = alsa_lisp_seq_integer(result, &val1);
+       if (err < 0)
+               return err;
+       *val = val1;
+       return 0;
+}
+
+/**
+ * \brief set ordinary mixer io control value in dB (decibel units)
+ * \param mixer ordinary mixer handle
+ * \param type io type
+ * \param val desired value in dB
+ * \return zero if success, otherwise a negative error code
+ */ 
+int sndo_mixer_io_set_dB(sndo_mixer_t *mixer, enum sndo_mixer_io_type type, int *val)
+{
+       struct alisp_seq_iterator *result;
+       long val1;
+       int err;
+
+       err = alsa_lisp_function(mixer->alisp, &result, "sndo_mixer_io_set", "%i%i", 
type, *val);
+       if (err < 0)
+               return err;
+       err = alsa_lisp_seq_integer(result, &val1);
+       if (err < 0)
+               return err;
+       *val = val1;
+       return 0;
+}
+
+/**
+ * \brief try to set ordinary mixer io control value in dB (decibel units)
+ * \param mixer ordinary mixer handle
+ * \param type io type
+ * \param val desired and returned value in dB
+ * \return zero if success, otherwise a negative error code
+ *
+ * This function does not update the value.
+ * It only returns the real value which will be set.
+ */ 
+int sndo_mixer_io_try_set_dB(sndo_mixer_t *mixer, enum sndo_mixer_io_type type, int 
*val)
+{
+       struct alisp_seq_iterator *result;
+       long val1;
+       int err;
+
+       err = alsa_lisp_function(mixer->alisp, &result, "sndo_mixer_io_try_set", 
"%i%i", type, *val);
+       if (err < 0)
+               return err;
+       err = alsa_lisp_seq_integer(result, &val1);
+       if (err < 0)
+               return err;
+       *val = val1;
+       return 0;
 }
 
 /**
@@ -257,5 +508,25 @@
  */ 
 int sndo_mixer_io_change(sndo_mixer_t *mixer, enum sndo_mixer_io_type *changed, int 
changed_array_size)
 {
-       return -ENODEV;
+       struct alisp_seq_iterator *result;
+       long val1;
+       int err;
+
+       err = alsa_lisp_function(mixer->alisp, &result, "sndo_mixer_io_change", "%i", 
changed_array_size);
+       if (err < 0)
+               return err;
+       err = alsa_lisp_seq_integer(result, &val1);
+       if (err < 0)
+               return err;
+       if (val1 < 0)
+               return val1;
+       while (changed_array_size-- > 0) {
+               *changed = val1;
+               if (!alsa_lisp_seq_next(&result))
+                       break;
+               err = alsa_lisp_seq_integer(result, &val1);
+               if (err < 0)
+                       return err;
+       }
+       return 0;
 }



-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
SourceForge.net hosts over 70,000 Open Source Projects.
See the people who have HELPED US provide better services:
Click here: http://sourceforge.net/supporters.php
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to