[alsa-devel] [PATCH 4/7] ALSA: compress_core: Add support for capture streams

Vinod Koul vinod.koul at intel.com
Fri Apr 19 15:25:52 CEST 2013


On Thu, Apr 18, 2013 at 11:02:08AM +0100, Charles Keepax wrote:
> Signed-off-by: Charles Keepax <ckeepax at opensource.wolfsonmicro.com>
> Signed-off-by: Richard Fitzgerald <rf at opensource.wolfsonmicro.com>
> ---
>  sound/core/compress_offload.c |   43 +++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 41 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
> index 52ca4cc..52a2765 100644
> --- a/sound/core/compress_offload.c
> +++ b/sound/core/compress_offload.c
> @@ -296,7 +296,41 @@ static ssize_t snd_compr_write(struct file *f, const char __user *buf,
>  static ssize_t snd_compr_read(struct file *f, char __user *buf,
>  		size_t count, loff_t *offset)
>  {
> -	return -ENXIO;
> +	struct snd_compr_file *data = f->private_data;
> +	struct snd_compr_stream *stream;
> +	size_t avail;
> +	int retval;
> +
> +	if (snd_BUG_ON(!data))
> +		return -EFAULT;
> +
> +	stream = &data->stream;
> +	mutex_lock(&stream->device->lock);
> +
> +	/* read is allowed when stream is running */
> +	if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING) {
> +		retval = -EBADFD;
> +		goto out;
minor one but shouldnt we allow read even when we have stoped or paused the
stream. Stop is important as you might want to get all buffers after you have
stopped.
> +	}
> +
> +	avail = snd_compr_get_avail(stream);
> +	pr_debug("avail returned %ld\n", (unsigned long)avail);
> +	/* calculate how much we can read from buffer */
> +	if (avail > count)
> +		avail = count;
> +
> +	if (stream->ops->copy) {
> +		retval = stream->ops->copy(stream, buf, avail);
> +	} else {
> +		retval = -ENXIO;
> +		goto out;
> +	}
> +	if (retval > 0)
> +		stream->runtime->total_bytes_transferred += retval;
> +
> +out:
> +	mutex_unlock(&stream->device->lock);
> +	return retval;
>  }
>  
>  static int snd_compr_mmap(struct file *f, struct vm_area_struct *vma)
> @@ -481,9 +515,14 @@ snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg)
>  		retval = stream->ops->set_params(stream, params);
>  		if (retval)
>  			goto out;
> -		stream->runtime->state = SNDRV_PCM_STATE_SETUP;
> +
>  		stream->metadata_set = false;
>  		stream->next_track = false;
> +
> +		if (stream->direction == SND_COMPRESS_PLAYBACK)
> +			stream->runtime->state = SNDRV_PCM_STATE_SETUP;
> +		else
> +			stream->runtime->state = SNDRV_PCM_STATE_PREPARED;
>  	} else {
>  		return -EPERM;
>  	}
> -- 
> 1.7.2.5
> 


More information about the Alsa-devel mailing list