summaryrefslogtreecommitdiff
path: root/src/buffer
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer')
-rw-r--r--src/buffer/common.h3
-rw-r--r--src/buffer/common_internal.h4
-rw-r--r--src/buffer/video.c5
3 files changed, 10 insertions, 2 deletions
diff --git a/src/buffer/common.h b/src/buffer/common.h
index 64168ff..24964ba 100644
--- a/src/buffer/common.h
+++ b/src/buffer/common.h
@@ -5,5 +5,6 @@ enum {
CAMU_BUFFER_CORK,
CAMU_BUFFER_UNCORK,
CAMU_BUFFER_PAUSED,
- CAMU_BUFFER_EOF
+ CAMU_BUFFER_EOF,
+ CAMU_BUFFER_ERRORED
};
diff --git a/src/buffer/common_internal.h b/src/buffer/common_internal.h
index 0dc1e5f..e4cdd33 100644
--- a/src/buffer/common_internal.h
+++ b/src/buffer/common_internal.h
@@ -6,5 +6,7 @@ enum {
// Got request to flush.
FLUSHED,
// Realized flush.
- SIGNALED
+ SIGNALED,
+ // Errored.
+ ERRORED
};
diff --git a/src/buffer/video.c b/src/buffer/video.c
index 2879082..94c452d 100644
--- a/src/buffer/video.c
+++ b/src/buffer/video.c
@@ -237,6 +237,11 @@ bool camu_video_buffer_read(struct camu_video_buffer *buf, void *out)
}
u8 ret = buf->queue->read(buf->queue, base, out);
u8 flow = al_atomic_load(u8)(&buf->flow, AL_ATOMIC_ACQUIRE);
+ if (ret == CAMU_QUEUE_ERR) {
+ buf->callback(buf->userdata, CAMU_BUFFER_ERRORED);
+ al_atomic_store(u8)(&buf->flow, ERRORED, AL_ATOMIC_RELEASE);
+ return false;
+ }
if (flow == FLUSHED && (ret == CAMU_QUEUE_EOF || (buf->single_frame && ret == CAMU_QUEUE_OK))) {
buf->callback(buf->userdata, CAMU_BUFFER_EOF);
al_atomic_store(u8)(&buf->flow, SIGNALED, AL_ATOMIC_RELEASE);