aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/tinyalsa/mixer.h4
-rw-r--r--src/mixer.c44
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.