[Sound-open-firmware] [PATCH] comps: make sure correct state transitions are used and verified.

Liam Girdwood liam.r.girdwood at linux.intel.com
Thu Sep 21 00:33:45 CEST 2017


Use the correct component states and verify this at runtime.

Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
 src/audio/component.c | 18 ++++++++++++++----
 src/audio/host.c      | 10 ++++------
 src/audio/mixer.c     |  6 ++++--
 src/audio/volume.c    |  3 ++-
 4 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/audio/component.c b/src/audio/component.c
index fd0d65e..1cf4799 100644
--- a/src/audio/component.c
+++ b/src/audio/component.c
@@ -122,13 +122,23 @@ int comp_set_state(struct comp_dev *dev, int cmd)
 
 	switch (cmd) {
 	case COMP_CMD_START:
+		if (dev->state == COMP_STATE_PREPARE) {
+			dev->state = COMP_STATE_ACTIVE;
+		} else {
+			trace_comp_error("CES");
+			ret = -EINVAL;
+		}
+		break;
 	case COMP_CMD_RELEASE:
-		dev->state = COMP_STATE_ACTIVE;
+		if (dev->state == COMP_STATE_PAUSED) {
+			dev->state = COMP_STATE_ACTIVE;
+		} else {
+			trace_comp_error("CEr");
+			ret = -EINVAL;
+		}
 		break;
 	case COMP_CMD_STOP:
-		if (dev->state == COMP_STATE_ACTIVE ||
-		dev->state == COMP_STATE_PAUSED) {
-			comp_buffer_reset(dev);
+		if (dev->state == COMP_STATE_ACTIVE) {
 			dev->state = COMP_STATE_READY;
 		} else {
 			trace_comp_error("CEs");
diff --git a/src/audio/host.c b/src/audio/host.c
index 36e4c29..8aa29ad 100644
--- a/src/audio/host.c
+++ b/src/audio/host.c
@@ -527,7 +527,7 @@ static int host_stop(struct comp_dev *dev)
 	/* now reset downstream buffer */
 	comp_buffer_reset(dev);
 
-	dev->state = COMP_STATE_READY;
+	dev->state = COMP_STATE_PAUSED;
 	return 0;
 }
 
@@ -549,18 +549,16 @@ static int host_cmd(struct comp_dev *dev, int cmd, void *data)
 
 	trace_host("cmd");
 
-	// TODO: align cmd macros.
 	switch (cmd) {
+	case COMP_CMD_PAUSE:
 	case COMP_CMD_STOP:
-		if (dev->state == COMP_STATE_ACTIVE ||
-			dev->state == COMP_STATE_PAUSED)
+		if (dev->state == COMP_STATE_ACTIVE)
 			ret = host_stop(dev);
 		break;
 	case COMP_CMD_SUSPEND:
 	case COMP_CMD_RESUME:
 		break;
 	case COMP_CMD_START:
-	case COMP_CMD_PAUSE:
 	case COMP_CMD_RELEASE:
 	default:
 		ret = comp_set_state(dev, cmd);
@@ -616,7 +614,7 @@ static int host_reset(struct comp_dev *dev)
 	hd->host_pos = NULL;
 	hd->source = NULL;
 	hd->sink = NULL;
-	dev->state = COMP_STATE_INIT;
+	dev->state = COMP_STATE_READY;
 
 	return 0;
 }
diff --git a/src/audio/mixer.c b/src/audio/mixer.c
index 30ac8cc..85aa601 100644
--- a/src/audio/mixer.c
+++ b/src/audio/mixer.c
@@ -99,7 +99,7 @@ static struct comp_dev *mixer_new(struct sof_ipc_comp *comp)
 	}
 
 	comp_set_drvdata(dev, md);
-
+	dev->state = COMP_STATE_READY;
 	return dev;
 }
 
@@ -274,7 +274,7 @@ static int mixer_reset(struct comp_dev *dev)
 			return 1; /* should not reset the downstream components */
 	}
 
-	dev->state = COMP_STATE_INIT;
+	dev->state = COMP_STATE_READY;
 	return 0;
 }
 
@@ -312,6 +312,8 @@ static int mixer_prepare(struct comp_dev *dev)
 		}
 	}
 
+	dev->state = COMP_STATE_PREPARE;
+
 	/* prepare downstream */
 	return downstream;
 }
diff --git a/src/audio/volume.c b/src/audio/volume.c
index 13cba42..45bbe27 100644
--- a/src/audio/volume.c
+++ b/src/audio/volume.c
@@ -332,6 +332,7 @@ static struct comp_dev *volume_new(struct sof_ipc_comp *comp)
 		cd->tvolume[i] = VOL_MAX;
 	}
 
+	dev->state = COMP_STATE_READY;
 	return dev;
 }
 
@@ -649,7 +650,7 @@ static int volume_reset(struct comp_dev *dev)
 {
 	trace_volume("res");
 
-	dev->state = COMP_STATE_INIT;
+	dev->state = COMP_STATE_READY;
 	return 0;
 }
 
-- 
2.11.0



More information about the Sound-open-firmware mailing list