aboutsummaryrefslogtreecommitdiff
path: root/src/mixer.c
diff options
context:
space:
mode:
authorRohit kumar <rohitkr@codeaurora.org>2020-06-02 11:14:38 +0530
committerRohit kumar <rohitkr@codeaurora.org>2020-06-02 12:31:17 +0530
commitf38405c4fd804fc3482055f1345095343ef243c5 (patch)
treeafa8e91e4c19f4a1c929d928ec9764b3445ad7fa /src/mixer.c
parentbdc1fcf5f04b1bc2f97e9d449ced1c516f70d4af (diff)
mixer: Add plugin support for mixer_consume/read_event
snd_ctl_event is needed by client to get details of event received. Introduce mixer_read_event() with plugin support to support this.
Diffstat (limited to 'src/mixer.c')
-rw-r--r--src/mixer.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/mixer.c b/src/mixer.c
index c8c6c2a..582d8c1 100644
--- a/src/mixer.c
+++ b/src/mixer.c
@@ -545,15 +545,37 @@ int mixer_wait_event(struct mixer *mixer, int timeout)
* @returns 0 on success. -errno on failure.
* @ingroup libtinyalsa-mixer
*/
-int mixer_consume_event(struct mixer *mixer) {
+int mixer_consume_event(struct mixer *mixer)
+{
struct snd_ctl_event ev;
- ssize_t count = read(mixer->fd, &ev, sizeof(ev));
- // Exporting the actual event would require exposing snd_ctl_event
- // via the header file, and all associated structs.
- // The events generally tell you exactly which value changed,
- // but reading values you're interested isn't hard and simplifies
- // the interface greatly.
- return (count >= 0) ? 0 : -errno;
+
+ return mixer_read_event(mixer, &ev);
+}
+
+int mixer_read_event(struct mixer *mixer, struct snd_ctl_event *ev)
+{
+ struct mixer_ctl_group *grp;
+ ssize_t count = 0;
+
+ if (mixer->h_grp) {
+ grp = mixer->h_grp;
+ if (grp->event_cnt) {
+ grp->event_cnt--;
+ count = grp->ops->read_event(grp->data, ev, sizeof(*ev));
+ return (count >= 0) ? 0 : -errno;
+ }
+ }
+#ifdef TINYALSA_USES_PLUGINS
+ if (mixer->v_grp) {
+ grp = mixer->v_grp;
+ if (grp->event_cnt) {
+ grp->event_cnt--;
+ count = grp->ops->read_event(grp->data, ev, sizeof(*ev));
+ return (count >= 0) ? 0 : -errno;
+ }
+ }
+#endif
+ return 0;
}
static unsigned int mixer_grp_get_count(struct mixer_ctl_group *grp)