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

Modified Files:
        ordinary_mixer.c 
Log Message:
added snd_user_file() function
alisp extensions
  - added nth, include, path commands
  - added auto-exec functionality
  - added helpers for C<->lisp interoperability


Index: ordinary_mixer.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/ordinary_mixer/ordinary_mixer.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ordinary_mixer.c    22 Jun 2003 19:02:20 -0000      1.1
+++ ordinary_mixer.c    3 Sep 2003 19:25:09 -0000       1.2
@@ -56,10 +56,15 @@
 #include <sys/mman.h>
 #include <limits.h>
 #include "local.h"
+#include "alisp.h"
 #include "mixer_ordinary.h"
 
 struct sndo_mixer {
-       snd_mixer_t *mixer;
+       struct alisp_cfg *cfg;
+       struct alisp_instance *alisp;
+       int hctl_count;
+       snd_hctl_t **hctl;
+       int _free_cfg;
 };
 
 /**
@@ -73,10 +78,78 @@
 int sndo_mixer_open(sndo_mixer_t **pmixer,
                    const char *playback_name,
                    const char *capture_name,
-                   snd_config_t *lconf)
+                   struct alisp_cfg *lconf)
 {
+       struct alisp_cfg *cfg = lconf;
+       struct alisp_instance *alisp;
+       struct alisp_seq_iterator *iterator;
+       sndo_mixer_t *mixer;
+       int err, count;
+       long val;
+
        *pmixer = NULL;
-       return -ENODEV;
+       if (cfg == NULL) {
+               char *file;
+               snd_input_t *input;
+               file = getenv("ALSA_ORDINARY_MIXER");
+               if (!file)
+                       file = DATADIR "/alsa/sndo-mixer.alisp";
+               if ((err = snd_input_stdio_open(&input, file, "r")) < 0) {
+                       SNDERR("unable to open alisp file '%s'", file);
+                       return err;
+               }
+               cfg = alsa_lisp_default_cfg(input);
+               if (cfg == NULL)
+                       return -ENOMEM;
+       }
+       err = alsa_lisp(cfg, &alisp);
+       if (err < 0)
+               goto __error;
+       err = alsa_lisp_function(alisp, &iterator, "open", "%s%s", playback_name, 
capture_name);
+       if (err < 0) {
+               alsa_lisp_free(alisp);
+               goto __error;
+       }
+       err = alsa_lisp_seq_integer(iterator, &val);
+       if (err == 0 && val < 0)
+               err = val;
+       if (err < 0) {
+               alsa_lisp_free(alisp);
+               goto __error;
+       }
+       count = 0;
+       if (alsa_lisp_seq_first(alisp, "hctls", &iterator) == 0) {
+               count = alsa_lisp_seq_count(iterator);
+               if (count < 0)
+                       count = 0;
+       }
+       mixer = malloc(sizeof(sndo_mixer_t) + count * sizeof(snd_hctl_t *));
+       if (mixer == NULL) {
+               alsa_lisp_free(alisp);
+               err = -ENOMEM;
+               goto __error;
+       }
+       memset(mixer, 0, sizeof(sndo_mixer_t));
+       if (count > 0) {
+               mixer->hctl = (snd_hctl_t **)(mixer + 1);
+               do {
+                       if (alsa_lisp_seq_pointer(iterator, "hctl", (void 
**)&mixer->hctl[mixer->hctl_count++]))
+                               break;
+               } while (mixer->hctl_count < count && alsa_lisp_seq_next(&iterator) == 
0);
+               if (mixer->hctl_count < count) {
+                       mixer->hctl = NULL;
+                       mixer->hctl_count = 0;
+               }
+       }
+       mixer->alisp = alisp;
+       mixer->cfg = cfg;
+       mixer->_free_cfg = cfg != lconf;
+       *pmixer = mixer;
+       return 0;
+      __error:
+       if (cfg != lconf)
+               alsa_lisp_default_cfg_free(cfg);
+       return err;
 }
 
 /**
@@ -86,7 +159,14 @@
  */
 int sndo_mixer_close(sndo_mixer_t *mixer)
 {
-       return -ENODEV;
+       int res;
+       
+       res = alsa_lisp_function(mixer->alisp, NULL, "close", "n");
+       alsa_lisp_free(mixer->alisp);
+       if (mixer->_free_cfg)
+               alsa_lisp_default_cfg_free(mixer->cfg);
+       free(mixer);
+       return res;
 }
 
 /**
@@ -96,7 +176,25 @@
  */
 int sndo_mixer_poll_descriptors_count(sndo_mixer_t *mixer)
 {
-       return snd_mixer_poll_descriptors_count(mixer->mixer);
+       int idx, err, res = -EIO;
+
+       if (mixer->hctl_count > 0) {
+               for (idx = 0; idx < mixer->hctl_count; idx++) {
+                       err = snd_hctl_poll_descriptors_count(mixer->hctl[idx]);
+                       if (err < 0)
+                               return err;
+                       res += err;
+               }
+       } else {
+               struct alisp_seq_iterator *result;
+               long val;
+               err = alsa_lisp_function(mixer->alisp, &result, 
"poll_descriptors_count", "n");
+               if (err < 0)
+                       return err;
+               err = alsa_lisp_seq_integer(result, &val);
+               return err < 0 ? err : val;
+       }
+       return res;
 }
 
 /**
@@ -108,7 +206,8 @@
  */     
 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 snd_mixer_poll_descriptors(mixer->mixer, pfds, space);
+       return -ENODEV;
 }
 
 /**
@@ -121,7 +220,8 @@
  */ 
 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 snd_mixer_poll_descriptors_revents(mixer->mixer, pfds, nfds, revents);
+       return -ENODEV;
 }
 
 /**



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to