From 6c033c60b6a1f13dec014a55cc27e660dd9af750 Mon Sep 17 00:00:00 2001 From: Steve Markgraf Date: Thu, 28 Nov 2024 22:15:06 +0100 Subject: [PATCH] hsdaoh_file: retry writing in case whole frame couldn't be written at once --- src/hsdaoh_file.c | 14 +++++++++++--- src/libhsdaoh.c | 3 ++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/hsdaoh_file.c b/src/hsdaoh_file.c index 6413f65..3aeac3e 100644 --- a/src/hsdaoh_file.c +++ b/src/hsdaoh_file.c @@ -79,6 +79,8 @@ static void sighandler(int signum) static void hsdaoh_callback(unsigned char *buf, uint32_t len, void *ctx) { + size_t nbytes = 0; + if (ctx) { if (do_exit) return; @@ -89,9 +91,15 @@ static void hsdaoh_callback(unsigned char *buf, uint32_t len, void *ctx) hsdaoh_stop_stream(dev); } - if (fwrite(buf, 1, len, (FILE*)ctx) != len) { - fprintf(stderr, "Short write, samples lost, exiting!\n"); - hsdaoh_stop_stream(dev); + while (nbytes < len) { + nbytes += fwrite(buf + nbytes, 1, len - nbytes, (FILE*)ctx); + + if (ferror((FILE*)ctx)) { + fprintf(stderr, "Error writing file, samples lost, exiting!\n"); + hsdaoh_stop_stream(dev); + break; + } + } if (bytes_to_read > 0) diff --git a/src/libhsdaoh.c b/src/libhsdaoh.c index a21f2a5..ea8dc7b 100644 --- a/src/libhsdaoh.c +++ b/src/libhsdaoh.c @@ -624,7 +624,8 @@ void hsdaoh_process_frame(hsdaoh_dev_t *dev, uint8_t *data, int size) payload_len &= 0x0fff; if (payload_len > dev->width-1) { - fprintf(stderr, "Invalid payload length: %d\n", payload_len); + if (dev->stream_synced) + fprintf(stderr, "Invalid payload length: %d\n", payload_len); /* discard frame */ return;