Re: [alsa-devel] [PATCH 4/7] ALSA: compress_core: Add support for capture streams
On Thu, Apr 18, 2013 at 11:02:08AM +0100, Charles Keepax wrote:
Signed-off-by: Charles Keepax ckeepax@opensource.wolfsonmicro.com Signed-off-by: Richard Fitzgerald rf@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
} else { return -EPERM; }stream->runtime->state = SNDRV_PCM_STATE_PREPARED;
-- 1.7.2.5
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.
Yes, looks like a bug to me. Not sure that it's a blocker - new feature so nobody is going to be using this immediately. As you can't capture sounds from the future(!) the DSP could only hold data up to the point you stopped/paused. But the DSP could have some audio packets queued that it hasn't sent to host yet and you still need to read them. You'd probably not have much queued anyway as it would be disturbing for user if they monitor recording through their device headphones and it has significant latency from the real world sounds?
KINDLY REMOVE THIS ADDRESS FROM YOUR MAILING LIST
On Friday, 19 April 2013, Vinod Koul wrote:
On Thu, Apr 18, 2013 at 11:02:08AM +0100, Charles Keepax wrote:
Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.comjavascript:;
Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.comjavascript:;
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
participants (3)
-
Leanne Girdwood
-
Richard Fitzgerald
-
Vinod Koul