[alsa-devel] [TINYCOMPRESS][PATCH 1/1] compress: Add support for capture streams
Signed-off-by: Charles Keepax ckeepax@opensource.wolfsonmicro.com Signed-off-by: Richard Fitzgerald rf@opensource.wolfsonmicro.com --- compress.c | 64 +++++++++++++++++++++++++++++++--- include/tinycompress/tinycompress.h | 2 +- 2 files changed, 59 insertions(+), 7 deletions(-)
diff --git a/compress.c b/compress.c index 86cca88..e80e598 100644 --- a/compress.c +++ b/compress.c @@ -240,13 +240,12 @@ struct compress *compress_open(unsigned int card, unsigned int device, oops(&bad_compress, -EINVAL, "can't deduce device direction from given flags"); goto config_fail; } + if (flags & COMPRESS_OUT) { - /* this should be removed once we have capture tested */ - oops(&bad_compress, -EINVAL, "this version doesnt support capture"); - goto config_fail; + compress->fd = open(fn, O_RDONLY); + } else { + compress->fd = open(fn, O_WRONLY); } - - compress->fd = open(fn, O_WRONLY); if (compress->fd < 0) { oops(&bad_compress, errno, "cannot open device '%s'", fn); goto config_fail; @@ -403,7 +402,60 @@ int compress_write(struct compress *compress, const void *buf, unsigned int size
int compress_read(struct compress *compress, void *buf, unsigned int size) { - return oops(compress, -ENOTTY, "Not supported yet in lib"); + struct snd_compr_avail avail; + struct pollfd fds; + int to_read = 0; + int num_read, total = 0, ret; + char* cbuf = buf; + const unsigned int frag_size = compress->config->fragment_size; + + if (!(compress->flags & COMPRESS_OUT)) + return oops(compress, -EINVAL, "Invalid flag set"); + if (!is_compress_ready(compress)) + return oops(compress, -ENODEV, "device not ready"); + fds.fd = compress->fd; + fds.events = POLLIN; + + while (size) { + if (ioctl(compress->fd, SNDRV_COMPRESS_AVAIL, &avail)) + return oops(compress, errno, "cannot get avail"); + + if ( (avail.avail < frag_size) && (avail.avail < size) ) { + /* Less than one fragment available and not at the + * end of the read, so poll + */ + ret = poll(&fds, 1, compress->max_poll_wait_ms); + /* A pause will cause -EBADFD or zero. + * This is not an error, just stop reading */ + if ((ret == 0) || (ret == -EBADFD)) + break; + if (ret < 0) + return oops(compress, errno, "poll error"); + if (fds.revents & POLLIN) { + continue; + } + if (fds.revents & POLLERR) { + return oops(compress, -EIO, "poll returned error!"); + } + } + /* read avail bytes */ + if (size > avail.avail) + to_read = avail.avail; + else + to_read = size; + num_read = read(compress->fd, cbuf, to_read); + /* If play was paused the read returns -EBADFD */ + if (num_read == -EBADFD) + break; + if (num_read < 0) + return oops(compress, errno, "read failed!"); + + size -= num_read; + cbuf += num_read; + total += num_read; + } + + return total; }
int compress_start(struct compress *compress) diff --git a/include/tinycompress/tinycompress.h b/include/tinycompress/tinycompress.h index ba9f3b6..9867afc 100644 --- a/include/tinycompress/tinycompress.h +++ b/include/tinycompress/tinycompress.h @@ -76,7 +76,7 @@ struct compr_gapless_mdata { __u32 encoder_padding; };
-#define COMPRESS_OUT 0x00000000 +#define COMPRESS_OUT 0x20000000 #define COMPRESS_IN 0x10000000
struct compress;
On Fri, Apr 26, 2013 at 04:14:22PM +0100, Richard Fitzgerald wrote:
Signed-off-by: Charles Keepax ckeepax@opensource.wolfsonmicro.com Signed-off-by: Richard Fitzgerald rf@opensource.wolfsonmicro.com
compress.c | 64 +++++++++++++++++++++++++++++++--- include/tinycompress/tinycompress.h | 2 +- 2 files changed, 59 insertions(+), 7 deletions(-)
Applied thanks, now where is crecord :-)
-- ~Vinod
diff --git a/compress.c b/compress.c index 86cca88..e80e598 100644 --- a/compress.c +++ b/compress.c @@ -240,13 +240,12 @@ struct compress *compress_open(unsigned int card, unsigned int device, oops(&bad_compress, -EINVAL, "can't deduce device direction from given flags"); goto config_fail; }
- if (flags & COMPRESS_OUT) {
/* this should be removed once we have capture tested */
oops(&bad_compress, -EINVAL, "this version doesnt support capture");
goto config_fail;
compress->fd = open(fn, O_RDONLY);
- } else {
}compress->fd = open(fn, O_WRONLY);
- compress->fd = open(fn, O_WRONLY); if (compress->fd < 0) { oops(&bad_compress, errno, "cannot open device '%s'", fn); goto config_fail;
@@ -403,7 +402,60 @@ int compress_write(struct compress *compress, const void *buf, unsigned int size
int compress_read(struct compress *compress, void *buf, unsigned int size) {
- return oops(compress, -ENOTTY, "Not supported yet in lib");
- struct snd_compr_avail avail;
- struct pollfd fds;
- int to_read = 0;
- int num_read, total = 0, ret;
- char* cbuf = buf;
- const unsigned int frag_size = compress->config->fragment_size;
- if (!(compress->flags & COMPRESS_OUT))
return oops(compress, -EINVAL, "Invalid flag set");
- if (!is_compress_ready(compress))
return oops(compress, -ENODEV, "device not ready");
- fds.fd = compress->fd;
- fds.events = POLLIN;
- while (size) {
if (ioctl(compress->fd, SNDRV_COMPRESS_AVAIL, &avail))
return oops(compress, errno, "cannot get avail");
if ( (avail.avail < frag_size) && (avail.avail < size) ) {
/* Less than one fragment available and not at the
* end of the read, so poll
*/
ret = poll(&fds, 1, compress->max_poll_wait_ms);
/* A pause will cause -EBADFD or zero.
* This is not an error, just stop reading */
if ((ret == 0) || (ret == -EBADFD))
break;
if (ret < 0)
return oops(compress, errno, "poll error");
if (fds.revents & POLLIN) {
continue;
}
if (fds.revents & POLLERR) {
return oops(compress, -EIO, "poll returned error!");
}
}
/* read avail bytes */
if (size > avail.avail)
to_read = avail.avail;
else
to_read = size;
num_read = read(compress->fd, cbuf, to_read);
/* If play was paused the read returns -EBADFD */
if (num_read == -EBADFD)
break;
if (num_read < 0)
return oops(compress, errno, "read failed!");
size -= num_read;
cbuf += num_read;
total += num_read;
- }
- return total;
}
int compress_start(struct compress *compress) diff --git a/include/tinycompress/tinycompress.h b/include/tinycompress/tinycompress.h index ba9f3b6..9867afc 100644 --- a/include/tinycompress/tinycompress.h +++ b/include/tinycompress/tinycompress.h @@ -76,7 +76,7 @@ struct compr_gapless_mdata { __u32 encoder_padding; };
-#define COMPRESS_OUT 0x00000000 +#define COMPRESS_OUT 0x20000000 #define COMPRESS_IN 0x10000000
struct compress;
1.7.2.5
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
participants (2)
-
Richard Fitzgerald
-
Vinod Koul