summaryrefslogtreecommitdiff
path: root/axfer/xfer-libasound-irq-rw.c
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2019-10-30 09:35:55 +0900
committerJaroslav Kysela <perex@perex.cz>2019-10-30 13:13:22 +0100
commit498ca99461b724f24a1d3d04b9f25294bb0a2c4e (patch)
treecfe0f68c700dfba7fc717f26d1599b9275c047f2 /axfer/xfer-libasound-irq-rw.c
parenta07eb8e235dd01f60bc8b2ea4be783e201e28311 (diff)
downloadalsa-utils-498ca99461b724f24a1d3d04b9f25294bb0a2c4e.tar.gz
axfer: code refactoring for a helper function to wait for avail buffer space
This commit applies code refactoring for waiting PCM event queued per period of PCM buffer in copying operation for IRQ-based scheduling model. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'axfer/xfer-libasound-irq-rw.c')
-rw-r--r--axfer/xfer-libasound-irq-rw.c54
1 files changed, 28 insertions, 26 deletions
diff --git a/axfer/xfer-libasound-irq-rw.c b/axfer/xfer-libasound-irq-rw.c
index cf4155f..184b85a 100644
--- a/axfer/xfer-libasound-irq-rw.c
+++ b/axfer/xfer-libasound-irq-rw.c
@@ -19,6 +19,32 @@ struct rw_closure {
struct frame_cache cache;
};
+static int wait_for_avail(struct libasound_state *state)
+{
+ unsigned short revents;
+ unsigned short event;
+ int err;
+
+ // Wait for hardware IRQ when no available space.
+ err = xfer_libasound_wait_event(state, -1, &revents);
+ if (err < 0)
+ return err;
+
+ // TODO: error reporting.
+ if (revents & POLLERR)
+ return -EIO;
+
+ if (snd_pcm_stream(state->handle) == SND_PCM_STREAM_CAPTURE)
+ event = POLLIN;
+ else
+ event = POLLOUT;
+
+ if (!(revents & event))
+ return -EAGAIN;
+
+ return 0;
+}
+
static int read_frames(struct libasound_state *state, unsigned int *frame_count,
unsigned int avail_count, struct mapper_context *mapper,
struct container_context *cntrs)
@@ -134,21 +160,9 @@ static int r_process_frames_nonblocking(struct libasound_state *state,
}
if (state->use_waiter) {
- unsigned short revents;
-
- // Wait for hardware IRQ when no available space.
- err = xfer_libasound_wait_event(state, -1, &revents);
+ err = wait_for_avail(state);
if (err < 0)
goto error;
- if (revents & POLLERR) {
- // TODO: error reporting.
- err = -EIO;
- goto error;
- }
- if (!(revents & POLLIN)) {
- err = -EAGAIN;
- goto error;
- }
}
// Check available space on the buffer.
@@ -300,21 +314,9 @@ static int w_process_frames_nonblocking(struct libasound_state *state,
int err;
if (state->use_waiter) {
- unsigned short revents;
-
- // Wait for hardware IRQ when no left space.
- err = xfer_libasound_wait_event(state, -1, &revents);
+ err = wait_for_avail(state);
if (err < 0)
goto error;
- if (revents & POLLERR) {
- // TODO: error reporting.
- err = -EIO;
- goto error;
- }
- if (!(revents & POLLOUT)) {
- err = -EAGAIN;
- goto error;
- }
}
// Check available space on the buffer.