diff --git a/windows/portaudio/JackPortAudioDriver.cpp b/windows/portaudio/JackPortAudioDriver.cpp index 276a5609..f0f5b58a 100644 --- a/windows/portaudio/JackPortAudioDriver.cpp +++ b/windows/portaudio/JackPortAudioDriver.cpp @@ -164,6 +164,10 @@ int JackPortAudioDriver::Open(jack_nframes_t buffer_size, int in_max = 0; int out_max = 0; PaError err = paNoError; + + if (!fPaDevices) { + fPaDevices = new PortAudioDevices(); + } fCaptureLatency = capture_latency; fPlaybackLatency = playback_latency; @@ -251,8 +255,11 @@ int JackPortAudioDriver::Close() { // Generic audio driver close jack_log("JackPortAudioDriver::Close"); - int res = JackAudioDriver::Close(); - return (Pa_CloseStream(fStream) != paNoError) ? -1 : res; + JackAudioDriver::Close(); + PaError err = Pa_CloseStream(fStream); + delete fPaDevices; + fPaDevices = NULL; + return (err != paNoError) ? -1 : 0; } int JackPortAudioDriver::Attach() @@ -312,19 +319,27 @@ int JackPortAudioDriver::SetBufferSize(jack_nframes_t buffer_size) { PaError err; - if ((err = Pa_CloseStream(fStream)) != paNoError) { + if (fStream && (err = Pa_CloseStream(fStream)) != paNoError) { jack_error("Pa_CloseStream error = %s", Pa_GetErrorText(err)); - return -1; + goto error; } - + + // It seems that some ASIO drivers (like ASIO4All needs this to restart correctly); + delete fPaDevices; + fPaDevices = new PortAudioDevices(); + err = OpenStream(buffer_size); if (err != paNoError) { jack_error("Pa_OpenStream error %d = %s", err, Pa_GetErrorText(err)); - return -1; + goto error; } else { JackAudioDriver::SetBufferSize(buffer_size); // Generic change, never fails return 0; } + +error: + fStream = NULL; + return -1; } } // end of namespace diff --git a/windows/portaudio/JackPortAudioDriver.h b/windows/portaudio/JackPortAudioDriver.h index ca745a4e..0ba02ff6 100644 --- a/windows/portaudio/JackPortAudioDriver.h +++ b/windows/portaudio/JackPortAudioDriver.h @@ -56,10 +56,8 @@ class JackPortAudioDriver : public JackMMCSS, public JackAudioDriver JackPortAudioDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table, PortAudioDevices* pa_devices) : JackMMCSS(), JackAudioDriver(name, alias, engine, table), fStream(NULL), fInputBuffer(NULL), fOutputBuffer(NULL), - fInputDevice(paNoDevice), fOutputDevice(paNoDevice) - { - fPaDevices = pa_devices; - } + fInputDevice(paNoDevice), fOutputDevice(paNoDevice), fPaDevices(pa_devices); + {} virtual ~JackPortAudioDriver() {