ALSA: compress_core: Add support for capture streams

Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
Acked-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Charles Keepax 2013-04-18 11:02:08 +01:00 committed by Takashi Iwai
parent 4daf891cde
commit 49bb6402f1

View File

@ -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, static ssize_t snd_compr_read(struct file *f, char __user *buf,
size_t count, loff_t *offset) 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;
}
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) 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); retval = stream->ops->set_params(stream, params);
if (retval) if (retval)
goto out; goto out;
stream->runtime->state = SNDRV_PCM_STATE_SETUP;
stream->metadata_set = false; stream->metadata_set = false;
stream->next_track = 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 { } else {
return -EPERM; return -EPERM;
} }