diff options
author | Pankaj Bharadiya <pankaj.laxminarayan.bharadiya@intel.com> | 2017-01-11 08:57:06 +0530 |
---|---|---|
committer | Pankaj Bharadiya <pankaj.laxminarayan.bharadiya@intel.com> | 2017-01-11 10:38:28 +0530 |
commit | 010121a131a8092ca7cfc9e219b6fb1e3f4346bf (patch) | |
tree | b3d0a62040df593cdc8513ca509f3fcbc0205733 | |
parent | 3e9a64211e76529aae4ff08e7a661bcffdee02a5 (diff) |
Tinyalsa: Add support to poll on alsa control
ALSA controls support polling on the kcontrols, this is used in HD-A for
jack notifcation. In tinyalsa we can use this for notfication from sound
card for any events detected by DSP
Change-Id: I4193809bfcdb60f4dc11e1c2ad6a07b29cfa80e9
Signed-off-by: Hardik T Shah <hardik.t.shah@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Pankaj Bharadiya <pankaj.laxminarayan.bharadiya@intel.com>
-rw-r--r-- | include/tinyalsa/mixer.h | 4 | ||||
-rw-r--r-- | src/mixer.c | 44 |
2 files changed, 48 insertions, 0 deletions
diff --git a/include/tinyalsa/mixer.h b/include/tinyalsa/mixer.h index 0a48b6f..faeb957 100644 --- a/include/tinyalsa/mixer.h +++ b/include/tinyalsa/mixer.h @@ -90,6 +90,10 @@ struct mixer_ctl *mixer_get_ctl_by_name_and_index(struct mixer *mixer, const char *name, unsigned int index); +int mixer_subscribe_events(struct mixer *mixer, int subscribe); + +int mixer_wait_event(struct mixer *mixer, int timeout); + unsigned int mixer_ctl_get_id(const struct mixer_ctl *ctl); const char *mixer_ctl_get_name(const struct mixer_ctl *ctl); diff --git a/src/mixer.c b/src/mixer.c index b7239fd..73fbc66 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -36,6 +36,7 @@ #include <ctype.h> #include <limits.h> #include <time.h> +#include <poll.h> #include <sys/ioctl.h> @@ -302,6 +303,49 @@ unsigned int mixer_get_num_ctls_by_name(const struct mixer *mixer, const char *n return count; } +/** Subscribes for the mixer events. + * @param mixer A mixer handle. + * @param subscribe value indicating subscribe or unsubscribe for events + * @returns On success, zero. + * On failure, non-zero. + * @ingroup libtinyalsa-mixer + */ +int mixer_subscribe_events(struct mixer *mixer, int subscribe) +{ + if (ioctl(mixer->fd, SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS, &subscribe) < 0) { + return -1; + } + return 0; +} + +/** Wait for mixer events. + * @param mixer A mixer handle. + * @param timeout timout value + * @returns On success, zero. + * On failure, non-zero. + * @ingroup libtinyalsa-mixer + */ +int mixer_wait_event(struct mixer *mixer, int timeout) +{ + struct pollfd pfd; + + pfd.fd = mixer->fd; + pfd.events = POLLIN | POLLOUT | POLLERR | POLLNVAL; + + for (;;) { + int err; + err = poll(&pfd, 1, timeout); + if (err < 0) + return -errno; + if (!err) + return 0; + if (pfd.revents & (POLLERR | POLLNVAL)) + return -EIO; + if (pfd.revents & (POLLIN | POLLOUT)) + return 1; + } +} + /** Gets a mixer control handle, by the mixer control's id. * For non-const access, see @ref mixer_get_ctl * @param mixer An initialized mixer handle. |