@@ -50,7 +50,7 @@ AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio() | |||||
#endif | #endif | ||||
#if ! (JUCE_WINDOWS && JUCE_WASAPI) | #if ! (JUCE_WINDOWS && JUCE_WASAPI) | ||||
AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI() { return nullptr; } | |||||
AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool) { return nullptr; } | |||||
#endif | #endif | ||||
#if ! (JUCE_WINDOWS && JUCE_DIRECTSOUND) | #if ! (JUCE_WINDOWS && JUCE_DIRECTSOUND) | ||||
@@ -151,7 +151,7 @@ public: | |||||
/** Creates an iOS device type if it's available on this platform, or returns null. */ | /** Creates an iOS device type if it's available on this platform, or returns null. */ | ||||
static AudioIODeviceType* createAudioIODeviceType_iOSAudio(); | static AudioIODeviceType* createAudioIODeviceType_iOSAudio(); | ||||
/** Creates a WASAPI device type if it's available on this platform, or returns null. */ | /** Creates a WASAPI device type if it's available on this platform, or returns null. */ | ||||
static AudioIODeviceType* createAudioIODeviceType_WASAPI(); | |||||
static AudioIODeviceType* createAudioIODeviceType_WASAPI (bool exclusiveMode); | |||||
/** Creates a DirectSound device type if it's available on this platform, or returns null. */ | /** Creates a DirectSound device type if it's available on this platform, or returns null. */ | ||||
static AudioIODeviceType* createAudioIODeviceType_DirectSound(); | static AudioIODeviceType* createAudioIODeviceType_DirectSound(); | ||||
/** Creates an ASIO device type if it's available on this platform, or returns null. */ | /** Creates an ASIO device type if it's available on this platform, or returns null. */ | ||||
@@ -43,12 +43,21 @@ | |||||
#endif | #endif | ||||
/** Config: JUCE_WASAPI | /** Config: JUCE_WASAPI | ||||
Enables WASAPI audio devices (Windows Vista and above). | |||||
Enables WASAPI audio devices (Windows Vista and above). See also the | |||||
JUCE_WASAPI_EXCLUSIVE flag. | |||||
*/ | */ | ||||
#ifndef JUCE_WASAPI | #ifndef JUCE_WASAPI | ||||
#define JUCE_WASAPI 1 | #define JUCE_WASAPI 1 | ||||
#endif | #endif | ||||
/** Config: JUCE_WASAPI_EXCLUSIVE | |||||
Enables WASAPI audio devices in exclusive mode (Windows Vista and above). | |||||
*/ | |||||
#ifndef JUCE_WASAPI_EXCLUSIVE | |||||
#define JUCE_WASAPI_EXCLUSIVE 0 | |||||
#endif | |||||
/** Config: JUCE_DIRECTSOUND | /** Config: JUCE_DIRECTSOUND | ||||
Enables DirectSound audio (MS Windows only). | Enables DirectSound audio (MS Windows only). | ||||
*/ | */ | ||||
@@ -1409,6 +1409,7 @@ private: | |||||
if (currentASIODev[0] == this) ASIOCallbackFunctions<0>::setCallbacks (callbacks); | if (currentASIODev[0] == this) ASIOCallbackFunctions<0>::setCallbacks (callbacks); | ||||
else if (currentASIODev[1] == this) ASIOCallbackFunctions<1>::setCallbacks (callbacks); | else if (currentASIODev[1] == this) ASIOCallbackFunctions<1>::setCallbacks (callbacks); | ||||
else if (currentASIODev[2] == this) ASIOCallbackFunctions<2>::setCallbacks (callbacks); | else if (currentASIODev[2] == this) ASIOCallbackFunctions<2>::setCallbacks (callbacks); | ||||
else if (currentASIODev[3] == this) ASIOCallbackFunctions<3>::setCallbacks (callbacks); | |||||
else jassertfalse; | else jassertfalse; | ||||
} | } | ||||
@@ -1208,9 +1208,10 @@ class WASAPIAudioIODeviceType : public AudioIODeviceType, | |||||
private DeviceChangeDetector | private DeviceChangeDetector | ||||
{ | { | ||||
public: | public: | ||||
WASAPIAudioIODeviceType() | |||||
: AudioIODeviceType ("Windows Audio"), | |||||
WASAPIAudioIODeviceType (bool exclusive) | |||||
: AudioIODeviceType (exclusive ? "Windows Audio (Exclusive Mode)" : "Windows Audio"), | |||||
DeviceChangeDetector (L"Windows Audio"), | DeviceChangeDetector (L"Windows Audio"), | ||||
exclusiveMode (exclusive), | |||||
hasScanned (false) | hasScanned (false) | ||||
{ | { | ||||
} | } | ||||
@@ -1267,7 +1268,6 @@ public: | |||||
{ | { | ||||
jassert (hasScanned); // need to call scanForDevices() before doing this | jassert (hasScanned); // need to call scanForDevices() before doing this | ||||
const bool useExclusiveMode = false; | |||||
ScopedPointer<WASAPIAudioIODevice> device; | ScopedPointer<WASAPIAudioIODevice> device; | ||||
const int outputIndex = outputDeviceNames.indexOf (outputDeviceName); | const int outputIndex = outputDeviceNames.indexOf (outputDeviceName); | ||||
@@ -1279,7 +1279,7 @@ public: | |||||
: inputDeviceName, | : inputDeviceName, | ||||
outputDeviceIds [outputIndex], | outputDeviceIds [outputIndex], | ||||
inputDeviceIds [inputIndex], | inputDeviceIds [inputIndex], | ||||
useExclusiveMode); | |||||
exclusiveMode); | |||||
if (! device->initialise()) | if (! device->initialise()) | ||||
device = nullptr; | device = nullptr; | ||||
@@ -1293,7 +1293,7 @@ public: | |||||
StringArray inputDeviceNames, inputDeviceIds; | StringArray inputDeviceNames, inputDeviceIds; | ||||
private: | private: | ||||
bool hasScanned; | |||||
bool exclusiveMode, hasScanned; | |||||
ComSmartPtr<IMMDeviceEnumerator> enumerator; | ComSmartPtr<IMMDeviceEnumerator> enumerator; | ||||
//============================================================================== | //============================================================================== | ||||
@@ -1493,12 +1493,16 @@ struct MMDeviceMasterVolume | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI() | |||||
AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool exclusiveMode) | |||||
{ | { | ||||
if (SystemStats::getOperatingSystemType() >= SystemStats::WinVista) | |||||
return new WasapiClasses::WASAPIAudioIODeviceType(); | |||||
#if ! JUCE_WASAPI_EXCLUSIVE | |||||
if (exclusiveMode) | |||||
return nullptr; | |||||
#endif | |||||
return nullptr; | |||||
return SystemStats::getOperatingSystemType() >= SystemStats::WinVista | |||||
? new WasapiClasses::WASAPIAudioIODeviceType (exclusiveMode) | |||||
: nullptr; | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||