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