From f38405c4fd804fc3482055f1345095343ef243c5 Mon Sep 17 00:00:00 2001 From: Rohit kumar Date: Tue, 2 Jun 2020 11:14:38 +0530 Subject: 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. --- src/mixer.c | 38 ++++++++++++++++++++++++++++++-------- src/mixer_hw.c | 9 +++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) (limited to 'src') 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) diff --git a/src/mixer_hw.c b/src/mixer_hw.c index 2e86dfa..da5a390 100644 --- a/src/mixer_hw.c +++ b/src/mixer_hw.c @@ -82,9 +82,18 @@ static int mixer_hw_ioctl(void *data, unsigned int cmd, ...) return ioctl(hw_data->fd, cmd, arg); } +static ssize_t mixer_hw_read_event(void *data, struct snd_ctl_event *ev, + size_t size) +{ + struct mixer_hw_data *hw_data = data; + + return read(hw_data->fd, ev, size); +} + static const struct mixer_ops mixer_hw_ops = { .close = mixer_hw_close, .ioctl = mixer_hw_ioctl, + .read_event = mixer_hw_read_event, }; int mixer_hw_open(unsigned int card, void **data, -- cgit v1.2.3