comp: default function to set comp state

This patch adds a the comp_set_state() used for
the mandatory pipeline commands, START, STOP, PAUSE and RELEASE. It also
updates the cmd method in existing components to use comp_set_state().

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
This commit is contained in:
Ranjani Sridharan 2017-09-06 22:01:40 +01:00 committed by Liam Girdwood
parent a57a7b1ec8
commit 6200408cd7
7 changed files with 57 additions and 95 deletions

View File

@ -117,6 +117,44 @@ void comp_unregister(struct comp_driver *drv)
spin_unlock(&cd->lock);
}
int comp_set_state(struct comp_dev *dev, int cmd)
{
int ret = 0;
switch (cmd) {
case COMP_CMD_START:
case COMP_CMD_RELEASE:
dev->state = COMP_STATE_RUNNING;
break;
case COMP_CMD_STOP:
if (dev->state == COMP_STATE_RUNNING ||
dev->state == COMP_STATE_DRAINING ||
dev->state == COMP_STATE_PAUSED) {
comp_buffer_reset(dev);
dev->state = COMP_STATE_SETUP;
} else {
trace_comp_error("CEs");
ret = -EINVAL;
}
break;
case COMP_CMD_PAUSE:
/* only support pausing for running */
if (dev->state == COMP_STATE_RUNNING)
dev->state = COMP_STATE_PAUSED;
else {
trace_comp_error("CEp");
ret = -EINVAL;
}
break;
default:
trace_comp_error("CEd");
ret = -EINVAL;
break;
}
return ret;
}
void sys_comp_init(void)
{
cd = rzalloc(RZONE_SYS, RFLAGS_NONE, sizeof(*cd));

View File

@ -382,32 +382,11 @@ static int eq_fir_cmd(struct comp_dev *dev, int cmd, void *data)
ret = fir_cmd(dev, cdata);
break;
case COMP_CMD_START:
trace_src("EFs");
dev->state = COMP_STATE_RUNNING;
break;
case COMP_CMD_STOP:
trace_src("ESp");
if (dev->state == COMP_STATE_RUNNING ||
dev->state == COMP_STATE_DRAINING ||
dev->state == COMP_STATE_PAUSED) {
comp_buffer_reset(dev);
dev->state = COMP_STATE_SETUP;
}
break;
case COMP_CMD_PAUSE:
trace_src("EPe");
/* only support pausing for running */
if (dev->state == COMP_STATE_RUNNING)
dev->state = COMP_STATE_PAUSED;
break;
case COMP_CMD_RELEASE:
trace_src("ERl");
dev->state = COMP_STATE_RUNNING;
break;
default:
trace_src("EDf");
ret = -EINVAL;
ret = comp_set_state(dev, cmd);
break;
}

View File

@ -551,28 +551,20 @@ static int host_cmd(struct comp_dev *dev, int cmd, void *data)
// TODO: align cmd macros.
switch (cmd) {
case COMP_CMD_PAUSE:
/* only support pausing for running, channel is paused by DAI */
if (dev->state == COMP_STATE_RUNNING)
dev->state = COMP_STATE_PAUSED;
break;
case COMP_CMD_STOP:
if (dev->state == COMP_STATE_RUNNING ||
dev->state == COMP_STATE_DRAINING ||
dev->state == COMP_STATE_PAUSED)
ret = host_stop(dev);
break;
case COMP_CMD_RELEASE:
/* channel is released by DAI */
dev->state = COMP_STATE_RUNNING;
break;
case COMP_CMD_START:
dev->state = COMP_STATE_RUNNING;
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);
break;
}

View File

