From 58015f7b17d98869bf59a8ec645e8a538e652d06 Mon Sep 17 00:00:00 2001 From: rossb Date: Thu, 18 Aug 2011 03:31:51 +0000 Subject: [PATCH] changed default host API logic to use first successfully initialized host api with a defined default input or output device. resolves ticket #49 --- src/common/pa_front.c | 18 +++++++++++++++++- src/common/pa_hostapi.h | 19 +++++++++---------- src/os/unix/pa_unix_hostapis.c | 2 -- src/os/win/pa_win_hostapis.c | 2 -- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/common/pa_front.c b/src/common/pa_front.c index 8dfa27d..6817727 100644 --- a/src/common/pa_front.c +++ b/src/common/pa_front.c @@ -116,6 +116,7 @@ void PaUtil_SetLastHostErrorInfo( PaHostApiTypeId hostApiType, long errorCode, static PaUtilHostApiRepresentation **hostApis_ = 0; static int hostApisCount_ = 0; +static int defaultHostApiIndex_ = 0; static int initializationCount_ = 0; static int deviceCount_ = 0; @@ -172,6 +173,7 @@ static PaError InitializeHostApis( void ) } hostApisCount_ = 0; + defaultHostApiIndex_ = -1; /* indicates that we haven't determined the default host API yet */ deviceCount_ = 0; baseDeviceIndex = 0; @@ -193,6 +195,16 @@ static PaError InitializeHostApis( void ) assert( hostApi->info.defaultInputDevice < hostApi->info.deviceCount ); assert( hostApi->info.defaultOutputDevice < hostApi->info.deviceCount ); + /* the first successfully initialized host API with at least one input *or* + output device is used as the default host API. + */ + if( (defaultHostApiIndex_ == -1) && + ( hostApi->info.defaultInputDevice != paNoDevice + || hostApi->info.defaultOutputDevice != paNoDevice ) ) + { + defaultHostApiIndex_ = hostApisCount_; + } + hostApi->privatePaFrontInfo.baseDeviceIndex = baseDeviceIndex; if( hostApi->info.defaultInputDevice != paNoDevice ) @@ -208,6 +220,10 @@ static PaError InitializeHostApis( void ) } } + /* if no host APIs have devices, the default host API is the first initialized host API */ + if( defaultHostApiIndex_ == -1 ) + defaultHostApiIndex_ = 0; + return result; error: @@ -525,7 +541,7 @@ PaHostApiIndex Pa_GetDefaultHostApi( void ) } else { - result = paDefaultHostApiIndex; + result = defaultHostApiIndex_; /* internal consistency check: make sure that the default host api index is within range */ diff --git a/src/common/pa_hostapi.h b/src/common/pa_hostapi.h index dda0f27..cfbd521 100644 --- a/src/common/pa_hostapi.h +++ b/src/common/pa_hostapi.h @@ -294,22 +294,21 @@ typedef PaError PaUtilHostApiInitializer( PaUtilHostApiRepresentation**, PaHostA /** paHostApiInitializers is a NULL-terminated array of host API initialization functions. These functions are called by pa_front.c to initialize the host APIs - when the client calls Pa_Initialize(). + when the client calls Pa_Initialize(). + + The initialization functions are invoked in order. + + The first successfully initialized host API that has a default input *or* output + device is used as the default PortAudio host API. This is based on the logic that + there is only one default host API, and it must contain the default input and output + devices (if defined). - There is a platform specific file which defines paHostApiInitializers for that + There is a platform specific file that defines paHostApiInitializers for that platform, pa_win/pa_win_hostapis.c contains the Win32 definitions for example. */ extern PaUtilHostApiInitializer *paHostApiInitializers[]; -/** The index of the default host API in the paHostApiInitializers array. - - There is a platform specific file which defines paDefaultHostApiIndex for that - platform, see pa_win/pa_win_hostapis.c for example. -*/ -extern int paDefaultHostApiIndex; - - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/src/os/unix/pa_unix_hostapis.c b/src/os/unix/pa_unix_hostapis.c index 2bafaa2..ef56e81 100644 --- a/src/os/unix/pa_unix_hostapis.c +++ b/src/os/unix/pa_unix_hostapis.c @@ -101,5 +101,3 @@ PaUtilHostApiInitializer *paHostApiInitializers[] = 0 /* NULL terminated array */ }; - -int paDefaultHostApiIndex = 0; diff --git a/src/os/win/pa_win_hostapis.c b/src/os/win/pa_win_hostapis.c index 26fc559..9c9927a 100644 --- a/src/os/win/pa_win_hostapis.c +++ b/src/os/win/pa_win_hostapis.c @@ -100,5 +100,3 @@ PaUtilHostApiInitializer *paHostApiInitializers[] = }; -int paDefaultHostApiIndex = 0; - -- 2.43.0