From 43cb4675729275d6858a4a9cb6ad9070908c5292 Mon Sep 17 00:00:00 2001 From: Jonathan Wilkes <jon.w.wilkes@gmail.com> Date: Sun, 18 Jun 2017 17:07:56 -0400 Subject: [PATCH] port from Pd Vanilla: Fix bug in writesf~ (got tangled up when DSP started and stopped while spooling to disk) https://sourceforge.net/p/pure-data/bugs/1077/ commit 060a5d945c6fb70b4d82040665b53a4abc6beb5c --- pd/src/d_soundfile.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/pd/src/d_soundfile.c b/pd/src/d_soundfile.c index e7abcce67..2f699ba5a 100644 --- a/pd/src/d_soundfile.c +++ b/pd/src/d_soundfile.c @@ -2435,20 +2435,21 @@ static t_int *writesf_perform(t_int *w) bigendian = x->x_bigendian; if (x->x_state == STATE_STREAM) { - int wantbytes; + int wantbytes, roominfifo; pthread_mutex_lock(&x->x_mutex); wantbytes = sfchannels * vecsize * bytespersample; - while (x->x_fifotail > x->x_fifohead && - x->x_fifotail < x->x_fifohead + wantbytes + 1) + roominfifo = x->x_fifotail - x->x_fifohead; + if (roominfifo <= 0) + roominfifo += x->x_fifosize; + while (roominfifo < wantbytes + 1) { -#ifdef DEBUG_SOUNDFILE - pute("wait...\n"); -#endif + fprintf(stderr, "writesf waiting for disk write..\n"); sfread_cond_signal(&x->x_requestcondition); sfread_cond_wait(&x->x_answercondition, &x->x_mutex); -#ifdef DEBUG_SOUNDFILE - pute("done\n"); -#endif + fprintf(stderr, "... done waiting.\n"); + roominfifo = x->x_fifotail - x->x_fifohead; + if (roominfifo <= 0) + roominfifo += x->x_fifosize; } soundfile_xferout_sample(sfchannels, x->x_outvec, @@ -2553,10 +2554,8 @@ static void writesf_open(t_writesf *x, t_symbol *s, int argc, t_atom *argv) (x->x_bytespersample * x->x_sfchannels * MAXVECSIZE)); /* arrange for the "request" condition to be signalled 16 times per buffer */ - x->x_sigcountdown = x->x_sigperiod = - (x->x_fifosize / - (16 * x->x_bytespersample * x->x_sfchannels * - x->x_vecsize)); + x->x_sigcountdown = x->x_sigperiod = (x->x_fifosize / + (16 * x->x_bytespersample * x->x_sfchannels * x->x_vecsize)); sfread_cond_signal(&x->x_requestcondition); pthread_mutex_unlock(&x->x_mutex); } @@ -2566,9 +2565,8 @@ static void writesf_dsp(t_writesf *x, t_signal **sp) int i, ninlets = x->x_sfchannels; pthread_mutex_lock(&x->x_mutex); x->x_vecsize = sp[0]->s_n; - x->x_sigperiod = (x->x_fifosize / - (x->x_bytespersample * ninlets * x->x_vecsize)); + (16 * x->x_bytespersample * x->x_sfchannels * x->x_vecsize)); for (i = 0; i < ninlets; i++) x->x_outvec[i] = sp[i]->s_vec; x->x_insamplerate = sp[0]->s_sr; -- GitLab