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

Jie, Yang yang.jie at intel.com
Thu Feb 9 03:43:19 CET 2017


> -----Original Message-----
> From: Liam Girdwood [mailto:liam.r.girdwood at linux.intel.com]
> Sent: Wednesday, February 8, 2017 8:07 PM
> To: Keyon Jie <yang.jie at linux.intel.com>
> Cc: sound-open-firmware at alsa-project.org; Jie, Yang <yang.jie at intel.com>;
> Ingalsuo, Seppo <seppo.ingalsuo at intel.com>
> Subject: Re: [Sound-open-firmware] [PATCH 14/25] host: cleanup host_cmd()
> cases
> 
> 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

OK.

> 
> > +
> > +	/* 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.

OK, let me figure out one.

Thanks,
~Keyon

> 
> 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