Update juce_StandaloneFilterWindow.h
JUCE 5.4.7 compatibility update
This commit is contained in:
parent
1f5fb7b33b
commit
7cf812a9bd
1 changed files with 77 additions and 63 deletions
140
Modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h
Executable file → Normal file
140
Modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h
Executable file → Normal file
|
@ -42,7 +42,8 @@ namespace juce
|
|||
@tags{Audio}
|
||||
*/
|
||||
class StandalonePluginHolder : private AudioIODeviceCallback,
|
||||
private Timer
|
||||
private Timer,
|
||||
private Value::Listener
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
|
@ -72,15 +73,17 @@ public:
|
|||
#if JUCE_ANDROID || JUCE_IOS
|
||||
bool shouldAutoOpenMidiDevices = true
|
||||
#else
|
||||
bool shouldAutoOpenMidiDevices = false
|
||||
bool shouldAutoOpenMidiDevices = true
|
||||
#endif
|
||||
)
|
||||
|
||||
: settings (settingsToUse, takeOwnershipOfSettings),
|
||||
channelConfiguration (channels),
|
||||
shouldMuteInput (! isInterAppAudioConnected()),
|
||||
autoOpenMidiDevices (shouldAutoOpenMidiDevices)
|
||||
{
|
||||
shouldMuteInput.addListener (this);
|
||||
shouldMuteInput = ! isInterAppAudioConnected();
|
||||
|
||||
createPlugin();
|
||||
|
||||
auto inChannels = (channelConfiguration.size() > 0 ? channelConfiguration[0].numIns
|
||||
|
@ -109,7 +112,7 @@ public:
|
|||
startTimer (500);
|
||||
}
|
||||
|
||||
virtual ~StandalonePluginHolder()
|
||||
virtual ~StandalonePluginHolder() override
|
||||
{
|
||||
stopTimer();
|
||||
|
||||
|
@ -158,6 +161,7 @@ public:
|
|||
//==============================================================================
|
||||
Value& getMuteInputValue() { return shouldMuteInput; }
|
||||
bool getProcessorHasPotentialFeedbackLoop() const { return processorHasPotentialFeedbackLoop; }
|
||||
void valueChanged (Value& value) override { muteInput = (bool) value.getValue(); }
|
||||
|
||||
//==============================================================================
|
||||
File getLastFile() const
|
||||
|
@ -251,38 +255,29 @@ public:
|
|||
{
|
||||
DialogWindow::LaunchOptions o;
|
||||
|
||||
int minNumInputs = std::numeric_limits<int>::max(), maxNumInputs = 0,
|
||||
minNumOutputs = std::numeric_limits<int>::max(), maxNumOutputs = 0;
|
||||
|
||||
auto updateMinAndMax = [] (int newValue, int& minValue, int& maxValue)
|
||||
{
|
||||
minValue = jmin (minValue, newValue);
|
||||
maxValue = jmax (maxValue, newValue);
|
||||
};
|
||||
int maxNumInputs = 0, maxNumOutputs = 0;
|
||||
|
||||
if (channelConfiguration.size() > 0)
|
||||
{
|
||||
auto defaultConfig = channelConfiguration.getReference (0);
|
||||
updateMinAndMax ((int) defaultConfig.numIns, minNumInputs, maxNumInputs);
|
||||
updateMinAndMax ((int) defaultConfig.numOuts, minNumOutputs, maxNumOutputs);
|
||||
auto& defaultConfig = channelConfiguration.getReference (0);
|
||||
|
||||
maxNumInputs = jmax (0, (int) defaultConfig.numIns);
|
||||
maxNumOutputs = jmax (0, (int) defaultConfig.numOuts);
|
||||
}
|
||||
|
||||
if (auto* bus = processor->getBus (true, 0))
|
||||
updateMinAndMax (bus->getDefaultLayout().size(), minNumInputs, maxNumInputs);
|
||||
maxNumInputs = jmax (0, bus->getDefaultLayout().size());
|
||||
|
||||
if (auto* bus = processor->getBus (false, 0))
|
||||
updateMinAndMax (bus->getDefaultLayout().size(), minNumOutputs, maxNumOutputs);
|
||||
maxNumOutputs = jmax (0, bus->getDefaultLayout().size());
|
||||
|
||||
minNumInputs = jmin (minNumInputs, maxNumInputs);
|
||||
minNumOutputs = jmin (minNumOutputs, maxNumOutputs);
|
||||
|
||||
o.content.setOwned (new SettingsComponent (*this, deviceManager,
|
||||
minNumInputs,
|
||||
maxNumInputs,
|
||||
minNumOutputs,
|
||||
maxNumOutputs));
|
||||
o.content.setOwned (new SettingsComponent (*this, deviceManager, maxNumInputs, maxNumOutputs));
|
||||
#if JUCE_MAC
|
||||
o.content->setSize (500, 240);
|
||||
|
||||
#endif
|
||||
#if ! JUCE_MAC
|
||||
o.content->setSize (500, 340);
|
||||
#endif
|
||||
o.dialogTitle = TRANS("Audio/MIDI Settings");
|
||||
o.dialogBackgroundColour = o.content->getLookAndFeel().findColour (ResizableWindow::backgroundColourId);
|
||||
o.escapeKeyTriggersCloseButton = true;
|
||||
|
@ -296,7 +291,7 @@ public:
|
|||
{
|
||||
if (settings != nullptr)
|
||||
{
|
||||
std::unique_ptr<XmlElement> xml (deviceManager.createStateXml());
|
||||
auto xml = deviceManager.createStateXml();
|
||||
|
||||
settings->setValue ("audioSetup", xml.get());
|
||||
|
||||
|
@ -314,7 +309,7 @@ public:
|
|||
|
||||
if (settings != nullptr)
|
||||
{
|
||||
savedState.reset (settings->getXmlValue ("audioSetup"));
|
||||
savedState = settings->getXmlValue ("audioSetup");
|
||||
|
||||
#if ! (JUCE_IOS || JUCE_ANDROID)
|
||||
shouldMuteInput.setValue (settings->getBoolValue ("shouldMuteInput", true));
|
||||
|
@ -406,12 +401,13 @@ public:
|
|||
|
||||
// avoid feedback loop by default
|
||||
bool processorHasPotentialFeedbackLoop = true;
|
||||
std::atomic<bool> muteInput { true };
|
||||
Value shouldMuteInput;
|
||||
AudioBuffer<float> emptyBuffer;
|
||||
bool autoOpenMidiDevices;
|
||||
|
||||
std::unique_ptr<AudioDeviceManager::AudioDeviceSetup> options;
|
||||
StringArray lastMidiDevices;
|
||||
Array<MidiDeviceInfo> lastMidiDevices;
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
|
@ -420,16 +416,14 @@ private:
|
|||
public:
|
||||
SettingsComponent (StandalonePluginHolder& pluginHolder,
|
||||
AudioDeviceManager& deviceManagerToUse,
|
||||
int minAudioInputChannels,
|
||||
int maxAudioInputChannels,
|
||||
int minAudioOutputChannels,
|
||||
int maxAudioOutputChannels)
|
||||
: owner (pluginHolder),
|
||||
deviceSelector (deviceManagerToUse,
|
||||
minAudioInputChannels, maxAudioInputChannels,
|
||||
minAudioOutputChannels, maxAudioOutputChannels,
|
||||
0, maxAudioInputChannels,
|
||||
0, maxAudioOutputChannels,
|
||||
true,
|
||||
(pluginHolder.processor.get() != nullptr && pluginHolder.processor->producesMidi()),
|
||||
false, // disables MIDI Out // (pluginHolder.processor.get() != nullptr && pluginHolder.processor->producesMidi()),
|
||||
true, false),
|
||||
shouldMuteLabel ("Feedback Loop:", "Feedback Loop:"),
|
||||
shouldMuteButton ("Mute audio input")
|
||||
|
@ -492,9 +486,7 @@ private:
|
|||
int numOutputChannels,
|
||||
int numSamples) override
|
||||
{
|
||||
const bool inputMuted = shouldMuteInput.getValue();
|
||||
|
||||
if (inputMuted)
|
||||
if (muteInput)
|
||||
{
|
||||
emptyBuffer.clear();
|
||||
inputChannelData = emptyBuffer.getArrayOfReadPointers();
|
||||
|
@ -526,7 +518,7 @@ private:
|
|||
const AudioDeviceManager::AudioDeviceSetup* preferredSetupOptions)
|
||||
{
|
||||
deviceManager.addAudioCallback (this);
|
||||
deviceManager.addMidiInputCallback ({}, &player);
|
||||
deviceManager.addMidiInputDeviceCallback ({}, &player);
|
||||
|
||||
reloadAudioDeviceState (enableAudioInput, preferredDefaultDeviceName, preferredSetupOptions);
|
||||
}
|
||||
|
@ -535,23 +527,25 @@ private:
|
|||
{
|
||||
saveAudioDeviceState();
|
||||
|
||||
deviceManager.removeMidiInputCallback ({}, &player);
|
||||
deviceManager.removeMidiInputDeviceCallback ({}, &player);
|
||||
deviceManager.removeAudioCallback (this);
|
||||
}
|
||||
|
||||
void timerCallback() override
|
||||
{
|
||||
auto newMidiDevices = MidiInput::getDevices();
|
||||
auto newMidiDevices = MidiInput::getAvailableDevices();
|
||||
|
||||
if (newMidiDevices != lastMidiDevices)
|
||||
{
|
||||
for (auto& oldDevice : lastMidiDevices)
|
||||
if (! newMidiDevices.contains (oldDevice))
|
||||
deviceManager.setMidiInputEnabled (oldDevice, false);
|
||||
deviceManager.setMidiInputDeviceEnabled (oldDevice.identifier, false);
|
||||
|
||||
for (auto& newDevice : newMidiDevices)
|
||||
if (! lastMidiDevices.contains (newDevice))
|
||||
deviceManager.setMidiInputEnabled (newDevice, true);
|
||||
deviceManager.setMidiInputDeviceEnabled (newDevice.identifier, true);
|
||||
|
||||
lastMidiDevices = newMidiDevices;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -595,7 +589,7 @@ public:
|
|||
bool autoOpenMidiDevices = true
|
||||
#endif
|
||||
)
|
||||
: DocumentWindow (title, Colour::fromHSV (0.0f, 0.0f, 0.1f, 1.0f), DocumentWindow::minimiseButton | DocumentWindow::closeButton)
|
||||
: DocumentWindow ("", Colour::fromHSV (0.0f, 0.0f, 0.1f, 1.0f), DocumentWindow::minimiseButton | DocumentWindow::closeButton)
|
||||
, menuBar(this)
|
||||
#if ! JUCE_MAC
|
||||
, optionsButton ("Settings")
|
||||
|
@ -644,7 +638,7 @@ public:
|
|||
#endif
|
||||
}
|
||||
|
||||
~StandaloneFilterWindow()
|
||||
~StandaloneFilterWindow() override
|
||||
{
|
||||
#if JUCE_MAC
|
||||
setMacMainMenu(nullptr);
|
||||
|
@ -717,16 +711,17 @@ public:
|
|||
|
||||
void buttonClicked (Button*) override
|
||||
{
|
||||
PopupMenu m;
|
||||
m.addItem (1, TRANS("Audio/MIDI Settings..."));
|
||||
m.addSeparator();
|
||||
m.addItem (2, TRANS("Save current state..."));
|
||||
m.addItem (3, TRANS("Load a saved state..."));
|
||||
m.addSeparator();
|
||||
m.addItem (4, TRANS("Reset to default state"));
|
||||
pluginHolder->showAudioSettingsDialog();
|
||||
|
||||
m.showMenuAsync (PopupMenu::Options(),
|
||||
ModalCallbackFunction::forComponent (menuCallback, this));
|
||||
// PopupMenu m;
|
||||
// m.addItem (1, TRANS("Audio/MIDI Settings..."));
|
||||
// m.addSeparator();
|
||||
// m.addItem (2, TRANS("Save current state..."));
|
||||
// m.addItem (3, TRANS("Load a saved state..."));
|
||||
// m.addSeparator();
|
||||
// m.addItem (4, TRANS("Reset to default state"));
|
||||
|
||||
// m.showMenuAsync (PopupMenu::Options(),ModalCallbackFunction::forComponent (menuCallback, this));
|
||||
}
|
||||
|
||||
void handleMenuResult (int result)
|
||||
|
@ -771,7 +766,8 @@ private:
|
|||
public:
|
||||
MainContentComponent (StandaloneFilterWindow& filterWindow)
|
||||
: owner (filterWindow), notification (this),
|
||||
editor (owner.getAudioProcessor()->createEditorIfNeeded())
|
||||
editor (owner.getAudioProcessor()->hasEditor() ? owner.getAudioProcessor()->createEditorIfNeeded()
|
||||
: new GenericAudioProcessorEditor (*owner.getAudioProcessor()))
|
||||
{
|
||||
Value& inputMutedValue = owner.pluginHolder->getMuteInputValue();
|
||||
|
||||
|
@ -794,7 +790,7 @@ private:
|
|||
inputMutedChanged (shouldShowNotification);
|
||||
}
|
||||
|
||||
~MainContentComponent()
|
||||
~MainContentComponent() override
|
||||
{
|
||||
if (editor != nullptr)
|
||||
{
|
||||
|
@ -811,7 +807,9 @@ private:
|
|||
if (shouldShowNotification)
|
||||
notification.setBounds (r.removeFromTop (NotificationArea::height));
|
||||
|
||||
editor->setBounds (r);
|
||||
if (editor != nullptr)
|
||||
editor->setBounds (editor->getLocalArea (this, r)
|
||||
.withPosition (r.getTopLeft().transformedBy (editor->getTransform().inverted())));
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -871,9 +869,13 @@ private:
|
|||
#if JUCE_IOS || JUCE_ANDROID
|
||||
resized();
|
||||
#else
|
||||
setSize (editor->getWidth(),
|
||||
editor->getHeight()
|
||||
+ (shouldShowNotification ? NotificationArea::height : 0));
|
||||
if (editor != nullptr)
|
||||
{
|
||||
auto rect = getSizeToContainEditor();
|
||||
|
||||
setSize (rect.getWidth(),
|
||||
rect.getHeight() + (shouldShowNotification ? NotificationArea::height : 0));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -888,11 +890,23 @@ private:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
void componentMovedOrResized (Component&, bool, bool wasResized) override
|
||||
void componentMovedOrResized (Component&, bool, bool) override
|
||||
{
|
||||
if (wasResized && editor != nullptr)
|
||||
setSize (editor->getWidth(),
|
||||
editor->getHeight() + (shouldShowNotification ? NotificationArea::height : 0));
|
||||
if (editor != nullptr)
|
||||
{
|
||||
auto rect = getSizeToContainEditor();
|
||||
|
||||
setSize (rect.getWidth(),
|
||||
rect.getHeight() + (shouldShowNotification ? NotificationArea::height : 0));
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle<int> getSizeToContainEditor() const
|
||||
{
|
||||
if (editor != nullptr)
|
||||
return getLocalArea (editor.get(), editor->getLocalBounds());
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
Loading…
Reference in a new issue