summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compress.c76
-rw-r--r--compress_plugin.c6
-rw-r--r--include/tinycompress/tinycompress.h2
3 files changed, 44 insertions, 40 deletions
diff --git a/compress.c b/compress.c
index f1947b0..187bbe9 100644
--- a/compress.c
+++ b/compress.c
@@ -397,51 +397,49 @@ int compress_read(struct compress *compress, void *buf, unsigned int size)
return oops(compress, ENODEV, "device not ready");
fds.events = POLLIN;
- while (size) {
- if (compress->ops->ioctl(compress->data, SNDRV_COMPRESS_AVAIL, &avail))
- return oops(compress, errno, "cannot get avail");
+ if (compress->ops->ioctl(compress->data, 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
- */
- if (compress->nonblocking)
- return total;
+ if ( (avail.avail < frag_size) && (avail.avail < size) ) {
+ /* Less than one fragment available and not at the
+ * end of the read, so poll
+ */
+ if (compress->nonblocking)
+ return total;
- ret = compress->ops->poll(compress->data, &fds, 1,
- compress->max_poll_wait_ms);
- if (fds.revents & POLLERR) {
- return oops(compress, EIO, "poll returned error!");
- }
- /* A pause will cause -EBADFD or zero.
- * This is not an error, just stop reading */
- if ((ret == 0) || (ret < 0 && errno == EBADFD))
- break;
- if (ret < 0)
- return oops(compress, errno, "poll error");
- if (fds.revents & POLLIN) {
- continue;
- }
+ ret = compress->ops->poll(compress->data, &fds, 1,
+ compress->max_poll_wait_ms);
+ 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 = compress->ops->read(compress->data, cbuf, to_read);
- if (num_read < 0) {
- /* If play was paused the read returns -EBADFD */
- if (errno == EBADFD)
- break;
- return oops(compress, errno, "read failed!");
+ /* A pause will cause -EBADFD or zero.
+ * This is not an error, just stop reading */
+ if ((ret == 0) || (ret < 0 && errno == EBADFD))
+ return 0;
+ if (ret < 0)
+ return oops(compress, errno, "poll error");
+ if (fds.revents & POLLIN) {
+ return 0;
}
-
- size -= num_read;
- cbuf += num_read;
- total += num_read;
+ }
+ /* read avail bytes */
+ if (size > avail.avail)
+ to_read = avail.avail;
+ else
+ to_read = size;
+ num_read = compress->ops->read(compress->data, cbuf, to_read);
+ if (num_read < 0) {
+ /* If play was paused the read returns -EBADFD */
+ if (errno == EBADFD)
+ return 0;
+ return oops(compress, errno, "read failed!");
}
- return total;
+ size -= num_read;
+ cbuf += num_read;
+ total += num_read;
+
+ return num_read;
}
int compress_start(struct compress *compress)
diff --git a/compress_plugin.c b/compress_plugin.c
index 0e536cc..22f8f11 100644
--- a/compress_plugin.c
+++ b/compress_plugin.c
@@ -43,6 +43,7 @@
#include <linux/ioctl.h>
#include <sound/asound.h>
#include "tinycompress/compress_plugin.h"
+#include "tinycompress/tinycompress.h"
#include "sound/compress_offload.h"
#include "compress_ops.h"
#include "snd_utils.h"
@@ -96,8 +97,11 @@ static int compress_plug_set_params(struct compress_plug_data *plug_data,
return -EINVAL;
rc = plugin->ops->set_params(plugin, params);
- if (!rc)
+ if (!rc) {
plugin->state = COMPRESS_PLUG_STATE_SETUP;
+ if (plug_data->flags & COMPRESS_OUT)
+ plugin->state = COMPRESS_PLUG_STATE_PREPARED;
+ }
return rc;
}
diff --git a/include/tinycompress/tinycompress.h b/include/tinycompress/tinycompress.h
index 97b305f..83c8f9e 100644
--- a/include/tinycompress/tinycompress.h
+++ b/include/tinycompress/tinycompress.h
@@ -53,6 +53,8 @@
#ifndef __TINYCOMPRESS_H
#define __TINYCOMPRESS_H
+#include <stdbool.h>
+
#if defined(__cplusplus)
extern "C" {
#endif