From 01be101f4156d3577b4f0255d02c766f61d899a5 Mon Sep 17 00:00:00 2001 From: jules Date: Wed, 26 Sep 2012 16:30:05 +0100 Subject: [PATCH] Added error callback dispatching to AudioDeviceManager. --- .../audio_io/juce_AudioDeviceManager.cpp | 133 +++++++++--------- .../audio_io/juce_AudioDeviceManager.h | 19 +-- .../utility/juce_CheckSettingMacros.h | 5 + .../filebrowser/juce_FilenameComponent.cpp | 3 +- 4 files changed, 81 insertions(+), 79 deletions(-) diff --git a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp index 16a689f440..c67ba90be4 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp +++ b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp @@ -43,6 +43,49 @@ bool AudioDeviceManager::AudioDeviceSetup::operator== (const AudioDeviceManager: && useDefaultOutputChannels == other.useDefaultOutputChannels; } +//============================================================================== +class AudioDeviceManager::CallbackHandler : public AudioIODeviceCallback, + public MidiInputCallback, + public AudioIODeviceType::Listener +{ +public: + CallbackHandler (AudioDeviceManager& adm) noexcept : owner (adm) {} + +private: + void audioDeviceIOCallback (const float** ins, int numIns, float** outs, int numOuts, int numSamples) + { + owner.audioDeviceIOCallbackInt (ins, numIns, outs, numOuts, numSamples); + } + + void audioDeviceAboutToStart (AudioIODevice* device) + { + owner.audioDeviceAboutToStartInt (device); + } + + void audioDeviceStopped() + { + owner.audioDeviceStoppedInt(); + } + + void audioDeviceError (const String& message) + { + owner.audioDeviceErrorInt (message); + } + + void handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message) + { + owner.handleIncomingMidiMessageInt (source, message); + } + + void audioDeviceListChanged() + { + owner.audioDeviceListChanged(); + } + + AudioDeviceManager& owner; +}; + + //============================================================================== AudioDeviceManager::AudioDeviceManager() : numInputChansNeeded (0), @@ -55,7 +98,7 @@ AudioDeviceManager::AudioDeviceManager() cpuUsageMs (0), timeToCpuScale (0) { - callbackHandler.owner = this; + callbackHandler = new CallbackHandler (*this); } AudioDeviceManager::~AudioDeviceManager() @@ -79,7 +122,7 @@ void AudioDeviceManager::createDeviceTypesIfNeeded() currentDeviceType = availableDeviceTypes.getUnchecked(0)->getTypeName(); for (int i = 0; i < availableDeviceTypes.size(); ++i) - availableDeviceTypes.getUnchecked(i)->addListener (&callbackHandler); + availableDeviceTypes.getUnchecked(i)->addListener (callbackHandler); } } @@ -200,7 +243,7 @@ String AudioDeviceManager::initialise (const int numInputChannelsNeeded, { AudioIODeviceType* const type = availableDeviceTypes.getUnchecked(j); - StringArray outs (type->getDeviceNames (false)); + const StringArray outs (type->getDeviceNames (false)); for (int i = 0; i < outs.size(); ++i) { @@ -211,7 +254,7 @@ String AudioDeviceManager::initialise (const int numInputChannelsNeeded, } } - StringArray ins (type->getDeviceNames (true)); + const StringArray ins (type->getDeviceNames (true)); for (int i = 0; i < ins.size(); ++i) { @@ -404,18 +447,12 @@ String AudioDeviceManager::setAudioDeviceSetup (const AudioDeviceSetup& newSetup outputChannels.setRange (0, numOutputChansNeeded, true); } - if (newInputDeviceName.isEmpty()) - inputChannels.clear(); - - if (newOutputDeviceName.isEmpty()) - outputChannels.clear(); + if (newInputDeviceName.isEmpty()) inputChannels.clear(); + if (newOutputDeviceName.isEmpty()) outputChannels.clear(); } - if (! newSetup.useDefaultInputChannels) - inputChannels = newSetup.inputChannels; - - if (! newSetup.useDefaultOutputChannels) - outputChannels = newSetup.outputChannels; + if (! newSetup.useDefaultInputChannels) inputChannels = newSetup.inputChannels; + if (! newSetup.useDefaultOutputChannels) outputChannels = newSetup.outputChannels; currentSetup = newSetup; @@ -431,11 +468,11 @@ String AudioDeviceManager::setAudioDeviceSetup (const AudioDeviceSetup& newSetup { currentDeviceType = currentAudioDevice->getTypeName(); - currentAudioDevice->start (&callbackHandler); + currentAudioDevice->start (callbackHandler); - currentSetup.sampleRate = currentAudioDevice->getCurrentSampleRate(); - currentSetup.bufferSize = currentAudioDevice->getCurrentBufferSizeSamples(); - currentSetup.inputChannels = currentAudioDevice->getActiveInputChannels(); + currentSetup.sampleRate = currentAudioDevice->getCurrentSampleRate(); + currentSetup.bufferSize = currentAudioDevice->getCurrentBufferSizeSamples(); + currentSetup.inputChannels = currentAudioDevice->getActiveInputChannels(); currentSetup.outputChannels = currentAudioDevice->getActiveOutputChannels(); for (int i = 0; i < availableDeviceTypes.size(); ++i) @@ -546,10 +583,8 @@ void AudioDeviceManager::updateXml() } for (int i = 0; i < enabledMidiInputs.size(); ++i) - { - XmlElement* const m = lastExplicitSettings->createNewChildElement ("MIDIINPUT"); - m->setAttribute ("name", enabledMidiInputs[i]->getName()); - } + lastExplicitSettings->createNewChildElement ("MIDIINPUT") + ->setAttribute ("name", enabledMidiInputs[i]->getName()); if (midiInsFromXml.size() > 0) { @@ -561,8 +596,8 @@ void AudioDeviceManager::updateXml() { if (! availableMidiDevices.contains (midiInsFromXml[i], true)) { - XmlElement* const m = lastExplicitSettings->createNewChildElement ("MIDIINPUT"); - m->setAttribute ("name", midiInsFromXml[i]); + lastExplicitSettings->createNewChildElement ("MIDIINPUT") + ->setAttribute ("name", midiInsFromXml[i]); } } } @@ -724,14 +759,20 @@ void AudioDeviceManager::audioDeviceStoppedInt() callbacks.getUnchecked(i)->audioDeviceStopped(); } +void AudioDeviceManager::audioDeviceErrorInt (const String& message) +{ + const ScopedLock sl (audioCallbackLock); + for (int i = callbacks.size(); --i >= 0;) + callbacks.getUnchecked(i)->audioDeviceError (message); +} + double AudioDeviceManager::getCpuUsage() const { return jlimit (0.0, 1.0, timeToCpuScale * cpuUsageMs); } //============================================================================== -void AudioDeviceManager::setMidiInputEnabled (const String& name, - const bool enabled) +void AudioDeviceManager::setMidiInputEnabled (const String& name, const bool enabled) { if (enabled != isMidiInputEnabled (name)) { @@ -741,9 +782,7 @@ void AudioDeviceManager::setMidiInputEnabled (const String& name, if (index >= 0) { - MidiInput* const midiIn = MidiInput::openDevice (index, &callbackHandler); - - if (midiIn != nullptr) + if (MidiInput* const midiIn = MidiInput::openDevice (index, callbackHandler)) { enabledMidiInputs.add (midiIn); midiIn->start(); @@ -771,8 +810,7 @@ bool AudioDeviceManager::isMidiInputEnabled (const String& name) const return false; } -void AudioDeviceManager::addMidiInputCallback (const String& name, - MidiInputCallback* callbackToAdd) +void AudioDeviceManager::addMidiInputCallback (const String& name, MidiInputCallback* callbackToAdd) { removeMidiInputCallback (name, callbackToAdd); @@ -797,8 +835,7 @@ void AudioDeviceManager::removeMidiInputCallback (const String& name, MidiInputC } } -void AudioDeviceManager::handleIncomingMidiMessageInt (MidiInput* source, - const MidiMessage& message) +void AudioDeviceManager::handleIncomingMidiMessageInt (MidiInput* source, const MidiMessage& message) { if (! message.isActiveSense()) { @@ -853,36 +890,6 @@ void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) } } -//============================================================================== -void AudioDeviceManager::CallbackHandler::audioDeviceIOCallback (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) -{ - owner->audioDeviceIOCallbackInt (inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples); -} - -void AudioDeviceManager::CallbackHandler::audioDeviceAboutToStart (AudioIODevice* device) -{ - owner->audioDeviceAboutToStartInt (device); -} - -void AudioDeviceManager::CallbackHandler::audioDeviceStopped() -{ - owner->audioDeviceStoppedInt(); -} - -void AudioDeviceManager::CallbackHandler::handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message) -{ - owner->handleIncomingMidiMessageInt (source, message); -} - -void AudioDeviceManager::CallbackHandler::audioDeviceListChanged() -{ - owner->audioDeviceListChanged(); -} - //============================================================================== void AudioDeviceManager::playTestSound() { diff --git a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h index 5bc831454a..3e71bbe604 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h +++ b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h @@ -472,27 +472,16 @@ private: double cpuUsageMs, timeToCpuScale; //============================================================================== - class CallbackHandler : public AudioIODeviceCallback, - public MidiInputCallback, - public AudioIODeviceType::Listener - { - public: - void audioDeviceIOCallback (const float**, int, float**, int, int); - void audioDeviceAboutToStart (AudioIODevice*); - void audioDeviceStopped(); - void handleIncomingMidiMessage (MidiInput*, const MidiMessage&); - void audioDeviceListChanged(); - - AudioDeviceManager* owner; - }; - - CallbackHandler callbackHandler; + class CallbackHandler; friend class CallbackHandler; + friend class ScopedPointer; + ScopedPointer callbackHandler; void audioDeviceIOCallbackInt (const float** inputChannelData, int totalNumInputChannels, float** outputChannelData, int totalNumOutputChannels, int numSamples); void audioDeviceAboutToStartInt (AudioIODevice*); void audioDeviceStoppedInt(); + void audioDeviceErrorInt (const String&); void handleIncomingMidiMessageInt (MidiInput*, const MidiMessage&); void audioDeviceListChanged(); diff --git a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h index b7678582f2..811d17f660 100644 --- a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h +++ b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h @@ -104,3 +104,8 @@ #if JucePlugin_Build_AAX && ! defined (JucePlugin_AAXIdentifier) #error "You need to define the JucePlugin_AAXIdentifier value!" #endif + +#if defined (__ppc__) + #undef JucePlugin_Build_AAX + #define JucePlugin_Build_AAX 0 +#endif diff --git a/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp b/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp index b72f4982c6..f1ddbd29dc 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp @@ -100,7 +100,8 @@ void FilenameComponent::setDefaultBrowseTarget (const File& newDefaultDirectory) void FilenameComponent::buttonClicked (Button*) { #if JUCE_MODAL_LOOPS_PERMITTED - FileChooser fc (TRANS("Choose a new file"), + FileChooser fc (isDir ? TRANS ("Choose a new directory") + : TRANS ("Choose a new file"), getCurrentFile() == File::nonexistent ? defaultBrowseFile : getCurrentFile(), wildcard);