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