diff --git a/pd/src/d_soundfile.c b/pd/src/d_soundfile.c index e7abcce6732bf65e9ccd39df6416b94b2926304f..2f699ba5a2f74f676dfa21a0bcb70a0b97772352 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;