[Sound-open-firmware] [PATCH 14/25] host: cleanup host_cmd() cases

Liam Girdwood liam.r.girdwood at linux.intel.com
Wed Feb 8 13:06:37 CET 2017


On Tue, 2017-02-07 at 22:03 +0800, Keyon Jie wrote:
> 1. only pause at running stage;
> 2. resetting buffer pointers and local_elem for stopping, to let next
> starting begin from original position;
> 3. adding processes for COMP_CMD_IPC_MMAP_WPOS and
> COMP_CMD_AVAIL_UPDATE.
> 
> Signed-off-by: Keyon Jie <yang.jie at linux.intel.com>
> ---
>  src/audio/host.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 58 insertions(+), 4 deletions(-)
> 
> diff --git a/src/audio/host.c b/src/audio/host.c
> index 8e13391..4b60943 100644
> --- a/src/audio/host.c
> +++ b/src/audio/host.c
> @@ -43,6 +43,7 @@
>  #include <reef/wait.h>
>  #include <reef/audio/component.h>
>  #include <reef/audio/pipeline.h>
> +#include <uapi/intel-ipc.h>
>  #include <platform/dma.h>
>  
>  #define trace_host(__e)	trace_event(TRACE_CLASS_HOST, __e)
> @@ -651,22 +652,67 @@ static struct comp_dev* host_volume_component(struct comp_dev *host)
>  	return comp_dev;
>  }
>  
> +static int host_stop(struct comp_dev *dev)
> +{
> +	struct host_data *hd = comp_get_drvdata(dev);
> +	struct dma_sg_elem *source_elem, *sink_elem, *local_elem;
> +
> +	/* reset buffer pointers */
> +	if (hd->host_pos)
> +		*hd->host_pos = 0;
> +	if (hd->host_app_pos)
> +		*hd->host_app_pos = 0;
> +	hd->host_pos_read = 0;
> +	hd->host_period_pos = 0;
> +	host_update_buffer_consume(hd);

Lets make this a seperate func for resetting pointers 

> +
> +	/* reset buffer pointers and local_elem, to let next start
> +	   from original one */
> +
> +	/* setup elem to point to first source elem */
> +	source_elem = list_first_item(&hd->source->elem_list,
> +					struct dma_sg_elem, list);
> +	hd->source->current = &source_elem->list;
> +	hd->source->current_end = source_elem->src + source_elem->size;
> +
> +	/* setup elem to point to first sink elem */
> +	sink_elem = list_first_item(&hd->sink->elem_list,
> +					struct dma_sg_elem, list);
> +	hd->sink->current = &sink_elem->list;
> +	hd->sink->current_end = sink_elem->dest + sink_elem->size;
> +
> +	/* local element */
> +	local_elem = list_first_item(&hd->config.elem_list,
> +					struct dma_sg_elem, list);
> +	local_elem->dest = sink_elem->dest;
> +	local_elem->size = hd->period->size;
> +	local_elem->src = source_elem->src;
> +	hd->next_inc = hd->period->size;

This looks like it can also be a new func that is shared with parts of
init.

Liam

> +
> +	dev->state = COMP_STATE_STOPPED;
> +	return 0;
> +}
> +
>  /* used to pass standard and bespoke commands (with data) to component */
>  static int host_cmd(struct comp_dev *dev, int cmd, void *data)
>  {
>  	struct host_data *hd = comp_get_drvdata(dev);
>  	struct comp_dev *vol_dev = NULL;
> +	struct ipc_intel_ipc_stream_set_position *app_pos;
>  	int ret = 0;
>  
>  	// TODO: align cmd macros.
>  	switch (cmd) {
>  	case COMP_CMD_PAUSE:
> -		/* channel is paused by DAI */
> -		dev->state = COMP_STATE_PAUSED;
> +		/* 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:
> -		/* stop any new DMA copies (let existing finish though) */
> -		dev->state = COMP_STATE_STOPPED;
> +		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 */
> @@ -681,6 +727,14 @@ static int host_cmd(struct comp_dev *dev, int cmd, void *data)
>  	case COMP_CMD_IPC_MMAP_RPOS:
>  		hd->host_pos = data;
>  		break;
> +	case COMP_CMD_IPC_MMAP_WPOS:
> +		hd->host_app_pos = data;
> +		break;
> +	case COMP_CMD_AVAIL_UPDATE:
> +		app_pos = (struct ipc_intel_ipc_stream_set_position *)data;
> +		*hd->host_app_pos = app_pos->position;
> +		host_update_buffer_produce(hd);
> +		break;
>  	case COMP_CMD_VOLUME:
>  		vol_dev = host_volume_component(dev);
>  		if (vol_dev != NULL)




More information about the Sound-open-firmware mailing list