mirror of
https://github.com/openharmony/third_party_tinyalsa.git
synced 2026-07-18 21:34:26 -04:00
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.
This commit is contained in:
@@ -35,7 +35,9 @@
|
||||
#ifndef TINYALSA_MIXER_H
|
||||
#define TINYALSA_MIXER_H
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <stddef.h>
|
||||
#include <sound/asound.h>
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
@@ -136,6 +138,8 @@ int mixer_ctl_get_range_min(const struct mixer_ctl *ctl);
|
||||
|
||||
int mixer_ctl_get_range_max(const struct mixer_ctl *ctl);
|
||||
|
||||
int mixer_read_event(struct mixer *mixer, struct snd_ctl_event *ev);
|
||||
|
||||
int mixer_consume_event(struct mixer *mixer);
|
||||
#if defined(__cplusplus)
|
||||
} /* extern "C" */
|
||||
|
||||
+30
-8
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user