diff options
| -rw-r--r-- | arcam-av/ctl_arcam_av.c | 192 | 
1 files 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;  | 
