* [PATCH 2/2] Arcam AV Control Plugin Updates
@ 2009-02-21 16:59 Peter Stokes
0 siblings, 0 replies; only message in thread
From: Peter Stokes @ 2009-02-21 16:59 UTC (permalink / raw)
To: alsa-devel
[-- Attachment #1: Type: text/plain, Size: 140 bytes --]
arcam_av: Refactor control specifications to facilitate addition of "numid" optimisation
Signed-off-by: Peter Stokes <linux@dadeos.co.uk>
[-- Attachment #2: arcam_av_numid_refactor.patch --]
[-- Type: text/x-diff, Size: 10942 bytes --]
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;
[-- Attachment #3: Type: text/plain, Size: 160 bytes --]
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2009-02-21 17:17 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-21 16:59 [PATCH 2/2] Arcam AV Control Plugin Updates Peter Stokes
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.