From 232633212a384f0a275160226e4e2b5e73b5142b Mon Sep 17 00:00:00 2001 From: Peter Stokes Date: Mon, 2 Mar 2009 12:24:13 +0100 Subject: arcam_av: Refactor event callback to facilitate addition of "numid" optimisation Signed-off-by: Peter Stokes Signed-off-by: Takashi Iwai --- arcam-av/arcam_av.h | 36 +++++++++++-------- arcam-av/ctl_arcam_av.c | 92 +++++++++++++++++-------------------------------- 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; } -- cgit