From 3a6eb0068a25644c14b1b628d0c73f56faf6f49c Mon Sep 17 00:00:00 2001 From: Johannes Kroll Date: Sat, 19 Aug 2017 04:38:45 +0200 Subject: [PATCH 1/3] clamp samples to prevent corrupt FLAC files --- src/threads.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/threads.c b/src/threads.c index 9133aa8..2bccff4 100644 --- a/src/threads.c +++ b/src/threads.c @@ -128,6 +128,16 @@ int process(jack_nframes_t nframes, void *arg) return 0; } +float clamp_sample(float sample) +{ + // some audio formats (FLAC) will generate faulty files if data out of range, so clamp the sample + if(sample < -0.999) + sample = -0.999; + else if(sample > 0.999) + sample = 0.999; + return sample; +} + int writer_thread(void *d) { unsigned int i, j, k, opos; @@ -191,7 +201,7 @@ int writer_thread(void *d) for (j = 0; j < BUF_SIZE && i < pre_size; i++, j++) { for (k = 0; k < num_ports; k++) { buf[j * num_ports + k] = - pre_buffer[k][(i + pre_pos) % pre_size]; + clamp_sample( pre_buffer[k][(i + pre_pos) % pre_size] ); } } sf_writef_float(out, buf, j); @@ -213,7 +223,7 @@ int writer_thread(void *d) for (i = disk_read_pos; i != disk_write_pos && opos < BUF_SIZE; i = (i + 1) & (DISK_SIZE - 1), opos++) { for (j = 0; j < num_ports; j++) { - buf[opos * num_ports + j] = disk_buffer[j][i]; + buf[opos * num_ports + j] = clamp_sample(disk_buffer[j][i]); } } sf_writef_float(out, buf, opos); From d677d0e4a65336776c277eeca08840efe92449eb Mon Sep 17 00:00:00 2001 From: Johannes Kroll Date: Tue, 22 Aug 2017 12:03:56 +0200 Subject: [PATCH 2/3] Revert "clamp samples to prevent corrupt FLAC files" This reverts commit 3a6eb0068a25644c14b1b628d0c73f56faf6f49c. --- src/threads.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/threads.c b/src/threads.c index 2bccff4..9133aa8 100644 --- a/src/threads.c +++ b/src/threads.c @@ -128,16 +128,6 @@ int process(jack_nframes_t nframes, void *arg) return 0; } -float clamp_sample(float sample) -{ - // some audio formats (FLAC) will generate faulty files if data out of range, so clamp the sample - if(sample < -0.999) - sample = -0.999; - else if(sample > 0.999) - sample = 0.999; - return sample; -} - int writer_thread(void *d) { unsigned int i, j, k, opos; @@ -201,7 +191,7 @@ int writer_thread(void *d) for (j = 0; j < BUF_SIZE && i < pre_size; i++, j++) { for (k = 0; k < num_ports; k++) { buf[j * num_ports + k] = - clamp_sample( pre_buffer[k][(i + pre_pos) % pre_size] ); + pre_buffer[k][(i + pre_pos) % pre_size]; } } sf_writef_float(out, buf, j); @@ -223,7 +213,7 @@ int writer_thread(void *d) for (i = disk_read_pos; i != disk_write_pos && opos < BUF_SIZE; i = (i + 1) & (DISK_SIZE - 1), opos++) { for (j = 0; j < num_ports; j++) { - buf[opos * num_ports + j] = clamp_sample(disk_buffer[j][i]); + buf[opos * num_ports + j] = disk_buffer[j][i]; } } sf_writef_float(out, buf, opos); From e4b4fc831a065d42f817e85b9fa8efcd17abd075 Mon Sep 17 00:00:00 2001 From: Johannes Kroll Date: Fri, 8 Sep 2017 19:08:58 +0200 Subject: [PATCH 3/3] Turn on libsndfile clipping for integer formats --- src/threads.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/threads.c b/src/threads.c index 9133aa8..2570b42 100644 --- a/src/threads.c +++ b/src/threads.c @@ -181,6 +181,9 @@ int writer_thread(void *d) goto again; } + /* Turn on automatic clipping for integer formats */ + sf_command(out, SFC_SET_CLIPPING, NULL, SF_TRUE); + printf("opened '%s'\n", filename); printf("writing buffer...\n"); free(filename);