1 /*
2   ==============================================================================
3 
4    This file is part of the JUCE library.
5    Copyright (c) 2020 - Raw Material Software Limited
6 
7    JUCE is an open source library subject to commercial or open-source
8    licensing.
9 
10    The code included in this file is provided under the terms of the ISC license
11    http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12    To use, copy, modify, and/or distribute this software for any purpose with or
13    without fee is hereby granted provided that the above copyright notice and
14    this permission notice appear in all copies.
15 
16    JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17    EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18    DISCLAIMED.
19 
20   ==============================================================================
21 */
22 
23 namespace juce
24 {
25 
AudioIODeviceType(const String & name)26 AudioIODeviceType::AudioIODeviceType (const String& name)
27     : typeName (name)
28 {
29 }
30 
~AudioIODeviceType()31 AudioIODeviceType::~AudioIODeviceType()
32 {
33 }
34 
35 //==============================================================================
addListener(Listener * l)36 void AudioIODeviceType::addListener (Listener* l)      { listeners.add (l); }
removeListener(Listener * l)37 void AudioIODeviceType::removeListener (Listener* l)   { listeners.remove (l); }
38 
callDeviceChangeListeners()39 void AudioIODeviceType::callDeviceChangeListeners()
40 {
41     listeners.call ([] (Listener& l) { l.audioDeviceListChanged(); });
42 }
43 
44 //==============================================================================
45 #if JUCE_MAC
createAudioIODeviceType_CoreAudio()46  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_CoreAudio()  { return new CoreAudioClasses::CoreAudioIODeviceType(); }
47 #else
createAudioIODeviceType_CoreAudio()48  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_CoreAudio()  { return nullptr; }
49 #endif
50 
51 #if JUCE_IOS
createAudioIODeviceType_iOSAudio()52  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio()   { return new iOSAudioIODeviceType(); }
53 #else
createAudioIODeviceType_iOSAudio()54  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio()   { return nullptr; }
55 #endif
56 
57 #if JUCE_WINDOWS && JUCE_WASAPI
createAudioIODeviceType_WASAPI(WASAPIDeviceMode deviceMode)58  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (WASAPIDeviceMode deviceMode)
59  {
60      auto windowsVersion = SystemStats::getOperatingSystemType();
61 
62      if (windowsVersion < SystemStats::WinVista
63          || (WasapiClasses::isLowLatencyMode (deviceMode) && windowsVersion < SystemStats::Windows10))
64          return nullptr;
65 
66      return new WasapiClasses::WASAPIAudioIODeviceType (deviceMode);
67  }
68 
createAudioIODeviceType_WASAPI(bool exclusiveMode)69  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool exclusiveMode)
70  {
71      return createAudioIODeviceType_WASAPI (exclusiveMode ? WASAPIDeviceMode::exclusive
72                                                           : WASAPIDeviceMode::shared);
73  }
74 #else
createAudioIODeviceType_WASAPI(WASAPIDeviceMode)75  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (WASAPIDeviceMode)  { return nullptr; }
createAudioIODeviceType_WASAPI(bool)76  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool)              { return nullptr; }
77 #endif
78 
79 #if JUCE_WINDOWS && JUCE_DIRECTSOUND
createAudioIODeviceType_DirectSound()80  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_DirectSound()  { return new DSoundAudioIODeviceType(); }
81 #else
createAudioIODeviceType_DirectSound()82  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_DirectSound()  { return nullptr; }
83 #endif
84 
85 #if JUCE_WINDOWS && JUCE_ASIO
createAudioIODeviceType_ASIO()86  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ASIO()         { return new ASIOAudioIODeviceType(); }
87 #else
createAudioIODeviceType_ASIO()88  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ASIO()         { return nullptr; }
89 #endif
90 
91 #if JUCE_LINUX && JUCE_ALSA
createAudioIODeviceType_ALSA()92  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ALSA()         { return createAudioIODeviceType_ALSA_PCMDevices(); }
93 #else
createAudioIODeviceType_ALSA()94  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ALSA()         { return nullptr; }
95 #endif
96 
97 #if JUCE_LINUX && JUCE_JACK
createAudioIODeviceType_JACK()98  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_JACK()         { return new JackAudioIODeviceType(); }
99 #else
createAudioIODeviceType_JACK()100  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_JACK()         { return nullptr; }
101 #endif
102 
103 #if JUCE_LINUX && JUCE_BELA
createAudioIODeviceType_Bela()104  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Bela()         { return new BelaAudioIODeviceType(); }
105 #else
createAudioIODeviceType_Bela()106  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Bela()         { return nullptr; }
107 #endif
108 
109 #if JUCE_ANDROID
createAudioIODeviceType_Android()110  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Android()
111  {
112     #if JUCE_USE_ANDROID_OBOE
113      if (isOboeAvailable())
114          return nullptr;
115     #endif
116 
117     #if JUCE_USE_ANDROID_OPENSLES
118      if (isOpenSLAvailable())
119          return nullptr;
120     #endif
121 
122      return new AndroidAudioIODeviceType();
123  }
124 #else
createAudioIODeviceType_Android()125  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Android()   { return nullptr; }
126 #endif
127 
128 #if JUCE_ANDROID && JUCE_USE_ANDROID_OPENSLES
createAudioIODeviceType_OpenSLES()129  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_OpenSLES()
130  {
131      return isOpenSLAvailable() ? new OpenSLAudioDeviceType() : nullptr;
132  }
133 #else
createAudioIODeviceType_OpenSLES()134  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_OpenSLES()  { return nullptr; }
135 #endif
136 
137 #if JUCE_ANDROID && JUCE_USE_ANDROID_OBOE
createAudioIODeviceType_Oboe()138  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Oboe()
139  {
140      return isOboeAvailable() ? new OboeAudioIODeviceType() : nullptr;
141  }
142 #else
createAudioIODeviceType_Oboe()143  AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Oboe()      { return nullptr; }
144 #endif
145 
146 } // namespace juce
147