From f8fcfe9c9a48a277407e534a3b5d3cf152ac1b9e Mon Sep 17 00:00:00 2001 From: Sven Neumann Date: Thu, 7 Oct 2021 08:18:00 +0200 Subject: [PATCH] wav: seek back to end of file after rewriting the header This fixes behavior for output streams created with sox_open_memstream_write(). Without seeking back the buffer would be truncated to just the header. --- src/wav.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/wav.c b/src/wav.c index 3f6beb45..c31ab9f8 100644 --- a/src/wav.c +++ b/src/wav.c @@ -1570,13 +1570,25 @@ static int stopwrite(sox_format_t * ft) if (!ft->seekable) return SOX_EOF; + off_t end = lsx_tell(ft); if (lsx_seeki(ft, (off_t)0, SEEK_SET) != 0) { - lsx_fail_errno(ft,SOX_EOF,"Can't rewind output file to rewrite .wav header."); - return SOX_EOF; + lsx_fail_errno(ft, SOX_EOF, "Can't rewind output file to rewrite .wav header."); + return SOX_EOF; + } + + int result = wavwritehdr(ft, 1); + if (result != SOX_SUCCESS) + return result; + + /* Seek back to end of stream as a dynamic memory streams would truncate otherwise. */ + if (lsx_seeki(ft, end, SEEK_SET) != 0) + { + lsx_fail_errno(ft, SOX_EOF, "Can't seek to end of output file after rewriting .wav header."); + return SOX_EOF; } - return (wavwritehdr(ft, 1)); + return SOX_SUCCESS; } /* -- 2.25.1