[PATCH] Arcam AV Control Plugin Update

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



arcam_av: Refactor event callback to facilitate addition of "numid" optimisation

Signed-off-by: Peter Stokes <linux@xxxxxxxxxxxx>

diff --git a/arcam-av/arcam_av.h b/arcam-av/arcam_av.h
index 85e9219..5d8624e 100644
--- a/arcam-av/arcam_av.h
+++ b/arcam-av/arcam_av.h
@@ -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;
 
diff --git a/arcam-av/ctl_arcam_av.c b/arcam-av/ctl_arcam_av.c
index d571b4f..0ab1460 100644
--- a/arcam-av/ctl_arcam_av.c
+++ b/arcam-av/ctl_arcam_av.c
@@ -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;
 }
 
 
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux