Skip to content

Commit

Permalink
test app: Disable WASAPI devices
Browse files Browse the repository at this point in the history
Since the test app is built as a MinGW console app, it won't detect any
Windows audio devices. But it will still try, and JUCE normally makes
them the default device type. To avoid this, we subclass the
AudioDeviceManager class and override its createAudioDeviceTypes method.
  • Loading branch information
ferdnyc committed Aug 22, 2021
1 parent b576924 commit f6dc4ae
Showing 1 changed file with 46 additions and 14 deletions.
60 changes: 46 additions & 14 deletions src/Main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,38 @@
#endif
#include "OpenShotAudio.h"

// Subclass the AudioDeviceManager so we can skip WASAPI devices on Windows
class TestAudioDeviceManager : public juce::AudioDeviceManager {
public:
static void addIfNotNull (
juce::OwnedArray<juce::AudioIODeviceType>& list,
juce::AudioIODeviceType* const device)
{
if (device != nullptr)
list.add (device);
}

void createAudioDeviceTypes (juce::OwnedArray<juce::AudioIODeviceType>& list) override
{
/*
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_WASAPI (false));
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_WASAPI (true));
*/
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_DirectSound());
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_ASIO());
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_CoreAudio());
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_iOSAudio());
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_Bela());
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_ALSA());
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_JACK());
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_Oboe());
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_OpenSLES());
addIfNotNull (list, juce::AudioIODeviceType::createAudioIODeviceType_Android());
}
};

void display_device_probe(juce::AudioDeviceManager& deviceManager) {

void display_device_probe(TestAudioDeviceManager& deviceManager) {
std::cout << "Audio device probe results:\n";
int device_count = 0;
for (const auto& t : deviceManager.getAvailableDeviceTypes()) {
Expand All @@ -56,20 +86,22 @@ void display_device_probe(juce::AudioDeviceManager& deviceManager) {
}
std::cout << "Discovered " << device_count << " total audio devices.\n\n";

std::cout << "Current audio device type: "
<< (deviceManager.getCurrentDeviceTypeObject() != nullptr
? deviceManager.getCurrentDeviceTypeObject()->getTypeName()
: "<none>") << '\n';
const auto* curType = deviceManager.getCurrentDeviceTypeObject();
auto* curDevice = deviceManager.getCurrentAudioDevice();

std::cout << "Current audio device: ";
auto* device = deviceManager.getCurrentAudioDevice();
if (!device) {
std::cout << "No audio device open.\n";
return;
if (curType == nullptr || curDevice == nullptr) {
std::cout << "<none>\n";
} else {
std::cout << curType->getTypeName()
<< " - " << curDevice->getName().quoted() << '\n';
std::cout << "Sample rate: "
<< curDevice->getCurrentSampleRate() << " Hz\n";
std::cout << "Block size: "
<< curDevice->getCurrentBufferSizeSamples() << " samples\n";
std::cout << "Bit depth: "
<< curDevice->getCurrentBitDepth() << '\n';
}
std::cout << device->getName().quoted() << '\n';
std::cout << "Sample rate: " << device->getCurrentSampleRate() << " Hz\n";
std::cout << "Block size: " << device->getCurrentBufferSizeSamples() << " samples\n";
std::cout << "Bit depth: " << device->getCurrentBitDepth() << '\n';
}


Expand All @@ -79,7 +111,7 @@ int main(int argc, char* argv[])

// Initialize default audio device
std::cout << "Initialising audio playback device.\n";
juce::AudioDeviceManager deviceManager;
TestAudioDeviceManager deviceManager;

auto error = deviceManager.initialise (
0, // numInputChannelsNeeded
Expand Down

0 comments on commit f6dc4ae

Please sign in to comment.