From 7a06fb4ccba34124dc09ea3678599281a936db06 Mon Sep 17 00:00:00 2001 From: Peter Stokes Date: Mon, 23 Feb 2009 10:03:31 +0100 Subject: arcam_av: Refactor control specifications to facilitate addition of "numid" optimisation Signed-off-by: Peter Stokes Signed-off-by: Takashi Iwai --- arcam-av/ctl_arcam_av.c | 192 +++++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 101 deletions(-) diff --git a/arcam-av/ctl_arcam_av.c b/arcam-av/ctl_arcam_av.c index c6ca87a..d571b4f 100644 --- a/arcam-av/ctl_arcam_av.c +++ b/arcam-av/ctl_arcam_av.c @@ -31,16 +31,32 @@ : ((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; -- cgit