diff --git a/src/m_sched.c b/src/m_sched.c index a719574206c510b158a900a5659779f78845220a..76f24a78a42b099c9a4a0606e433228970abc0bb 100644 --- a/src/m_sched.c +++ b/src/m_sched.c @@ -30,7 +30,7 @@ int sys_sleepgrain; void sched_reopenmeplease(void) /* request from s_audio for deferred reopen */ { - sys_quit = SYS_QUIT_RESTART; + sys_quit = SYS_QUIT_RESTART; } typedef void (*t_clockmethod)(void *client); @@ -537,7 +537,7 @@ void sched_audio_callbackfn(void) static void m_callbackscheduler(void) { sys_initmidiqueue(); - while (1) + while (!sys_quit) { #ifdef MSW Sleep(1000); diff --git a/src/s_audio.c b/src/s_audio.c index 626c9f58d9157f4a64b20140faf5c8ea6089825a..b3a744fc16733f773d12c113ffb001b9ea6039c4 100644 --- a/src/s_audio.c +++ b/src/s_audio.c @@ -67,6 +67,8 @@ static int audio_rate; static int audio_advance; static int audio_callback; +static int audio_callback_is_open; /* reflects true actual state */ +static int audio_nextinchans, audio_nextoutchans; void sched_audio_callbackfn(void); void sched_reopenmeplease(void); @@ -194,9 +196,6 @@ void sys_set_audio_settings(int naudioindev, int *audioindev, int nchindev, { return; } - /* if we're already open close it */ - if (sys_inchannels || sys_outchannels) - sys_close_audio(); if (rate < 1) rate = DEFAULTSRATE; @@ -325,10 +324,11 @@ void sys_set_audio_settings(int naudioindev, int *audioindev, int nchindev, nrealoutdev++; } sys_schedadvance = advance * 1000; - sys_setchsr(inchans, outchans, rate); sys_log_error(ERR_NOTHING); + audio_nextinchans = inchans; + audio_nextoutchans = outchans; sys_save_audio_params(nrealindev, realindev, realinchans, - nrealoutdev, realoutdev, realoutchans, sys_dacsr, advance, callback); + nrealoutdev, realoutdev, realoutchans, rate, advance, callback); } void sys_close_audio(void) @@ -369,6 +369,7 @@ void sys_close_audio(void) sys_audioapiopened = -1; sched_set_using_audio(SCHED_AUDIO_NONE); audio_state = 0; + audio_callback_is_open = 0; } /* open audio using whatever parameters were last used */ @@ -379,6 +380,7 @@ void sys_reopen_audio( void) int rate, advance, callback, outcome = 0; sys_get_audio_params(&naudioindev, audioindev, chindev, &naudiooutdev, audiooutdev, choutdev, &rate, &advance, &callback); + sys_setchsr(audio_nextinchans, audio_nextoutchans, rate); if (!naudioindev && !naudiooutdev) { sched_set_using_audio(SCHED_AUDIO_NONE); @@ -430,14 +432,16 @@ void sys_reopen_audio( void) audio_state = 0; sched_set_using_audio(SCHED_AUDIO_NONE); sys_audioapiopened = -1; + audio_callback_is_open = 0; } else { - /* fprintf(stderr, "started w/callback %d\n", callback); */ + /* fprintf(stderr, "started w/callback %d\n", callback); */ audio_state = 1; sched_set_using_audio( (callback ? SCHED_AUDIO_CALLBACK : SCHED_AUDIO_POLL)); sys_audioapiopened = sys_audioapi; + audio_callback_is_open = callback; } sys_vgui("set pd_whichapi %d\n", (outcome == 0 ? sys_audioapi : 0)); } @@ -690,6 +694,7 @@ void glob_audio_properties(t_pd *dummy, t_floatarg flongform) gfxstub_new(&glob_pdobject, (void *)glob_audio_properties, buf); } +extern int pa_foo; /* new values from dialog window */ void glob_audio_dialog(t_pd *dummy, t_symbol *s, int argc, t_atom *argv) { @@ -703,7 +708,6 @@ void glob_audio_dialog(t_pd *dummy, t_symbol *s, int argc, t_atom *argv) int newrate = atom_getintarg(16, argc, argv); int newadvance = atom_getintarg(17, argc, argv); int newcallback = atom_getintarg(18, argc, argv); - int statewas; for (i = 0; i < 4; i++) { @@ -738,12 +742,12 @@ void glob_audio_dialog(t_pd *dummy, t_symbol *s, int argc, t_atom *argv) if (newcallback < 0) newcallback = 0; - if (!audio_callback && !newcallback) + if (!audio_callback_is_open && !newcallback) sys_close_audio(); sys_set_audio_settings(nindev, newaudioindev, nindev, newaudioinchan, noutdev, newaudiooutdev, noutdev, newaudiooutchan, newrate, newadvance, (newcallback >= 0 ? newcallback : 0)); - if (!audio_callback && !newcallback) + if (!audio_callback_is_open && !newcallback) sys_reopen_audio(); else sched_reopenmeplease(); } diff --git a/src/s_audio_pa.c b/src/s_audio_pa.c index 65afc247a3992d1c2b78d1683f7e9d564ac0c7ef..52bb6ce49b20fbb6a4ad5c1dd5a106f28144de22 100644 --- a/src/s_audio_pa.c +++ b/src/s_audio_pa.c @@ -28,6 +28,8 @@ static t_audiocallback pa_callback; #define MAX_PA_CHANS 32 #define MAX_SAMPLES_PER_FRAME MAX_PA_CHANS * DEFDACBLKSIZE +int pa_foo; + static int pa_lowlevel_callback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *outTime, PaStreamCallbackFlags myflags, @@ -36,6 +38,8 @@ static int pa_lowlevel_callback(const void *inputBuffer, int i; unsigned int j; float *fbuf, *fp2, *fp3, *soundiop; + if (pa_foo) + fprintf(stderr, "pa_lowlevel_callback\n"); if (framesPerBuffer != DEFDACBLKSIZE) { fprintf(stderr, "ignoring buffer size %d\n", (int)framesPerBuffer); @@ -62,6 +66,8 @@ static int pa_lowlevel_callback(const void *inputBuffer, for (j = 0, fp3 = fp2; j < framesPerBuffer; j++, fp3 += pa_outchans) *fp3 = *soundiop++; } + if (pa_foo) + fprintf(stderr, "done pa_lowlevel_callback\n"); return 0; } @@ -154,8 +160,7 @@ int pa_open_audio(int inchans, int outchans, int rate, t_sample *soundin, int j, devno, pa_indev = 0, pa_outdev = 0; pa_callback = callbackfn; - if (callbackfn) - fprintf(stderr, "callback enabled\n"); + /* fprintf(stderr, "open callback %d\n", (callbackfn != 0)); */ if (!initialized) { /* Initialize PortAudio */ @@ -255,6 +260,7 @@ int pa_open_audio(int inchans, int outchans, int rate, t_sample *soundin, void pa_close_audio( void) { + /* fprintf(stderr, "close\n"); */ if (pa_inchans || pa_outchans) CloseAudioStream( pa_stream ); pa_inchans = pa_outchans = 0;