summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Stokes <linux@dadeos.co.uk>2009-03-02 12:24:13 +0100
committerTakashi Iwai <tiwai@suse.de>2009-03-02 12:24:13 +0100
commit232633212a384f0a275160226e4e2b5e73b5142b (patch)
tree46be20dc8491edc98faaff5927c08f38fac7898b
parent7a06fb4ccba34124dc09ea3678599281a936db06 (diff)
arcam_av: Refactor event callback to facilitate addition of "numid" optimisation
Signed-off-by: Peter Stokes <linux@dadeos.co.uk> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--arcam-av/arcam_av.h36
-rw-r--r--arcam-av/ctl_arcam_av.c92
2 files changed, 52 insertions, 76 deletions
diff --git a/arcam-av/arcam_av.h b/arcam-av/arcam_av.h
index 85e9219..5d8624e 100644
--- a/arcam-av/arcam_av.h
+++ b/arcam-av/arcam_av.h
@@ -133,22 +133,28 @@ int arcam_av_send(int fd, arcam_av_cc_t command, unsigned char param1, unsigned
typedef struct arcam_av_state {
- struct {
- arcam_av_power_t power;
- unsigned char volume;
- arcam_av_mute_t mute;
- arcam_av_direct_t direct;
- arcam_av_source_t source;
- arcam_av_source_type_t source_type;
- arcam_av_stereo_decode_t stereo_decode;
- arcam_av_stereo_effect_t stereo_effect;
- arcam_av_multi_decode_t multi_decode;
+ union {
+ struct {
+ unsigned char power;
+ unsigned char volume;
+ unsigned char mute;
+ unsigned char direct;
+ unsigned char source;
+ unsigned char source_type;
+ unsigned char stereo_decode;
+ unsigned char stereo_effect;
+ unsigned char multi_decode;
+ };
+ unsigned char state[9];
} zone1;
- struct {
- arcam_av_power_t power;
- unsigned char volume;
- arcam_av_mute_t mute;
- arcam_av_source_t source;
+ union {
+ struct {
+ unsigned char power;
+ unsigned char volume;
+ unsigned char mute;
+ unsigned char source;
+ };
+ unsigned char state[4];
} zone2;
} arcam_av_state_t;
diff --git a/arcam-av/ctl_arcam_av.c b/arcam-av/ctl_arcam_av.c
index d571b4f..0ab1460 100644
--- a/arcam-av/ctl_arcam_av.c
+++ b/arcam-av/ctl_arcam_av.c
@@ -816,81 +816,51 @@ static int arcam_av_write_enumerated(snd_ctl_ext_t *ext, snd_ctl_ext_key_t key,
static int arcam_av_read_event(snd_ctl_ext_t *ext, snd_ctl_elem_id_t *id, unsigned int *event_mask)
{
snd_ctl_arcam_av_t *arcam_av = ext->private_data;
+ unsigned int elem;
+ int result = 0;
switch(arcam_av->zone) {
case ARCAM_AV_ZONE1:
- if (arcam_av->local.zone1.power != arcam_av->global->zone1.power) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone1[0].name);
- arcam_av->local.zone1.power = arcam_av->global->zone1.power;
- } else if (arcam_av->local.zone1.volume != arcam_av->global->zone1.volume) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone1[1].name);
- arcam_av->local.zone1.volume = arcam_av->global->zone1.volume;
- } else if (arcam_av->local.zone1.mute != arcam_av->global->zone1.mute) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone1[2].name);
- arcam_av->local.zone1.mute = arcam_av->global->zone1.mute;
- } else if (arcam_av->local.zone1.direct != arcam_av->global->zone1.direct) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone1[3].name);
- arcam_av->local.zone1.direct = arcam_av->global->zone1.direct;
- } else if (arcam_av->local.zone1.source != arcam_av->global->zone1.source) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone1[4].name);
- arcam_av->local.zone1.source = arcam_av->global->zone1.source;
- } else if (arcam_av->local.zone1.source_type != arcam_av->global->zone1.source_type) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone1[5].name);
- arcam_av->local.zone1.source_type = arcam_av->global->zone1.source_type;
- } else if (arcam_av->local.zone1.stereo_decode != arcam_av->global->zone1.stereo_decode) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone1[6].name);
- arcam_av->local.zone1.stereo_decode = arcam_av->global->zone1.stereo_decode;
- } else if (arcam_av->local.zone1.stereo_effect != arcam_av->global->zone1.stereo_effect) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone1[7].name);
- arcam_av->local.zone1.stereo_effect = arcam_av->global->zone1.stereo_effect;
- } else if (arcam_av->local.zone1.multi_decode != arcam_av->global->zone1.multi_decode) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone1[8].name);
- arcam_av->local.zone1.multi_decode = arcam_av->global->zone1.multi_decode;
- } else {
- char buf[10];
- if (recv(arcam_av->ext.poll_fd, buf, sizeof(buf), 0) <= 0) {
- close(arcam_av->ext.poll_fd);
- arcam_av->ext.poll_fd = arcam_av_client(arcam_av->port);
- if (arcam_av->ext.poll_fd > 0)
- fcntl(arcam_av->ext.poll_fd, F_SETFL, O_NONBLOCK);
+ for (elem = 0; elem < ARRAY_SIZE(arcam_av_zone1); ++elem) {
+ if (arcam_av->local.zone1.state[elem] != arcam_av->global->zone1.state[elem]) {
+ snd_ctl_elem_id_set_name(id, arcam_av_zone1[elem].name);
+ snd_ctl_elem_id_set_numid(id, elem + 1);
+ arcam_av->local.zone1.state[elem] = arcam_av->global->zone1.state[elem];
+ result = 1;
+ break;
}
-
- return -EAGAIN;
- }
+ }
break;
case ARCAM_AV_ZONE2:
- if (arcam_av->local.zone2.power != arcam_av->global->zone2.power) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone2[0].name);
- arcam_av->local.zone2.power = arcam_av->global->zone2.power;
- } else if (arcam_av->local.zone2.volume != arcam_av->global->zone2.volume) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone2[1].name);
- arcam_av->local.zone2.volume = arcam_av->global->zone2.volume;
- } else if (arcam_av->local.zone2.mute != arcam_av->global->zone2.mute) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone2[2].name);
- arcam_av->local.zone2.mute = arcam_av->global->zone2.mute;
- } else if (arcam_av->local.zone2.source != arcam_av->global->zone2.source) {
- snd_ctl_elem_id_set_name(id, arcam_av_zone2[3].name);
- arcam_av->local.zone2.source = arcam_av->global->zone2.source;
- } else {
- char buf[10];
- if (recv(arcam_av->ext.poll_fd, buf, sizeof(buf), 0) <= 0) {
- close(arcam_av->ext.poll_fd);
- arcam_av->ext.poll_fd = arcam_av_client(arcam_av->port);
- if (arcam_av->ext.poll_fd > 0)
- fcntl(arcam_av->ext.poll_fd, F_SETFL, O_NONBLOCK);
+ for (elem = 0; elem < ARRAY_SIZE(arcam_av_zone2); ++elem) {
+ if (arcam_av->local.zone2.state[elem] != arcam_av->global->zone2.state[elem]) {
+ snd_ctl_elem_id_set_name(id, arcam_av_zone2[elem].name);
+ snd_ctl_elem_id_set_numid(id, elem + 1);
+ arcam_av->local.zone2.state[elem] = arcam_av->global->zone2.state[elem];
+ result = 1;
+ break;
}
-
- return -EAGAIN;
}
break;
}
- snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
+ if (!result) {
+ char buf[10];
+ if (recv(arcam_av->ext.poll_fd, buf, sizeof(buf), 0) <= 0) {
+ close(arcam_av->ext.poll_fd);
+ arcam_av->ext.poll_fd = arcam_av_client(arcam_av->port);
+ if (arcam_av->ext.poll_fd > 0)
+ fcntl(arcam_av->ext.poll_fd, F_SETFL, O_NONBLOCK);
+ }
- *event_mask = SND_CTL_EVENT_MASK_VALUE;
+ result = -EAGAIN;
+ } else {
+ snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
+ *event_mask = SND_CTL_EVENT_MASK_VALUE;
+ }
- return 1;
+ return result;
}