@ -435,6 +435,7 @@ static int src_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata)
static int src_cmd(struct comp_dev *dev, int cmd, void *data)
{
struct sof_ipc_ctrl_data *cdata = data;
int ret = 0;
trace_src("SCm");
@ -442,35 +443,15 @@ static int src_cmd(struct comp_dev *dev, int cmd, void *data)
case COMP_CMD_SET_VALUE:
return src_ctrl_cmd(dev, cdata);
case COMP_CMD_START:
trace_src("SSt");
dev->state = COMP_STATE_RUNNING;
break;
case COMP_CMD_STOP:
trace_src("SSp");
if (dev->state == COMP_STATE_RUNNING ||
dev->state == COMP_STATE_DRAINING ||
dev->state == COMP_STATE_PAUSED) {
comp_buffer_reset(dev);
dev->state = COMP_STATE_SETUP;
}
break;
case COMP_CMD_PAUSE:
trace_src("SPe");
/* only support pausing for running */
if (dev->state == COMP_STATE_RUNNING)
dev->state = COMP_STATE_PAUSED;
break;
case COMP_CMD_RELEASE:
trace_src("SRl");
dev->state = COMP_STATE_RUNNING;
break;
default:
trace_src("SDf");
ret = comp_set_state(dev, cmd);
break;
}
return 0;
return ret;
}
/* copy and process stream data from source to sink buffers */

View File

@ -434,6 +434,8 @@ static int tone_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata)
{
struct comp_data *cd = comp_get_drvdata(dev);
trace_tone("tri");
switch (cdata->cmd) {
case SOF_CTRL_CMD_MUTE:
trace_tone("TMu");
@ -468,6 +470,7 @@ static int tone_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata)
static int tone_cmd(struct comp_dev *dev, int cmd, void *data)
{
struct sof_ipc_ctrl_data *cdata = data;
int ret = 0;
trace_tone("tri");
@ -475,36 +478,15 @@ static int tone_cmd(struct comp_dev *dev, int cmd, void *data)
case COMP_CMD_SET_VALUE:
return tone_ctrl_cmd(dev, cdata);
case COMP_CMD_START:
trace_tone("TSt");
dev->state = COMP_STATE_RUNNING;
break;
case COMP_CMD_STOP:
trace_tone("TSp");
if (dev->state == COMP_STATE_RUNNING ||
dev->state == COMP_STATE_DRAINING ||
dev->state == COMP_STATE_PAUSED) {
comp_buffer_reset(dev);
dev->state = COMP_STATE_SETUP;
}
break;
case COMP_CMD_PAUSE:
trace_tone("TPe");
/* only support pausing for running */
if (dev->state == COMP_STATE_RUNNING)
dev->state = COMP_STATE_PAUSED;
break;
case COMP_CMD_RELEASE:
trace_tone("TRl");
dev->state = COMP_STATE_RUNNING;
break;
default:
trace_tone("TDf");
ret = comp_set_state(dev, cmd);
break;
}
return 0;
return ret;
}
/* copy and process stream data from source to sink buffers */

View File

@ -429,6 +429,7 @@ static int volume_ctrl_cmd(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata
static int volume_cmd(struct comp_dev *dev, int cmd, void *data)
{
struct sof_ipc_ctrl_data *cdata = data;
int ret = 0;
trace_volume("cmd");
@ -436,29 +437,15 @@ static int volume_cmd(struct comp_dev *dev, int cmd, void *data)
case COMP_CMD_SET_VALUE:
return volume_ctrl_cmd(dev, cdata);
case COMP_CMD_START:
dev->state = COMP_STATE_RUNNING;
break;
case COMP_CMD_STOP:
if (dev->state == COMP_STATE_RUNNING ||
dev->state == COMP_STATE_DRAINING ||
dev->state == COMP_STATE_PAUSED) {
comp_buffer_reset(dev);
dev->state = COMP_STATE_SETUP;
}
break;
case COMP_CMD_PAUSE:
/* only support pausing for running */
if (dev->state == COMP_STATE_RUNNING)
dev->state = COMP_STATE_PAUSED;
break;
case COMP_CMD_RELEASE:
dev->state = COMP_STATE_RUNNING;
break;
default:
ret = comp_set_state(dev, cmd);
break;
}
return 0;
return ret;
}
/* copy and process stream data from source to sink buffers */

View File

@ -214,6 +214,9 @@ static inline void comp_free(struct comp_dev *dev)
dev->drv->ops.free(dev);
}
/* component state set */
int comp_set_state(struct comp_dev *dev, int cmd);
/* component parameter init - mandatory */
static inline int comp_params(struct comp_dev *dev)
{