]> git.alsa-project.org Git - alsa-plugins.git/commitdiff
arcam_av: Refactor control specifications to facilitate addition of "numid" optimisation
authorPeter Stokes <linux@dadeos.co.uk>
Mon, 23 Feb 2009 09:03:31 +0000 (10:03 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 23 Feb 2009 09:03:31 +0000 (10:03 +0100)
Signed-off-by: Peter Stokes <linux@dadeos.co.uk>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
arcam-av/ctl_arcam_av.c

index c6ca87afb83b8eb4f16bd60ee5e87b92cf80d46a..d571b4f97f62a88978020b4d978faa621cf31c5b 100644 (file)
                                  : ((b) > (c) ? (b) : ((a) > (c) ? (c) : (a))))
 
 
-static const char* arcam_av_name               = "Arcam AV";
-static const char* arcam_av_power_name         = "Power Switch";
-static const char* arcam_av_volume_name                = "Master Playback Volume";
-static const char* arcam_av_mute_name          = "Master Playback Switch";
-static const char* arcam_av_direct_name                = "Direct Playback Switch";
-static const char* arcam_av_source_name                = "Source Playback Route";
-static const char* arcam_av_source_type_name   = "Source Type Playback Route";
-static const char* arcam_av_stereo_decode_name = "Stereo Decode Playback Route";
-static const char* arcam_av_multi_decode_name  = "Multi-Channel Decode Playback Route";
-static const char* arcam_av_stereo_effect_name = "Stereo Effect Playback Route";
+static const char* arcam_av_name =             "Arcam AV";
+
+static const struct {
+       arcam_av_cc_t                   code;
+       const char*                     name;
+} arcam_av_zone1[] = {
+       {ARCAM_AV_POWER,                        "Power Switch"                          },
+       {ARCAM_AV_VOLUME_SET,                   "Master Playback Volume"                },
+       {ARCAM_AV_MUTE,                         "Master Playback Switch"                },
+       {ARCAM_AV_DIRECT,                       "Direct Playback Switch"                },
+       {ARCAM_AV_SOURCE,                       "Source Playback Route"                 },
+       {ARCAM_AV_SOURCE_TYPE,                  "Source Type Playback Route"            },
+       {ARCAM_AV_STEREO_DECODE,                "Stereo Decode Playback Route"          },
+       {ARCAM_AV_MULTI_DECODE,                 "Multi-Channel Decode Playback Route"   },
+       {ARCAM_AV_STEREO_EFFECT,                "Stereo Effect Playback Route"          }
+};
+
+static const struct {
+       arcam_av_cc_t                   code;
+       const char*                     name;
+} arcam_av_zone2[] = {
+       {ARCAM_AV_POWER,                        "Power Switch"                          },
+       {ARCAM_AV_VOLUME_SET,                   "Master Playback Volume"                },
+       {ARCAM_AV_MUTE,                         "Master Playback Switch"                },
+       {ARCAM_AV_SOURCE,                       "Source Playback Route"                 }
+};
 
 static const struct {
        arcam_av_source_t               code;
@@ -145,7 +161,15 @@ static int arcam_av_elem_count(snd_ctl_ext_t *ext)
 {
        snd_ctl_arcam_av_t *arcam_av = ext->private_data;
 
-       return arcam_av->zone == ARCAM_AV_ZONE1 ? 9 : 4;
+       switch(arcam_av->zone) {
+       case ARCAM_AV_ZONE1:
+               return ARRAY_SIZE(arcam_av_zone1);
+
+       case ARCAM_AV_ZONE2:
+               return ARRAY_SIZE(arcam_av_zone2);
+       }
+
+       return 0;
 }
 
 static int arcam_av_elem_list(snd_ctl_ext_t *ext, unsigned int offset, snd_ctl_elem_id_t *id)
@@ -153,92 +177,59 @@ static int arcam_av_elem_list(snd_ctl_ext_t *ext, unsigned int offset, snd_ctl_e
        snd_ctl_arcam_av_t *arcam_av = ext->private_data;
 
        snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
-       
-       if (arcam_av->zone == ARCAM_AV_ZONE1) {
-               switch(offset) {
-               case 0:
-                       snd_ctl_elem_id_set_name(id, arcam_av_power_name);
-                       break;
-
-               case 1:
-                       snd_ctl_elem_id_set_name(id, arcam_av_volume_name);
-                       break;
 
-               case 2:
-                       snd_ctl_elem_id_set_name(id, arcam_av_mute_name);
-                       break;
+       switch(arcam_av->zone) {
+       case ARCAM_AV_ZONE1:
+               if (offset < ARRAY_SIZE(arcam_av_zone1))
+                       snd_ctl_elem_id_set_name(id, arcam_av_zone1[offset].name);
+               break;
 
-               case 3:
-                       snd_ctl_elem_id_set_name(id, arcam_av_direct_name);
-                       break;
+       case ARCAM_AV_ZONE2:
+               if (offset < ARRAY_SIZE(arcam_av_zone2))
+                       snd_ctl_elem_id_set_name(id, arcam_av_zone2[offset].name);
+               break;
+       }
 
-               case 4:
-                       snd_ctl_elem_id_set_name(id, arcam_av_source_name);
-                       break;
+       return 0;
+}
 
-               case 5:
-                       snd_ctl_elem_id_set_name(id, arcam_av_source_type_name);
-                       break;
+static snd_ctl_ext_key_t arcam_av_find_elem(snd_ctl_ext_t *ext,
+                                           const snd_ctl_elem_id_t *id)
+{
+       snd_ctl_arcam_av_t *arcam_av = ext->private_data;
+       unsigned int numid, search;
+       const char *name;
 
-               case 6:
-                       snd_ctl_elem_id_set_name(id, arcam_av_stereo_decode_name);
-                       break;
+       numid = snd_ctl_elem_id_get_numid(id);
+       if (numid > 0) {
+               numid--;
 
-               case 7:
-                       snd_ctl_elem_id_set_name(id, arcam_av_multi_decode_name);
+               switch(arcam_av->zone) {
+               case ARCAM_AV_ZONE1:
+                       if (numid < ARRAY_SIZE(arcam_av_zone1))
+                               return arcam_av_zone1[numid].code;
                        break;
 
-               case 8:
-                       snd_ctl_elem_id_set_name(id, arcam_av_stereo_effect_name);
+               case ARCAM_AV_ZONE2:
+                       if (numid < ARRAY_SIZE(arcam_av_zone2))
+                               return arcam_av_zone2[numid].code;
                        break;
                }
-       } else {
-               switch(offset) {
-               case 0:
-                       snd_ctl_elem_id_set_name(id, arcam_av_power_name);
-                       break;
-
-               case 1:
-                       snd_ctl_elem_id_set_name(id, arcam_av_volume_name);
-                       break;
-
-               case 2:
-                       snd_ctl_elem_id_set_name(id, arcam_av_mute_name);
-                       break;
-
-               case 3:
-                       snd_ctl_elem_id_set_name(id, arcam_av_source_name);
-                       break;
-               }       
        }
 
-       return 0;
-}
-
-static snd_ctl_ext_key_t arcam_av_find_elem(snd_ctl_ext_t *ext ATTRIBUTE_UNUSED,
-                                           const snd_ctl_elem_id_t *id)
-{
-       const char *name;
-
        name = snd_ctl_elem_id_get_name(id);
-       if (!strcmp(name, arcam_av_power_name)) {
-               return ARCAM_AV_POWER;
-       } else if (!strcmp(name, arcam_av_volume_name)) {
-               return ARCAM_AV_VOLUME_SET;
-       } else if (!strcmp(name, arcam_av_mute_name)) {
-               return ARCAM_AV_MUTE;
-       } else if (!strcmp(name, arcam_av_direct_name)) {
-               return ARCAM_AV_DIRECT;
-       } else if (!strcmp(name, arcam_av_source_name)) {
-               return ARCAM_AV_SOURCE;
-       } else if (!strcmp(name, arcam_av_source_type_name)) {
-               return ARCAM_AV_SOURCE_TYPE;
-       } else if (!strcmp(name, arcam_av_stereo_decode_name)) {
-               return ARCAM_AV_STEREO_DECODE;
-       } else if (!strcmp(name, arcam_av_multi_decode_name)) {
-               return ARCAM_AV_MULTI_DECODE;
-       } else if (!strcmp(name, arcam_av_stereo_effect_name)) {
-               return ARCAM_AV_STEREO_EFFECT;
+       switch(arcam_av->zone) {
+       case ARCAM_AV_ZONE1:
+               for (search = 0; search < ARRAY_SIZE(arcam_av_zone1); search++)
+                       if (!strcmp(name, arcam_av_zone1[search].name))
+                               return arcam_av_zone1[search].code;
+               break;
+
+       case ARCAM_AV_ZONE2:
+               for (search = 0; search < ARRAY_SIZE(arcam_av_zone2); search++)
+                       if (!strcmp(name, arcam_av_zone2[search].name))
+                               return arcam_av_zone2[search].code;
+               break;
        }
 
        return SND_CTL_EXT_KEY_NOT_FOUND;
@@ -697,8 +688,7 @@ static int arcam_av_write_integer(snd_ctl_ext_t *ext, snd_ctl_ext_key_t key, lon
 static int arcam_av_write_enumerated(snd_ctl_ext_t *ext, snd_ctl_ext_key_t key, unsigned int *item)
 {
        snd_ctl_arcam_av_t *arcam_av = ext->private_data;
-
-       char code;
+       unsigned char code;
 
        switch(key) {
        case ARCAM_AV_SOURCE:
@@ -830,31 +820,31 @@ static int arcam_av_read_event(snd_ctl_ext_t *ext, snd_ctl_elem_id_t *id, unsign
        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_power_name);
+                       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_volume_name);
+                       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_mute_name);
+                       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_direct_name);
+                       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_source_name);
+                       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_source_type_name);
+                       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_stereo_decode_name);
+                       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_stereo_effect_name);
+                       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_multi_decode_name);
+                       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];
@@ -871,16 +861,16 @@ static int arcam_av_read_event(snd_ctl_ext_t *ext, snd_ctl_elem_id_t *id, unsign
 
        case ARCAM_AV_ZONE2:
                if (arcam_av->local.zone2.power != arcam_av->global->zone2.power) {
-                       snd_ctl_elem_id_set_name(id, arcam_av_power_name);
+                       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_volume_name);
+                       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_mute_name);
+                       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_source_name);
+                       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];
@@ -934,7 +924,7 @@ SND_CTL_PLUGIN_DEFINE_FUNC(arcam_av)
                const char *id;
                if (snd_config_get_id(n, &id) < 0)
                        continue;
-               if (strcmp(id, "comment") == 0 || strcmp(id, "type") == 0)
+               if (strcmp(id, "comment") == 0 || strcmp(id, "type") == 0 || strcmp(id, "hint") == 0)
                        continue;
                if (strcmp(id, "port") == 0) {
                        if (snd_config_get_string(n, &port) < 0) {
@@ -978,7 +968,7 @@ SND_CTL_PLUGIN_DEFINE_FUNC(arcam_av)
        arcam_av->ext.callback = &arcam_av_ext_callback;
        arcam_av->ext.private_data = arcam_av;
 
-       arcam_av->shm_id= -1;
+       arcam_av->shm_id = -1;
        arcam_av->port_fd = -1;
        arcam_av->port = strcpy((char*)(arcam_av + 1), port);
        arcam_av->zone = zone != 2 ? ARCAM_AV_ZONE1 : ARCAM_AV_ZONE2;