Browse Source

More robust code in JackPortAudioDriver to handle buffer size change and backend switching.

tags/v1.9.10
Stephane Letz 12 years ago
parent
commit
36c386b5bf
2 changed files with 23 additions and 10 deletions
  1. +21
    -6
      windows/portaudio/JackPortAudioDriver.cpp
  2. +2
    -4
      windows/portaudio/JackPortAudioDriver.h

+ 21
- 6
windows/portaudio/JackPortAudioDriver.cpp View File

@@ -164,6 +164,10 @@ int JackPortAudioDriver::Open(jack_nframes_t buffer_size,
int in_max = 0; int in_max = 0;
int out_max = 0; int out_max = 0;
PaError err = paNoError; PaError err = paNoError;
if (!fPaDevices) {
fPaDevices = new PortAudioDevices();
}


fCaptureLatency = capture_latency; fCaptureLatency = capture_latency;
fPlaybackLatency = playback_latency; fPlaybackLatency = playback_latency;
@@ -251,8 +255,11 @@ int JackPortAudioDriver::Close()
{ {
// Generic audio driver close // Generic audio driver close
jack_log("JackPortAudioDriver::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() int JackPortAudioDriver::Attach()
@@ -312,19 +319,27 @@ int JackPortAudioDriver::SetBufferSize(jack_nframes_t buffer_size)
{ {
PaError err; PaError err;


if ((err = Pa_CloseStream(fStream)) != paNoError) {
if (fStream && (err = Pa_CloseStream(fStream)) != paNoError) {
jack_error("Pa_CloseStream error = %s", Pa_GetErrorText(err)); 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); err = OpenStream(buffer_size);
if (err != paNoError) { if (err != paNoError) {
jack_error("Pa_OpenStream error %d = %s", err, Pa_GetErrorText(err)); jack_error("Pa_OpenStream error %d = %s", err, Pa_GetErrorText(err));
return -1;
goto error;
} else { } else {
JackAudioDriver::SetBufferSize(buffer_size); // Generic change, never fails JackAudioDriver::SetBufferSize(buffer_size); // Generic change, never fails
return 0; return 0;
} }
error:
fStream = NULL;
return -1;
} }


} // end of namespace } // end of namespace


+ 2
- 4
windows/portaudio/JackPortAudioDriver.h View File

@@ -56,10 +56,8 @@ class JackPortAudioDriver : public JackMMCSS, public JackAudioDriver


JackPortAudioDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table, PortAudioDevices* pa_devices) 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), : 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() virtual ~JackPortAudioDriver()
{ {


Loading…
Cancel
Save