]> git.alsa-project.org Git - alsa-plugins.git/commitdiff
arcam_av: Refactor event callback to facilitate addition of "numid" optimisation
authorPeter Stokes <linux@dadeos.co.uk>
Mon, 2 Mar 2009 11:24:13 +0000 (12:24 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 2 Mar 2009 11:24:13 +0000 (12:24 +0100)
Signed-off-by: Peter Stokes <linux@dadeos.co.uk>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
arcam-av/arcam_av.h
arcam-av/ctl_arcam_av.c

index 85e921987f70cfa53ee92d02c09bfb022ced0c73..5d8624e9842a6adacdea0291e40b4b6793af9bde 100644 (file)
@@ -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;
 
index d571b4f97f62a88978020b4d978faa621cf31c5b..0ab14605bf30482e395629284ec66b5e2d21776a 100644 (file)
@@ -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;
 }