JUCE breaking changes
=====================
+Version 6.1.5
+=============
+
+Change
+------
+XWindowSystemUtilities::XSettings now has a private constructor.
+
+Possible Issues
+---------------
+User code that uses XSettings::XSettings() will fail to build.
+
+Workaround
+----------
+Use the XSettings::createXSettings() factory function.
+
+Rationale
+---------
+The XSETTINGS facility is not available on all Linux distributions and the old
+constructor would fail on such systems, potentially crashing the application.
+The factory function will return nullptr in such situations instead.
+
+
Version 6.1.3
=============
cmake_minimum_required(VERSION 3.15)
-project(JUCE VERSION 6.1.4 LANGUAGES C CXX)
+project(JUCE VERSION 6.1.5 LANGUAGES C CXX)
include(CMakeDependentOption)
This file just lists the more notable headline features. For more detailed info\r
about changes and bugfixes please see the git log and BREAKING-CHANGES.txt.\r
\r
+Version 6.1.5\r
+ - Improved the accessibility framework\r
+ - Added handling of non-Latin virtual key codes on macOS\r
+ - Improved X11 compatibility\r
+ - Updated the iOS in-app purchases workflow\r
+ - Improved macOS windowing behaviour\r
+ - Improved MinGW-w64 compatibility\r
+ - Added an MPEKeyboardComponent class\r
+\r
Version 6.1.4\r
- Restored Projucer project saving behavior\r
- Fixed a CGImage memory access violation on Monterey\r
The repository doesn't contain a pre-built Projucer so you will need to build it
for your platform - Xcode, Visual Studio and Linux Makefile projects are located in
[extras/Projucer/Builds](/extras/Projucer/Builds)
-(the minumum system requirements are listed in the __System Requirements__ section below).
+(the minimum system requirements are listed in the __System Requirements__ section below).
The Projucer can then be used to create new JUCE projects, view tutorials and run examples.
It is also possible to include the JUCE modules source code in an existing project directly,
or build them into a static or dynamic library which can be linked into a project.
## Contributing
-For bug reports and features requests, please visit the [JUCE Forum](https://forum.juce.com/) -
-the JUCE developers are active there and will read every post and respond accordingly. When
-submitting a bug report, please ensure that it follows the
-[issue template](/.github/ISSUE_TEMPLATE.txt).
-We don't accept third party GitHub pull requests directly due to copyright restrictions
-but if you would like to contribute any changes please contact us.
+Please see our [contribution guidelines](.github/contributing.md).
## License
`USE_LEGACY_COMPATIBILITY_PLUGIN_CODE`
- May be either TRUE or FALSE (defaults to FALSE). If TRUE, will override the value of the
preprocessor definition "JucePlugin_ManufacturerCode" with the hex equivalent of "proj". This
- option exists to maintain compatiblity with a previous, buggy version of JUCE's CMake support
+ option exists to maintain compatibility with a previous, buggy version of JUCE's CMake support
which mishandled the manufacturer code property. Most projects should leave this option set to
its default value.
juce_events\r
juce_graphics\r
\r
-But any name that is a valid C++ identifer is OK.\r
+But any name that is a valid C++ identifier is OK.\r
\r
Inside the root of this folder, there must be a set of public header and source files which\r
the user's' project will include. The module may have as many other internal source files as\r
This has been tested on Ubuntu 16.04 LTS (Xenial Xerus), 18.04 LTS (Bionic
Beaver), and 20.04 LTS (Focal Fossa). Packages may differ in name or not be
-available on other distrubutions.
+available on other distributions.
## Compiler
A C++ compiler is required. JUCE has been tested thoroughly with Clang and GCC:
\r
#pragma once\r
\r
+\r
//==============================================================================\r
class ZoneColourPicker\r
{\r
};\r
\r
//==============================================================================\r
-class NoteComponent : public Component\r
-{\r
-public:\r
- NoteComponent (const MPENote& n, Colour colourToUse)\r
- : note (n), colour (colourToUse)\r
- {}\r
-\r
- //==============================================================================\r
- void update (const MPENote& newNote, Point<float> newCentre)\r
- {\r
- note = newNote;\r
- centre = newCentre;\r
-\r
- setBounds (getSquareAroundCentre (jmax (getNoteOnRadius(), getNoteOffRadius(), getPressureRadius()))\r
- .getUnion (getTextRectangle())\r
- .getSmallestIntegerContainer()\r
- .expanded (3));\r
-\r
- repaint();\r
- }\r
-\r
- //==============================================================================\r
- void paint (Graphics& g) override\r
- {\r
- if (note.keyState == MPENote::keyDown || note.keyState == MPENote::keyDownAndSustained)\r
- drawPressedNoteCircle (g, colour);\r
- else if (note.keyState == MPENote::sustained)\r
- drawSustainedNoteCircle (g, colour);\r
- else\r
- return;\r
-\r
- drawNoteLabel (g, colour);\r
- }\r
-\r
- //==============================================================================\r
- MPENote note;\r
- Colour colour;\r
- Point<float> centre;\r
-\r
-private:\r
- //==============================================================================\r
- void drawPressedNoteCircle (Graphics& g, Colour zoneColour)\r
- {\r
- g.setColour (zoneColour.withAlpha (0.3f));\r
- g.fillEllipse (translateToLocalBounds (getSquareAroundCentre (getNoteOnRadius())));\r
- g.setColour (zoneColour);\r
- g.drawEllipse (translateToLocalBounds (getSquareAroundCentre (getPressureRadius())), 2.0f);\r
- }\r
-\r
- //==============================================================================\r
- void drawSustainedNoteCircle (Graphics& g, Colour zoneColour)\r
- {\r
- g.setColour (zoneColour);\r
- Path circle, dashedCircle;\r
- circle.addEllipse (translateToLocalBounds (getSquareAroundCentre (getNoteOffRadius())));\r
- float dashLengths[] = { 3.0f, 3.0f };\r
- PathStrokeType (2.0, PathStrokeType::mitered).createDashedStroke (dashedCircle, circle, dashLengths, 2);\r
- g.fillPath (dashedCircle);\r
- }\r
-\r
- //==============================================================================\r
- void drawNoteLabel (Graphics& g, Colour /**zoneColour*/)\r
- {\r
- auto textBounds = translateToLocalBounds (getTextRectangle()).getSmallestIntegerContainer();\r
-\r
- g.drawText ("+", textBounds, Justification::centred);\r
- g.drawText (MidiMessage::getMidiNoteName (note.initialNote, true, true, 3), textBounds, Justification::centredBottom);\r
- g.setFont (Font (22.0f, Font::bold));\r
- g.drawText (String (note.midiChannel), textBounds, Justification::centredTop);\r
- }\r
-\r
- //==============================================================================\r
- Rectangle<float> getSquareAroundCentre (float radius) const noexcept\r
- {\r
- return Rectangle<float> (radius * 2.0f, radius * 2.0f).withCentre (centre);\r
- }\r
-\r
- Rectangle<float> translateToLocalBounds (Rectangle<float> r) const noexcept\r
- {\r
- return r - getPosition().toFloat();\r
- }\r
-\r
- Rectangle<float> getTextRectangle() const noexcept\r
- {\r
- return Rectangle<float> (30.0f, 50.0f).withCentre (centre);\r
- }\r
-\r
- float getNoteOnRadius() const noexcept { return note.noteOnVelocity .asUnsignedFloat() * maxNoteRadius; }\r
- float getNoteOffRadius() const noexcept { return note.noteOffVelocity.asUnsignedFloat() * maxNoteRadius; }\r
- float getPressureRadius() const noexcept { return note.pressure .asUnsignedFloat() * maxNoteRadius; }\r
-\r
- const float maxNoteRadius = 100.0f;\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NoteComponent)\r
-};\r
-\r
-//==============================================================================\r
-class Visualiser : public Component,\r
- public MPEInstrument::Listener,\r
- private AsyncUpdater\r
-{\r
-public:\r
- //==============================================================================\r
- Visualiser (ZoneColourPicker& zoneColourPicker)\r
- : colourPicker (zoneColourPicker)\r
- {}\r
-\r
- //==============================================================================\r
- void paint (Graphics& g) override\r
- {\r
- g.fillAll (Colours::black);\r
-\r
- auto noteDistance = float (getWidth()) / 128;\r
- for (auto i = 0; i < 128; ++i)\r
- {\r
- auto x = noteDistance * (float) i;\r
- auto noteHeight = int (MidiMessage::isMidiNoteBlack (i) ? 0.7 * getHeight() : getHeight());\r
-\r
- g.setColour (MidiMessage::isMidiNoteBlack (i) ? Colours::white : Colours::grey);\r
- g.drawLine (x, 0.0f, x, (float) noteHeight);\r
-\r
- if (i > 0 && i % 12 == 0)\r
- {\r
- g.setColour (Colours::grey);\r
- auto octaveNumber = (i / 12) - 2;\r
- g.drawText ("C" + String (octaveNumber), (int) x - 15, getHeight() - 30, 30, 30, Justification::centredBottom);\r
- }\r
- }\r
- }\r
-\r
- //==============================================================================\r
- void noteAdded (MPENote newNote) override\r
- {\r
- const ScopedLock sl (lock);\r
- activeNotes.add (newNote);\r
- triggerAsyncUpdate();\r
- }\r
-\r
- void notePressureChanged (MPENote note) override { noteChanged (note); }\r
- void notePitchbendChanged (MPENote note) override { noteChanged (note); }\r
- void noteTimbreChanged (MPENote note) override { noteChanged (note); }\r
- void noteKeyStateChanged (MPENote note) override { noteChanged (note); }\r
-\r
- void noteChanged (MPENote changedNote)\r
- {\r
- const ScopedLock sl (lock);\r
-\r
- for (auto& note : activeNotes)\r
- if (note.noteID == changedNote.noteID)\r
- note = changedNote;\r
-\r
- triggerAsyncUpdate();\r
- }\r
-\r
- void noteReleased (MPENote finishedNote) override\r
- {\r
- const ScopedLock sl (lock);\r
-\r
- for (auto i = activeNotes.size(); --i >= 0;)\r
- if (activeNotes.getReference(i).noteID == finishedNote.noteID)\r
- activeNotes.remove (i);\r
-\r
- triggerAsyncUpdate();\r
- }\r
-\r
-\r
-private:\r
- //==============================================================================\r
- const MPENote* findActiveNote (int noteID) const noexcept\r
- {\r
- for (auto& note : activeNotes)\r
- if (note.noteID == noteID)\r
- return ¬e;\r
-\r
- return nullptr;\r
- }\r
-\r
- NoteComponent* findNoteComponent (int noteID) const noexcept\r
- {\r
- for (auto& noteComp : noteComponents)\r
- if (noteComp->note.noteID == noteID)\r
- return noteComp;\r
-\r
- return nullptr;\r
- }\r
-\r
- //==============================================================================\r
- void handleAsyncUpdate() override\r
- {\r
- const ScopedLock sl (lock);\r
-\r
- for (auto i = noteComponents.size(); --i >= 0;)\r
- if (findActiveNote (noteComponents.getUnchecked(i)->note.noteID) == nullptr)\r
- noteComponents.remove (i);\r
-\r
- for (auto& note : activeNotes)\r
- if (findNoteComponent (note.noteID) == nullptr)\r
- addAndMakeVisible (noteComponents.add (new NoteComponent (note, colourPicker.getColourForMidiChannel(note.midiChannel))));\r
-\r
- for (auto& noteComp : noteComponents)\r
- if (auto* noteInfo = findActiveNote (noteComp->note.noteID))\r
- noteComp->update (*noteInfo, getCentrePositionForNote (*noteInfo));\r
- }\r
-\r
- //==============================================================================\r
- Point<float> getCentrePositionForNote (MPENote note) const\r
- {\r
- auto n = float (note.initialNote) + float (note.totalPitchbendInSemitones);\r
- auto x = (float) getWidth() * n / 128;\r
- auto y = (float) getHeight() * (1 - note.timbre.asUnsignedFloat());\r
-\r
- return { x, y };\r
- }\r
-\r
- //==============================================================================\r
- OwnedArray<NoteComponent> noteComponents;\r
- CriticalSection lock;\r
- Array<MPENote> activeNotes;\r
- ZoneColourPicker& colourPicker;\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Visualiser)\r
-};\r
-\r
-//==============================================================================\r
-class MPESetupComponent : public Component,\r
- public ChangeBroadcaster\r
+class MPESetupComponent : public Component\r
{\r
public:\r
//==============================================================================\r
- class Listener\r
- {\r
- public:\r
- virtual ~Listener() {}\r
- virtual void zoneChanged (bool isLower, int numMemberChans, int perNotePb, int masterPb) = 0;\r
- virtual void allZonesCleared() = 0;\r
- virtual void legacyModeChanged (bool legacyModeEnabled, int pitchbendRange, Range<int> channelRange) = 0;\r
- virtual void voiceStealingEnabledChanged (bool voiceStealingEnabled) = 0;\r
- virtual void numberOfVoicesChanged (int numberOfVoices) = 0;\r
- };\r
-\r
- void addListener (Listener* listenerToAdd) { listeners.add (listenerToAdd); }\r
- void removeListener (Listener* listenerToRemove) { listeners.remove (listenerToRemove); }\r
-\r
- //==============================================================================\r
- MPESetupComponent()\r
+ MPESetupComponent (MPEInstrument& instr)\r
+ : instrument (instr)\r
{\r
addAndMakeVisible (isLowerZoneButton);\r
isLowerZoneButton.setToggleState (true, NotificationType::dontSendNotification);\r
\r
addAndMakeVisible (setZoneButton);\r
setZoneButton.onClick = [this] { setZoneButtonClicked(); };\r
+\r
addAndMakeVisible (clearAllZonesButton);\r
clearAllZonesButton.onClick = [this] { clearAllZonesButtonClicked(); };\r
+\r
addAndMakeVisible (legacyModeEnabledToggle);\r
legacyModeEnabledToggle.onClick = [this] { legacyModeEnabledToggleClicked(); };\r
+\r
addAndMakeVisible (voiceStealingEnabledToggle);\r
voiceStealingEnabledToggle.onClick = [this] { voiceStealingEnabledToggleClicked(); };\r
\r
numberOfVoices.setBounds (r.removeFromTop (h));\r
}\r
\r
+ //==============================================================================\r
+ bool isVoiceStealingEnabled() const { return voiceStealingEnabledToggle.getToggleState(); }\r
+ int getNumVoices() const { return numberOfVoices.getText().getIntValue(); }\r
+\r
+ std::function<void()> onSynthParametersChange;\r
+\r
private:\r
//==============================================================================\r
void initialiseComboBoxWithConsecutiveIntegers (ComboBox& comboBox, Label& labelToAttach,\r
auto perNotePb = notePitchbendRange.getText().getIntValue();\r
auto masterPb = masterPitchbendRange.getText().getIntValue();\r
\r
+ auto zoneLayout = instrument.getZoneLayout();\r
+\r
if (isLowerZone)\r
zoneLayout.setLowerZone (numMemberChannels, perNotePb, masterPb);\r
else\r
zoneLayout.setUpperZone (numMemberChannels, perNotePb, masterPb);\r
\r
- listeners.call ([&] (Listener& l) { l.zoneChanged (isLowerZone, numMemberChannels, perNotePb, masterPb); });\r
+ instrument.setZoneLayout (zoneLayout);\r
}\r
\r
- //==============================================================================\r
void clearAllZonesButtonClicked()\r
{\r
- zoneLayout.clearAllZones();\r
- listeners.call ([] (Listener& l) { l.allZonesCleared(); });\r
+ instrument.setZoneLayout ({});\r
}\r
\r
- //==============================================================================\r
void legacyModeEnabledToggleClicked()\r
{\r
auto legacyModeEnabled = legacyModeEnabledToggle.getToggleState();\r
legacyEndChannel .setVisible (legacyModeEnabled);\r
legacyPitchbendRange.setVisible (legacyModeEnabled);\r
\r
- if (areLegacyModeParametersValid())\r
+ if (legacyModeEnabled)\r
{\r
- listeners.call ([&] (Listener& l) { l.legacyModeChanged (legacyModeEnabledToggle.getToggleState(),\r
- legacyPitchbendRange.getText().getIntValue(),\r
- getLegacyModeChannelRange()); });\r
+ if (areLegacyModeParametersValid())\r
+ {\r
+ instrument.enableLegacyMode();\r
+\r
+ instrument.setLegacyModeChannelRange (getLegacyModeChannelRange());\r
+ instrument.setLegacyModePitchbendRange (getLegacyModePitchbendRange());\r
+ }\r
+ else\r
+ {\r
+ handleInvalidLegacyModeParameters();\r
+ }\r
}\r
else\r
{\r
- handleInvalidLegacyModeParameters();\r
+ instrument.setZoneLayout ({ MPEZone (MPEZone::Type::lower, 15) });\r
}\r
}\r
\r
//==============================================================================\r
- void voiceStealingEnabledToggleClicked()\r
- {\r
- auto newState = voiceStealingEnabledToggle.getToggleState();\r
- listeners.call ([=] (Listener& l) { l.voiceStealingEnabledChanged (newState); });\r
- }\r
-\r
- //==============================================================================\r
- void numberOfVoicesChanged()\r
- {\r
- listeners.call ([this] (Listener& l) { l.numberOfVoicesChanged (numberOfVoices.getText().getIntValue()); });\r
- }\r
-\r
void legacyModePitchbendRangeChanged()\r
{\r
jassert (legacyModeEnabledToggle.getToggleState() == true);\r
\r
- listeners.call ([this] (Listener& l) { l.legacyModeChanged (true,\r
- legacyPitchbendRange.getText().getIntValue(),\r
- getLegacyModeChannelRange()); });\r
+ instrument.setLegacyModePitchbendRange (getLegacyModePitchbendRange());\r
}\r
\r
void legacyModeChannelRangeChanged()\r
jassert (legacyModeEnabledToggle.getToggleState() == true);\r
\r
if (areLegacyModeParametersValid())\r
- {\r
- listeners.call ([this] (Listener& l) { l.legacyModeChanged (true,\r
- legacyPitchbendRange.getText().getIntValue(),\r
- getLegacyModeChannelRange()); });\r
- }\r
+ instrument.setLegacyModeChannelRange (getLegacyModeChannelRange());\r
else\r
- {\r
handleInvalidLegacyModeParameters();\r
- }\r
}\r
\r
- //==============================================================================\r
bool areLegacyModeParametersValid() const\r
{\r
return legacyStartChannel.getText().getIntValue() <= legacyEndChannel.getText().getIntValue();\r
"Got it");\r
}\r
\r
- //==============================================================================\r
Range<int> getLegacyModeChannelRange() const\r
{\r
return { legacyStartChannel.getText().getIntValue(),\r
legacyEndChannel.getText().getIntValue() + 1 };\r
}\r
\r
+ int getLegacyModePitchbendRange() const\r
+ {\r
+ return legacyPitchbendRange.getText().getIntValue();\r
+ }\r
+\r
//==============================================================================\r
- MPEZoneLayout zoneLayout;\r
+ void voiceStealingEnabledToggleClicked()\r
+ {\r
+ jassert (onSynthParametersChange != nullptr);\r
+ onSynthParametersChange();\r
+ }\r
+\r
+ void numberOfVoicesChanged()\r
+ {\r
+ jassert (onSynthParametersChange != nullptr);\r
+ onSynthParametersChange();\r
+ }\r
+\r
+ //==============================================================================\r
+ MPEInstrument& instrument;\r
\r
ComboBox memberChannels, masterPitchbendRange, notePitchbendRange;\r
\r
ComboBox numberOfVoices;\r
Label numberOfVoicesLabel { {}, "Number of synth voices"};\r
\r
- ListenerList<Listener> listeners;\r
-\r
- const int defaultMemberChannels = 15,\r
- defaultMasterPitchbendRange = 2,\r
- defaultNotePitchbendRange = 48;\r
+ static constexpr int defaultMemberChannels = 15,\r
+ defaultMasterPitchbendRange = 2,\r
+ defaultNotePitchbendRange = 48;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPESetupComponent)\r
};\r
\r
//==============================================================================\r
class ZoneLayoutComponent : public Component,\r
- public MPESetupComponent::Listener\r
+ private MPEInstrument::Listener\r
{\r
public:\r
//==============================================================================\r
- ZoneLayoutComponent (const ZoneColourPicker& zoneColourPicker)\r
- : colourPicker (zoneColourPicker)\r
- {}\r
+ ZoneLayoutComponent (MPEInstrument& instr, ZoneColourPicker& zoneColourPicker)\r
+ : instrument (instr),\r
+ colourPicker (zoneColourPicker)\r
+ {\r
+ instrument.addListener (this);\r
+ }\r
+\r
+ ~ZoneLayoutComponent() override\r
+ {\r
+ instrument.removeListener (this);\r
+ }\r
\r
//==============================================================================\r
void paint (Graphics& g) override\r
{\r
paintBackground (g);\r
\r
- if (legacyModeEnabled)\r
+ if (instrument.isLegacyModeEnabled())\r
paintLegacyMode (g);\r
else\r
paintZones (g);\r
}\r
\r
+private:\r
//==============================================================================\r
- void zoneChanged (bool isLowerZone, int numMemberChannels,\r
- int perNotePitchbendRange, int masterPitchbendRange) override\r
- {\r
- if (isLowerZone)\r
- zoneLayout.setLowerZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange);\r
- else\r
- zoneLayout.setUpperZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange);\r
-\r
- repaint();\r
- }\r
-\r
- void allZonesCleared() override\r
- {\r
- zoneLayout.clearAllZones();\r
- repaint();\r
- }\r
-\r
- void legacyModeChanged (bool legacyModeShouldBeEnabled, int pitchbendRange, Range<int> channelRange) override\r
+ void zoneLayoutChanged() override\r
{\r
- legacyModeEnabled = legacyModeShouldBeEnabled;\r
- legacyModePitchbendRange = pitchbendRange;\r
- legacyModeChannelRange = channelRange;\r
-\r
repaint();\r
}\r
\r
- void voiceStealingEnabledChanged (bool) override { /* not interested in this change */ }\r
- void numberOfVoicesChanged (int) override { /* not interested in this change */ }\r
-\r
-private:\r
//==============================================================================\r
void paintBackground (Graphics& g)\r
{\r
{\r
auto channelWidth = getChannelRectangleWidth();\r
\r
+ auto zoneLayout = instrument.getZoneLayout();\r
+\r
Array<MPEZoneLayout::Zone> activeZones;\r
if (zoneLayout.getLowerZone().isActive()) activeZones.add (zoneLayout.getLowerZone());\r
if (zoneLayout.getUpperZone().isActive()) activeZones.add (zoneLayout.getUpperZone());\r
//==============================================================================\r
void paintLegacyMode (Graphics& g)\r
{\r
- auto startChannel = legacyModeChannelRange.getStart() - 1;\r
- auto numChannels = legacyModeChannelRange.getEnd() - startChannel - 1;\r
-\r
+ auto channelRange = instrument.getLegacyModeChannelRange();\r
+ auto startChannel = channelRange.getStart() - 1;\r
+ auto numChannels = channelRange.getEnd() - startChannel - 1;\r
\r
Rectangle<int> zoneRect (int (getChannelRectangleWidth() * (float) startChannel), 0,\r
int (getChannelRectangleWidth() * (float) numChannels), getHeight());\r
g.setColour (Colours::white);\r
g.drawRect (zoneRect, 3);\r
g.drawText ("LGCY", zoneRect.reduced (4, 4), Justification::topLeft, false);\r
- g.drawText ("<>" + String (legacyModePitchbendRange), zoneRect.reduced (4, 4), Justification::bottomLeft, false);\r
+ g.drawText ("<>" + String (instrument.getLegacyModePitchbendRange()), zoneRect.reduced (4, 4), Justification::bottomLeft, false);\r
}\r
\r
//==============================================================================\r
}\r
\r
//==============================================================================\r
- MPEZoneLayout zoneLayout;\r
- const ZoneColourPicker& colourPicker;\r
+ static constexpr int numMidiChannels = 16;\r
\r
- bool legacyModeEnabled = false;\r
- int legacyModePitchbendRange = 48;\r
- Range<int> legacyModeChannelRange = { 1, 17 };\r
- const int numMidiChannels = 16;\r
+ MPEInstrument& instrument;\r
+ ZoneColourPicker& colourPicker;\r
};\r
\r
//==============================================================================\r
class MPEDemo : public Component,\r
private AudioIODeviceCallback,\r
private MidiInputCallback,\r
- private MPESetupComponent::Listener\r
+ private MPEInstrument::Listener\r
{\r
public:\r
//==============================================================================\r
MPEDemo()\r
- : audioSetupComp (audioDeviceManager, 0, 0, 0, 256, true, true, true, false),\r
- zoneLayoutComp (colourPicker),\r
- visualiserComp (colourPicker)\r
{\r
#ifndef JUCE_DEMO_RUNNER\r
audioDeviceManager.initialise (0, 2, nullptr, true, {}, nullptr);\r
audioDeviceManager.addAudioCallback (this);\r
\r
addAndMakeVisible (audioSetupComp);\r
- addAndMakeVisible (MPESetupComp);\r
+ addAndMakeVisible (mpeSetupComp);\r
addAndMakeVisible (zoneLayoutComp);\r
- addAndMakeVisible (visualiserViewport);\r
-\r
- visualiserViewport.setScrollBarsShown (false, true);\r
- visualiserViewport.setViewedComponent (&visualiserComp, false);\r
- visualiserViewport.setViewPositionProportionately (0.5, 0.0);\r
-\r
- MPESetupComp.addListener (&zoneLayoutComp);\r
- MPESetupComp.addListener (this);\r
- visualiserInstrument.addListener (&visualiserComp);\r
+ addAndMakeVisible (keyboardComponent);\r
\r
synth.setVoiceStealingEnabled (false);\r
for (auto i = 0; i < 15; ++i)\r
synth.addVoice (new MPEDemoSynthVoice());\r
\r
+ mpeSetupComp.onSynthParametersChange = [this]\r
+ {\r
+ synth.setVoiceStealingEnabled (mpeSetupComp.isVoiceStealingEnabled());\r
+\r
+ auto numVoices = mpeSetupComp.getNumVoices();\r
+\r
+ if (numVoices < synth.getNumVoices())\r
+ {\r
+ synth.reduceNumVoices (numVoices);\r
+ }\r
+ else\r
+ {\r
+ while (synth.getNumVoices() < numVoices)\r
+ synth.addVoice (new MPEDemoSynthVoice());\r
+ }\r
+ };\r
+\r
+ instrument.addListener (this);\r
+\r
setSize (880, 720);\r
}\r
\r
//==============================================================================\r
void resized() override\r
{\r
- auto visualiserCompWidth = 2800;\r
- auto visualiserCompHeight = 300;\r
auto zoneLayoutCompHeight = 60;\r
auto audioSetupCompRelativeWidth = 0.55f;\r
\r
auto r = getLocalBounds();\r
\r
- visualiserViewport.setBounds (r.removeFromBottom (visualiserCompHeight));\r
- visualiserComp .setBounds ({ visualiserCompWidth,\r
- visualiserViewport.getHeight() - visualiserViewport.getScrollBarThickness() });\r
+ keyboardComponent.setBounds (r.removeFromBottom (150));\r
+ r.reduce (10, 10);\r
\r
zoneLayoutComp.setBounds (r.removeFromBottom (zoneLayoutCompHeight));\r
audioSetupComp.setBounds (r.removeFromLeft (proportionOfWidth (audioSetupCompRelativeWidth)));\r
- MPESetupComp .setBounds (r);\r
+ mpeSetupComp .setBounds (r);\r
}\r
\r
//==============================================================================\r
void handleIncomingMidiMessage (MidiInput* /*source*/,\r
const MidiMessage& message) override\r
{\r
- visualiserInstrument.processNextMidiEvent (message);\r
+ instrument.processNextMidiEvent (message);\r
midiCollector.addMessageToQueue (message);\r
}\r
\r
//==============================================================================\r
- void zoneChanged (bool isLowerZone, int numMemberChannels,\r
- int perNotePitchbendRange, int masterPitchbendRange) override\r
+ void zoneLayoutChanged() override\r
{\r
- auto* midiOutput = audioDeviceManager.getDefaultMidiOutput();\r
- if (midiOutput != nullptr)\r
+ if (instrument.isLegacyModeEnabled())\r
{\r
- if (isLowerZone)\r
- midiOutput->sendBlockOfMessagesNow (MPEMessages::setLowerZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange));\r
- else\r
- midiOutput->sendBlockOfMessagesNow (MPEMessages::setUpperZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange));\r
- }\r
+ colourPicker.setLegacyModeEnabled (true);\r
\r
- if (isLowerZone)\r
- zoneLayout.setLowerZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange);\r
+ synth.enableLegacyMode (instrument.getLegacyModePitchbendRange(),\r
+ instrument.getLegacyModeChannelRange());\r
+ }\r
else\r
- zoneLayout.setUpperZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange);\r
-\r
- visualiserInstrument.setZoneLayout (zoneLayout);\r
- synth.setZoneLayout (zoneLayout);\r
- colourPicker.setZoneLayout (zoneLayout);\r
- }\r
+ {\r
+ colourPicker.setLegacyModeEnabled (false);\r
\r
- void allZonesCleared() override\r
- {\r
- auto* midiOutput = audioDeviceManager.getDefaultMidiOutput();\r
- if (midiOutput != nullptr)\r
- midiOutput->sendBlockOfMessagesNow (MPEMessages::clearAllZones());\r
-\r
- zoneLayout.clearAllZones();\r
- visualiserInstrument.setZoneLayout (zoneLayout);\r
- synth.setZoneLayout (zoneLayout);\r
- colourPicker.setZoneLayout (zoneLayout);\r
- }\r
+ auto zoneLayout = instrument.getZoneLayout();\r
\r
- void legacyModeChanged (bool legacyModeShouldBeEnabled, int pitchbendRange, Range<int> channelRange) override\r
- {\r
- colourPicker.setLegacyModeEnabled (legacyModeShouldBeEnabled);\r
+ if (auto* midiOutput = audioDeviceManager.getDefaultMidiOutput())\r
+ midiOutput->sendBlockOfMessagesNow (MPEMessages::setZoneLayout (zoneLayout));\r
\r
- if (legacyModeShouldBeEnabled)\r
- {\r
- synth.enableLegacyMode (pitchbendRange, channelRange);\r
- visualiserInstrument.enableLegacyMode (pitchbendRange, channelRange);\r
- }\r
- else\r
- {\r
synth.setZoneLayout (zoneLayout);\r
- visualiserInstrument.setZoneLayout (zoneLayout);\r
+ colourPicker.setZoneLayout (zoneLayout);\r
}\r
}\r
\r
- void voiceStealingEnabledChanged (bool voiceStealingEnabled) override\r
- {\r
- synth.setVoiceStealingEnabled (voiceStealingEnabled);\r
- }\r
-\r
- void numberOfVoicesChanged (int numberOfVoices) override\r
- {\r
- if (numberOfVoices < synth.getNumVoices())\r
- synth.reduceNumVoices (numberOfVoices);\r
- else\r
- while (synth.getNumVoices() < numberOfVoices)\r
- synth.addVoice (new MPEDemoSynthVoice());\r
- }\r
-\r
//==============================================================================\r
// if this PIP is running inside the demo runner, we'll use the shared device manager instead\r
#ifndef JUCE_DEMO_RUNNER\r
AudioDeviceManager& audioDeviceManager { getSharedAudioDeviceManager (0, 2) };\r
#endif\r
\r
- MPEZoneLayout zoneLayout;\r
- ZoneColourPicker colourPicker;\r
+ AudioDeviceSelectorComponent audioSetupComp { audioDeviceManager, 0, 0, 0, 256, true, true, true, false };\r
+ MidiMessageCollector midiCollector;\r
\r
- AudioDeviceSelectorComponent audioSetupComp;\r
- MPESetupComponent MPESetupComp;\r
- ZoneLayoutComponent zoneLayoutComp;\r
+ MPEInstrument instrument { MPEZone (MPEZone::Type::lower, 15) };\r
\r
- Visualiser visualiserComp;\r
- Viewport visualiserViewport;\r
- MPEInstrument visualiserInstrument;\r
+ ZoneColourPicker colourPicker;\r
+ MPESetupComponent mpeSetupComp { instrument };\r
+ ZoneLayoutComponent zoneLayoutComp { instrument, colourPicker};\r
\r
- MPESynthesiser synth;\r
- MidiMessageCollector midiCollector;\r
+ MPESynthesiser synth { instrument };\r
+ MPEKeyboardComponent keyboardComponent { instrument, MPEKeyboardComponent::horizontalKeyboard };\r
\r
+ //==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPEDemo)\r
};\r
add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c")
set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c" PROPERTIES COMPILE_FLAGS "-Wno-sign-conversion -Wno-gnu-statement-expression")
-add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.4]] [[-DJUCE_APP_VERSION_HEX=0x60104]])
+add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]])
include_directories( AFTER
"../../../JuceLibraryCode"
enable_language(ASM)
if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
- add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.4]] [[-DJUCE_APP_VERSION_HEX=0x60104]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
+ add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
- add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.4]] [[-DJUCE_APP_VERSION_HEX=0x60104]] [[-DNDEBUG=1]])
+ add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]] [[-DNDEBUG=1]])
else()
message( FATAL_ERROR "No matching build-configuration found." )
endif()
"../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp"
"../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h"
"../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h"
+ "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp"
+ "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h"
"../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"
"../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"
+ "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp"
+ "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h"
"../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp"
"../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm"
"../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h"
"../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h"
+ "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp"
+ "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h"
"../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h"
"../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h"
+ "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h"
"../../../../../modules/juce_video/native/juce_mac_CameraDevice.h"
"../../../../../modules/juce_video/native/juce_mac_Video.h"
"../../../../../modules/juce_video/native/juce_win32_CameraDevice.h"
+ "../../../../../modules/juce_video/native/juce_win32_ComTypes.h"
"../../../../../modules/juce_video/native/juce_win32_Video.h"
"../../../../../modules/juce_video/playback/juce_VideoComponent.cpp"
"../../../../../modules/juce_video/playback/juce_VideoComponent.h"
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_ComTypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/playback/juce_VideoComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/playback/juce_VideoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="6.1.4"
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="6.1.5"
package="com.rmsl.jucedemorunner">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
android:xlargeScreens="true"/>
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.4" "-DJUCE_APP_VERSION_HEX=0x60104" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := DemoRunner
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.4" "-DJUCE_APP_VERSION_HEX=0x60104" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := DemoRunner
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=6.1.4",
- "JUCE_APP_VERSION_HEX=0x60104",
+ "JUCE_APP_VERSION=6.1.5",
+ "JUCE_APP_VERSION_HEX=0x60105",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=6.1.4",
- "JUCE_APP_VERSION_HEX=0x60104",
+ "JUCE_APP_VERSION=6.1.5",
+ "JUCE_APP_VERSION_HEX=0x60105",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>6.1.4</string>\r
+ <string>6.1.5</string>\r
<key>CFBundleVersion</key>\r
- <string>6.1.4</string>\r
+ <string>6.1.5</string>\r
<key>NSHumanReadableCopyright</key>\r
<string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
<key>NSHighResolutionCapable</key>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+ <Filter>JUCE Modules\juce_video\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,4,0\r
+FILEVERSION 6,1,5,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0"\r
VALUE "FileDescription", "DemoRunner\0"\r
- VALUE "FileVersion", "6.1.4\0"\r
+ VALUE "FileVersion", "6.1.5\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "6.1.4\0"\r
+ VALUE "ProductVersion", "6.1.5\0"\r
END\r
END\r
\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+ <Filter>JUCE Modules\juce_video\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,4,0\r
+FILEVERSION 6,1,5,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0"\r
VALUE "FileDescription", "DemoRunner\0"\r
- VALUE "FileVersion", "6.1.4\0"\r
+ VALUE "FileVersion", "6.1.5\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "6.1.4\0"\r
+ VALUE "ProductVersion", "6.1.5\0"\r
END\r
END\r
\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+ <Filter>JUCE Modules\juce_video\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,4,0\r
+FILEVERSION 6,1,5,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0"\r
VALUE "FileDescription", "DemoRunner\0"\r
- VALUE "FileVersion", "6.1.4\0"\r
+ VALUE "FileVersion", "6.1.5\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "6.1.4\0"\r
+ VALUE "ProductVersion", "6.1.5\0"\r
END\r
END\r
\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+ <Filter>JUCE Modules\juce_video\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,4,0\r
+FILEVERSION 6,1,5,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0"\r
VALUE "FileDescription", "DemoRunner\0"\r
- VALUE "FileVersion", "6.1.4\0"\r
+ VALUE "FileVersion", "6.1.5\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "6.1.4\0"\r
+ VALUE "ProductVersion", "6.1.5\0"\r
END\r
END\r
\r
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_IPHONE_5BC26AE3=1",
- "JUCE_APP_VERSION=6.1.4",
- "JUCE_APP_VERSION_HEX=0x60104",
+ "JUCE_APP_VERSION=6.1.5",
+ "JUCE_APP_VERSION_HEX=0x60105",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_IPHONE_5BC26AE3=1",
- "JUCE_APP_VERSION=6.1.4",
- "JUCE_APP_VERSION_HEX=0x60104",
+ "JUCE_APP_VERSION=6.1.5",
+ "JUCE_APP_VERSION_HEX=0x60105",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>6.1.4</string>\r
+ <string>6.1.5</string>\r
<key>CFBundleVersion</key>\r
- <string>6.1.4</string>\r
+ <string>6.1.5</string>\r
<key>NSHumanReadableCopyright</key>\r
<string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
<key>NSHighResolutionCapable</key>\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT name="DemoRunner" projectType="guiapp" defines="JUCE_DEMO_RUNNER=1 JUCE_UNIT_TESTS=1"\r
- bundleIdentifier="com.rmsl.jucedemorunner" version="6.1.4" companyName="Raw Material Software Limited"\r
+ bundleIdentifier="com.rmsl.jucedemorunner" version="6.1.5" companyName="Raw Material Software Limited"\r
companyCopyright="Copyright (c) 2020 - Raw Material Software Limited"\r
companyWebsite="https://www.juce.com/" companyEmail="info@juce.com"\r
id="yj7xMM" reportAppUsage="0" useAppConfig="0" addUsingNamespaceToJuceHeader="1"\r
{\r
const char* const projectName = "DemoRunner";\r
const char* const companyName = "Raw Material Software Limited";\r
- const char* const versionString = "6.1.4";\r
- const int versionNumber = 0x60104;\r
+ const char* const versionString = "6.1.5";\r
+ const int versionNumber = 0x60105;\r
}\r
#endif\r
ButtonsComponent()\r
{\r
addAndMakeVisible (radioButtons);\r
+\r
+ textButton.setHasFocusOutline (true);\r
addAndMakeVisible (textButton);\r
\r
shapeButton.setShape (getJUCELogoPath(), false, true, false);\r
shapeButton.onClick = [] { AlertWindow::showMessageBoxAsync (MessageBoxIconType::InfoIcon, "Alert", "This is an AlertWindow"); };\r
+ shapeButton.setHasFocusOutline (true);\r
addAndMakeVisible (shapeButton);\r
}\r
\r
{\r
b.setRadioGroupId (1);\r
b.setButtonText ("Button " + String (index++));\r
+ b.setHasFocusOutline (true);\r
addAndMakeVisible (b);\r
}\r
\r
{ "Ignored", AccessibilityRole::ignored },\r
{ "Unspecified", AccessibilityRole::unspecified },\r
{ "Button", AccessibilityRole::button },\r
+ { "Toggle", AccessibilityRole::toggleButton },\r
{ "ComboBox", AccessibilityRole::comboBox },\r
{ "Slider", AccessibilityRole::slider },\r
{ "Static Text", AccessibilityRole::staticText },\r
struct CustomComponent : public PopupMenu::CustomComponent\r
{\r
CustomComponent (int widthIn, int heightIn, Colour backgroundIn)\r
- : idealWidth (widthIn), idealHeight (heightIn), background (backgroundIn)\r
+ : PopupMenu::CustomComponent (false),\r
+ idealWidth (widthIn),\r
+ idealHeight (heightIn),\r
+ background (backgroundIn)\r
{}\r
\r
void getIdealSize (int& width, int& height) override\r
{\r
auto header = std::make_unique<TableHeaderComponent>();\r
header->addColumn ("Message", messageColumn, 200, 30, -1, TableHeaderComponent::notSortable);\r
+ header->addColumn ("Time", timeColumn, 100, 30, -1, TableHeaderComponent::notSortable);\r
header->addColumn ("Channel", channelColumn, 100, 30, -1, TableHeaderComponent::notSortable);\r
header->addColumn ("Data", dataColumn, 200, 30, -1, TableHeaderComponent::notSortable);\r
return header;\r
enum\r
{\r
messageColumn = 1,\r
+ timeColumn,\r
channelColumn,\r
dataColumn\r
};\r
switch (columnId)\r
{\r
case messageColumn: return getEventString (message);\r
+ case timeColumn: return String (message.getTimeStamp());\r
case channelColumn: return String (message.getChannel());\r
case dataColumn: return getDataString (message);\r
default: break;\r
MidiLoggerPluginDemoProcessor()\r
: AudioProcessor (getBusesLayout())\r
{\r
- state.addChild ({ "uiState", { { "width", 500 }, { "height", 300 } }, {} }, -1, nullptr);\r
+ state.addChild ({ "uiState", { { "width", 600 }, { "height", 300 } }, {} }, -1, nullptr);\r
startTimerHz (60);\r
}\r
\r
namespace juce\r
{\r
\r
-bool operator== (const MPEZoneLayout& a, const MPEZoneLayout& b)\r
-{\r
- if (a.getLowerZone() != b.getLowerZone())\r
- return false;\r
-\r
- if (a.getUpperZone() != b.getUpperZone())\r
- return false;\r
-\r
- return true;\r
-}\r
-\r
-bool operator!= (const MPEZoneLayout& a, const MPEZoneLayout& b)\r
-{\r
- return ! (a == b);\r
-}\r
-\r
template<>\r
struct VariantConverter<LoopMode>\r
{\r
enable_language(ASM)
if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
- add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
+ add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
- add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
+ add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
else()
message( FATAL_ERROR "No matching build-configuration found." )
endif()
"../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp"
"../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h"
"../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h"
+ "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp"
+ "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h"
"../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"
"../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"
+ "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp"
+ "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h"
"../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp"
"../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm"
"../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h"
"../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h"
+ "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp"
+ "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h"
"../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h"
"../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h"
+ "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h"
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
apply plugin: 'com.android.application'
android {
- compileSdkVersion 29
+ compileSdkVersion 30
externalNativeBuild {
cmake {
path "CMakeLists.txt"
defaultConfig {
applicationId "com.juce.audioperformancetest"
minSdkVersion 23
- targetSdkVersion 29
+ targetSdkVersion 30
externalNativeBuild {
cmake {
arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_PLATFORM=android-23", "-DANDROID_STL=c++_static", "-DANDROID_CPP_FEATURES=exceptions rtti", "-DANDROID_ARM_MODE=arm", "-DANDROID_ARM_NEON=TRUE", "-DCMAKE_CXX_STANDARD=14", "-DCMAKE_CXX_EXTENSIONS=OFF"
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := AudioPerformanceTest
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := AudioPerformanceTest
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
reportAppUsage="0" companyCopyright="Raw Material Software Limited"\r
useAppConfig="0" addUsingNamespaceToJuceHeader="1" jucerFormatVersion="1">\r
<EXPORTFORMATS>\r
- <XCODE_MAC targetFolder="Builds/MacOSX" rtasFolder="~/SDKs/PT_80_SDK" objCExtraSuffix="M73TRi"\r
- smallIcon="c97aUr" bigIcon="c97aUr" microphonePermissionNeeded="1"\r
- sendAppleEventsPermissionNeeded="1" sendAppleEventsPermissionText="This is required for some third-party plug-ins to function correctly."\r
+ <XCODE_MAC targetFolder="Builds/MacOSX" smallIcon="c97aUr" bigIcon="c97aUr"\r
+ microphonePermissionNeeded="1" sendAppleEventsPermissionNeeded="1"\r
+ sendAppleEventsPermissionText="This is required for some third-party plug-ins to function correctly."\r
customXcodeResourceFolders="../../examples/Assets" applicationCategory="public.app-category.developer-tools">\r
<CONFIGURATIONS>\r
<CONFIGURATION name="Debug" isDebug="1" targetName="AudioPluginHost" recommendedWarnings="LLVM"/>\r
enable_language(ASM)
if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
- add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
+ add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
- add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
+ add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
if(NOT (ANDROID_ABI STREQUAL "mips" OR ANDROID_ABI STREQUAL "mips64"))
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto")
"../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp"
"../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h"
"../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h"
+ "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp"
+ "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h"
"../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"
"../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"
+ "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp"
+ "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h"
"../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp"
"../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm"
"../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h"
"../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h"
+ "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp"
+ "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h"
"../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h"
"../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h"
+ "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h"
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
apply plugin: 'com.android.application'
android {
- compileSdkVersion 29
+ compileSdkVersion 30
externalNativeBuild {
cmake {
path "CMakeLists.txt"
defaultConfig {
applicationId "com.juce.pluginhost"
minSdkVersion 23
- targetSdkVersion 29
+ targetSdkVersion 30
externalNativeBuild {
cmake {
arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_PLATFORM=android-23", "-DANDROID_STL=c++_static", "-DANDROID_CPP_FEATURES=exceptions rtti", "-DANDROID_ARM_MODE=arm", "-DANDROID_ARM_NEON=TRUE", "-DCMAKE_CXX_STANDARD=14", "-DCMAKE_CXX_EXTENSIONS=OFF"
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := AudioPluginHost
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := AudioPluginHost
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
companyCopyright="Raw Material Software Limited" useAppConfig="0"\r
addUsingNamespaceToJuceHeader="1" jucerFormatVersion="1">\r
<EXPORTFORMATS>\r
- <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"\r
- objCExtraSuffix="OeJtJb" applicationCategory="public.app-category.developer-tools">\r
+ <XCODE_MAC targetFolder="Builds/MacOSX" applicationCategory="public.app-category.developer-tools">\r
<CONFIGURATIONS>\r
<CONFIGURATION name="Debug" isDebug="1" targetName="BinaryBuilder"/>\r
<CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="BinaryBuilder"/>\r
<MODULEPATH id="juce_core" path="../../modules"/>\r
</MODULEPATHS>\r
</XCODE_MAC>\r
- <LINUX_MAKE targetFolder="Builds/LinuxMakefile" vstFolder="~/SDKs/vstsdk2.4">\r
+ <LINUX_MAKE targetFolder="Builds/LinuxMakefile">\r
<CONFIGURATIONS>\r
<CONFIGURATION name="Debug" isDebug="1" targetName="BinaryBuilder"/>\r
<CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="BinaryBuilder"/>\r
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_CONSOLEAPP := BinaryBuilder
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_CONSOLEAPP := BinaryBuilder
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_core=1",
"JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
"JUCE_STANDALONE_APPLICATION=1",
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_core=1",
"JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
"JUCE_STANDALONE_APPLICATION=1",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
$<$<CONFIG:Release>:$<IF:$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","MSVC">,-GL,-flto>>)
target_link_libraries(juce_recommended_lto_flags INTERFACE
$<$<CONFIG:Release>:$<$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","MSVC">:-LTCG>>)
-elseif((CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
- OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
- OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"))
+elseif((NOT MINGW) AND ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+ OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
+ OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")))
target_compile_options(juce_recommended_lto_flags INTERFACE $<$<CONFIG:Release>:-flto>)
target_link_libraries(juce_recommended_lto_flags INTERFACE $<$<CONFIG:Release>:-flto>)
endif()
target_compile_definitions(${module_name} INTERFACE LINUX=1)
endif()
+ if((${module_name} STREQUAL "juce_audio_devices") AND (CMAKE_SYSTEM_NAME STREQUAL "Android"))
+ add_subdirectory("${module_path}/native/oboe")
+ target_link_libraries(${module_name} INTERFACE oboe)
+ endif()
+
+ if((${module_name} STREQUAL "juce_opengl") AND (CMAKE_SYSTEM_NAME STREQUAL "Android"))
+ set(platform_supports_gl3 0)
+
+ if(CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 18)
+ set(platform_supports_gl3 1)
+ endif()
+
+ if(platform_supports_gl3)
+ target_compile_definitions(${module_name} INTERFACE JUCE_ANDROID_GL_ES_VERSION_3_0=1)
+ endif()
+
+ target_link_libraries(${module_name} INTERFACE EGL $<IF:${platform_supports_gl3},GLESv3,GLESv2>)
+ endif()
+
_juce_extract_metadata_block(JUCE_MODULE_DECLARATION "${module_path}/${module_header_name}" metadata_dict)
_juce_get_metadata("${metadata_dict}" minimumCppStandard module_cpp_standard)
\r
ID: juce_build_tools\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE Build Tools\r
description: Classes for generating intermediate files for JUCE projects.\r
website: http://www.juce.com/juce\r
# environment variables, which is unfortunate because we really don't want to cross-compile
# juceaide. If you really want to set the compilers for juceaide, pass the appropriate
# CMAKE_<lang>_COMPILER flags when configuring CMake.
- unset(ENV{ASM})
- unset(ENV{CC})
- unset(ENV{CXX})
+ if((CMAKE_SYSTEM_NAME STREQUAL "Android") OR (CMAKE_SYSTEM_NAME STREQUAL "iOS"))
+ unset(ENV{ASM})
+ unset(ENV{CC})
+ unset(ENV{CXX})
+ endif()
message(STATUS "Configuring juceaide")
- # Looks like we're boostrapping, reinvoke CMake
+ # Looks like we're bootstrapping, reinvoke CMake
execute_process(COMMAND "${CMAKE_COMMAND}"
"."
"-B${JUCE_BINARY_DIR}/tools"
"-G${CMAKE_GENERATOR}"
+ "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}"
"-DCMAKE_BUILD_TYPE=Debug"
"-DJUCE_BUILD_HELPER_TOOLS=ON"
"-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"
enable_language(ASM)
if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
- add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEBUG=0]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
+ add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEBUG=0]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
- add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
+ add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
else()
message( FATAL_ERROR "No matching build-configuration found." )
endif()
"../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp"
"../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h"
"../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h"
+ "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp"
+ "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h"
"../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"
"../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"
+ "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp"
+ "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h"
"../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp"
"../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm"
"../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h"
"../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h"
+ "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp"
+ "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h"
"../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp"
"../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h"
"../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h"
+ "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h"
"../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h"
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
apply plugin: 'com.android.application'
android {
- compileSdkVersion 29
+ compileSdkVersion 30
externalNativeBuild {
cmake {
path "CMakeLists.txt"
defaultConfig {
applicationId "com.juce.networkgraphicsdemo"
minSdkVersion 16
- targetSdkVersion 29
+ targetSdkVersion 30
externalNativeBuild {
cmake {
arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_PLATFORM=android-16", "-DANDROID_STL=c++_static", "-DANDROID_CPP_FEATURES=exceptions rtti", "-DANDROID_ARM_MODE=arm", "-DANDROID_ARM_NEON=TRUE", "-DCMAKE_CXX_STANDARD=14", "-DCMAKE_CXX_EXTENSIONS=OFF"
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.4" "-DJUCE_APP_VERSION_HEX=0x60104" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := Projucer
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.4" "-DJUCE_APP_VERSION_HEX=0x60104" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_APP := Projucer
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>6.1.4</string>\r
+ <string>6.1.5</string>\r
<key>CFBundleVersion</key>\r
- <string>6.1.4</string>\r
+ <string>6.1.5</string>\r
<key>NSHumanReadableCopyright</key>\r
<string>Raw Material Software Limited</string>\r
<key>NSHighResolutionCapable</key>\r
210CD22F25F2C22F9CEEB025 /* AVFoundation.framework */ /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
21F4833C5B5C17B159B956F3 /* juce_events */ /* juce_events */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_events; path = ../../../../modules/juce_events; sourceTree = SOURCE_ROOT; };
233C7FC5157176DB33FE2F27 /* RecentFilesMenuTemplate.nib */ /* RecentFilesMenuTemplate.nib */ = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = ../../../Build/CMake/RecentFilesMenuTemplate.nib; sourceTree = SOURCE_ROOT; };
- 234251407CD1A499D8A816BB /* jucer_ValueWithDefaultWrapper.h */ /* jucer_ValueWithDefaultWrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ValueWithDefaultWrapper.h; path = ../../Source/Utility/Helpers/jucer_ValueWithDefaultWrapper.h; sourceTree = SOURCE_ROOT; };
23A8DE16C0CDB8EED18B008B /* jucer_CommandIDs.h */ /* jucer_CommandIDs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_CommandIDs.h; path = ../../Source/Application/jucer_CommandIDs.h; sourceTree = SOURCE_ROOT; };
23D79A22569BEDF63B57DD36 /* jucer_CodeHelpers.h */ /* jucer_CodeHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_CodeHelpers.h; path = ../../Source/Utility/Helpers/jucer_CodeHelpers.h; sourceTree = SOURCE_ROOT; };
247768B490B9D759DDA79359 /* jucer_UserAvatarComponent.h */ /* jucer_UserAvatarComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_UserAvatarComponent.h; path = ../../Source/Project/UI/jucer_UserAvatarComponent.h; sourceTree = SOURCE_ROOT; };
58F1FF52E887887A93E84FC2,
6FD8DBC0FF42C87D8BEE2452,
00515BA4EC5A7D4DC078ED37,
- 234251407CD1A499D8A816BB,
FF3A6A384D536E1AEF47CD54,
C16F9F479A3A5F6DAD7647A2,
);
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_build_tools=1",
"JUCE_MODULE_AVAILABLE_juce_core=1",
"JUCE_MODULE_AVAILABLE_juce_cryptography=1",
"JUCE_WEB_BROWSER=0",
"JUCE_STANDALONE_APPLICATION=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=6.1.4",
- "JUCE_APP_VERSION_HEX=0x60104",
+ "JUCE_APP_VERSION=6.1.5",
+ "JUCE_APP_VERSION_HEX=0x60105",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_build_tools=1",
"JUCE_MODULE_AVAILABLE_juce_core=1",
"JUCE_MODULE_AVAILABLE_juce_cryptography=1",
"JUCE_WEB_BROWSER=0",
"JUCE_STANDALONE_APPLICATION=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=6.1.4",
- "JUCE_APP_VERSION_HEX=0x60104",
+ "JUCE_APP_VERSION=6.1.5",
+ "JUCE_APP_VERSION_HEX=0x60105",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_PresetIDs.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_TranslationHelpers.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
- <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h"/>\r
<ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h">\r
<Filter>Projucer\Utility\Helpers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h">\r
- <Filter>Projucer\Utility\Helpers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h">\r
<Filter>Projucer\Utility\Helpers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,4,0\r
+FILEVERSION 6,1,5,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Raw Material Software Limited\0"\r
VALUE "FileDescription", "Projucer\0"\r
- VALUE "FileVersion", "6.1.4\0"\r
+ VALUE "FileVersion", "6.1.5\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "6.1.4\0"\r
+ VALUE "ProductVersion", "6.1.5\0"\r
END\r
END\r
\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_PresetIDs.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_TranslationHelpers.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
- <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h"/>\r
<ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h">\r
<Filter>Projucer\Utility\Helpers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h">\r
- <Filter>Projucer\Utility\Helpers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h">\r
<Filter>Projucer\Utility\Helpers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,4,0\r
+FILEVERSION 6,1,5,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Raw Material Software Limited\0"\r
VALUE "FileDescription", "Projucer\0"\r
- VALUE "FileVersion", "6.1.4\0"\r
+ VALUE "FileVersion", "6.1.5\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "6.1.4\0"\r
+ VALUE "ProductVersion", "6.1.5\0"\r
END\r
END\r
\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_PresetIDs.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_TranslationHelpers.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
- <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h"/>\r
<ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h">\r
<Filter>Projucer\Utility\Helpers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h">\r
- <Filter>Projucer\Utility\Helpers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h">\r
<Filter>Projucer\Utility\Helpers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,4,0\r
+FILEVERSION 6,1,5,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Raw Material Software Limited\0"\r
VALUE "FileDescription", "Projucer\0"\r
- VALUE "FileVersion", "6.1.4\0"\r
+ VALUE "FileVersion", "6.1.5\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "6.1.4\0"\r
+ VALUE "ProductVersion", "6.1.5\0"\r
END\r
END\r
\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_PresetIDs.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_TranslationHelpers.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
- <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h"/>\r
<ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h">\r
<Filter>Projucer\Utility\Helpers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h">\r
- <Filter>Projucer\Utility\Helpers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h">\r
<Filter>Projucer\Utility\Helpers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 6,1,4,0\r
+FILEVERSION 6,1,5,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "Raw Material Software Limited\0"\r
VALUE "LegalCopyright", "Raw Material Software Limited\0"\r
VALUE "FileDescription", "Projucer\0"\r
- VALUE "FileVersion", "6.1.4\0"\r
+ VALUE "FileVersion", "6.1.5\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "6.1.4\0"\r
+ VALUE "ProductVersion", "6.1.5\0"\r
END\r
END\r
\r
{\r
const char* const projectName = "Projucer";\r
const char* const companyName = "Raw Material Software Limited";\r
- const char* const versionString = "6.1.4";\r
- const int versionNumber = 0x60104;\r
+ const char* const versionString = "6.1.5";\r
+ const int versionNumber = 0x60105;\r
}\r
#endif\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce"\r
- version="6.1.4" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
+ version="6.1.5" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
displaySplashScreen="0" reportAppUsage="0" companyName="Raw Material Software Limited"\r
companyCopyright="Raw Material Software Limited" useAppConfig="0"\r
addUsingNamespaceToJuceHeader="1" jucerFormatVersion="1">\r
<EXPORTFORMATS>\r
- <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"\r
- documentExtensions=".jucer" objCExtraSuffix="zkVtji" bigIcon="Zrx1Gl"\r
+ <XCODE_MAC targetFolder="Builds/MacOSX" documentExtensions=".jucer" bigIcon="Zrx1Gl"\r
extraFrameworks="AudioUnit; Accelerate; AVFoundation; CoreAudio; CoreAudioKit; CoreMIDI; DiscRecording; QuartzCore; AudioToolbox; OpenGL; QTKit; QuickTime"\r
microphonePermissionNeeded="1" cameraPermissionNeeded="1" smallIcon="Zrx1Gl"\r
applicationCategory="public.app-category.developer-tools">\r
file="Source/Utility/Helpers/jucer_TranslationHelpers.h"/>\r
<FILE id="EuC4K4" name="jucer_ValueSourceHelpers.h" compile="0" resource="0"\r
file="Source/Utility/Helpers/jucer_ValueSourceHelpers.h"/>\r
- <FILE id="W5a5Fy" name="jucer_ValueWithDefaultWrapper.h" compile="0"\r
- resource="0" file="Source/Utility/Helpers/jucer_ValueWithDefaultWrapper.h"/>\r
<FILE id="BPCoKV" name="jucer_VersionInfo.cpp" compile="1" resource="0"\r
file="Source/Utility/Helpers/jucer_VersionInfo.cpp"/>\r
<FILE id="TnBQtv" name="jucer_VersionInfo.h" compile="0" resource="0"\r
"which may simplify the includes in the project.");\r
\r
props.add (new ChoicePropertyComponent (addUsingNamespaceToJuceHeader, "Add \"using namespace juce\" to JuceHeader.h"),\r
- "If enabled, the JuceHeader.h will include a \"using namepace juce\" statement. If disabled, "\r
+ "If enabled, the JuceHeader.h will include a \"using namespace juce\" statement. If disabled, "\r
"no such statement will be included. This setting used to be enabled by default, but it "\r
"is recommended to leave it disabled for new projects.");\r
\r
androidGradleSettingsContent (settings, Ids::androidGradleSettingsContent, getUndoManager()),\r
androidVersionCode (settings, Ids::androidVersionCode, getUndoManager(), "1"),\r
androidMinimumSDK (settings, Ids::androidMinimumSDK, getUndoManager(), "16"),\r
- androidTargetSDK (settings, Ids::androidTargetSDK, getUndoManager(), "29"),\r
+ androidTargetSDK (settings, Ids::androidTargetSDK, getUndoManager(), "30"),\r
androidTheme (settings, Ids::androidTheme, getUndoManager()),\r
androidExtraAssetsFolder (settings, Ids::androidExtraAssetsFolder, getUndoManager()),\r
androidOboeRepositoryPath (settings, Ids::androidOboeRepositoryPath, getUndoManager()),\r
{ "Developer Tools", "developer-tools" },\r
{ "Education", "education" },\r
{ "Entertainment", "entertainment" },\r
- { "Finace", "finance" },\r
+ { "Finance", "finance" },\r
{ "Games", "games" },\r
{ "Games - Action", "action-games" },\r
{ "Games - Adventure", "adventure-games" },\r
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_CONSOLEAPP := UnitTestRunner
TARGET_ARCH :=
endif
- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
JUCE_TARGET_CONSOLEAPP := UnitTestRunner
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
- "JUCE_PROJUCER_VERSION=0x60104",
+ "JUCE_PROJUCER_VERSION=0x60105",
"JUCE_MODULE_AVAILABLE_juce_analytics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
"JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+ <Filter>JUCE Modules\juce_video\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+ <Filter>JUCE Modules\juce_video\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+ <Filter>JUCE Modules\juce_video\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader>NotUsing</PrecompiledHeader>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <ExcludedFromBuild>true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
<Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+ <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
<Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
<Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+ <Filter>JUCE Modules\juce_video\native</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
\r
ID: juce_analytics\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE analytics classes\r
description: Classes to collect analytics and send to destinations\r
website: http://www.juce.com/juce\r
cpuUsageProportion = 0;\r
xruns = 0;\r
\r
+ samplesPerBlock = blockSize;\r
+\r
if (sampleRate > 0.0 && blockSize > 0)\r
{\r
msPerSample = 1000.0 / sampleRate;\r
AudioProcessLoadMeasurer::ScopedTimer::ScopedTimer (AudioProcessLoadMeasurer& p, int numSamplesInBlock)\r
: owner (p), startTime (Time::getMillisecondCounterHiRes()), samplesInBlock (numSamplesInBlock)\r
{\r
+ // numSamplesInBlock should never be zero. Did you remember to call AudioProcessLoadMeasurer::reset(),\r
+ // passing the expected samples per block?\r
+ jassert (numSamplesInBlock);\r
}\r
\r
AudioProcessLoadMeasurer::ScopedTimer::~ScopedTimer()\r
#define JUCE_BEGIN_VEC_OP \\r
using Mode = FloatVectorHelpers::ModeType<sizeof(*dest)>::Mode; \\r
{ \\r
- const int numLongOps = num / Mode::numParallel;\r
+ const auto numLongOps = num / Mode::numParallel;\r
\r
#define JUCE_FINISH_VEC_OP(normalOp) \\r
num &= (Mode::numParallel - 1); \\r
if (num == 0) return; \\r
} \\r
- for (int i = 0; i < num; ++i) normalOp;\r
+ for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
\r
#define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \\r
JUCE_BEGIN_VEC_OP \\r
using Mode = FloatVectorHelpers::ModeType<sizeof(*dest)>::Mode; \\r
if (Mode::numParallel > 1) \\r
{ \\r
- const int numLongOps = num / Mode::numParallel;\r
+ const auto numLongOps = num / Mode::numParallel;\r
\r
#define JUCE_FINISH_VEC_OP(normalOp) \\r
num &= (Mode::numParallel - 1); \\r
if (num == 0) return; \\r
} \\r
- for (int i = 0; i < num; ++i) normalOp;\r
+ for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
\r
#define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \\r
JUCE_BEGIN_VEC_OP \\r
//==============================================================================\r
#else\r
#define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \\r
- for (int i = 0; i < num; ++i) normalOp;\r
+ for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
\r
#define JUCE_PERFORM_VEC_OP_SRC_DEST(normalOp, vecOp, locals, increment, setupOp) \\r
- for (int i = 0; i < num; ++i) normalOp;\r
+ for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
\r
#define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST(normalOp, vecOp, locals, increment, setupOp) \\r
- for (int i = 0; i < num; ++i) normalOp;\r
+ for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
\r
#define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST(normalOp, vecOp, locals, increment, setupOp) \\r
- for (int i = 0; i < num; ++i) normalOp;\r
+ for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
\r
#endif\r
\r
//==============================================================================\r
#define JUCE_VEC_LOOP(vecOp, srcLoad, dstLoad, dstStore, locals, increment) \\r
- for (int i = 0; i < numLongOps; ++i) \\r
+ for (auto i = (decltype (numLongOps)) 0; i < numLongOps; ++i) \\r
{ \\r
locals (srcLoad, dstLoad); \\r
dstStore (dest, vecOp); \\r
}\r
\r
#define JUCE_VEC_LOOP_TWO_SOURCES(vecOp, src1Load, src2Load, dstStore, locals, increment) \\r
- for (int i = 0; i < numLongOps; ++i) \\r
+ for (auto i = (decltype (numLongOps)) 0; i < numLongOps; ++i) \\r
{ \\r
locals (src1Load, src2Load); \\r
dstStore (dest, vecOp); \\r
}\r
\r
#define JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD(vecOp, src1Load, src2Load, dstLoad, dstStore, locals, increment) \\r
- for (int i = 0; i < numLongOps; ++i) \\r
+ for (auto i = (decltype (numLongOps)) 0; i < numLongOps; ++i) \\r
{ \\r
locals (src1Load, src2Load, dstLoad); \\r
dstStore (dest, vecOp); \\r
using Type = typename Mode::Type;\r
using ParallelType = typename Mode::ParallelType;\r
\r
- static Type findMinOrMax (const Type* src, int num, const bool isMinimum) noexcept\r
+ template <typename Size>\r
+ static Type findMinOrMax (const Type* src, Size num, const bool isMinimum) noexcept\r
{\r
- int numLongOps = num / Mode::numParallel;\r
+ auto numLongOps = num / Mode::numParallel;\r
\r
if (numLongOps > 1)\r
{\r
num &= (Mode::numParallel - 1);\r
src += Mode::numParallel;\r
\r
- for (int i = 0; i < num; ++i)\r
+ for (auto i = (decltype (num)) 0; i < num; ++i)\r
result = isMinimum ? jmin (result, src[i])\r
: jmax (result, src[i]);\r
\r
return result;\r
}\r
\r
- return isMinimum ? juce::findMinimum (src, num)\r
- : juce::findMaximum (src, num);\r
+ if (num <= 0)\r
+ return 0;\r
+\r
+ return isMinimum ? *std::min_element (src, src + num)\r
+ : *std::max_element (src, src + num);\r
}\r
\r
- static Range<Type> findMinAndMax (const Type* src, int num) noexcept\r
+ template <typename Size>\r
+ static Range<Type> findMinAndMax (const Type* src, Size num) noexcept\r
{\r
- int numLongOps = num / Mode::numParallel;\r
+ auto numLongOps = num / Mode::numParallel;\r
\r
if (numLongOps > 1)\r
{\r
num &= (Mode::numParallel - 1);\r
src += Mode::numParallel;\r
\r
- for (int i = 0; i < num; ++i)\r
+ for (auto i = (decltype (num)) 0; i < num; ++i)\r
result = result.getUnionWith (src[i]);\r
\r
return result;\r
}\r
};\r
#endif\r
-}\r
\r
//==============================================================================\r
namespace\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- // This casts away constness to account for slightly different vDSP function signatures\r
- // in OSX 10.8 SDK and below. Can be safely removed once those SDKs are obsolete.\r
- template <typename ValueType>\r
- ValueType* osx108sdkCompatibilityCast (const ValueType* arg) noexcept { return const_cast<ValueType*> (arg); }\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void clear (float* dest, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vclr (dest, 1, (vDSP_Length) num);\r
+ #else\r
+ zeromem (dest, (size_t) num * sizeof (float));\r
+ #endif\r
+ }\r
\r
-//==============================================================================\r
-void JUCE_CALLTYPE FloatVectorOperations::clear (float* dest, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vclr (dest, 1, (size_t) num);\r
- #else\r
- zeromem (dest, (size_t) num * sizeof (float));\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void clear (double* dest, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vclrD (dest, 1, (vDSP_Length) num);\r
+ #else\r
+ zeromem (dest, (size_t) num * sizeof (double));\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::clear (double* dest, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vclrD (dest, 1, (size_t) num);\r
- #else\r
- zeromem (dest, (size_t) num * sizeof (double));\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void fill (float* dest, float valueToFill, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vfill (&valueToFill, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill,\r
+ val,\r
+ JUCE_LOAD_NONE,\r
+ const Mode::ParallelType val = Mode::load1 (valueToFill);)\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::fill (float* dest, float valueToFill, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vfill (&valueToFill, dest, 1, (size_t) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill, val, JUCE_LOAD_NONE,\r
- const Mode::ParallelType val = Mode::load1 (valueToFill);)\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void fill (double* dest, double valueToFill, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vfillD (&valueToFill, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill,\r
+ val,\r
+ JUCE_LOAD_NONE,\r
+ const Mode::ParallelType val = Mode::load1 (valueToFill);)\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::fill (double* dest, double valueToFill, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vfillD (&valueToFill, dest, 1, (size_t) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill, val, JUCE_LOAD_NONE,\r
- const Mode::ParallelType val = Mode::load1 (valueToFill);)\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void copyWithMultiply (float* dest, const float* src, float multiplier, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsmul (src, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier,\r
+ Mode::mul (mult, s),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::copy (float* dest, const float* src, int num) noexcept\r
-{\r
- memcpy (dest, src, (size_t) num * sizeof (float));\r
-}\r
+ template <typename Size>\r
+ void copyWithMultiply (double* dest, const double* src, double multiplier, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsmulD (src, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier,\r
+ Mode::mul (mult, s),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::copy (double* dest, const double* src, int num) noexcept\r
-{\r
- memcpy (dest, src, (size_t) num * sizeof (double));\r
-}\r
+ template <typename Size>\r
+ void add (float* dest, float amount, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsadd (dest, 1, &amount, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount,\r
+ Mode::add (d, amountToAdd),\r
+ JUCE_LOAD_DEST,\r
+ const Mode::ParallelType amountToAdd = Mode::load1 (amount);)\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::copyWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsmul (src, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void add (double* dest, double amount, Size num) noexcept\r
+ {\r
+ JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount,\r
+ Mode::add (d, amountToAdd),\r
+ JUCE_LOAD_DEST,\r
+ const Mode::ParallelType amountToAdd = Mode::load1 (amount);)\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::copyWithMultiply (double* dest, const double* src, double multiplier, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsmulD (src, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void add (float* dest, const float* src, float amount, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsadd (src, 1, &amount, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount,\r
+ Mode::add (am, s),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType am = Mode::load1 (amount);)\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, float amount, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsadd (dest, 1, &amount, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount, Mode::add (d, amountToAdd), JUCE_LOAD_DEST,\r
- const Mode::ParallelType amountToAdd = Mode::load1 (amount);)\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void add (double* dest, const double* src, double amount, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsaddD (src, 1, &amount, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount,\r
+ Mode::add (am, s),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType am = Mode::load1 (amount);)\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, double amount, int num) noexcept\r
-{\r
- JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount, Mode::add (d, amountToAdd), JUCE_LOAD_DEST,\r
- const Mode::ParallelType amountToAdd = Mode::load1 (amount);)\r
-}\r
+ template <typename Size>\r
+ void add (float* dest, const float* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vadd (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i],\r
+ Mode::add (d, s),\r
+ JUCE_LOAD_SRC_DEST,\r
+ JUCE_INCREMENT_SRC_DEST, )\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, const float* src, float amount, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsadd (osx108sdkCompatibilityCast (src), 1, &amount, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount, Mode::add (am, s),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType am = Mode::load1 (amount);)\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void add (double* dest, const double* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vaddD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i],\r
+ Mode::add (d, s),\r
+ JUCE_LOAD_SRC_DEST,\r
+ JUCE_INCREMENT_SRC_DEST, )\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, const double* src, double amount, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsaddD (osx108sdkCompatibilityCast (src), 1, &amount, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount, Mode::add (am, s),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType am = Mode::load1 (amount);)\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void add (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vadd (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i],\r
+ Mode::add (s1, s2),\r
+ JUCE_LOAD_SRC1_SRC2,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, const float* src, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vadd (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i], Mode::add (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void add (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vaddD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i],\r
+ Mode::add (s1, s2),\r
+ JUCE_LOAD_SRC1_SRC2,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, const double* src, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vaddD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i], Mode::add (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void subtract (float* dest, const float* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsub (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i],\r
+ Mode::sub (d, s),\r
+ JUCE_LOAD_SRC_DEST,\r
+ JUCE_INCREMENT_SRC_DEST, )\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, const float* src1, const float* src2, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vadd (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i], Mode::add (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void subtract (double* dest, const double* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsubD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i],\r
+ Mode::sub (d, s),\r
+ JUCE_LOAD_SRC_DEST,\r
+ JUCE_INCREMENT_SRC_DEST, )\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, const double* src1, const double* src2, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vaddD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i], Mode::add (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void subtract (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsub (src2, 1, src1, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i],\r
+ Mode::sub (s1, s2),\r
+ JUCE_LOAD_SRC1_SRC2,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::subtract (float* dest, const float* src, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsub (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i], Mode::sub (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void subtract (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsubD (src2, 1, src1, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i],\r
+ Mode::sub (s1, s2),\r
+ JUCE_LOAD_SRC1_SRC2,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::subtract (double* dest, const double* src, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsubD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i], Mode::sub (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void addWithMultiply (float* dest, const float* src, float multiplier, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsma (src, 1, &multiplier, dest, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier,\r
+ Mode::add (d, Mode::mul (mult, s)),\r
+ JUCE_LOAD_SRC_DEST,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::subtract (float* dest, const float* src1, const float* src2, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsub (src2, 1, src1, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i], Mode::sub (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void addWithMultiply (double* dest, const double* src, double multiplier, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsmaD (src, 1, &multiplier, dest, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier,\r
+ Mode::add (d, Mode::mul (mult, s)),\r
+ JUCE_LOAD_SRC_DEST,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::subtract (double* dest, const double* src1, const double* src2, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsubD (src2, 1, src1, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i], Mode::sub (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void addWithMultiply (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vma ((float*) src1, 1, (float*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i],\r
+ Mode::add (d, Mode::mul (s1, s2)),\r
+ JUCE_LOAD_SRC1_SRC2_DEST,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsma (src, 1, &multiplier, dest, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier, Mode::add (d, Mode::mul (mult, s)),\r
- JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void addWithMultiply (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vmaD ((double*) src1, 1, (double*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i],\r
+ Mode::add (d, Mode::mul (s1, s2)),\r
+ JUCE_LOAD_SRC1_SRC2_DEST,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (double* dest, const double* src, double multiplier, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsmaD (src, 1, &multiplier, dest, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier, Mode::add (d, Mode::mul (mult, s)),\r
- JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void subtractWithMultiply (float* dest, const float* src, float multiplier, Size num) noexcept\r
+ {\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i] * multiplier,\r
+ Mode::sub (d, Mode::mul (mult, s)),\r
+ JUCE_LOAD_SRC_DEST,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vma ((float*) src1, 1, (float*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i], Mode::add (d, Mode::mul (s1, s2)),\r
- JUCE_LOAD_SRC1_SRC2_DEST,\r
- JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void subtractWithMultiply (double* dest, const double* src, double multiplier, Size num) noexcept\r
+ {\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i] * multiplier,\r
+ Mode::sub (d, Mode::mul (mult, s)),\r
+ JUCE_LOAD_SRC_DEST,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept\r
-{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vmaD ((double*) src1, 1, (double*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i], Mode::add (d, Mode::mul (s1, s2)),\r
- JUCE_LOAD_SRC1_SRC2_DEST,\r
- JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
-}\r
+ template <typename Size>\r
+ void subtractWithMultiply (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+ {\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] -= src1[i] * src2[i],\r
+ Mode::sub (d, Mode::mul (s1, s2)),\r
+ JUCE_LOAD_SRC1_SRC2_DEST,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::subtractWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept\r
-{\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i] * multiplier, Mode::sub (d, Mode::mul (mult, s)),\r
- JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST,\r
+ template <typename Size>\r
+ void subtractWithMultiply (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+ {\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] -= src1[i] * src2[i],\r
+ Mode::sub (d, Mode::mul (s1, s2)),\r
+ JUCE_LOAD_SRC1_SRC2_DEST,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ }\r
+\r
+ template <typename Size>\r
+ void multiply (float* dest, const float* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vmul (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i],\r
+ Mode::mul (d, s),\r
+ JUCE_LOAD_SRC_DEST,\r
+ JUCE_INCREMENT_SRC_DEST, )\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void multiply (double* dest, const double* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vmulD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i],\r
+ Mode::mul (d, s),\r
+ JUCE_LOAD_SRC_DEST,\r
+ JUCE_INCREMENT_SRC_DEST, )\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void multiply (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vmul (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i],\r
+ Mode::mul (s1, s2),\r
+ JUCE_LOAD_SRC1_SRC2,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void multiply (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vmulD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i],\r
+ Mode::mul (s1, s2),\r
+ JUCE_LOAD_SRC1_SRC2,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void multiply (float* dest, float multiplier, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsmul (dest, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier,\r
+ Mode::mul (d, mult),\r
+ JUCE_LOAD_DEST,\r
const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
-}\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::subtractWithMultiply (double* dest, const double* src, double multiplier, int num) noexcept\r
-{\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i] * multiplier, Mode::sub (d, Mode::mul (mult, s)),\r
- JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST,\r
+ template <typename Size>\r
+ void multiply (double* dest, double multiplier, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vsmulD (dest, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier,\r
+ Mode::mul (d, mult),\r
+ JUCE_LOAD_DEST,\r
const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
-}\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::subtractWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept\r
-{\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] -= src1[i] * src2[i], Mode::sub (d, Mode::mul (s1, s2)),\r
- JUCE_LOAD_SRC1_SRC2_DEST,\r
- JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-}\r
+ template <typename Size>\r
+ void multiply (float* dest, const float* src, float multiplier, Size num) noexcept\r
+ {\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier,\r
+ Mode::mul (mult, s),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+ }\r
+\r
+ template <typename Size>\r
+ void multiply (double* dest, const double* src, double multiplier, Size num) noexcept\r
+ {\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier,\r
+ Mode::mul (mult, s),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+ }\r
+\r
+ template <typename Size>\r
+ void negate (float* dest, const float* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vneg ((float*) src, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ copyWithMultiply (dest, src, -1.0f, num);\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void negate (double* dest, const double* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vnegD ((double*) src, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ copyWithMultiply (dest, src, -1.0f, num);\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void abs (float* dest, const float* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vabs ((float*) src, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ FloatVectorHelpers::signMask32 signMask;\r
+ signMask.i = 0x7fffffffUL;\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = std::abs (src[i]),\r
+ Mode::bit_and (s, mask),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType mask = Mode::load1 (signMask.f);)\r
+\r
+ ignoreUnused (signMask);\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void abs (double* dest, const double* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vabsD ((double*) src, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ FloatVectorHelpers::signMask64 signMask;\r
+ signMask.i = 0x7fffffffffffffffULL;\r
+\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = std::abs (src[i]),\r
+ Mode::bit_and (s, mask),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType mask = Mode::load1 (signMask.d);)\r
+\r
+ ignoreUnused (signMask);\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void min (float* dest, const float* src, float comp, Size num) noexcept\r
+ {\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp),\r
+ Mode::min (s, cmp),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+ }\r
+\r
+ template <typename Size>\r
+ void min (double* dest, const double* src, double comp, Size num) noexcept\r
+ {\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp),\r
+ Mode::min (s, cmp),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+ }\r
+\r
+ template <typename Size>\r
+ void min (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vmin ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]),\r
+ Mode::min (s1, s2),\r
+ JUCE_LOAD_SRC1_SRC2,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void min (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vminD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]),\r
+ Mode::min (s1, s2),\r
+ JUCE_LOAD_SRC1_SRC2,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void max (float* dest, const float* src, float comp, Size num) noexcept\r
+ {\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp),\r
+ Mode::max (s, cmp),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+ }\r
+\r
+ template <typename Size>\r
+ void max (double* dest, const double* src, double comp, Size num) noexcept\r
+ {\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp),\r
+ Mode::max (s, cmp),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+ }\r
+\r
+ template <typename Size>\r
+ void max (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vmax ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]),\r
+ Mode::max (s1, s2),\r
+ JUCE_LOAD_SRC1_SRC2,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void max (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vmaxD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]),\r
+ Mode::max (s1, s2),\r
+ JUCE_LOAD_SRC1_SRC2,\r
+ JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void clip (float* dest, const float* src, float low, float high, Size num) noexcept\r
+ {\r
+ jassert (high >= low);\r
+\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vclip ((float*) src, 1, &low, &high, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low),\r
+ Mode::max (Mode::min (s, hi), lo),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType lo = Mode::load1 (low);\r
+ const Mode::ParallelType hi = Mode::load1 (high);)\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void clip (double* dest, const double* src, double low, double high, Size num) noexcept\r
+ {\r
+ jassert (high >= low);\r
+\r
+ #if JUCE_USE_VDSP_FRAMEWORK\r
+ vDSP_vclipD ((double*) src, 1, &low, &high, dest, 1, (vDSP_Length) num);\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low),\r
+ Mode::max (Mode::min (s, hi), lo),\r
+ JUCE_LOAD_SRC,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType lo = Mode::load1 (low);\r
+ const Mode::ParallelType hi = Mode::load1 (high);)\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ Range<float> findMinAndMax (const float* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+ return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinAndMax (src, num);\r
+ #else\r
+ return Range<float>::findMinAndMax (src, num);\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ Range<double> findMinAndMax (const double* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+ return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinAndMax (src, num);\r
+ #else\r
+ return Range<double>::findMinAndMax (src, num);\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ float findMinimum (const float* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+ return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinOrMax (src, num, true);\r
+ #else\r
+ return juce::findMinimum (src, num);\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ double findMinimum (const double* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+ return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinOrMax (src, num, true);\r
+ #else\r
+ return juce::findMinimum (src, num);\r
+ #endif\r
+ }\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::subtractWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept\r
+ template <typename Size>\r
+ float findMaximum (const float* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+ return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinOrMax (src, num, false);\r
+ #else\r
+ return juce::findMaximum (src, num);\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ double findMaximum (const double* src, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+ return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinOrMax (src, num, false);\r
+ #else\r
+ return juce::findMaximum (src, num);\r
+ #endif\r
+ }\r
+\r
+ template <typename Size>\r
+ void convertFixedToFloat (float* dest, const int* src, float multiplier, Size num) noexcept\r
+ {\r
+ #if JUCE_USE_ARM_NEON\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = (float) src[i] * multiplier,\r
+ vmulq_n_f32 (vcvtq_f32_s32 (vld1q_s32 (src)), multiplier),\r
+ JUCE_LOAD_NONE,\r
+ JUCE_INCREMENT_SRC_DEST, )\r
+ #else\r
+ JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = (float) src[i] * multiplier,\r
+ Mode::mul (mult, _mm_cvtepi32_ps (_mm_loadu_si128 (reinterpret_cast<const __m128i*> (src)))),\r
+ JUCE_LOAD_NONE,\r
+ JUCE_INCREMENT_SRC_DEST,\r
+ const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+ #endif\r
+ }\r
+\r
+} // namespace\r
+} // namespace FloatVectorHelpers\r
+\r
+//==============================================================================\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::clear (FloatType* dest,\r
+ CountType numValues) noexcept\r
{\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] -= src1[i] * src2[i], Mode::sub (d, Mode::mul (s1, s2)),\r
- JUCE_LOAD_SRC1_SRC2_DEST,\r
- JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+ FloatVectorHelpers::clear (dest, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::fill (FloatType* dest,\r
+ FloatType valueToFill,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vmul (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i], Mode::mul (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
- #endif\r
+ FloatVectorHelpers::fill (dest, valueToFill, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::copy (FloatType* dest,\r
+ const FloatType* src,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vmulD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i], Mode::mul (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
- #endif\r
+ memcpy (dest, src, (size_t) numValues * sizeof (FloatType));\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src1, const float* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::copyWithMultiply (FloatType* dest,\r
+ const FloatType* src,\r
+ FloatType multiplier,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vmul (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i], Mode::mul (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
+ FloatVectorHelpers::copyWithMultiply (dest, src, multiplier, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src1, const double* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::add (FloatType* dest,\r
+ FloatType amountToAdd,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vmulD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i], Mode::mul (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
+ FloatVectorHelpers::add (dest, amountToAdd, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, float multiplier, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::add (FloatType* dest,\r
+ const FloatType* src,\r
+ FloatType amount,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsmul (dest, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier, Mode::mul (d, mult), JUCE_LOAD_DEST,\r
- const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
- #endif\r
+ FloatVectorHelpers::add (dest, src, amount, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, double multiplier, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::add (FloatType* dest,\r
+ const FloatType* src,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vsmulD (dest, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier, Mode::mul (d, mult), JUCE_LOAD_DEST,\r
- const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
- #endif\r
+ FloatVectorHelpers::add (dest, src, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src, float multiplier, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::add (FloatType* dest,\r
+ const FloatType* src1,\r
+ const FloatType* src2,\r
+ CountType num) noexcept\r
{\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+ FloatVectorHelpers::add (dest, src1, src2, num);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src, double multiplier, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::subtract (FloatType* dest,\r
+ const FloatType* src,\r
+ CountType numValues) noexcept\r
{\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+ FloatVectorHelpers::subtract (dest, src, numValues);\r
}\r
\r
-void FloatVectorOperations::negate (float* dest, const float* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::subtract (FloatType* dest,\r
+ const FloatType* src1,\r
+ const FloatType* src2,\r
+ CountType num) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vneg ((float*) src, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- copyWithMultiply (dest, src, -1.0f, num);\r
- #endif\r
+ FloatVectorHelpers::subtract (dest, src1, src2, num);\r
}\r
\r
-void FloatVectorOperations::negate (double* dest, const double* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::addWithMultiply (FloatType* dest,\r
+ const FloatType* src,\r
+ FloatType multiplier,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vnegD ((double*) src, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- copyWithMultiply (dest, src, -1.0f, num);\r
- #endif\r
+ FloatVectorHelpers::addWithMultiply (dest, src, multiplier, numValues);\r
}\r
\r
-void FloatVectorOperations::abs (float* dest, const float* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::addWithMultiply (FloatType* dest,\r
+ const FloatType* src1,\r
+ const FloatType* src2,\r
+ CountType num) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vabs ((float*) src, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- FloatVectorHelpers::signMask32 signMask;\r
- signMask.i = 0x7fffffffUL;\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = std::abs (src[i]), Mode::bit_and (s, mask),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType mask = Mode::load1 (signMask.f);)\r
-\r
- ignoreUnused (signMask);\r
- #endif\r
+ FloatVectorHelpers::addWithMultiply (dest, src1, src2, num);\r
}\r
\r
-void FloatVectorOperations::abs (double* dest, const double* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::subtractWithMultiply (FloatType* dest,\r
+ const FloatType* src,\r
+ FloatType multiplier,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vabsD ((double*) src, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- FloatVectorHelpers::signMask64 signMask;\r
- signMask.i = 0x7fffffffffffffffULL;\r
-\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = std::abs (src[i]), Mode::bit_and (s, mask),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType mask = Mode::load1 (signMask.d);)\r
-\r
- ignoreUnused (signMask);\r
- #endif\r
+ FloatVectorHelpers::subtractWithMultiply (dest, src, multiplier, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, const int* src, float multiplier, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::subtractWithMultiply (FloatType* dest,\r
+ const FloatType* src1,\r
+ const FloatType* src2,\r
+ CountType num) noexcept\r
{\r
- #if JUCE_USE_ARM_NEON\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = (float) src[i] * multiplier,\r
- vmulq_n_f32 (vcvtq_f32_s32 (vld1q_s32 (src)), multiplier),\r
- JUCE_LOAD_NONE, JUCE_INCREMENT_SRC_DEST, )\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = (float) src[i] * multiplier,\r
- Mode::mul (mult, _mm_cvtepi32_ps (_mm_loadu_si128 (reinterpret_cast<const __m128i*> (src)))),\r
- JUCE_LOAD_NONE, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
- #endif\r
+ FloatVectorHelpers::subtractWithMultiply (dest, src1, src2, num);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::min (float* dest, const float* src, float comp, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::multiply (FloatType* dest,\r
+ const FloatType* src,\r
+ CountType numValues) noexcept\r
{\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp), Mode::min (s, cmp),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+ FloatVectorHelpers::multiply (dest, src, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::min (double* dest, const double* src, double comp, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::multiply (FloatType* dest,\r
+ const FloatType* src1,\r
+ const FloatType* src2,\r
+ CountType numValues) noexcept\r
{\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp), Mode::min (s, cmp),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+ FloatVectorHelpers::multiply (dest, src1, src2, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::min (float* dest, const float* src1, const float* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::multiply (FloatType* dest,\r
+ FloatType multiplier,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vmin ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]), Mode::min (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
+ FloatVectorHelpers::multiply (dest, multiplier, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::min (double* dest, const double* src1, const double* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::multiply (FloatType* dest,\r
+ const FloatType* src,\r
+ FloatType multiplier,\r
+ CountType num) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vminD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]), Mode::min (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
+ FloatVectorHelpers::multiply (dest, src, multiplier, num);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::max (float* dest, const float* src, float comp, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::negate (FloatType* dest,\r
+ const FloatType* src,\r
+ CountType numValues) noexcept\r
{\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp), Mode::max (s, cmp),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+ FloatVectorHelpers::negate (dest, src, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::max (double* dest, const double* src, double comp, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::abs (FloatType* dest,\r
+ const FloatType* src,\r
+ CountType numValues) noexcept\r
{\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp), Mode::max (s, cmp),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+ FloatVectorHelpers::abs (dest, src, numValues);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::max (float* dest, const float* src1, const float* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::min (FloatType* dest,\r
+ const FloatType* src,\r
+ FloatType comp,\r
+ CountType num) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vmax ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]), Mode::max (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
+ FloatVectorHelpers::min (dest, src, comp, num);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::max (double* dest, const double* src1, const double* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::min (FloatType* dest,\r
+ const FloatType* src1,\r
+ const FloatType* src2,\r
+ CountType num) noexcept\r
{\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vmaxD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]), Mode::max (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
- #endif\r
+ FloatVectorHelpers::min (dest, src1, src2, num);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::clip (float* dest, const float* src, float low, float high, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::max (FloatType* dest,\r
+ const FloatType* src,\r
+ FloatType comp,\r
+ CountType num) noexcept\r
{\r
- jassert(high >= low);\r
-\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vclip ((float*) src, 1, &low, &high, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low), Mode::max (Mode::min (s, hi), lo),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType lo = Mode::load1 (low); const Mode::ParallelType hi = Mode::load1 (high);)\r
- #endif\r
+ FloatVectorHelpers::max (dest, src, comp, num);\r
}\r
\r
-void JUCE_CALLTYPE FloatVectorOperations::clip (double* dest, const double* src, double low, double high, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::max (FloatType* dest,\r
+ const FloatType* src1,\r
+ const FloatType* src2,\r
+ CountType num) noexcept\r
{\r
- jassert(high >= low);\r
-\r
- #if JUCE_USE_VDSP_FRAMEWORK\r
- vDSP_vclipD ((double*) src, 1, &low, &high, dest, 1, (vDSP_Length) num);\r
- #else\r
- JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low), Mode::max (Mode::min (s, hi), lo),\r
- JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
- const Mode::ParallelType lo = Mode::load1 (low); const Mode::ParallelType hi = Mode::load1 (high);)\r
- #endif\r
+ FloatVectorHelpers::max (dest, src1, src2, num);\r
}\r
\r
-Range<float> JUCE_CALLTYPE FloatVectorOperations::findMinAndMax (const float* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::clip (FloatType* dest,\r
+ const FloatType* src,\r
+ FloatType low,\r
+ FloatType high,\r
+ CountType num) noexcept\r
{\r
- #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
- return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinAndMax (src, num);\r
- #else\r
- return Range<float>::findMinAndMax (src, num);\r
- #endif\r
+ FloatVectorHelpers::clip (dest, src, low, high, num);\r
}\r
\r
-Range<double> JUCE_CALLTYPE FloatVectorOperations::findMinAndMax (const double* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+Range<FloatType> JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::findMinAndMax (const FloatType* src,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
- return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinAndMax (src, num);\r
- #else\r
- return Range<double>::findMinAndMax (src, num);\r
- #endif\r
+ return FloatVectorHelpers::findMinAndMax (src, numValues);\r
}\r
\r
-float JUCE_CALLTYPE FloatVectorOperations::findMinimum (const float* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+FloatType JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::findMinimum (const FloatType* src,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
- return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinOrMax (src, num, true);\r
- #else\r
- return juce::findMinimum (src, num);\r
- #endif\r
+ return FloatVectorHelpers::findMinimum (src, numValues);\r
}\r
\r
-double JUCE_CALLTYPE FloatVectorOperations::findMinimum (const double* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+FloatType JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::findMaximum (const FloatType* src,\r
+ CountType numValues) noexcept\r
{\r
- #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
- return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinOrMax (src, num, true);\r
- #else\r
- return juce::findMinimum (src, num);\r
- #endif\r
+ return FloatVectorHelpers::findMaximum (src, numValues);\r
}\r
\r
-float JUCE_CALLTYPE FloatVectorOperations::findMaximum (const float* src, int num) noexcept\r
+template struct detail::FloatVectorOperationsBase<float, int>;\r
+template struct detail::FloatVectorOperationsBase<float, size_t>;\r
+template struct detail::FloatVectorOperationsBase<double, int>;\r
+template struct detail::FloatVectorOperationsBase<double, size_t>;\r
+\r
+void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, const int* src, float multiplier, size_t num) noexcept\r
{\r
- #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
- return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinOrMax (src, num, false);\r
- #else\r
- return juce::findMaximum (src, num);\r
- #endif\r
+ FloatVectorHelpers::convertFixedToFloat (dest, src, multiplier, num);\r
}\r
\r
-double JUCE_CALLTYPE FloatVectorOperations::findMaximum (const double* src, int num) noexcept\r
+void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, const int* src, float multiplier, int num) noexcept\r
{\r
- #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
- return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinOrMax (src, num, false);\r
- #else\r
- return juce::findMaximum (src, num);\r
- #endif\r
+ FloatVectorHelpers::convertFixedToFloat (dest, src, multiplier, num);\r
}\r
\r
intptr_t JUCE_CALLTYPE FloatVectorOperations::getFpStatusRegister() noexcept\r
intptr_t fpsr = 0;\r
#if JUCE_INTEL && JUCE_USE_SSE_INTRINSICS\r
fpsr = static_cast<intptr_t> (_mm_getcsr());\r
- #elif defined (__arm64__) || defined (__aarch64__) || JUCE_USE_ARM_NEON\r
- #if defined (__arm64__) || defined (__aarch64__)\r
- asm volatile("mrs %0, fpcr" : "=r" (fpsr));\r
+ #elif defined(__arm64__) || defined(__aarch64__) || JUCE_USE_ARM_NEON\r
+ #if defined(__arm64__) || defined(__aarch64__)\r
+ asm volatile("mrs %0, fpcr"\r
+ : "=r"(fpsr));\r
#elif JUCE_USE_ARM_NEON\r
- asm volatile("vmrs %0, fpscr" : "=r" (fpsr));\r
+ asm volatile("vmrs %0, fpscr"\r
+ : "=r"(fpsr));\r
#endif\r
#else\r
- #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))\r
+ #if ! (defined(JUCE_INTEL) || defined(JUCE_ARM))\r
jassertfalse; // No support for getting the floating point status register for your platform\r
#endif\r
#endif\r
// which aggressively optimises away the variable otherwise\r
volatile auto fpsr_w = static_cast<uint32_t> (fpsr);\r
_mm_setcsr (fpsr_w);\r
- #elif defined (__arm64__) || defined (__aarch64__) || JUCE_USE_ARM_NEON\r
- #if defined (__arm64__) || defined (__aarch64__)\r
- asm volatile("msr fpcr, %0" : : "ri" (fpsr));\r
+ #elif defined(__arm64__) || defined(__aarch64__) || JUCE_USE_ARM_NEON\r
+ #if defined(__arm64__) || defined(__aarch64__)\r
+ asm volatile("msr fpcr, %0"\r
+ :\r
+ : "ri"(fpsr));\r
#elif JUCE_USE_ARM_NEON\r
- asm volatile("vmsr fpscr, %0" : : "ri" (fpsr));\r
+ asm volatile("vmsr fpscr, %0"\r
+ :\r
+ : "ri"(fpsr));\r
#endif\r
#else\r
- #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))\r
+ #if ! (defined(JUCE_INTEL) || defined(JUCE_ARM))\r
jassertfalse; // No support for getting the floating point status register for your platform\r
#endif\r
ignoreUnused (fpsr);\r
\r
void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode (bool shouldEnable) noexcept\r
{\r
- #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))\r
+ #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined(__arm64__) || defined(__aarch64__))\r
#if JUCE_USE_SSE_INTRINSICS\r
intptr_t mask = _MM_FLUSH_ZERO_MASK;\r
#else /*JUCE_USE_ARM_NEON*/\r
#endif\r
setFpStatusRegister ((getFpStatusRegister() & (~mask)) | (shouldEnable ? mask : 0));\r
#else\r
- #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))\r
+ #if ! (defined(JUCE_INTEL) || defined(JUCE_ARM))\r
jassertfalse; // No support for flush to zero mode on your platform\r
#endif\r
ignoreUnused (shouldEnable);\r
\r
void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport (bool shouldDisable) noexcept\r
{\r
- #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))\r
+ #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined(__arm64__) || defined(__aarch64__))\r
#if JUCE_USE_SSE_INTRINSICS\r
intptr_t mask = 0x8040;\r
#else /*JUCE_USE_ARM_NEON*/\r
#else\r
ignoreUnused (shouldDisable);\r
\r
- #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))\r
+ #if ! (defined(JUCE_INTEL) || defined(JUCE_ARM))\r
jassertfalse; // No support for disable denormals mode on your platform\r
#endif\r
#endif\r
\r
bool JUCE_CALLTYPE FloatVectorOperations::areDenormalsDisabled() noexcept\r
{\r
- #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))\r
+ #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined(__arm64__) || defined(__aarch64__))\r
#if JUCE_USE_SSE_INTRINSICS\r
intptr_t mask = 0x8040;\r
#else /*JUCE_USE_ARM_NEON*/\r
\r
ScopedNoDenormals::ScopedNoDenormals() noexcept\r
{\r
- #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))\r
+ #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined(__arm64__) || defined(__aarch64__))\r
#if JUCE_USE_SSE_INTRINSICS\r
intptr_t mask = 0x8040;\r
#else /*JUCE_USE_ARM_NEON*/\r
\r
ScopedNoDenormals::~ScopedNoDenormals() noexcept\r
{\r
- #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))\r
+ #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined(__arm64__) || defined(__aarch64__))\r
FloatVectorOperations::setFpStatusRegister (fpsr);\r
- #endif\r
+ #endif\r
}\r
\r
\r
#endif\r
class ScopedNoDenormals;\r
\r
-//==============================================================================\r
-/**\r
- A collection of simple vector operations on arrays of floats, accelerated with\r
- SIMD instructions where possible.\r
-\r
- @tags{Audio}\r
-*/\r
-class JUCE_API FloatVectorOperations\r
+#if ! DOXYGEN\r
+namespace detail\r
{\r
-public:\r
- //==============================================================================\r
- /** Clears a vector of floats. */\r
- static void JUCE_CALLTYPE clear (float* dest, int numValues) noexcept;\r
-\r
- /** Clears a vector of doubles. */\r
- static void JUCE_CALLTYPE clear (double* dest, int numValues) noexcept;\r
-\r
- /** Copies a repeated value into a vector of floats. */\r
- static void JUCE_CALLTYPE fill (float* dest, float valueToFill, int numValues) noexcept;\r
-\r
- /** Copies a repeated value into a vector of doubles. */\r
- static void JUCE_CALLTYPE fill (double* dest, double valueToFill, int numValues) noexcept;\r
-\r
- /** Copies a vector of floats. */\r
- static void JUCE_CALLTYPE copy (float* dest, const float* src, int numValues) noexcept;\r
-\r
- /** Copies a vector of doubles. */\r
- static void JUCE_CALLTYPE copy (double* dest, const double* src, int numValues) noexcept;\r
-\r
- /** Copies a vector of floats, multiplying each value by a given multiplier */\r
- static void JUCE_CALLTYPE copyWithMultiply (float* dest, const float* src, float multiplier, int numValues) noexcept;\r
-\r
- /** Copies a vector of doubles, multiplying each value by a given multiplier */\r
- static void JUCE_CALLTYPE copyWithMultiply (double* dest, const double* src, double multiplier, int numValues) noexcept;\r
-\r
- /** Adds a fixed value to the destination values. */\r
- static void JUCE_CALLTYPE add (float* dest, float amountToAdd, int numValues) noexcept;\r
-\r
- /** Adds a fixed value to the destination values. */\r
- static void JUCE_CALLTYPE add (double* dest, double amountToAdd, int numValues) noexcept;\r
-\r
- /** Adds a fixed value to each source value and stores it in the destination array. */\r
- static void JUCE_CALLTYPE add (float* dest, const float* src, float amount, int numValues) noexcept;\r
-\r
- /** Adds a fixed value to each source value and stores it in the destination array. */\r
- static void JUCE_CALLTYPE add (double* dest, const double* src, double amount, int numValues) noexcept;\r
-\r
- /** Adds the source values to the destination values. */\r
- static void JUCE_CALLTYPE add (float* dest, const float* src, int numValues) noexcept;\r
-\r
- /** Adds the source values to the destination values. */\r
- static void JUCE_CALLTYPE add (double* dest, const double* src, int numValues) noexcept;\r
-\r
- /** Adds each source1 value to the corresponding source2 value and stores the result in the destination array. */\r
- static void JUCE_CALLTYPE add (float* dest, const float* src1, const float* src2, int num) noexcept;\r
-\r
- /** Adds each source1 value to the corresponding source2 value and stores the result in the destination array. */\r
- static void JUCE_CALLTYPE add (double* dest, const double* src1, const double* src2, int num) noexcept;\r
-\r
- /** Subtracts the source values from the destination values. */\r
- static void JUCE_CALLTYPE subtract (float* dest, const float* src, int numValues) noexcept;\r
-\r
- /** Subtracts the source values from the destination values. */\r
- static void JUCE_CALLTYPE subtract (double* dest, const double* src, int numValues) noexcept;\r
-\r
- /** Subtracts each source2 value from the corresponding source1 value and stores the result in the destination array. */\r
- static void JUCE_CALLTYPE subtract (float* dest, const float* src1, const float* src2, int num) noexcept;\r
-\r
- /** Subtracts each source2 value from the corresponding source1 value and stores the result in the destination array. */\r
- static void JUCE_CALLTYPE subtract (double* dest, const double* src1, const double* src2, int num) noexcept;\r
\r
- /** Multiplies each source value by the given multiplier, then adds it to the destination value. */\r
- static void JUCE_CALLTYPE addWithMultiply (float* dest, const float* src, float multiplier, int numValues) noexcept;\r
-\r
- /** Multiplies each source value by the given multiplier, then adds it to the destination value. */\r
- static void JUCE_CALLTYPE addWithMultiply (double* dest, const double* src, double multiplier, int numValues) noexcept;\r
-\r
- /** Multiplies each source1 value by the corresponding source2 value, then adds it to the destination value. */\r
- static void JUCE_CALLTYPE addWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept;\r
-\r
- /** Multiplies each source1 value by the corresponding source2 value, then adds it to the destination value. */\r
- static void JUCE_CALLTYPE addWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept;\r
-\r
- /** Multiplies each source value by the given multiplier, then subtracts it to the destination value. */\r
- static void JUCE_CALLTYPE subtractWithMultiply (float* dest, const float* src, float multiplier, int numValues) noexcept;\r
-\r
- /** Multiplies each source value by the given multiplier, then subtracts it to the destination value. */\r
- static void JUCE_CALLTYPE subtractWithMultiply (double* dest, const double* src, double multiplier, int numValues) noexcept;\r
-\r
- /** Multiplies each source1 value by the corresponding source2 value, then subtracts it to the destination value. */\r
- static void JUCE_CALLTYPE subtractWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept;\r
-\r
- /** Multiplies each source1 value by the corresponding source2 value, then subtracts it to the destination value. */\r
- static void JUCE_CALLTYPE subtractWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept;\r
-\r
- /** Multiplies the destination values by the source values. */\r
- static void JUCE_CALLTYPE multiply (float* dest, const float* src, int numValues) noexcept;\r
-\r
- /** Multiplies the destination values by the source values. */\r
- static void JUCE_CALLTYPE multiply (double* dest, const double* src, int numValues) noexcept;\r
-\r
- /** Multiplies each source1 value by the correspinding source2 value, then stores it in the destination array. */\r
- static void JUCE_CALLTYPE multiply (float* dest, const float* src1, const float* src2, int numValues) noexcept;\r
-\r
- /** Multiplies each source1 value by the correspinding source2 value, then stores it in the destination array. */\r
- static void JUCE_CALLTYPE multiply (double* dest, const double* src1, const double* src2, int numValues) noexcept;\r
-\r
- /** Multiplies each of the destination values by a fixed multiplier. */\r
- static void JUCE_CALLTYPE multiply (float* dest, float multiplier, int numValues) noexcept;\r
-\r
- /** Multiplies each of the destination values by a fixed multiplier. */\r
- static void JUCE_CALLTYPE multiply (double* dest, double multiplier, int numValues) noexcept;\r
+template <typename FloatType, typename CountType>\r
+struct FloatVectorOperationsBase\r
+{\r
+ static void JUCE_CALLTYPE clear (FloatType* dest, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE fill (FloatType* dest, FloatType valueToFill, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE copy (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE copyWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE add (FloatType* dest, FloatType amountToAdd, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src, FloatType amount, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+ static void JUCE_CALLTYPE subtract (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE subtract (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+ static void JUCE_CALLTYPE addWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE addWithMultiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+ static void JUCE_CALLTYPE subtractWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE subtractWithMultiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+ static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE multiply (FloatType* dest, FloatType multiplier, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType num) noexcept;\r
+ static void JUCE_CALLTYPE negate (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE abs (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+ static void JUCE_CALLTYPE min (FloatType* dest, const FloatType* src, FloatType comp, CountType num) noexcept;\r
+ static void JUCE_CALLTYPE min (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+ static void JUCE_CALLTYPE max (FloatType* dest, const FloatType* src, FloatType comp, CountType num) noexcept;\r
+ static void JUCE_CALLTYPE max (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+ static void JUCE_CALLTYPE clip (FloatType* dest, const FloatType* src, FloatType low, FloatType high, CountType num) noexcept;\r
+ static Range<FloatType> JUCE_CALLTYPE findMinAndMax (const FloatType* src, CountType numValues) noexcept;\r
+ static FloatType JUCE_CALLTYPE findMinimum (const FloatType* src, CountType numValues) noexcept;\r
+ static FloatType JUCE_CALLTYPE findMaximum (const FloatType* src, CountType numValues) noexcept;\r
+};\r
\r
- /** Multiplies each of the source values by a fixed multiplier and stores the result in the destination array. */\r
- static void JUCE_CALLTYPE multiply (float* dest, const float* src, float multiplier, int num) noexcept;\r
+template <typename...>\r
+struct NameForwarder;\r
\r
- /** Multiplies each of the source values by a fixed multiplier and stores the result in the destination array. */\r
- static void JUCE_CALLTYPE multiply (double* dest, const double* src, double multiplier, int num) noexcept;\r
+template <typename Head>\r
+struct NameForwarder<Head> : Head {};\r
\r
- /** Copies a source vector to a destination, negating each value. */\r
- static void JUCE_CALLTYPE negate (float* dest, const float* src, int numValues) noexcept;\r
+template <typename Head, typename... Tail>\r
+struct NameForwarder<Head, Tail...> : Head, NameForwarder<Tail...>\r
+{\r
+ using Head::clear;\r
+ using NameForwarder<Tail...>::clear;\r
\r
- /** Copies a source vector to a destination, negating each value. */\r
- static void JUCE_CALLTYPE negate (double* dest, const double* src, int numValues) noexcept;\r
+ using Head::fill;\r
+ using NameForwarder<Tail...>::fill;\r
\r
- /** Copies a source vector to a destination, taking the absolute of each value. */\r
- static void JUCE_CALLTYPE abs (float* dest, const float* src, int numValues) noexcept;\r
+ using Head::copy;\r
+ using NameForwarder<Tail...>::copy;\r
\r
- /** Copies a source vector to a destination, taking the absolute of each value. */\r
- static void JUCE_CALLTYPE abs (double* dest, const double* src, int numValues) noexcept;\r
+ using Head::copyWithMultiply;\r
+ using NameForwarder<Tail...>::copyWithMultiply;\r
\r
- /** Converts a stream of integers to floats, multiplying each one by the given multiplier. */\r
- static void JUCE_CALLTYPE convertFixedToFloat (float* dest, const int* src, float multiplier, int numValues) noexcept;\r
+ using Head::add;\r
+ using NameForwarder<Tail...>::add;\r
\r
- /** Each element of dest will be the minimum of the corresponding element of the source array and the given comp value. */\r
- static void JUCE_CALLTYPE min (float* dest, const float* src, float comp, int num) noexcept;\r
+ using Head::subtract;\r
+ using NameForwarder<Tail...>::subtract;\r
\r
- /** Each element of dest will be the minimum of the corresponding element of the source array and the given comp value. */\r
- static void JUCE_CALLTYPE min (double* dest, const double* src, double comp, int num) noexcept;\r
+ using Head::addWithMultiply;\r
+ using NameForwarder<Tail...>::addWithMultiply;\r
\r
- /** Each element of dest will be the minimum of the corresponding source1 and source2 values. */\r
- static void JUCE_CALLTYPE min (float* dest, const float* src1, const float* src2, int num) noexcept;\r
+ using Head::subtractWithMultiply;\r
+ using NameForwarder<Tail...>::subtractWithMultiply;\r
\r
- /** Each element of dest will be the minimum of the corresponding source1 and source2 values. */\r
- static void JUCE_CALLTYPE min (double* dest, const double* src1, const double* src2, int num) noexcept;\r
+ using Head::multiply;\r
+ using NameForwarder<Tail...>::multiply;\r
\r
- /** Each element of dest will be the maximum of the corresponding element of the source array and the given comp value. */\r
- static void JUCE_CALLTYPE max (float* dest, const float* src, float comp, int num) noexcept;\r
+ using Head::negate;\r
+ using NameForwarder<Tail...>::negate;\r
\r
- /** Each element of dest will be the maximum of the corresponding element of the source array and the given comp value. */\r
- static void JUCE_CALLTYPE max (double* dest, const double* src, double comp, int num) noexcept;\r
+ using Head::abs;\r
+ using NameForwarder<Tail...>::abs;\r
\r
- /** Each element of dest will be the maximum of the corresponding source1 and source2 values. */\r
- static void JUCE_CALLTYPE max (float* dest, const float* src1, const float* src2, int num) noexcept;\r
+ using Head::min;\r
+ using NameForwarder<Tail...>::min;\r
\r
- /** Each element of dest will be the maximum of the corresponding source1 and source2 values. */\r
- static void JUCE_CALLTYPE max (double* dest, const double* src1, const double* src2, int num) noexcept;\r
+ using Head::max;\r
+ using NameForwarder<Tail...>::max;\r
\r
- /** Each element of dest is calculated by hard clipping the corresponding src element so that it is in the range specified by the arguments low and high. */\r
- static void JUCE_CALLTYPE clip (float* dest, const float* src, float low, float high, int num) noexcept;\r
+ using Head::clip;\r
+ using NameForwarder<Tail...>::clip;\r
\r
- /** Each element of dest is calculated by hard clipping the corresponding src element so that it is in the range specified by the arguments low and high. */\r
- static void JUCE_CALLTYPE clip (double* dest, const double* src, double low, double high, int num) noexcept;\r
+ using Head::findMinAndMax;\r
+ using NameForwarder<Tail...>::findMinAndMax;\r
\r
- /** Finds the minimum and maximum values in the given array. */\r
- static Range<float> JUCE_CALLTYPE findMinAndMax (const float* src, int numValues) noexcept;\r
+ using Head::findMinimum;\r
+ using NameForwarder<Tail...>::findMinimum;\r
\r
- /** Finds the minimum and maximum values in the given array. */\r
- static Range<double> JUCE_CALLTYPE findMinAndMax (const double* src, int numValues) noexcept;\r
+ using Head::findMaximum;\r
+ using NameForwarder<Tail...>::findMaximum;\r
+};\r
\r
- /** Finds the minimum value in the given array. */\r
- static float JUCE_CALLTYPE findMinimum (const float* src, int numValues) noexcept;\r
+} // namespace detail\r
+#endif\r
\r
- /** Finds the minimum value in the given array. */\r
- static double JUCE_CALLTYPE findMinimum (const double* src, int numValues) noexcept;\r
+//==============================================================================\r
+/**\r
+ A collection of simple vector operations on arrays of floats, accelerated with\r
+ SIMD instructions where possible.\r
\r
- /** Finds the maximum value in the given array. */\r
- static float JUCE_CALLTYPE findMaximum (const float* src, int numValues) noexcept;\r
+ @tags{Audio}\r
+*/\r
+class JUCE_API FloatVectorOperations : public detail::NameForwarder<detail::FloatVectorOperationsBase<float, int>,\r
+ detail::FloatVectorOperationsBase<float, size_t>,\r
+ detail::FloatVectorOperationsBase<double, int>,\r
+ detail::FloatVectorOperationsBase<double, size_t>>\r
+{\r
+public:\r
+ static void JUCE_CALLTYPE convertFixedToFloat (float* dest, const int* src, float multiplier, int num) noexcept;\r
\r
- /** Finds the maximum value in the given array. */\r
- static double JUCE_CALLTYPE findMaximum (const double* src, int numValues) noexcept;\r
+ static void JUCE_CALLTYPE convertFixedToFloat (float* dest, const int* src, float multiplier, size_t num) noexcept;\r
\r
/** This method enables or disables the SSE/NEON flush-to-zero mode. */\r
static void JUCE_CALLTYPE enableFlushToZeroMode (bool shouldEnable) noexcept;\r
\r
ID: juce_audio_basics\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE audio and MIDI data classes\r
description: Classes for audio buffer manipulation, midi message handling, synthesis, etc.\r
website: http://www.juce.com/juce\r
{\r
\r
/**\r
- This struct acts as a single-file namespace for Univeral MIDI Packet\r
+ This struct acts as a single-file namespace for Universal MIDI Packet\r
functionality related to 7-bit SysEx.\r
\r
@tags{Audio}\r
mpeInstrumentFill (isMemberChannelSustained, false);\r
\r
pitchbendDimension.value = &MPENote::pitchbend;\r
- pressureDimension.value = &MPENote::pressure;\r
- timbreDimension.value = &MPENote::timbre;\r
+ pressureDimension.value = &MPENote::pressure;\r
+ timbreDimension.value = &MPENote::timbre;\r
\r
resetLastReceivedValues();\r
\r
- legacyMode.isEnabled = false;\r
- legacyMode.pitchbendRange = 2;\r
legacyMode.channelRange = allChannels;\r
}\r
\r
+MPEInstrument::MPEInstrument (MPEZoneLayout layout)\r
+ : MPEInstrument()\r
+{\r
+ setZoneLayout (layout);\r
+}\r
+\r
MPEInstrument::~MPEInstrument() = default;\r
\r
//==============================================================================\r
\r
const ScopedLock sl (lock);\r
legacyMode.isEnabled = false;\r
- zoneLayout = newLayout;\r
\r
- resetLastReceivedValues();\r
+ if (zoneLayout != newLayout)\r
+ {\r
+ zoneLayout = newLayout;\r
+ listeners.call ([=] (Listener& l) { l.zoneLayoutChanged(); });\r
+ }\r
}\r
\r
//==============================================================================\r
void MPEInstrument::enableLegacyMode (int pitchbendRange, Range<int> channelRange)\r
{\r
+ if (legacyMode.isEnabled)\r
+ return;\r
+\r
releaseAllNotes();\r
\r
const ScopedLock sl (lock);\r
+\r
legacyMode.isEnabled = true;\r
legacyMode.pitchbendRange = pitchbendRange;\r
legacyMode.channelRange = channelRange;\r
+\r
zoneLayout.clearAllZones();\r
+ listeners.call ([=] (Listener& l) { l.zoneLayoutChanged(); });\r
}\r
\r
bool MPEInstrument::isLegacyModeEnabled() const noexcept\r
\r
releaseAllNotes();\r
const ScopedLock sl (lock);\r
- legacyMode.channelRange = channelRange;\r
+\r
+ if (legacyMode.channelRange != channelRange)\r
+ {\r
+ legacyMode.channelRange = channelRange;\r
+ listeners.call ([=] (Listener& l) { l.zoneLayoutChanged(); });\r
+ }\r
}\r
\r
int MPEInstrument::getLegacyModePitchbendRange() const noexcept\r
\r
releaseAllNotes();\r
const ScopedLock sl (lock);\r
- legacyMode.pitchbendRange = pitchbendRange;\r
+\r
+ if (legacyMode.pitchbendRange != pitchbendRange)\r
+ {\r
+ legacyMode.pitchbendRange = pitchbendRange;\r
+ listeners.call ([=] (Listener& l) { l.zoneLayoutChanged(); });\r
+ }\r
}\r
\r
//==============================================================================\r
\r
if (legacyMode.isEnabled && legacyMode.channelRange.contains (message.getChannel()))\r
{\r
- for (auto i = notes.size(); --i >= 0;)\r
+ for (int i = notes.size(); --i >= 0;)\r
{\r
auto& note = notes.getReference (i);\r
\r
auto zone = (message.getChannel() == 1 ? zoneLayout.getLowerZone()\r
: zoneLayout.getUpperZone());\r
\r
- for (auto i = notes.size(); --i >= 0;)\r
+ for (int i = notes.size(); --i >= 0;)\r
{\r
auto& note = notes.getReference (i);\r
\r
int midiNoteNumber,\r
MPEValue midiNoteOffVelocity)\r
{\r
+ const ScopedLock sl (lock);\r
+\r
if (notes.isEmpty() || ! isUsingChannel (midiChannel))\r
return;\r
\r
- const ScopedLock sl (lock);\r
-\r
if (auto* note = getNotePtr (midiChannel, midiNoteNumber))\r
{\r
note->keyState = (note->keyState == MPENote::keyDownAndSustained) ? MPENote::sustained : MPENote::off;\r
{\r
const ScopedLock sl (lock);\r
\r
- for (auto i = notes.size(); --i >= 0;)\r
+ for (int i = notes.size(); --i >= 0;)\r
{\r
auto& note = notes.getReference (i);\r
\r
{\r
if (dimension.trackingMode == allNotesOnChannel)\r
{\r
- for (auto i = notes.size(); --i >= 0;)\r
+ for (int i = notes.size(); --i >= 0;)\r
{\r
auto& note = notes.getReference (i);\r
\r
if (! zone.isActive())\r
return;\r
\r
- for (auto i = notes.size(); --i >= 0;)\r
+ for (int i = notes.size(); --i >= 0;)\r
{\r
auto& note = notes.getReference (i);\r
\r
auto zone = (midiChannel == 1 ? zoneLayout.getLowerZone()\r
: zoneLayout.getUpperZone());\r
\r
- for (auto i = notes.size(); --i >= 0;)\r
+ for (int i = notes.size(); --i >= 0;)\r
{\r
auto& note = notes.getReference (i);\r
\r
if (! legacyMode.isEnabled)\r
{\r
if (zone.isLowerZone())\r
- for (auto i = zone.getFirstMemberChannel(); i <= zone.getLastMemberChannel(); ++i)\r
+ {\r
+ for (int i = zone.getFirstMemberChannel(); i <= zone.getLastMemberChannel(); ++i)\r
isMemberChannelSustained[i - 1] = isDown;\r
+ }\r
else\r
- for (auto i = zone.getFirstMemberChannel(); i >= zone.getLastMemberChannel(); --i)\r
+ {\r
+ for (int i = zone.getFirstMemberChannel(); i >= zone.getLastMemberChannel(); --i)\r
isMemberChannelSustained[i - 1] = isDown;\r
+ }\r
}\r
}\r
}\r
return notes[index];\r
}\r
\r
+MPENote MPEInstrument::getNoteWithID (uint16 noteID) const noexcept\r
+{\r
+ const ScopedLock sl (lock);\r
+\r
+ for (auto& note : notes)\r
+ if (note.noteID == noteID)\r
+ return note;\r
+\r
+ return {};\r
+}\r
+\r
//==============================================================================\r
MPENote MPEInstrument::getMostRecentNote (int midiChannel) const noexcept\r
{\r
//==============================================================================\r
const MPENote* MPEInstrument::getLastNotePlayedPtr (int midiChannel) const noexcept\r
{\r
+ const ScopedLock sl (lock);\r
+\r
for (auto i = notes.size(); --i >= 0;)\r
{\r
auto& note = notes.getReference (i);\r
MPE. If you pass it a message, it will know what notes on what\r
channels (if any) should be affected by that message.\r
\r
- The class has a Listener class with the three callbacks MPENoteAdded,\r
- MPENoteChanged, and MPENoteFinished. Implement such a\r
- Listener class to react to note changes and trigger some functionality for\r
- your application that depends on the MPE note state.\r
+ The class has a Listener class that can be used to react to note and\r
+ state changes and trigger some functionality for your application.\r
For example, you can use this class to write an MPE visualiser.\r
\r
If you want to write a real-time audio synth with MPE functionality,\r
\r
This will construct an MPE instrument with inactive lower and upper zones.\r
\r
- In order to process incoming MIDI, call setZoneLayout, define the layout\r
- via MIDI RPN messages, or set the instrument to legacy mode.\r
+ In order to process incoming MIDI messages call setZoneLayout, use the MPEZoneLayout\r
+ constructor, define the layout via MIDI RPN messages, or set the instrument to legacy mode.\r
*/\r
MPEInstrument() noexcept;\r
\r
+ /** Constructs an MPE instrument with the specified zone layout. */\r
+ MPEInstrument (MPEZoneLayout layout);\r
+\r
/** Destructor. */\r
virtual ~MPEInstrument();\r
\r
*/\r
MPENote getNote (int midiChannel, int midiNoteNumber) const noexcept;\r
\r
+ /** Returns the note with a given ID. */\r
+ MPENote getNoteWithID (uint16 noteID) const noexcept;\r
+\r
/** Returns the most recent note that is playing on the given midiChannel\r
(this will be the note which has received the most recent note-on without\r
a corresponding note-off), if there is such a note. Otherwise, this returns an\r
MPENote getMostRecentNoteOtherThan (MPENote otherThanThisNote) const noexcept;\r
\r
//==============================================================================\r
- /** Derive from this class to be informed about any changes in the expressive\r
- MIDI notes played by this instrument.\r
+ /** Derive from this class to be informed about any changes in the MPE notes played\r
+ by this instrument, and any changes to its zone layout.\r
\r
Note: This listener type receives its callbacks immediately, and not\r
via the message thread (so you might be for example in the MIDI thread).\r
and should therefore stop playing.\r
*/\r
virtual void noteReleased (MPENote finishedNote) { ignoreUnused (finishedNote); }\r
+\r
+ /** Implement this callback to be informed whenever the MPE zone layout\r
+ or legacy mode settings of this instrument have been changed.\r
+ */\r
+ virtual void zoneLayoutChanged() {}\r
};\r
\r
//==============================================================================\r
void removeListener (Listener* listenerToRemove);\r
\r
//==============================================================================\r
- /** Puts the instrument into legacy mode.\r
+ /** Puts the instrument into legacy mode. If legacy mode is already enabled this method\r
+ does nothing.\r
+\r
As a side effect, this will discard all currently playing notes,\r
and call noteReleased for all of them.\r
\r
\r
struct LegacyMode\r
{\r
- bool isEnabled;\r
+ bool isEnabled = false;\r
Range<int> channelRange;\r
- int pitchbendRange;\r
+ int pitchbendRange = 2;\r
};\r
\r
struct MPEDimension\r
*/\r
MPEValue noteOnVelocity { MPEValue::minValue() };\r
\r
- /** Current per-note pitchbend of the note (in units of MIDI pitchwheel\r
+ /** Current per-note pitchbend of the note (in units of MIDI pitchwheel\r
position). This dimension can be modulated while the note sounds.\r
\r
Note: This value is not aware of the currently used pitchbend range,\r
\r
MPESynthesiser::MPESynthesiser()\r
{\r
- MPEZoneLayout zoneLayout;\r
- zoneLayout.setLowerZone (15);\r
- setZoneLayout (zoneLayout);\r
}\r
\r
-MPESynthesiser::MPESynthesiser (MPEInstrument* mpeInstrument) : MPESynthesiserBase (mpeInstrument)\r
+MPESynthesiser::MPESynthesiser (MPEInstrument& mpeInstrument)\r
+ : MPESynthesiserBase (mpeInstrument)\r
{\r
}\r
\r
}\r
\r
// finally make sure the MPE Instrument also doesn't have any notes anymore.\r
- instrument->releaseAllNotes();\r
+ instrument.releaseAllNotes();\r
}\r
\r
//==============================================================================\r
/** Constructor to pass to the synthesiser a custom MPEInstrument object\r
to handle the MPE note state, MIDI channel assignment etc.\r
(in case you need custom logic for this that goes beyond MIDI and MPE).\r
- The synthesiser will take ownership of this object.\r
\r
@see MPESynthesiserBase, MPEInstrument\r
*/\r
- MPESynthesiser (MPEInstrument* instrumentToUse);\r
+ MPESynthesiser (MPEInstrument& instrumentToUse);\r
\r
/** Destructor. */\r
~MPESynthesiser() override;\r
\r
private:\r
//==============================================================================\r
- bool shouldStealVoices = false;\r
+ std::atomic<bool> shouldStealVoices { false };\r
uint32 lastNoteOnCounter = 0;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPESynthesiser)\r
{\r
\r
MPESynthesiserBase::MPESynthesiserBase()\r
- : instrument (new MPEInstrument)\r
+ : instrument (defaultInstrument)\r
{\r
- instrument->addListener (this);\r
+ instrument.addListener (this);\r
}\r
\r
-MPESynthesiserBase::MPESynthesiserBase (MPEInstrument* inst)\r
+MPESynthesiserBase::MPESynthesiserBase (MPEInstrument& inst)\r
: instrument (inst)\r
{\r
- jassert (instrument != nullptr);\r
- instrument->addListener (this);\r
+ instrument.addListener (this);\r
}\r
\r
//==============================================================================\r
MPEZoneLayout MPESynthesiserBase::getZoneLayout() const noexcept\r
{\r
- return instrument->getZoneLayout();\r
+ return instrument.getZoneLayout();\r
}\r
\r
void MPESynthesiserBase::setZoneLayout (MPEZoneLayout newLayout)\r
{\r
- instrument->setZoneLayout (newLayout);\r
+ instrument.setZoneLayout (newLayout);\r
}\r
\r
//==============================================================================\r
void MPESynthesiserBase::enableLegacyMode (int pitchbendRange, Range<int> channelRange)\r
{\r
- instrument->enableLegacyMode (pitchbendRange, channelRange);\r
+ instrument.enableLegacyMode (pitchbendRange, channelRange);\r
}\r
\r
bool MPESynthesiserBase::isLegacyModeEnabled() const noexcept\r
{\r
- return instrument->isLegacyModeEnabled();\r
+ return instrument.isLegacyModeEnabled();\r
}\r
\r
Range<int> MPESynthesiserBase::getLegacyModeChannelRange() const noexcept\r
{\r
- return instrument->getLegacyModeChannelRange();\r
+ return instrument.getLegacyModeChannelRange();\r
}\r
\r
void MPESynthesiserBase::setLegacyModeChannelRange (Range<int> channelRange)\r
{\r
- instrument->setLegacyModeChannelRange (channelRange);\r
+ instrument.setLegacyModeChannelRange (channelRange);\r
}\r
\r
int MPESynthesiserBase::getLegacyModePitchbendRange() const noexcept\r
{\r
- return instrument->getLegacyModePitchbendRange();\r
+ return instrument.getLegacyModePitchbendRange();\r
}\r
\r
void MPESynthesiserBase::setLegacyModePitchbendRange (int pitchbendRange)\r
{\r
- instrument->setLegacyModePitchbendRange (pitchbendRange);\r
+ instrument.setLegacyModePitchbendRange (pitchbendRange);\r
}\r
\r
//==============================================================================\r
void MPESynthesiserBase::setPressureTrackingMode (TrackingMode modeToUse)\r
{\r
- instrument->setPressureTrackingMode (modeToUse);\r
+ instrument.setPressureTrackingMode (modeToUse);\r
}\r
\r
void MPESynthesiserBase::setPitchbendTrackingMode (TrackingMode modeToUse)\r
{\r
- instrument->setPitchbendTrackingMode (modeToUse);\r
+ instrument.setPitchbendTrackingMode (modeToUse);\r
}\r
\r
void MPESynthesiserBase::setTimbreTrackingMode (TrackingMode modeToUse)\r
{\r
- instrument->setTimbreTrackingMode (modeToUse);\r
+ instrument.setTimbreTrackingMode (modeToUse);\r
}\r
\r
//==============================================================================\r
void MPESynthesiserBase::handleMidiEvent (const MidiMessage& m)\r
{\r
- instrument->processNextMidiEvent (m);\r
+ instrument.processNextMidiEvent (m);\r
}\r
\r
//==============================================================================\r
if (sampleRate != newRate)\r
{\r
const ScopedLock sl (noteStateLock);\r
- instrument->releaseAllNotes();\r
+ instrument.releaseAllNotes();\r
sampleRate = newRate;\r
}\r
}\r
\r
/** Constructor.\r
\r
- If you use this constructor, the synthesiser will take ownership of the\r
- provided instrument object, and will use it internally to handle the\r
- MPE note state logic.\r
+ If you use this constructor, the synthesiser will use the provided instrument\r
+ object to handle the MPE note state logic.\r
This is useful if you want to use an instance of your own class derived\r
from MPEInstrument for the MPE logic.\r
*/\r
- MPESynthesiserBase (MPEInstrument* instrument);\r
+ MPESynthesiserBase (MPEInstrument& instrument);\r
\r
//==============================================================================\r
/** Returns the synthesiser's internal MPE zone layout.\r
protected:\r
//==============================================================================\r
/** @internal */\r
- std::unique_ptr<MPEInstrument> instrument;\r
+ MPEInstrument& instrument;\r
\r
private:\r
//==============================================================================\r
+ MPEInstrument defaultInstrument { MPEZone (MPEZone::Type::lower, 15) };\r
+\r
CriticalSection noteStateLock;\r
double sampleRate = 0.0;\r
int minimumSubBlockSize = 32;\r
if (numChannels <= 1)\r
return firstChannel;\r
\r
- for (auto ch = firstChannel; (isLegacy || zone->isLowerZone() ? ch <= lastChannel : ch >= lastChannel); ch += channelIncrement)\r
+ for (int ch = firstChannel; (isLegacy || zone->isLowerZone() ? ch <= lastChannel : ch >= lastChannel); ch += channelIncrement)\r
{\r
- if (midiChannels[ch].isFree() && midiChannels[ch].lastNotePlayed == noteNumber)\r
+ if (midiChannels[(size_t) ch].isFree() && midiChannels[(size_t) ch].lastNotePlayed == noteNumber)\r
{\r
midiChannelLastAssigned = ch;\r
- midiChannels[ch].notes.add (noteNumber);\r
+ midiChannels[(size_t) ch].notes.add (noteNumber);\r
return ch;\r
}\r
}\r
\r
- for (auto ch = midiChannelLastAssigned + channelIncrement; ; ch += channelIncrement)\r
+ for (int ch = midiChannelLastAssigned + channelIncrement; ; ch += channelIncrement)\r
{\r
if (ch == lastChannel + channelIncrement) // loop wrap-around\r
ch = firstChannel;\r
\r
- if (midiChannels[ch].isFree())\r
+ if (midiChannels[(size_t) ch].isFree())\r
{\r
midiChannelLastAssigned = ch;\r
- midiChannels[ch].notes.add (noteNumber);\r
+ midiChannels[(size_t) ch].notes.add (noteNumber);\r
return ch;\r
}\r
\r
}\r
\r
midiChannelLastAssigned = findMidiChannelPlayingClosestNonequalNote (noteNumber);\r
- midiChannels[midiChannelLastAssigned].notes.add (noteNumber);\r
+ midiChannels[(size_t) midiChannelLastAssigned].notes.add (noteNumber);\r
\r
return midiChannelLastAssigned;\r
}\r
\r
+int MPEChannelAssigner::findMidiChannelForExistingNote (int noteNumber) noexcept\r
+{\r
+ const auto iter = std::find_if (midiChannels.cbegin(), midiChannels.cend(), [&] (auto& ch)\r
+ {\r
+ return std::find (ch.notes.begin(), ch.notes.end(), noteNumber) != ch.notes.end();\r
+ });\r
+\r
+ return iter != midiChannels.cend() ? (int) std::distance (midiChannels.cbegin(), iter) : -1;\r
+}\r
+\r
void MPEChannelAssigner::noteOff (int noteNumber, int midiChannel)\r
{\r
const auto removeNote = [] (MidiChannel& ch, int noteNum)\r
\r
if (midiChannel >= 0 && midiChannel <= 16)\r
{\r
- removeNote (midiChannels[midiChannel], noteNumber);\r
+ removeNote (midiChannels[(size_t) midiChannel], noteNumber);\r
return;\r
}\r
\r
auto channelWithClosestNote = firstChannel;\r
int closestNoteDistance = 127;\r
\r
- for (auto ch = firstChannel; (isLegacy || zone->isLowerZone() ? ch <= lastChannel : ch >= lastChannel); ch += channelIncrement)\r
+ for (int ch = firstChannel; (isLegacy || zone->isLowerZone() ? ch <= lastChannel : ch >= lastChannel); ch += channelIncrement)\r
{\r
- for (auto note : midiChannels[ch].notes)\r
+ for (auto note : midiChannels[(size_t) ch].notes)\r
{\r
auto noteDistance = std::abs (note - noteNumber);\r
\r
// check that channels are assigned in correct order\r
int noteNum = 60;\r
for (int ch = 2; ch <= 16; ++ch)\r
- expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum++), ch);\r
+ {\r
+ expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum), ch);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (noteNum), ch);\r
+\r
+ ++noteNum;\r
+ }\r
\r
// check that note-offs are processed\r
channelAssigner.noteOff (60);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (60), 2);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (60), 2);\r
\r
channelAssigner.noteOff (61);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (61), 3);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (61), 3);\r
\r
// check that assigned channel was last to play note\r
channelAssigner.noteOff (65);\r
channelAssigner.noteOff (66);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (66), 8);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (65), 7);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 8);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 7);\r
\r
// find closest channel playing nonequal note\r
expectEquals (channelAssigner.findMidiChannelForNewNote (80), 16);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (55), 2);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 16);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 2);\r
\r
// all notes off\r
channelAssigner.allNotesOff();\r
expectEquals (channelAssigner.findMidiChannelForNewNote (65), 7);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (80), 16);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (55), 2);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 8);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 7);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 16);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 2);\r
\r
// normal assignment\r
expectEquals (channelAssigner.findMidiChannelForNewNote (101), 3);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (20), 4);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (101), 3);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (20), 4);\r
}\r
\r
// upper\r
// check that channels are assigned in correct order\r
int noteNum = 60;\r
for (int ch = 15; ch >= 1; --ch)\r
- expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum++), ch);\r
+ {\r
+ expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum), ch);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (noteNum), ch);\r
+\r
+ ++noteNum;\r
+ }\r
\r
// check that note-offs are processed\r
channelAssigner.noteOff (60);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (60), 15);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (60), 15);\r
\r
channelAssigner.noteOff (61);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (61), 14);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (61), 14);\r
\r
// check that assigned channel was last to play note\r
channelAssigner.noteOff (65);\r
channelAssigner.noteOff (66);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (66), 9);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (65), 10);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 9);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 10);\r
\r
// find closest channel playing nonequal note\r
expectEquals (channelAssigner.findMidiChannelForNewNote (80), 1);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (55), 15);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 1);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 15);\r
\r
// all notes off\r
channelAssigner.allNotesOff();\r
expectEquals (channelAssigner.findMidiChannelForNewNote (65), 10);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (80), 1);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (55), 15);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 9);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 10);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 1);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 15);\r
\r
// normal assignment\r
expectEquals (channelAssigner.findMidiChannelForNewNote (101), 14);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (20), 13);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (101), 14);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (20), 13);\r
}\r
\r
// legacy\r
// check that channels are assigned in correct order\r
int noteNum = 60;\r
for (int ch = 1; ch <= 16; ++ch)\r
- expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum++), ch);\r
+ {\r
+ expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum), ch);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (noteNum), ch);\r
+\r
+ ++noteNum;\r
+ }\r
\r
// check that note-offs are processed\r
channelAssigner.noteOff (60);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (60), 1);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (60), 1);\r
\r
channelAssigner.noteOff (61);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (61), 2);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (61), 2);\r
\r
// check that assigned channel was last to play note\r
channelAssigner.noteOff (65);\r
channelAssigner.noteOff (66);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (66), 7);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (65), 6);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 7);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 6);\r
\r
// find closest channel playing nonequal note\r
expectEquals (channelAssigner.findMidiChannelForNewNote (80), 16);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (55), 1);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 16);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 1);\r
\r
// all notes off\r
channelAssigner.allNotesOff();\r
expectEquals (channelAssigner.findMidiChannelForNewNote (65), 6);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (80), 16);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (55), 1);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 7);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 6);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 16);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 1);\r
\r
// normal assignment\r
expectEquals (channelAssigner.findMidiChannelForNewNote (101), 2);\r
expectEquals (channelAssigner.findMidiChannelForNewNote (20), 3);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (101), 2);\r
+ expectEquals (channelAssigner.findMidiChannelForExistingNote (20), 3);\r
}\r
}\r
\r
*/\r
int findMidiChannelForNewNote (int noteNumber) noexcept;\r
\r
+ /** If a note has been added using findMidiChannelForNewNote() this will return the channel\r
+ to which it was assigned, otherwise it will return -1.\r
+ */\r
+ int findMidiChannelForExistingNote (int initialNoteOnNumber) noexcept;\r
+\r
/** You must call this method for all note-offs that you receive so that this class\r
can keep track of the currently playing notes internally.\r
\r
int lastNotePlayed = -1;\r
bool isFree() const noexcept { return notes.isEmpty(); }\r
};\r
- MidiChannel midiChannels[17];\r
+ std::array<MidiChannel, 17> midiChannels;\r
\r
//==============================================================================\r
int findMidiChannelPlayingClosestNonequalNote (int noteNumber) noexcept;\r
return { value };\r
}\r
\r
+MPEValue MPEValue::fromUnsignedFloat (float value) noexcept\r
+{\r
+ jassert (0.0f <= value && value <= 1.0f);\r
+ return { roundToInt (value * 16383.0f) };\r
+}\r
+\r
+MPEValue MPEValue::fromSignedFloat (float value) noexcept\r
+{\r
+ jassert (-1.0f <= value && value <= 1.0f);\r
+ return { roundToInt (((value + 1.0f) * 16383.0f) / 2.0f) };\r
+}\r
+\r
//==============================================================================\r
MPEValue MPEValue::minValue() noexcept { return MPEValue::from7BitInt (0); }\r
MPEValue MPEValue::centreValue() noexcept { return MPEValue::from7BitInt (64); }\r
\r
beginTest ("zero/minimum value");\r
{\r
- expectValuesConsistent (MPEValue::from7BitInt (0), 0, 0, -1.0f, 0.0f);\r
- expectValuesConsistent (MPEValue::from14BitInt (0), 0, 0, -1.0f, 0.0f);\r
+ expectValuesConsistent (MPEValue::from7BitInt (0), 0, 0, -1.0f, 0.0f);\r
+ expectValuesConsistent (MPEValue::from14BitInt (0), 0, 0, -1.0f, 0.0f);\r
+ expectValuesConsistent (MPEValue::fromUnsignedFloat (0.0f), 0, 0, -1.0f, 0.0f);\r
+ expectValuesConsistent (MPEValue::fromSignedFloat (-1.0f), 0, 0, -1.0f, 0.0f);\r
}\r
\r
beginTest ("maximum value");\r
{\r
- expectValuesConsistent (MPEValue::from7BitInt (127), 127, 16383, 1.0f, 1.0f);\r
- expectValuesConsistent (MPEValue::from14BitInt (16383), 127, 16383, 1.0f, 1.0f);\r
+ expectValuesConsistent (MPEValue::from7BitInt (127), 127, 16383, 1.0f, 1.0f);\r
+ expectValuesConsistent (MPEValue::from14BitInt (16383), 127, 16383, 1.0f, 1.0f);\r
+ expectValuesConsistent (MPEValue::fromUnsignedFloat (1.0f), 127, 16383, 1.0f, 1.0f);\r
+ expectValuesConsistent (MPEValue::fromSignedFloat (1.0f), 127, 16383, 1.0f, 1.0f);\r
}\r
\r
beginTest ("centre value");\r
{\r
- expectValuesConsistent (MPEValue::from7BitInt (64), 64, 8192, 0.0f, 0.5f);\r
- expectValuesConsistent (MPEValue::from14BitInt (8192), 64, 8192, 0.0f, 0.5f);\r
+ expectValuesConsistent (MPEValue::from7BitInt (64), 64, 8192, 0.0f, 0.5f);\r
+ expectValuesConsistent (MPEValue::from14BitInt (8192), 64, 8192, 0.0f, 0.5f);\r
+ expectValuesConsistent (MPEValue::fromUnsignedFloat (0.5f), 64, 8192, 0.0f, 0.5f);\r
+ expectValuesConsistent (MPEValue::fromSignedFloat (0.0f), 64, 8192, 0.0f, 0.5f);\r
}\r
\r
beginTest ("value halfway between min and centre");\r
{\r
- expectValuesConsistent (MPEValue::from7BitInt (32), 32, 4096, -0.5f, 0.25f);\r
- expectValuesConsistent (MPEValue::from14BitInt (4096), 32, 4096, -0.5f, 0.25f);\r
+ expectValuesConsistent (MPEValue::from7BitInt (32), 32, 4096, -0.5f, 0.25f);\r
+ expectValuesConsistent (MPEValue::from14BitInt (4096), 32, 4096, -0.5f, 0.25f);\r
+ expectValuesConsistent (MPEValue::fromUnsignedFloat (0.25f), 32, 4096, -0.5f, 0.25f);\r
+ expectValuesConsistent (MPEValue::fromSignedFloat (-0.5f), 32, 4096, -0.5f, 0.25f);\r
}\r
}\r
\r
*/\r
static MPEValue from14BitInt (int value) noexcept;\r
\r
+ /** Constructs an MPEValue from a float between 0.0f and 1.0f. */\r
+ static MPEValue fromUnsignedFloat (float value) noexcept;\r
+\r
+ /** Constructs an MPEValue from a float between -1.0f and 1.0f. */\r
+ static MPEValue fromSignedFloat (float value) noexcept;\r
+\r
/** Constructs an MPEValue corresponding to the centre value. */\r
static MPEValue centreValue() noexcept;\r
\r
namespace juce\r
{\r
\r
-MPEZoneLayout::MPEZoneLayout() noexcept {}\r
+MPEZoneLayout::MPEZoneLayout (MPEZone lower, MPEZone upper)\r
+ : lowerZone (lower), upperZone (upper)\r
+{\r
+}\r
+\r
+MPEZoneLayout::MPEZoneLayout (MPEZone zone)\r
+ : lowerZone (zone.isLowerZone() ? zone : MPEZone()),\r
+ upperZone (! zone.isLowerZone() ? zone : MPEZone())\r
+{\r
+}\r
+\r
\r
MPEZoneLayout::MPEZoneLayout (const MPEZoneLayout& other)\r
: lowerZone (other.lowerZone),\r
checkAndLimitZoneParameters (0, 96, masterPitchbendRange);\r
\r
if (isLower)\r
- lowerZone = { true, numMemberChannels, perNotePitchbendRange, masterPitchbendRange };\r
+ lowerZone = { MPEZone::Type::lower, numMemberChannels, perNotePitchbendRange, masterPitchbendRange };\r
else\r
- upperZone = { false, numMemberChannels, perNotePitchbendRange, masterPitchbendRange };\r
+ upperZone = { MPEZone::Type::upper, numMemberChannels, perNotePitchbendRange, masterPitchbendRange };\r
\r
if (numMemberChannels > 0)\r
{\r
\r
void MPEZoneLayout::clearAllZones()\r
{\r
- lowerZone = { true, 0 };\r
- upperZone = { false, 0 };\r
+ lowerZone = { MPEZone::Type::lower, 0 };\r
+ upperZone = { MPEZone::Type::upper, 0 };\r
\r
sendLayoutChangeMessage();\r
}\r
}\r
}\r
\r
-void MPEZoneLayout::updateMasterPitchbend (Zone& zone, int value)\r
+void MPEZoneLayout::updateMasterPitchbend (MPEZone& zone, int value)\r
{\r
if (zone.masterPitchbendRange != value)\r
{\r
}\r
}\r
\r
-void MPEZoneLayout::updatePerNotePitchbendRange (Zone& zone, int value)\r
+void MPEZoneLayout::updatePerNotePitchbendRange (MPEZone& zone, int value)\r
{\r
if (zone.perNotePitchbendRange != value)\r
{\r
namespace juce\r
{\r
\r
+//==============================================================================\r
+/**\r
+ This struct represents an MPE zone.\r
+\r
+ It can either be a lower or an upper zone, where:\r
+ - A lower zone encompasses master channel 1 and an arbitrary number of ascending\r
+ MIDI channels, increasing from channel 2.\r
+ - An upper zone encompasses master channel 16 and an arbitrary number of descending\r
+ MIDI channels, decreasing from channel 15.\r
+\r
+ It also defines a pitchbend range (in semitones) to be applied for per-note pitchbends and\r
+ master pitchbends, respectively.\r
+*/\r
+struct MPEZone\r
+{\r
+ enum class Type { lower, upper };\r
+\r
+ MPEZone() = default;\r
+ MPEZone (const MPEZone& other) = default;\r
+\r
+ MPEZone (Type type, int memberChannels = 0, int perNotePitchbend = 48, int masterPitchbend = 2)\r
+ : zoneType (type),\r
+ numMemberChannels (memberChannels),\r
+ perNotePitchbendRange (perNotePitchbend),\r
+ masterPitchbendRange (masterPitchbend)\r
+ {}\r
+\r
+ bool isLowerZone() const noexcept { return zoneType == Type::lower; }\r
+ bool isUpperZone() const noexcept { return zoneType == Type::upper; }\r
+\r
+ bool isActive() const noexcept { return numMemberChannels > 0; }\r
+\r
+ int getMasterChannel() const noexcept { return isLowerZone() ? lowerZoneMasterChannel : upperZoneMasterChannel; }\r
+ int getFirstMemberChannel() const noexcept { return isLowerZone() ? lowerZoneMasterChannel + 1 : upperZoneMasterChannel - 1; }\r
+ int getLastMemberChannel() const noexcept { return isLowerZone() ? (lowerZoneMasterChannel + numMemberChannels)\r
+ : (upperZoneMasterChannel - numMemberChannels); }\r
+\r
+ bool isUsingChannelAsMemberChannel (int channel) const noexcept\r
+ {\r
+ return isLowerZone() ? (lowerZoneMasterChannel < channel && channel <= getLastMemberChannel())\r
+ : (channel < upperZoneMasterChannel && getLastMemberChannel() <= channel);\r
+ }\r
+\r
+ bool isUsing (int channel) const noexcept\r
+ {\r
+ return isUsingChannelAsMemberChannel (channel) || channel == getMasterChannel();\r
+ }\r
+\r
+ static auto tie (const MPEZone& z)\r
+ {\r
+ return std::tie (z.zoneType,\r
+ z.numMemberChannels,\r
+ z.perNotePitchbendRange,\r
+ z.masterPitchbendRange);\r
+ }\r
+\r
+ bool operator== (const MPEZone& other) const\r
+ {\r
+ return tie (*this) == tie (other);\r
+ }\r
+\r
+ bool operator!= (const MPEZone& other) const\r
+ {\r
+ return tie (*this) != tie (other);\r
+ }\r
+\r
+ //==============================================================================\r
+ static constexpr int lowerZoneMasterChannel = 1,\r
+ upperZoneMasterChannel = 16;\r
+\r
+ Type zoneType = Type::lower;\r
+\r
+ int numMemberChannels = 0;\r
+ int perNotePitchbendRange = 48;\r
+ int masterPitchbendRange = 2;\r
+};\r
+\r
//==============================================================================\r
/**\r
This class represents the current MPE zone layout of a device capable of handling MPE.\r
class JUCE_API MPEZoneLayout\r
{\r
public:\r
- /** Default constructor.\r
+ //==============================================================================\r
+ /** Creates a layout with inactive upper and lower zones. */\r
+ MPEZoneLayout() = default;\r
\r
- This will create a layout with inactive lower and upper zones, representing\r
- a device with MPE mode disabled.\r
+ /** Creates a layout with the given upper and lower zones. */\r
+ MPEZoneLayout (MPEZone lower, MPEZone upper);\r
\r
- You can set the lower or upper MPE zones using the setZone() method.\r
+ /** Creates a layout with a single upper or lower zone, leaving the other zone uninitialised. */\r
+ MPEZoneLayout (MPEZone singleZone);\r
\r
- @see setZone\r
- */\r
- MPEZoneLayout() noexcept;\r
-\r
- /** Copy constuctor.\r
- This will not copy the listeners registered to the MPEZoneLayout.\r
- */\r
MPEZoneLayout (const MPEZoneLayout& other);\r
-\r
- /** Copy assignment operator.\r
- This will not copy the listeners registered to the MPEZoneLayout.\r
- */\r
MPEZoneLayout& operator= (const MPEZoneLayout& other);\r
\r
- //==============================================================================\r
- /**\r
- This struct represents an MPE zone.\r
-\r
- It can either be a lower or an upper zone, where:\r
- - A lower zone encompasses master channel 1 and an arbitrary number of ascending\r
- MIDI channels, increasing from channel 2.\r
- - An upper zone encompasses master channel 16 and an arbitrary number of descending\r
- MIDI channels, decreasing from channel 15.\r
-\r
- It also defines a pitchbend range (in semitones) to be applied for per-note pitchbends and\r
- master pitchbends, respectively.\r
- */\r
- struct Zone\r
- {\r
- Zone (const Zone& other) = default;\r
-\r
- bool isLowerZone() const noexcept { return lowerZone; }\r
- bool isUpperZone() const noexcept { return ! lowerZone; }\r
-\r
- bool isActive() const noexcept { return numMemberChannels > 0; }\r
-\r
- int getMasterChannel() const noexcept { return lowerZone ? 1 : 16; }\r
- int getFirstMemberChannel() const noexcept { return lowerZone ? 2 : 15; }\r
- int getLastMemberChannel() const noexcept { return lowerZone ? (1 + numMemberChannels)\r
- : (16 - numMemberChannels); }\r
-\r
- bool isUsingChannelAsMemberChannel (int channel) const noexcept\r
- {\r
- return lowerZone ? (channel > 1 && channel <= 1 + numMemberChannels)\r
- : (channel < 16 && channel >= 16 - numMemberChannels);\r
- }\r
-\r
- bool isUsing (int channel) const noexcept\r
- {\r
- return isUsingChannelAsMemberChannel (channel) || channel == getMasterChannel();\r
- }\r
+ bool operator== (const MPEZoneLayout& other) const { return lowerZone == other.lowerZone && upperZone == other.upperZone; }\r
+ bool operator!= (const MPEZoneLayout& other) const { return ! operator== (other); }\r
\r
- bool operator== (const Zone& other) const noexcept { return lowerZone == other.lowerZone\r
- && numMemberChannels == other.numMemberChannels\r
- && perNotePitchbendRange == other.perNotePitchbendRange\r
- && masterPitchbendRange == other.masterPitchbendRange; }\r
-\r
- bool operator!= (const Zone& other) const noexcept { return ! operator== (other); }\r
-\r
- int numMemberChannels;\r
- int perNotePitchbendRange;\r
- int masterPitchbendRange;\r
-\r
- private:\r
- friend class MPEZoneLayout;\r
-\r
- Zone (bool lower, int memberChans = 0, int perNotePb = 48, int masterPb = 2) noexcept\r
- : numMemberChannels (memberChans),\r
- perNotePitchbendRange (perNotePb),\r
- masterPitchbendRange (masterPb),\r
- lowerZone (lower)\r
- {\r
- }\r
+ //==============================================================================\r
+ /** Returns a struct representing the lower MPE zone. */\r
+ MPEZone getLowerZone() const noexcept { return lowerZone; }\r
\r
- bool lowerZone;\r
- };\r
+ /** Returns a struct representing the upper MPE zone. */\r
+ MPEZone getUpperZone() const noexcept { return upperZone; }\r
\r
/** Sets the lower zone of this layout. */\r
void setLowerZone (int numMemberChannels = 0,\r
int perNotePitchbendRange = 48,\r
int masterPitchbendRange = 2) noexcept;\r
\r
- /** Returns a struct representing the lower MPE zone. */\r
- const Zone getLowerZone() const noexcept { return lowerZone; }\r
-\r
- /** Returns a struct representing the upper MPE zone. */\r
- const Zone getUpperZone() const noexcept { return upperZone; }\r
-\r
/** Clears the lower and upper zones of this layout, making them both inactive\r
and disabling MPE mode.\r
*/\r
void clearAllZones();\r
\r
+ /** Returns true if either of the zones are active. */\r
+ bool isActive() const { return lowerZone.isActive() || upperZone.isActive(); }\r
+\r
//==============================================================================\r
/** Pass incoming MIDI messages to an object of this class if you want the\r
zone layout to properly react to MPE RPN messages like an\r
/** Removes a listener. */\r
void removeListener (Listener* const listenerToRemove) noexcept;\r
\r
+ #ifndef DOXYGEN\r
+ using Zone = MPEZone;\r
+ #endif\r
+\r
private:\r
//==============================================================================\r
- Zone lowerZone { true, 0 };\r
- Zone upperZone { false, 0 };\r
+ MPEZone lowerZone { MPEZone::Type::lower, 0 };\r
+ MPEZone upperZone { MPEZone::Type::upper, 0 };\r
\r
MidiRPNDetector rpnDetector;\r
ListenerList<Listener> listeners;\r
void processZoneLayoutRpnMessage (MidiRPNMessage);\r
void processPitchbendRangeRpnMessage (MidiRPNMessage);\r
\r
- void updateMasterPitchbend (Zone&, int);\r
- void updatePerNotePitchbendRange (Zone&, int);\r
+ void updateMasterPitchbend (MPEZone&, int);\r
+ void updatePerNotePitchbendRange (MPEZone&, int);\r
\r
void sendLayoutChangeMessage();\r
void checkAndLimitZoneParameters (int, int, int&) noexcept;\r
currentDeviceType = currentAudioDevice->getTypeName();\r
\r
currentAudioDevice->start (callbackHandler.get());\r
-\r
- currentSetup.sampleRate = currentAudioDevice->getCurrentSampleRate();\r
- currentSetup.bufferSize = currentAudioDevice->getCurrentBufferSizeSamples();\r
- currentSetup.inputChannels = currentAudioDevice->getActiveInputChannels();\r
- currentSetup.outputChannels = currentAudioDevice->getActiveOutputChannels();\r
+ updateCurrentSetup();\r
\r
for (int i = 0; i < availableDeviceTypes.size(); ++i)\r
if (availableDeviceTypes.getUnchecked (i)->getTypeName() == currentDeviceType)\r
loadMeasurer.reset (device->getCurrentSampleRate(),\r
device->getCurrentBufferSizeSamples());\r
\r
+ updateCurrentSetup();\r
+\r
{\r
const ScopedLock sl (audioCallbackLock);\r
\r
callbacks.getUnchecked(i)->audioDeviceAboutToStart (device);\r
}\r
\r
- updateCurrentSetup();\r
sendChangeMessage();\r
}\r
\r
enableInputChannels (manager);\r
closeDeviceByRequestingEmptyNames (manager);\r
}\r
+\r
+ beginTest ("AudioDeviceManager updates its current settings before notifying callbacks when device restarts itself");\r
+ {\r
+ AudioDeviceManager manager;\r
+ auto deviceType = std::make_unique<MockDeviceType> ("foo",\r
+ StringArray { "foo in a", "foo in b" },\r
+ StringArray { "foo out a", "foo out b" });\r
+ auto* ptr = deviceType.get();\r
+ manager.addAudioDeviceType (std::move (deviceType));\r
+\r
+ AudioDeviceManager::AudioDeviceSetup setup;\r
+ setup.sampleRate = 48000.0;\r
+ setup.bufferSize = 256;\r
+ setup.inputDeviceName = "foo in a";\r
+ setup.outputDeviceName = "foo out a";\r
+ setup.useDefaultInputChannels = true;\r
+ setup.useDefaultOutputChannels = true;\r
+ manager.setAudioDeviceSetup (setup, true);\r
+\r
+ const auto currentSetup = manager.getAudioDeviceSetup();\r
+ expectEquals (currentSetup.sampleRate, setup.sampleRate);\r
+ expectEquals (currentSetup.bufferSize, setup.bufferSize);\r
+\r
+ MockCallback callback;\r
+ manager.addAudioCallback (&callback);\r
+\r
+ constexpr auto newSr = 10000.0;\r
+ constexpr auto newBs = 1024;\r
+ auto numCalls = 0;\r
+\r
+ // Compilers disagree about whether newSr and newBs need to be captured\r
+ callback.aboutToStart = [&]\r
+ {\r
+ ++numCalls;\r
+ const auto current = manager.getAudioDeviceSetup();\r
+ expectEquals (current.sampleRate, newSr);\r
+ expectEquals (current.bufferSize, newBs);\r
+ };\r
+\r
+ ptr->restartDevices (newSr, newBs);\r
+ expectEquals (numCalls, 1);\r
+ }\r
}\r
\r
private:\r
const String mockBName = "mockB";\r
const String emptyName = "empty";\r
\r
- class MockDevice : public AudioIODevice\r
+ struct Restartable\r
+ {\r
+ virtual ~Restartable() = default;\r
+ virtual void restart (double newSr, int newBs) = 0;\r
+ };\r
+\r
+ class MockDevice : public AudioIODevice,\r
+ private Restartable\r
{\r
public:\r
- MockDevice (String typeNameIn, String outNameIn, String inNameIn)\r
- : AudioIODevice ("mock", typeNameIn), outName (outNameIn), inName (inNameIn) {}\r
+ MockDevice (ListenerList<Restartable>& l, String typeNameIn, String outNameIn, String inNameIn)\r
+ : AudioIODevice ("mock", typeNameIn), listeners (l), outName (outNameIn), inName (inNameIn)\r
+ {\r
+ listeners.add (this);\r
+ }\r
+\r
+ ~MockDevice() override\r
+ {\r
+ listeners.remove (this);\r
+ }\r
\r
StringArray getOutputChannelNames() override { return { "o1", "o2", "o3" }; }\r
StringArray getInputChannelNames() override { return { "i1", "i2", "i3" }; }\r
void close() override { on = false; }\r
bool isOpen() override { return on; }\r
\r
- void start (AudioIODeviceCallback*) override { playing = true; }\r
- void stop() override { playing = false; }\r
+ void start (AudioIODeviceCallback* c) override\r
+ {\r
+ callback = c;\r
+ callback->audioDeviceAboutToStart (this);\r
+ playing = true;\r
+ }\r
+\r
+ void stop() override\r
+ {\r
+ playing = false;\r
+ callback->audioDeviceStopped();\r
+ }\r
+\r
bool isPlaying() override { return playing; }\r
\r
String getLastError() override { return {}; }\r
int getInputLatencyInSamples() override { return 0; }\r
\r
private:\r
+ void restart (double newSr, int newBs) override\r
+ {\r
+ stop();\r
+ close();\r
+ open (inChannels, outChannels, newSr, newBs);\r
+ start (callback);\r
+ }\r
+\r
+ ListenerList<Restartable>& listeners;\r
+ AudioIODeviceCallback* callback = nullptr;\r
String outName, inName;\r
BigInteger outChannels, inChannels;\r
double sampleRate = 0.0;\r
inNames (std::move (inputNames)),\r
outNames (std::move (outputNames)) {}\r
\r
+ ~MockDeviceType() override\r
+ {\r
+ // A Device outlived its DeviceType!\r
+ jassert (listeners.isEmpty());\r
+ }\r
+\r
void scanForDevices() override {}\r
\r
StringArray getDeviceNames (bool isInput) const override\r
AudioIODevice* createDevice (const String& outputName, const String& inputName) override\r
{\r
if (inNames.contains (inputName) || outNames.contains (outputName))\r
- return new MockDevice (getTypeName(), outputName, inputName);\r
+ return new MockDevice (listeners, getTypeName(), outputName, inputName);\r
\r
return nullptr;\r
}\r
\r
+ // Call this to emulate the device restarting itself with new settings.\r
+ // This might happen e.g. when a user changes the ASIO settings.\r
+ void restartDevices (double newSr, int newBs)\r
+ {\r
+ listeners.call ([&] (auto& l) { return l.restart (newSr, newBs); });\r
+ }\r
+\r
private:\r
const StringArray& getNames (bool isInput) const { return isInput ? inNames : outNames; }\r
\r
const StringArray inNames, outNames;\r
+ ListenerList<Restartable> listeners;\r
+ };\r
+\r
+ class MockCallback : public AudioIODeviceCallback\r
+ {\r
+ public:\r
+ std::function<void()> callback;\r
+ std::function<void()> aboutToStart;\r
+ std::function<void()> stopped;\r
+ std::function<void()> error;\r
+\r
+ void audioDeviceIOCallback (const float**, int, float**, int, int) override { NullCheckedInvocation::invoke (callback); }\r
+ void audioDeviceAboutToStart (AudioIODevice*) override { NullCheckedInvocation::invoke (aboutToStart); }\r
+ void audioDeviceStopped() override { NullCheckedInvocation::invoke (stopped); }\r
+ void audioDeviceError (const String&) override { NullCheckedInvocation::invoke (error); }\r
};\r
\r
void initialiseManager (AudioDeviceManager& manager)\r
\r
ID: juce_audio_devices\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE audio and MIDI I/O device classes\r
description: Classes to play and record from audio and MIDI I/O devices\r
website: http://www.juce.com/juce\r
\r
static void getDeviceSampleRates (snd_pcm_t* handle, Array<double>& rates)\r
{\r
- const int ratesToTry[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 };\r
+ const int ratesToTry[] = { 22050, 24000, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 };\r
\r
snd_pcm_hw_params_t* hwParams;\r
snd_pcm_hw_params_alloca (&hwParams);\r
\r
if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ranges)))\r
{\r
- for (auto r : { 8000, 11025, 16000, 22050, 32000,\r
+ for (auto r : { 8000, 11025, 16000, 22050, 24000, 32000,\r
44100, 48000, 88200, 96000, 176400,\r
192000, 352800, 384000, 705600, 768000 })\r
{\r
{\r
const ScopedLock sl (callbackLock);\r
\r
- if (! started)\r
+ if (callback == nullptr && callbackToNotify != nullptr)\r
{\r
- callback = nullptr;\r
+ callback = callbackToNotify;\r
+ callback->audioDeviceAboutToStart (&owner);\r
+ }\r
\r
+ if (! started)\r
+ {\r
if (deviceID != 0)\r
{\r
if (OK (AudioDeviceCreateIOProcID (deviceID, audioIOProc, this, &audioProcID)))\r
}\r
}\r
}\r
-\r
- if (started)\r
- {\r
- callback = callbackToNotify;\r
-\r
- if (callback != nullptr)\r
- callback->audioDeviceAboutToStart (&owner);\r
- }\r
}\r
\r
playing = started && callback != nullptr;\r
\r
if (asioObject != nullptr)\r
{\r
- for (auto rate : { 8000, 11025, 16000, 22050, 32000,\r
+ for (auto rate : { 8000, 11025, 16000, 22050, 24000, 32000,\r
44100, 48000, 88200, 96000, 176400,\r
192000, 352800, 384000, 705600, 768000 })\r
if (asioObject->canSampleRate ((double) rate) == 0)\r
JUCE_COMCALL UnregisterAudioSessionNotification (IAudioSessionEvents*) = 0;\r
};\r
\r
+} // namespace juce\r
+\r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::IPropertyStore, 0x886d8eeb, 0x8cf2, 0x4446, 0x8d, 0x02, 0xcd, 0xba, 0x1d, 0xbd, 0xcf, 0x99)\r
+__CRT_UUID_DECL (juce::IMMDevice, 0xD666063F, 0x1587, 0x4E43, 0x81, 0xF1, 0xB9, 0x48, 0xE8, 0x07, 0x36, 0x3F)\r
+__CRT_UUID_DECL (juce::IMMEndpoint, 0x1BE09788, 0x6894, 0x4089, 0x85, 0x86, 0x9A, 0x2A, 0x6C, 0x26, 0x5A, 0xC5)\r
+__CRT_UUID_DECL (juce::IMMNotificationClient, 0x7991EEC9, 0x7E89, 0x4D85, 0x83, 0x90, 0x6C, 0x70, 0x3C, 0xEC, 0x60, 0xC0)\r
+__CRT_UUID_DECL (juce::IMMDeviceEnumerator, 0xA95664D2, 0x9614, 0x4F35, 0xA7, 0x46, 0xDE, 0x8D, 0xB6, 0x36, 0x17, 0xE6)\r
+__CRT_UUID_DECL (juce::MMDeviceEnumerator, 0xBCDE0395, 0xE52F, 0x467C, 0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E)\r
+__CRT_UUID_DECL (juce::IAudioClient, 0x1CB9AD4C, 0xDBFA, 0x4c32, 0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2)\r
+__CRT_UUID_DECL (juce::IAudioClient2, 0x726778CD, 0xF60A, 0x4eda, 0x82, 0xDE, 0xE4, 0x76, 0x10, 0xCD, 0x78, 0xAA)\r
+__CRT_UUID_DECL (juce::IAudioClient3, 0x1CB9AD4C, 0xDBFA, 0x4c32, 0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2)\r
+__CRT_UUID_DECL (juce::IAudioCaptureClient, 0xC8ADBD64, 0xE71E, 0x48a0, 0xA4, 0xDE, 0x18, 0x5C, 0x39, 0x5C, 0xD3, 0x17)\r
+__CRT_UUID_DECL (juce::IAudioRenderClient, 0xF294ACFC, 0x3146, 0x4483, 0xA7, 0xBF, 0xAD, 0xDC, 0xA7, 0xC2, 0x60, 0xE2)\r
+__CRT_UUID_DECL (juce::IAudioEndpointVolume, 0x5CDF2C82, 0x841E, 0x4546, 0x97, 0x22, 0x0C, 0xF7, 0x40, 0x78, 0x22, 0x9A)\r
+__CRT_UUID_DECL (juce::IAudioSessionEvents, 0x24918ACC, 0x64B3, 0x37C1, 0x8C, 0xA9, 0x74, 0xA6, 0x6E, 0x99, 0x57, 0xA8)\r
+__CRT_UUID_DECL (juce::IAudioSessionControl, 0xF4B1A599, 0x7266, 0x4319, 0xA8, 0xCA, 0xE7, 0x0A, 0xCB, 0x11, 0xE8, 0xCD)\r
+#endif\r
+\r
//==============================================================================\r
+namespace juce\r
+{\r
namespace WasapiClasses\r
{\r
\r
\r
void querySupportedSampleRates (WAVEFORMATEXTENSIBLE format, ComSmartPtr<IAudioClient>& audioClient)\r
{\r
- for (auto rate : { 8000, 11025, 16000, 22050, 32000,\r
+ for (auto rate : { 8000, 11025, 16000, 22050, 24000, 32000,\r
44100, 48000, 88200, 96000, 176400,\r
192000, 352800, 384000, 705600, 768000 })\r
{\r
namespace juce\r
{\r
\r
+using StringMap = std::unordered_map<String, String>;\r
+\r
+static auto toMap (const StringPairArray& array)\r
+{\r
+ StringMap result;\r
+\r
+ for (auto i = 0; i < array.size(); ++i)\r
+ result[array.getAllKeys()[i]] = array.getAllValues()[i];\r
+\r
+ return result;\r
+}\r
+\r
+static auto getValueWithDefault (const StringMap& m, const String& key, const String& fallback = {})\r
+{\r
+ const auto iter = m.find (key);\r
+ return iter != m.cend() ? iter->second : fallback;\r
+}\r
+\r
static const char* const wavFormatName = "WAV file";\r
\r
//==============================================================================\r
uint8 reserved[190];\r
char codingHistory[1];\r
\r
- void copyTo (StringPairArray& values, const int totalSize) const\r
+ void copyTo (StringMap& values, const int totalSize) const\r
{\r
- values.set (WavAudioFormat::bwavDescription, String::fromUTF8 (description, sizeof (description)));\r
- values.set (WavAudioFormat::bwavOriginator, String::fromUTF8 (originator, sizeof (originator)));\r
- values.set (WavAudioFormat::bwavOriginatorRef, String::fromUTF8 (originatorRef, sizeof (originatorRef)));\r
- values.set (WavAudioFormat::bwavOriginationDate, String::fromUTF8 (originationDate, sizeof (originationDate)));\r
- values.set (WavAudioFormat::bwavOriginationTime, String::fromUTF8 (originationTime, sizeof (originationTime)));\r
+ values[WavAudioFormat::bwavDescription] = String::fromUTF8 (description, sizeof (description));\r
+ values[WavAudioFormat::bwavOriginator] = String::fromUTF8 (originator, sizeof (originator));\r
+ values[WavAudioFormat::bwavOriginatorRef] = String::fromUTF8 (originatorRef, sizeof (originatorRef));\r
+ values[WavAudioFormat::bwavOriginationDate] = String::fromUTF8 (originationDate, sizeof (originationDate));\r
+ values[WavAudioFormat::bwavOriginationTime] = String::fromUTF8 (originationTime, sizeof (originationTime));\r
\r
auto timeLow = ByteOrder::swapIfBigEndian (timeRefLow);\r
auto timeHigh = ByteOrder::swapIfBigEndian (timeRefHigh);\r
auto time = (((int64) timeHigh) << 32) + timeLow;\r
\r
- values.set (WavAudioFormat::bwavTimeReference, String (time));\r
- values.set (WavAudioFormat::bwavCodingHistory,\r
- String::fromUTF8 (codingHistory, totalSize - (int) offsetof (BWAVChunk, codingHistory)));\r
+ values[WavAudioFormat::bwavTimeReference] = String (time);\r
+ values[WavAudioFormat::bwavCodingHistory] = String::fromUTF8 (codingHistory, totalSize - (int) offsetof (BWAVChunk, codingHistory));\r
}\r
\r
- static MemoryBlock createFrom (const StringPairArray& values)\r
+ static MemoryBlock createFrom (const StringMap& values)\r
{\r
- MemoryBlock data (roundUpSize (sizeof (BWAVChunk) + values[WavAudioFormat::bwavCodingHistory].getNumBytesAsUTF8()));\r
+ MemoryBlock data (roundUpSize (sizeof (BWAVChunk) + getValueWithDefault (values, WavAudioFormat::bwavCodingHistory).getNumBytesAsUTF8()));\r
data.fillWith (0);\r
\r
auto* b = (BWAVChunk*) data.getData();\r
\r
// Allow these calls to overwrite an extra byte at the end, which is fine as long\r
- // as they get called in the right order..\r
- values[WavAudioFormat::bwavDescription] .copyToUTF8 (b->description, 257);\r
- values[WavAudioFormat::bwavOriginator] .copyToUTF8 (b->originator, 33);\r
- values[WavAudioFormat::bwavOriginatorRef] .copyToUTF8 (b->originatorRef, 33);\r
- values[WavAudioFormat::bwavOriginationDate].copyToUTF8 (b->originationDate, 11);\r
- values[WavAudioFormat::bwavOriginationTime].copyToUTF8 (b->originationTime, 9);\r
-\r
- auto time = values[WavAudioFormat::bwavTimeReference].getLargeIntValue();\r
+ // as they get called in the right order.\r
+ getValueWithDefault (values, WavAudioFormat::bwavDescription) .copyToUTF8 (b->description, 257);\r
+ getValueWithDefault (values, WavAudioFormat::bwavOriginator) .copyToUTF8 (b->originator, 33);\r
+ getValueWithDefault (values, WavAudioFormat::bwavOriginatorRef) .copyToUTF8 (b->originatorRef, 33);\r
+ getValueWithDefault (values, WavAudioFormat::bwavOriginationDate).copyToUTF8 (b->originationDate, 11);\r
+ getValueWithDefault (values, WavAudioFormat::bwavOriginationTime).copyToUTF8 (b->originationTime, 9);\r
+\r
+ auto time = getValueWithDefault (values, WavAudioFormat::bwavTimeReference).getLargeIntValue();\r
b->timeRefLow = ByteOrder::swapIfBigEndian ((uint32) (time & 0xffffffff));\r
b->timeRefHigh = ByteOrder::swapIfBigEndian ((uint32) (time >> 32));\r
\r
- values[WavAudioFormat::bwavCodingHistory].copyToUTF8 (b->codingHistory, 0x7fffffff);\r
+ getValueWithDefault (values, WavAudioFormat::bwavCodingHistory).copyToUTF8 (b->codingHistory, 0x7fffffff);\r
\r
if (b->description[0] != 0\r
|| b->originator[0] != 0\r
SampleLoop loops[1];\r
\r
template <typename NameType>\r
- static void setValue (StringPairArray& values, NameType name, uint32 val)\r
+ static void setValue (StringMap& values, NameType name, uint32 val)\r
{\r
- values.set (name, String (ByteOrder::swapIfBigEndian (val)));\r
+ values[name] = String (ByteOrder::swapIfBigEndian (val));\r
}\r
\r
- static void setValue (StringPairArray& values, int prefix, const char* name, uint32 val)\r
+ static void setValue (StringMap& values, int prefix, const char* name, uint32 val)\r
{\r
setValue (values, "Loop" + String (prefix) + name, val);\r
}\r
\r
- void copyTo (StringPairArray& values, const int totalSize) const\r
+ void copyTo (StringMap& values, const int totalSize) const\r
{\r
setValue (values, "Manufacturer", manufacturer);\r
setValue (values, "Product", product);\r
}\r
\r
template <typename NameType>\r
- static uint32 getValue (const StringPairArray& values, NameType name, const char* def)\r
+ static uint32 getValue (const StringMap& values, NameType name, const char* def)\r
{\r
- return ByteOrder::swapIfBigEndian ((uint32) values.getValue (name, def).getIntValue());\r
+ return ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, name, def).getIntValue());\r
}\r
\r
- static uint32 getValue (const StringPairArray& values, int prefix, const char* name, const char* def)\r
+ static uint32 getValue (const StringMap& values, int prefix, const char* name, const char* def)\r
{\r
return getValue (values, "Loop" + String (prefix) + name, def);\r
}\r
\r
- static MemoryBlock createFrom (const StringPairArray& values)\r
+ static MemoryBlock createFrom (const StringMap& values)\r
{\r
MemoryBlock data;\r
- auto numLoops = jmin (64, values.getValue ("NumSampleLoops", "0").getIntValue());\r
+ auto numLoops = jmin (64, getValueWithDefault (values, "NumSampleLoops", "0").getIntValue());\r
\r
data.setSize (roundUpSize (sizeof (SMPLChunk) + (size_t) (jmax (0, numLoops - 1)) * sizeof (SampleLoop)), true);\r
\r
int8 lowVelocity;\r
int8 highVelocity;\r
\r
- static void setValue (StringPairArray& values, const char* name, int val)\r
+ static void setValue (StringMap& values, const char* name, int val)\r
{\r
- values.set (name, String (val));\r
+ values[name] = String (val);\r
}\r
\r
- void copyTo (StringPairArray& values) const\r
+ void copyTo (StringMap& values) const\r
{\r
setValue (values, "MidiUnityNote", baseNote);\r
setValue (values, "Detune", detune);\r
setValue (values, "HighVelocity", highVelocity);\r
}\r
\r
- static int8 getValue (const StringPairArray& values, const char* name, const char* def)\r
+ static int8 getValue (const StringMap& values, const char* name, const char* def)\r
{\r
- return (int8) values.getValue (name, def).getIntValue();\r
+ return (int8) getValueWithDefault (values, name, def).getIntValue();\r
}\r
\r
- static MemoryBlock createFrom (const StringPairArray& values)\r
+ static MemoryBlock createFrom (const StringMap& values)\r
{\r
MemoryBlock data;\r
- auto& keys = values.getAllKeys();\r
\r
- if (keys.contains ("LowNote", true) && keys.contains ("HighNote", true))\r
+ if ( values.find ("LowNote") != values.cend()\r
+ && values.find ("HighNote") != values.cend())\r
{\r
data.setSize (8, true);\r
auto* inst = static_cast<InstChunk*> (data.getData());\r
uint32 numCues;\r
Cue cues[1];\r
\r
- static void setValue (StringPairArray& values, int prefix, const char* name, uint32 val)\r
+ static void setValue (StringMap& values, int prefix, const char* name, uint32 val)\r
{\r
- values.set ("Cue" + String (prefix) + name, String (ByteOrder::swapIfBigEndian (val)));\r
+ values["Cue" + String (prefix) + name] = String (ByteOrder::swapIfBigEndian (val));\r
}\r
\r
- void copyTo (StringPairArray& values, const int totalSize) const\r
+ void copyTo (StringMap& values, const int totalSize) const\r
{\r
- values.set ("NumCuePoints", String (ByteOrder::swapIfBigEndian (numCues)));\r
+ values["NumCuePoints"] = String (ByteOrder::swapIfBigEndian (numCues));\r
\r
for (int i = 0; i < (int) numCues; ++i)\r
{\r
}\r
}\r
\r
- static MemoryBlock createFrom (const StringPairArray& values)\r
+ static MemoryBlock createFrom (const StringMap& values)\r
{\r
MemoryBlock data;\r
- const int numCues = values.getValue ("NumCuePoints", "0").getIntValue();\r
+ const int numCues = getValueWithDefault (values, "NumCuePoints", "0").getIntValue();\r
\r
if (numCues > 0)\r
{\r
for (int i = 0; i < numCues; ++i)\r
{\r
auto prefix = "Cue" + String (i);\r
- auto identifier = (uint32) values.getValue (prefix + "Identifier", "0").getIntValue();\r
+ auto identifier = (uint32) getValueWithDefault (values, prefix + "Identifier", "0").getIntValue();\r
\r
#if JUCE_DEBUG\r
jassert (! identifiers.contains (identifier));\r
identifiers.add (identifier);\r
#endif\r
\r
- auto order = values.getValue (prefix + "Order", String (nextOrder)).getIntValue();\r
+ auto order = getValueWithDefault (values, prefix + "Order", String (nextOrder)).getIntValue();\r
nextOrder = jmax (nextOrder, order) + 1;\r
\r
auto& cue = c->cues[i];\r
cue.identifier = ByteOrder::swapIfBigEndian ((uint32) identifier);\r
cue.order = ByteOrder::swapIfBigEndian ((uint32) order);\r
- cue.chunkID = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "ChunkID", dataChunkID).getIntValue());\r
- cue.chunkStart = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "ChunkStart", "0").getIntValue());\r
- cue.blockStart = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "BlockStart", "0").getIntValue());\r
- cue.offset = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "Offset", "0").getIntValue());\r
+ cue.chunkID = ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, prefix + "ChunkID", dataChunkID).getIntValue());\r
+ cue.chunkStart = ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, prefix + "ChunkStart", "0").getIntValue());\r
+ cue.blockStart = ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, prefix + "BlockStart", "0").getIntValue());\r
+ cue.offset = ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, prefix + "Offset", "0").getIntValue());\r
}\r
}\r
\r
//==============================================================================\r
namespace ListChunk\r
{\r
- static int getValue (const StringPairArray& values, const String& name)\r
+ static int getValue (const StringMap& values, const String& name)\r
{\r
- return values.getValue (name, "0").getIntValue();\r
+ return getValueWithDefault (values, name, "0").getIntValue();\r
}\r
\r
- static int getValue (const StringPairArray& values, const String& prefix, const char* name)\r
+ static int getValue (const StringMap& values, const String& prefix, const char* name)\r
{\r
return getValue (values, prefix + name);\r
}\r
\r
- static void appendLabelOrNoteChunk (const StringPairArray& values, const String& prefix,\r
+ static void appendLabelOrNoteChunk (const StringMap& values, const String& prefix,\r
const int chunkType, MemoryOutputStream& out)\r
{\r
- auto label = values.getValue (prefix + "Text", prefix);\r
+ auto label = getValueWithDefault (values, prefix + "Text", prefix);\r
auto labelLength = (int) label.getNumBytesAsUTF8() + 1;\r
auto chunkLength = 4 + labelLength + (labelLength & 1);\r
\r
out.writeByte (0);\r
}\r
\r
- static void appendExtraChunk (const StringPairArray& values, const String& prefix, MemoryOutputStream& out)\r
+ static void appendExtraChunk (const StringMap& values, const String& prefix, MemoryOutputStream& out)\r
{\r
- auto text = values.getValue (prefix + "Text", prefix);\r
+ auto text = getValueWithDefault (values, prefix + "Text", prefix);\r
\r
auto textLength = (int) text.getNumBytesAsUTF8() + 1; // include null terminator\r
auto chunkLength = textLength + 20 + (textLength & 1);\r
out.writeByte (0);\r
}\r
\r
- static MemoryBlock createFrom (const StringPairArray& values)\r
+ static MemoryBlock createFrom (const StringMap& values)\r
{\r
auto numCueLabels = getValue (values, "NumCueLabels");\r
auto numCueNotes = getValue (values, "NumCueNotes");\r
return true;\r
}\r
\r
- static void addToMetadata (StringPairArray& values, InputStream& input, int64 chunkEnd)\r
+ static void addToMetadata (StringMap& values, InputStream& input, int64 chunkEnd)\r
{\r
while (input.getPosition() < chunkEnd)\r
{\r
{\r
MemoryBlock mb;\r
input.readIntoMemoryBlock (mb, (ssize_t) infoLength);\r
- values.set (type, String::createStringFromData ((const char*) mb.getData(),\r
- (int) mb.getSize()));\r
+ values[type] = String::createStringFromData ((const char*) mb.getData(),\r
+ (int) mb.getSize());\r
break;\r
}\r
}\r
}\r
}\r
\r
- static bool writeValue (const StringPairArray& values, MemoryOutputStream& out, const char* paramName)\r
+ static bool writeValue (const StringMap& values, MemoryOutputStream& out, const char* paramName)\r
{\r
- auto value = values.getValue (paramName, {});\r
+ auto value = getValueWithDefault (values, paramName, {});\r
\r
if (value.isEmpty())\r
return false;\r
return true;\r
}\r
\r
- static MemoryBlock createFrom (const StringPairArray& values)\r
+ static MemoryBlock createFrom (const StringMap& values)\r
{\r
MemoryOutputStream out;\r
out.writeInt (chunkName ("INFO"));\r
input.read (this, (int) jmin (sizeof (*this), length));\r
}\r
\r
- AcidChunk (const StringPairArray& values)\r
+ AcidChunk (const StringMap& values)\r
{\r
zerostruct (*this);\r
\r
| getFlagIfPresent (values, WavAudioFormat::acidDiskBased, 0x08)\r
| getFlagIfPresent (values, WavAudioFormat::acidizerFlag, 0x10);\r
\r
- if (values[WavAudioFormat::acidRootSet].getIntValue() != 0)\r
- rootNote = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidRootNote].getIntValue());\r
+ if (getValueWithDefault (values, WavAudioFormat::acidRootSet).getIntValue() != 0)\r
+ rootNote = ByteOrder::swapIfBigEndian ((uint16) getValueWithDefault (values, WavAudioFormat::acidRootNote).getIntValue());\r
+\r
+ numBeats = ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, WavAudioFormat::acidBeats).getIntValue());\r
+ meterDenominator = ByteOrder::swapIfBigEndian ((uint16) getValueWithDefault (values, WavAudioFormat::acidDenominator).getIntValue());\r
+ meterNumerator = ByteOrder::swapIfBigEndian ((uint16) getValueWithDefault (values, WavAudioFormat::acidNumerator).getIntValue());\r
\r
- numBeats = ByteOrder::swapIfBigEndian ((uint32) values[WavAudioFormat::acidBeats].getIntValue());\r
- meterDenominator = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidDenominator].getIntValue());\r
- meterNumerator = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidNumerator].getIntValue());\r
+ const auto iter = values.find (WavAudioFormat::acidTempo);\r
\r
- if (values.containsKey (WavAudioFormat::acidTempo))\r
- tempo = swapFloatByteOrder (values[WavAudioFormat::acidTempo].getFloatValue());\r
+ if (iter != values.cend())\r
+ tempo = swapFloatByteOrder (iter->second.getFloatValue());\r
}\r
\r
- static MemoryBlock createFrom (const StringPairArray& values)\r
+ static MemoryBlock createFrom (const StringMap& values)\r
{\r
return AcidChunk (values).toMemoryBlock();\r
}\r
? MemoryBlock (this, sizeof (*this)) : MemoryBlock();\r
}\r
\r
- void addToMetadata (StringPairArray& values) const\r
+ void addToMetadata (StringMap& values) const\r
{\r
setBoolFlag (values, WavAudioFormat::acidOneShot, 0x01);\r
setBoolFlag (values, WavAudioFormat::acidRootSet, 0x02);\r
setBoolFlag (values, WavAudioFormat::acidizerFlag, 0x10);\r
\r
if (flags & 0x02) // root note set\r
- values.set (WavAudioFormat::acidRootNote, String (ByteOrder::swapIfBigEndian (rootNote)));\r
+ values[WavAudioFormat::acidRootNote] = String (ByteOrder::swapIfBigEndian (rootNote));\r
\r
- values.set (WavAudioFormat::acidBeats, String (ByteOrder::swapIfBigEndian (numBeats)));\r
- values.set (WavAudioFormat::acidDenominator, String (ByteOrder::swapIfBigEndian (meterDenominator)));\r
- values.set (WavAudioFormat::acidNumerator, String (ByteOrder::swapIfBigEndian (meterNumerator)));\r
- values.set (WavAudioFormat::acidTempo, String (swapFloatByteOrder (tempo)));\r
+ values[WavAudioFormat::acidBeats] = String (ByteOrder::swapIfBigEndian (numBeats));\r
+ values[WavAudioFormat::acidDenominator] = String (ByteOrder::swapIfBigEndian (meterDenominator));\r
+ values[WavAudioFormat::acidNumerator] = String (ByteOrder::swapIfBigEndian (meterNumerator));\r
+ values[WavAudioFormat::acidTempo] = String (swapFloatByteOrder (tempo));\r
}\r
\r
- void setBoolFlag (StringPairArray& values, const char* name, uint32 mask) const\r
+ void setBoolFlag (StringMap& values, const char* name, uint32 mask) const\r
{\r
- values.set (name, (flags & ByteOrder::swapIfBigEndian (mask)) ? "1" : "0");\r
+ values[name] = (flags & ByteOrder::swapIfBigEndian (mask)) ? "1" : "0";\r
}\r
\r
- static uint32 getFlagIfPresent (const StringPairArray& values, const char* name, uint32 flag)\r
+ static uint32 getFlagIfPresent (const StringMap& values, const char* name, uint32 flag)\r
{\r
- return values[name].getIntValue() != 0 ? ByteOrder::swapIfBigEndian (flag) : 0;\r
+ return getValueWithDefault (values, name).getIntValue() != 0 ? ByteOrder::swapIfBigEndian (flag) : 0;\r
}\r
\r
static float swapFloatByteOrder (const float x) noexcept\r
//==============================================================================\r
struct TracktionChunk\r
{\r
- static MemoryBlock createFrom (const StringPairArray& values)\r
+ static MemoryBlock createFrom (const StringMap& values)\r
{\r
MemoryOutputStream out;\r
- auto s = values[WavAudioFormat::tracktionLoopInfo];\r
+ auto s = getValueWithDefault (values, WavAudioFormat::tracktionLoopInfo);\r
\r
if (s.isNotEmpty())\r
{\r
//==============================================================================\r
namespace AXMLChunk\r
{\r
- static void addToMetadata (StringPairArray& destValues, const String& source)\r
+ static void addToMetadata (StringMap& destValues, const String& source)\r
{\r
if (auto xml = parseXML (source))\r
{\r
auto ISRCCode = xml4->getAllSubText().fromFirstOccurrenceOf ("ISRC:", false, true);\r
\r
if (ISRCCode.isNotEmpty())\r
- destValues.set (WavAudioFormat::ISRC, ISRCCode);\r
+ destValues[WavAudioFormat::ISRC] = ISRCCode;\r
}\r
}\r
}\r
}\r
}\r
\r
- static MemoryBlock createFrom (const StringPairArray& values)\r
+ static MemoryBlock createFrom (const StringMap& values)\r
{\r
- auto ISRC = values.getValue (WavAudioFormat::ISRC, {});\r
+ auto ISRC = getValueWithDefault (values, WavAudioFormat::ISRC);\r
MemoryOutputStream xml;\r
\r
if (ISRC.isNotEmpty())\r
int cueLabelIndex = 0;\r
int cueRegionIndex = 0;\r
\r
+ StringMap dict;\r
+\r
auto streamStartPos = input->getPosition();\r
auto firstChunkType = input->readInt();\r
\r
{\r
input->skipNextBytes (4); // skip over size and bitsPerSample\r
auto channelMask = input->readInt();\r
- metadataValues.set ("ChannelMask", String (channelMask));\r
+ dict["ChannelMask"] = String (channelMask);\r
channelLayout = getChannelLayoutFromMask (channelMask, numChannels);\r
\r
ExtensibleWavSubFormat subFormat;\r
HeapBlock<BWAVChunk> bwav;\r
bwav.calloc (jmax ((size_t) length + 1, sizeof (BWAVChunk)), 1);\r
input->read (bwav, (int) length);\r
- bwav->copyTo (metadataValues, (int) length);\r
+ bwav->copyTo (dict, (int) length);\r
}\r
else if (chunkType == chunkName ("smpl"))\r
{\r
HeapBlock<SMPLChunk> smpl;\r
smpl.calloc (jmax ((size_t) length + 1, sizeof (SMPLChunk)), 1);\r
input->read (smpl, (int) length);\r
- smpl->copyTo (metadataValues, (int) length);\r
+ smpl->copyTo (dict, (int) length);\r
}\r
else if (chunkType == chunkName ("inst") || chunkType == chunkName ("INST")) // need to check which...\r
{\r
HeapBlock<InstChunk> inst;\r
inst.calloc (jmax ((size_t) length + 1, sizeof (InstChunk)), 1);\r
input->read (inst, (int) length);\r
- inst->copyTo (metadataValues);\r
+ inst->copyTo (dict);\r
}\r
else if (chunkType == chunkName ("cue "))\r
{\r
HeapBlock<CueChunk> cue;\r
cue.calloc (jmax ((size_t) length + 1, sizeof (CueChunk)), 1);\r
input->read (cue, (int) length);\r
- cue->copyTo (metadataValues, (int) length);\r
+ cue->copyTo (dict, (int) length);\r
}\r
else if (chunkType == chunkName ("axml"))\r
{\r
MemoryBlock axml;\r
input->readIntoMemoryBlock (axml, (ssize_t) length);\r
- AXMLChunk::addToMetadata (metadataValues, axml.toString());\r
+ AXMLChunk::addToMetadata (dict, axml.toString());\r
}\r
else if (chunkType == chunkName ("LIST"))\r
{\r
\r
if (subChunkType == chunkName ("info") || subChunkType == chunkName ("INFO"))\r
{\r
- ListInfoChunk::addToMetadata (metadataValues, *input, chunkEnd);\r
+ ListInfoChunk::addToMetadata (dict, *input, chunkEnd);\r
}\r
else if (subChunkType == chunkName ("adtl"))\r
{\r
MemoryBlock textBlock;\r
input->readIntoMemoryBlock (textBlock, stringLength);\r
\r
- metadataValues.set (prefix + "Identifier", String (identifier));\r
- metadataValues.set (prefix + "Text", textBlock.toString());\r
+ dict[prefix + "Identifier"] = String (identifier);\r
+ dict[prefix + "Text"] = textBlock.toString();\r
}\r
else if (adtlChunkType == chunkName ("ltxt"))\r
{\r
MemoryBlock textBlock;\r
input->readIntoMemoryBlock (textBlock, (int) stringLength);\r
\r
- metadataValues.set (prefix + "Identifier", String (identifier));\r
- metadataValues.set (prefix + "SampleLength", String (sampleLength));\r
- metadataValues.set (prefix + "Purpose", String (purpose));\r
- metadataValues.set (prefix + "Country", String (country));\r
- metadataValues.set (prefix + "Language", String (language));\r
- metadataValues.set (prefix + "Dialect", String (dialect));\r
- metadataValues.set (prefix + "CodePage", String (codePage));\r
- metadataValues.set (prefix + "Text", textBlock.toString());\r
+ dict[prefix + "Identifier"] = String (identifier);\r
+ dict[prefix + "SampleLength"] = String (sampleLength);\r
+ dict[prefix + "Purpose"] = String (purpose);\r
+ dict[prefix + "Country"] = String (country);\r
+ dict[prefix + "Language"] = String (language);\r
+ dict[prefix + "Dialect"] = String (dialect);\r
+ dict[prefix + "CodePage"] = String (codePage);\r
+ dict[prefix + "Text"] = textBlock.toString();\r
}\r
\r
input->setPosition (adtlChunkEnd);\r
}\r
else if (chunkType == chunkName ("acid"))\r
{\r
- AcidChunk (*input, length).addToMetadata (metadataValues);\r
+ AcidChunk (*input, length).addToMetadata (dict);\r
}\r
else if (chunkType == chunkName ("Trkn"))\r
{\r
MemoryBlock tracktion;\r
input->readIntoMemoryBlock (tracktion, (ssize_t) length);\r
- metadataValues.set (WavAudioFormat::tracktionLoopInfo, tracktion.toString());\r
+ dict[WavAudioFormat::tracktionLoopInfo] = tracktion.toString();\r
}\r
else if (chunkEnd <= input->getPosition())\r
{\r
}\r
}\r
\r
- if (cueLabelIndex > 0) metadataValues.set ("NumCueLabels", String (cueLabelIndex));\r
- if (cueNoteIndex > 0) metadataValues.set ("NumCueNotes", String (cueNoteIndex));\r
- if (cueRegionIndex > 0) metadataValues.set ("NumCueRegions", String (cueRegionIndex));\r
- if (metadataValues.size() > 0) metadataValues.set ("MetaDataSource", "WAV");\r
+ if (cueLabelIndex > 0) dict["NumCueLabels"] = String (cueLabelIndex);\r
+ if (cueNoteIndex > 0) dict["NumCueNotes"] = String (cueNoteIndex);\r
+ if (cueRegionIndex > 0) dict["NumCueRegions"] = String (cueRegionIndex);\r
+ if (dict.size() > 0) dict["MetaDataSource"] = "WAV";\r
+\r
+ metadataValues.addUnorderedMap (dict);\r
}\r
\r
//==============================================================================\r
// key should be removed (or set to "WAV") once this has been done\r
jassert (metadataValues.getValue ("MetaDataSource", "None") != "AIFF");\r
\r
- bwavChunk = BWAVChunk::createFrom (metadataValues);\r
- axmlChunk = AXMLChunk::createFrom (metadataValues);\r
- smplChunk = SMPLChunk::createFrom (metadataValues);\r
- instChunk = InstChunk::createFrom (metadataValues);\r
- cueChunk = CueChunk ::createFrom (metadataValues);\r
- listChunk = ListChunk::createFrom (metadataValues);\r
- listInfoChunk = ListInfoChunk::createFrom (metadataValues);\r
- acidChunk = AcidChunk::createFrom (metadataValues);\r
- trckChunk = TracktionChunk::createFrom (metadataValues);\r
+ const auto map = toMap (metadataValues);\r
+\r
+ bwavChunk = BWAVChunk::createFrom (map);\r
+ axmlChunk = AXMLChunk::createFrom (map);\r
+ smplChunk = SMPLChunk::createFrom (map);\r
+ instChunk = InstChunk::createFrom (map);\r
+ cueChunk = CueChunk ::createFrom (map);\r
+ listChunk = ListChunk::createFrom (map);\r
+ listInfoChunk = ListInfoChunk::createFrom (map);\r
+ acidChunk = AcidChunk::createFrom (map);\r
+ trckChunk = TracktionChunk::createFrom (map);\r
}\r
\r
headerPosition = out->getPosition();\r
\r
if (bwavSize > 0)\r
{\r
- auto chunk = BWAVChunk::createFrom (newMetadata);\r
+ auto chunk = BWAVChunk::createFrom (toMap (newMetadata));\r
\r
if (chunk.getSize() <= (size_t) bwavSize)\r
{\r
{\r
beginTest ("Setting up metadata");\r
\r
- StringPairArray metadataValues = WavAudioFormat::createBWAVMetadata ("description",\r
- "originator",\r
- "originatorRef",\r
- Time::getCurrentTime(),\r
- numTestAudioBufferSamples,\r
- "codingHistory");\r
+ auto metadataValues = toMap (WavAudioFormat::createBWAVMetadata ("description",\r
+ "originator",\r
+ "originatorRef",\r
+ Time::getCurrentTime(),\r
+ numTestAudioBufferSamples,\r
+ "codingHistory"));\r
\r
for (int i = numElementsInArray (WavFileHelpers::ListInfoChunk::types); --i >= 0;)\r
- metadataValues.set (WavFileHelpers::ListInfoChunk::types[i],\r
- WavFileHelpers::ListInfoChunk::types[i]);\r
+ metadataValues[WavFileHelpers::ListInfoChunk::types[i]] = WavFileHelpers::ListInfoChunk::types[i];\r
\r
if (metadataValues.size() > 0)\r
- metadataValues.set ("MetaDataSource", "WAV");\r
+ metadataValues["MetaDataSource"] = "WAV";\r
\r
- metadataValues.addArray (createDefaultSMPLMetadata());\r
+ const auto smplMetadata = createDefaultSMPLMetadata();\r
+ metadataValues.insert (smplMetadata.cbegin(), smplMetadata.cend());\r
\r
WavAudioFormat format;\r
MemoryBlock memoryBlock;\r
\r
+ StringPairArray metadataArray;\r
+ metadataArray.addUnorderedMap (metadataValues);\r
+\r
{\r
beginTest ("Creating a basic wave writer");\r
\r
std::unique_ptr<AudioFormatWriter> writer (format.createWriterFor (new MemoryOutputStream (memoryBlock, false),\r
44100.0, numTestAudioBufferChannels,\r
- 32, metadataValues, 0));\r
+ 32, metadataArray, 0));\r
expect (writer != nullptr);\r
\r
AudioBuffer<float> buffer (numTestAudioBufferChannels, numTestAudioBufferSamples);\r
\r
std::unique_ptr<AudioFormatReader> reader (format.createReaderFor (new MemoryInputStream (memoryBlock, false), false));\r
expect (reader != nullptr);\r
- expect (reader->metadataValues == metadataValues, "Somehow, the metadata is different!");\r
+ expect (reader->metadataValues == metadataArray, "Somehow, the metadata is different!");\r
}\r
}\r
\r
numTestAudioBufferSamples = 256\r
};\r
\r
- StringPairArray createDefaultSMPLMetadata() const\r
+ static StringMap createDefaultSMPLMetadata()\r
{\r
- StringPairArray m;\r
-\r
- m.set ("Manufacturer", "0");\r
- m.set ("Product", "0");\r
- m.set ("SamplePeriod", "0");\r
- m.set ("MidiUnityNote", "60");\r
- m.set ("MidiPitchFraction", "0");\r
- m.set ("SmpteFormat", "0");\r
- m.set ("SmpteOffset", "0");\r
- m.set ("NumSampleLoops", "0");\r
- m.set ("SamplerData", "0");\r
+ StringMap m;\r
+\r
+ m["Manufacturer"] = "0";\r
+ m["Product"] = "0";\r
+ m["SamplePeriod"] = "0";\r
+ m["MidiUnityNote"] = "60";\r
+ m["MidiPitchFraction"] = "0";\r
+ m["SmpteFormat"] = "0";\r
+ m["SmpteOffset"] = "0";\r
+ m["NumSampleLoops"] = "0";\r
+ m["SamplerData"] = "0";\r
\r
return m;\r
}\r
\r
ID: juce_audio_formats\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE audio file format codecs\r
description: Classes for reading and writing various audio file formats.\r
website: http://www.juce.com/juce\r
if (auto* editorConstrainer = editor->getConstrainer())\r
{\r
const auto borders = owner.getContentComponentBorder();\r
- const auto extraWindowWidth = borders.getLeftAndRight();\r
- const auto extraWindowHeight = extraHeight + borders.getTopAndBottom();\r
+\r
+ const auto windowBorders = [&]() -> BorderSize<int>\r
+ {\r
+ if (auto* peer = owner.getPeer())\r
+ return peer->getFrameSize();\r
+\r
+ return {};\r
+ }();\r
+\r
+ const auto extraWindowWidth = borders.getLeftAndRight() + windowBorders.getLeftAndRight();\r
+ const auto extraWindowHeight = extraHeight + borders.getTopAndBottom() + windowBorders.getTopAndBottom();\r
\r
owner.setResizeLimits (jmax (10, editorConstrainer->getMinimumWidth() + extraWindowWidth),\r
jmax (10, editorConstrainer->getMinimumHeight() + extraWindowHeight),\r
\r
#if JUCE_VST3_CAN_REPLACE_VST2\r
\r
- #if ! JUCE_MSVC\r
+ #if ! JUCE_MSVC && ! defined (__cdecl)\r
#define __cdecl\r
#endif\r
\r
return kResultFalse;\r
}\r
\r
- if (processSetup.symbolicSampleSize == Vst::kSample32) processAudio<float> (data, channelListFloat);\r
- else if (processSetup.symbolicSampleSize == Vst::kSample64) processAudio<double> (data, channelListDouble);\r
- else jassertfalse;\r
+ // If all of these are zero, the host is attempting to flush parameters without processing audio.\r
+ if (data.numSamples != 0 || data.numInputs != 0 || data.numOutputs != 0)\r
+ {\r
+ if (processSetup.symbolicSampleSize == Vst::kSample32) processAudio<float> (data, channelListFloat);\r
+ else if (processSetup.symbolicSampleSize == Vst::kSample64) processAudio<double> (data, channelListDouble);\r
+ else jassertfalse;\r
+ }\r
+\r
+ if (auto* changes = data.outputParameterChanges)\r
+ {\r
+ comPluginInstance->forAllChangedParameters ([&] (Vst::ParamID paramID, float value)\r
+ {\r
+ Steinberg::int32 queueIndex = 0;\r
+\r
+ if (auto* queue = changes->addParameterData (paramID, queueIndex))\r
+ {\r
+ Steinberg::int32 pointIndex = 0;\r
+ queue->addPoint (0, value, pointIndex);\r
+ }\r
+ });\r
+ }\r
\r
#if JucePlugin_ProducesMidiOutput\r
if (isMidiOutputBusEnabled && data.outputEvents != nullptr)\r
jassert (midiBuffer.getNumEvents() <= numMidiEventsComingIn);\r
#endif\r
}\r
-\r
- if (auto* changes = data.outputParameterChanges)\r
- {\r
- comPluginInstance->forAllChangedParameters ([&] (Vst::ParamID paramID, float value)\r
- {\r
- Steinberg::int32 queueIndex = 0;\r
-\r
- if (auto* queue = changes->addParameterData (paramID, queueIndex))\r
- {\r
- Steinberg::int32 pointIndex = 0;\r
- queue->addPoint (0, value, pointIndex);\r
- }\r
- });\r
- }\r
}\r
\r
//==============================================================================\r
DEF_CLASS_IID (JuceAudioProcessor)\r
\r
#if JUCE_VST3_CAN_REPLACE_VST2\r
+ // Defined in PluginUtilities.cpp\r
+ void getUUIDForVST2ID (bool, uint8[16]);\r
+\r
FUID getFUIDForVST2ID (bool forControllerUID)\r
{\r
TUID uuid;\r
- extern JUCE_API void getUUIDForVST2ID (bool, uint8[16]);\r
getUUIDForVST2ID (forControllerUID, (uint8*) uuid);\r
return FUID (uuid);\r
}\r
\r
ID: juce_audio_plugin_client\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE audio plugin wrapper classes\r
description: Classes for building VST, VST3, AudioUnit, AAX and RTAS plugins.\r
website: http://www.juce.com/juce\r
#define JucePlugin_Build_RTAS 0\r
#endif\r
\r
-#if ! (defined (_MSC_VER) || defined (__APPLE_CPP__) || defined (__APPLE_CC__) || defined (LINUX) || defined (__linux__))\r
- #undef JucePlugin_Build_VST3\r
- #define JucePlugin_Build_VST3 0\r
-#endif\r
-\r
//==============================================================================\r
#if JucePlugin_Build_LV2 && ! defined (JucePlugin_LV2URI)\r
#error "You need to define the JucePlugin_LV2URI value!"\r
#define VST3_REPLACEMENT_AVAILABLE 1\r
\r
// NB: Nasty old-fashioned code in here because it's copied from the Steinberg example code.\r
- void JUCE_API getUUIDForVST2ID (bool forControllerUID, uint8 uuid[16])\r
+ void getUUIDForVST2ID (bool forControllerUID, uint8 uuid[16])\r
{\r
#if JUCE_MSVC\r
const auto juce_sprintf = [] (auto&& head, auto&&... tail) { sprintf_s (head, numElementsInArray (head), tail...); };\r
class ChannelRemapper\r
{\r
public:\r
- ChannelRemapper (AudioProcessor& p) : processor (p), inputLayoutMap (nullptr), outputLayoutMap (nullptr) {}\r
- ~ChannelRemapper() {}\r
-\r
- void alloc()\r
+ void alloc (AudioProcessor& processor)\r
{\r
const int numInputBuses = AudioUnitHelpers::getBusCount (processor, true);\r
const int numOutputBuses = AudioUnitHelpers::getBusCount (processor, false);\r
\r
- initializeChannelMapArray (true, numInputBuses);\r
- initializeChannelMapArray (false, numOutputBuses);\r
+ initializeChannelMapArray (processor, true, numInputBuses);\r
+ initializeChannelMapArray (processor, false, numOutputBuses);\r
\r
for (int busIdx = 0; busIdx < numInputBuses; ++busIdx)\r
- fillLayoutChannelMaps (true, busIdx);\r
+ fillLayoutChannelMaps (processor, true, busIdx);\r
\r
for (int busIdx = 0; busIdx < numOutputBuses; ++busIdx)\r
- fillLayoutChannelMaps (false, busIdx);\r
+ fillLayoutChannelMaps (processor, false, busIdx);\r
}\r
\r
void release()\r
\r
private:\r
//==============================================================================\r
- AudioProcessor& processor;\r
HeapBlock<int*> inputLayoutMapPtrStorage, outputLayoutMapPtrStorage;\r
HeapBlock<int> inputLayoutMapStorage, outputLayoutMapStorage;\r
- int** inputLayoutMap;\r
- int** outputLayoutMap;\r
+ int** inputLayoutMap = nullptr;\r
+ int** outputLayoutMap = nullptr;\r
\r
//==============================================================================\r
- void initializeChannelMapArray (bool isInput, const int numBuses)\r
+ void initializeChannelMapArray (AudioProcessor& processor, bool isInput, const int numBuses)\r
{\r
HeapBlock<int*>& layoutMapPtrStorage = isInput ? inputLayoutMapPtrStorage : outputLayoutMapPtrStorage;\r
HeapBlock<int>& layoutMapStorage = isInput ? inputLayoutMapStorage : outputLayoutMapStorage;\r
layoutMapPtrStorage.calloc (static_cast<size_t> (numBuses));\r
layoutMapStorage.calloc (static_cast<size_t> (isInput ? totalInChannels : totalOutChannels));\r
\r
- layoutMap = layoutMapPtrStorage. get();\r
+ layoutMap = layoutMapPtrStorage.get();\r
\r
int ch = 0;\r
for (int busIdx = 0; busIdx < numBuses; ++busIdx)\r
}\r
}\r
\r
- void fillLayoutChannelMaps (bool isInput, int busNr)\r
+ void fillLayoutChannelMaps (AudioProcessor& processor, bool isInput, int busNr)\r
{\r
int* layoutMap = (isInput ? inputLayoutMap : outputLayoutMap)[busNr];\r
auto channelFormat = processor.getChannelLayoutOfBus (isInput, busNr);\r
jassert (channels[(size_t) i] != nullptr);\r
#endif\r
\r
- mutableBuffer.setDataToReferTo (channels.data(), (int) channels.size(), static_cast<int> (frames));\r
+ if (! channels.empty())\r
+ mutableBuffer.setDataToReferTo (channels.data(), (int) channels.size(), static_cast<int> (frames));\r
+\r
return mutableBuffer;\r
}\r
\r
\r
tresult getInt (Steinberg::int64& result) const\r
{\r
- if (kind != Kind::Int)\r
+ if (kind != Kind::tagInt)\r
return kResultFalse;\r
\r
result = storage.storedInt;\r
\r
tresult getFloat (double& result) const\r
{\r
- if (kind != Kind::Float)\r
+ if (kind != Kind::tagFloat)\r
return kResultFalse;\r
\r
result = storage.storedFloat;\r
\r
tresult getString (Vst::TChar* data, Steinberg::uint32 numBytes) const\r
{\r
- if (kind != Kind::String)\r
+ if (kind != Kind::tagString)\r
return kResultFalse;\r
\r
std::memcpy (data,\r
\r
tresult getBinary (const void*& data, Steinberg::uint32& numBytes) const\r
{\r
- if (kind != Kind::Binary)\r
+ if (kind != Kind::tagBinary)\r
return kResultFalse;\r
\r
data = storage.storedBinary.data();\r
}\r
\r
private:\r
- void constructFrom (Int x) noexcept { kind = Kind::Int; new (&storage.storedInt) Int (std::move (x)); }\r
- void constructFrom (Float x) noexcept { kind = Kind::Float; new (&storage.storedFloat) Float (std::move (x)); }\r
- void constructFrom (String x) noexcept { kind = Kind::String; new (&storage.storedString) String (std::move (x)); }\r
- void constructFrom (Binary x) noexcept { kind = Kind::Binary; new (&storage.storedBinary) Binary (std::move (x)); }\r
+ void constructFrom (Int x) noexcept { kind = Kind::tagInt; new (&storage.storedInt) Int (std::move (x)); }\r
+ void constructFrom (Float x) noexcept { kind = Kind::tagFloat; new (&storage.storedFloat) Float (std::move (x)); }\r
+ void constructFrom (String x) noexcept { kind = Kind::tagString; new (&storage.storedString) String (std::move (x)); }\r
+ void constructFrom (Binary x) noexcept { kind = Kind::tagBinary; new (&storage.storedBinary) Binary (std::move (x)); }\r
\r
void reset() noexcept\r
{\r
switch (kind)\r
{\r
- case Kind::Int: break;\r
- case Kind::Float: break;\r
- case Kind::String: storage.storedString.~vector(); break;\r
- case Kind::Binary: storage.storedBinary.~vector(); break;\r
+ case Kind::tagInt: break;\r
+ case Kind::tagFloat: break;\r
+ case Kind::tagString: storage.storedString.~vector(); break;\r
+ case Kind::tagBinary: storage.storedBinary.~vector(); break;\r
}\r
}\r
\r
{\r
switch (other.kind)\r
{\r
- case Kind::Int: constructFrom (std::move (other.storage.storedInt)); break;\r
- case Kind::Float: constructFrom (std::move (other.storage.storedFloat)); break;\r
- case Kind::String: constructFrom (std::move (other.storage.storedString)); break;\r
- case Kind::Binary: constructFrom (std::move (other.storage.storedBinary)); break;\r
+ case Kind::tagInt: constructFrom (std::move (other.storage.storedInt)); break;\r
+ case Kind::tagFloat: constructFrom (std::move (other.storage.storedFloat)); break;\r
+ case Kind::tagString: constructFrom (std::move (other.storage.storedString)); break;\r
+ case Kind::tagBinary: constructFrom (std::move (other.storage.storedBinary)); break;\r
}\r
}\r
\r
- enum class Kind { Int, Float, String, Binary };\r
+ enum class Kind { tagInt, tagFloat, tagString, tagBinary };\r
\r
union Storage\r
{\r
\r
#include "juce_audio_processors.h"\r
#include <juce_gui_extra/juce_gui_extra.h>\r
-#include <set>\r
\r
//==============================================================================\r
#if JUCE_MAC\r
\r
ID: juce_audio_processors\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE audio processor classes\r
description: Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors.\r
website: http://www.juce.com/juce\r
A pointer to the object you pass in will be kept, but it won't be deleted\r
by this object, so it's the caller's responsibility to manage it.\r
\r
- If you pass a nullptr, then no contraints will be placed on the positioning of the window.\r
+ If you pass a nullptr, then no constraints will be placed on the positioning of the window.\r
*/\r
void setConstrainer (ComponentBoundsConstrainer* newConstrainer);\r
\r
std::make_unique<AudioParameterInt> ("b", "Parameter B", 0, 5, 2) })\r
@endcode\r
\r
- To add parameters programatically you can call `add` repeatedly on a\r
+ To add parameters programmatically you can call `add` repeatedly on a\r
ParameterLayout instance:\r
\r
@code\r
inputLevelGetter = manager.getInputLevelGetter();\r
}\r
\r
- ~SimpleDeviceManagerInputLevelMeter() override\r
- {\r
- }\r
-\r
void timerCallback() override\r
{\r
if (isShowing())\r
*/\r
bool loadThumb (AudioThumbnailBase& thumb, int64 hashCode);\r
\r
- /** Stores the cachable data from the specified thumb in this cache.\r
+ /** Stores the cacheable data from the specified thumb in this cache.\r
\r
This is called automatically by the AudioThumbnail class, so you shouldn't\r
normally need to call it directly.\r
Only after a Bluetooth MIDI device has been paired will its MIDI ports\r
be available through JUCE's MidiInput and MidiOutput classes.\r
\r
- This dialogue is currently only available on macOS targetting versions 10.11+,\r
+ This dialogue is currently only available on macOS targeting versions 10.11+,\r
iOS and Android. When targeting older versions of macOS you should instead\r
pair Bluetooth MIDI devices using the "Audio MIDI Setup" app (located in\r
/Applications/Utilities). On Windows, you should use the system settings. On\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2020 - Raw Material Software Limited\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 6 End-User License\r
+ Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+ End User License Agreement: www.juce.com/juce-6-licence\r
+ Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+constexpr uint8 whiteNotes[] = { 0, 2, 4, 5, 7, 9, 11 };\r
+constexpr uint8 blackNotes[] = { 1, 3, 6, 8, 10 };\r
+\r
+//==============================================================================\r
+struct KeyboardComponentBase::UpDownButton : public Button\r
+{\r
+ UpDownButton (KeyboardComponentBase& c, int d)\r
+ : Button ({}), owner (c), delta (d)\r
+ {\r
+ }\r
+\r
+ void clicked() override\r
+ {\r
+ auto note = owner.getLowestVisibleKey();\r
+\r
+ note = delta < 0 ? (note - 1) / 12 : note / 12 + 1;\r
+\r
+ owner.setLowestVisibleKey (note * 12);\r
+ }\r
+\r
+ using Button::clicked;\r
+\r
+ void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
+ {\r
+ owner.drawUpDownButton (g, getWidth(), getHeight(),\r
+ shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown,\r
+ delta > 0);\r
+ }\r
+\r
+private:\r
+ KeyboardComponentBase& owner;\r
+ int delta;\r
+\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UpDownButton)\r
+};\r
+\r
+//==============================================================================\r
+KeyboardComponentBase::KeyboardComponentBase (Orientation o) : orientation (o)\r
+{\r
+ scrollDown = std::make_unique<UpDownButton> (*this, -1);\r
+ scrollUp = std::make_unique<UpDownButton> (*this, 1);\r
+\r
+ addChildComponent (*scrollDown);\r
+ addChildComponent (*scrollUp);\r
+\r
+ colourChanged();\r
+}\r
+\r
+//==============================================================================\r
+void KeyboardComponentBase::setKeyWidth (float widthInPixels)\r
+{\r
+ jassert (widthInPixels > 0);\r
+\r
+ if (keyWidth != widthInPixels) // Prevent infinite recursion if the width is being computed in a 'resized()' callback\r
+ {\r
+ keyWidth = widthInPixels;\r
+ resized();\r
+ }\r
+}\r
+\r
+void KeyboardComponentBase::setScrollButtonWidth (int widthInPixels)\r
+{\r
+ jassert (widthInPixels > 0);\r
+\r
+ if (scrollButtonWidth != widthInPixels)\r
+ {\r
+ scrollButtonWidth = widthInPixels;\r
+ resized();\r
+ }\r
+}\r
+\r
+void KeyboardComponentBase::setOrientation (Orientation newOrientation)\r
+{\r
+ if (orientation != newOrientation)\r
+ {\r
+ orientation = newOrientation;\r
+ resized();\r
+ }\r
+}\r
+\r
+void KeyboardComponentBase::setAvailableRange (int lowestNote, int highestNote)\r
+{\r
+ jassert (lowestNote >= 0 && lowestNote <= 127);\r
+ jassert (highestNote >= 0 && highestNote <= 127);\r
+ jassert (lowestNote <= highestNote);\r
+\r
+ if (rangeStart != lowestNote || rangeEnd != highestNote)\r
+ {\r
+ rangeStart = jlimit (0, 127, lowestNote);\r
+ rangeEnd = jlimit (0, 127, highestNote);\r
+ firstKey = jlimit ((float) rangeStart, (float) rangeEnd, firstKey);\r
+ resized();\r
+ }\r
+}\r
+\r
+void KeyboardComponentBase::setLowestVisibleKey (int noteNumber)\r
+{\r
+ setLowestVisibleKeyFloat ((float) noteNumber);\r
+}\r
+\r
+void KeyboardComponentBase::setLowestVisibleKeyFloat (float noteNumber)\r
+{\r
+ noteNumber = jlimit ((float) rangeStart, (float) rangeEnd, noteNumber);\r
+\r
+ if (noteNumber != firstKey)\r
+ {\r
+ bool hasMoved = (((int) firstKey) != (int) noteNumber);\r
+ firstKey = noteNumber;\r
+\r
+ if (hasMoved)\r
+ sendChangeMessage();\r
+\r
+ resized();\r
+ }\r
+}\r
+\r
+float KeyboardComponentBase::getWhiteNoteLength() const noexcept\r
+{\r
+ return (orientation == horizontalKeyboard) ? (float) getHeight() : (float) getWidth();\r
+}\r
+\r
+void KeyboardComponentBase::setBlackNoteLengthProportion (float ratio) noexcept\r
+{\r
+ jassert (ratio >= 0.0f && ratio <= 1.0f);\r
+\r
+ if (blackNoteLengthRatio != ratio)\r
+ {\r
+ blackNoteLengthRatio = ratio;\r
+ resized();\r
+ }\r
+}\r
+\r
+float KeyboardComponentBase::getBlackNoteLength() const noexcept\r
+{\r
+ auto whiteNoteLength = orientation == horizontalKeyboard ? getHeight() : getWidth();\r
+ return (float) whiteNoteLength * blackNoteLengthRatio;\r
+}\r
+\r
+void KeyboardComponentBase::setBlackNoteWidthProportion (float ratio) noexcept\r
+{\r
+ jassert (ratio >= 0.0f && ratio <= 1.0f);\r
+\r
+ if (blackNoteWidthRatio != ratio)\r
+ {\r
+ blackNoteWidthRatio = ratio;\r
+ resized();\r
+ }\r
+}\r
+\r
+void KeyboardComponentBase::setScrollButtonsVisible (bool newCanScroll)\r
+{\r
+ if (canScroll != newCanScroll)\r
+ {\r
+ canScroll = newCanScroll;\r
+ resized();\r
+ }\r
+}\r
+\r
+//==============================================================================\r
+Range<float> KeyboardComponentBase::getKeyPos (int midiNoteNumber) const\r
+{\r
+ return getKeyPosition (midiNoteNumber, keyWidth)\r
+ - xOffset\r
+ - getKeyPosition (rangeStart, keyWidth).getStart();\r
+}\r
+\r
+float KeyboardComponentBase::getKeyStartPosition (int midiNoteNumber) const\r
+{\r
+ return getKeyPos (midiNoteNumber).getStart();\r
+}\r
+\r
+float KeyboardComponentBase::getTotalKeyboardWidth() const noexcept\r
+{\r
+ return getKeyPos (rangeEnd).getEnd();\r
+}\r
+\r
+KeyboardComponentBase::NoteAndVelocity KeyboardComponentBase::getNoteAndVelocityAtPosition (Point<float> pos, bool children)\r
+{\r
+ if (! reallyContains (pos, children))\r
+ return { -1, 0.0f };\r
+\r
+ auto p = pos;\r
+\r
+ if (orientation != horizontalKeyboard)\r
+ {\r
+ p = { p.y, p.x };\r
+\r
+ if (orientation == verticalKeyboardFacingLeft)\r
+ p = { p.x, (float) getWidth() - p.y };\r
+ else\r
+ p = { (float) getHeight() - p.x, p.y };\r
+ }\r
+\r
+ return remappedXYToNote (p + Point<float> (xOffset, 0));\r
+}\r
+\r
+KeyboardComponentBase::NoteAndVelocity KeyboardComponentBase::remappedXYToNote (Point<float> pos) const\r
+{\r
+ auto blackNoteLength = getBlackNoteLength();\r
+\r
+ if (pos.getY() < blackNoteLength)\r
+ {\r
+ for (int octaveStart = 12 * (rangeStart / 12); octaveStart <= rangeEnd; octaveStart += 12)\r
+ {\r
+ for (int i = 0; i < 5; ++i)\r
+ {\r
+ auto note = octaveStart + blackNotes[i];\r
+\r
+ if (rangeStart <= note && note <= rangeEnd)\r
+ {\r
+ if (getKeyPos (note).contains (pos.x - xOffset))\r
+ {\r
+ return { note, jmax (0.0f, pos.y / blackNoteLength) };\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ for (int octaveStart = 12 * (rangeStart / 12); octaveStart <= rangeEnd; octaveStart += 12)\r
+ {\r
+ for (int i = 0; i < 7; ++i)\r
+ {\r
+ auto note = octaveStart + whiteNotes[i];\r
+\r
+ if (note >= rangeStart && note <= rangeEnd)\r
+ {\r
+ if (getKeyPos (note).contains (pos.x - xOffset))\r
+ {\r
+ auto whiteNoteLength = (orientation == horizontalKeyboard) ? getHeight() : getWidth();\r
+ return { note, jmax (0.0f, pos.y / (float) whiteNoteLength) };\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return { -1, 0 };\r
+}\r
+\r
+Rectangle<float> KeyboardComponentBase::getRectangleForKey (int note) const\r
+{\r
+ jassert (note >= rangeStart && note <= rangeEnd);\r
+\r
+ auto pos = getKeyPos (note);\r
+ auto x = pos.getStart();\r
+ auto w = pos.getLength();\r
+\r
+ if (MidiMessage::isMidiNoteBlack (note))\r
+ {\r
+ auto blackNoteLength = getBlackNoteLength();\r
+\r
+ switch (orientation)\r
+ {\r
+ case horizontalKeyboard: return { x, 0, w, blackNoteLength };\r
+ case verticalKeyboardFacingLeft: return { (float) getWidth() - blackNoteLength, x, blackNoteLength, w };\r
+ case verticalKeyboardFacingRight: return { 0, (float) getHeight() - x - w, blackNoteLength, w };\r
+ default: jassertfalse; break;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ switch (orientation)\r
+ {\r
+ case horizontalKeyboard: return { x, 0, w, (float) getHeight() };\r
+ case verticalKeyboardFacingLeft: return { 0, x, (float) getWidth(), w };\r
+ case verticalKeyboardFacingRight: return { 0, (float) getHeight() - x - w, (float) getWidth(), w };\r
+ default: jassertfalse; break;\r
+ }\r
+ }\r
+\r
+ return {};\r
+}\r
+\r
+//==============================================================================\r
+void KeyboardComponentBase::setOctaveForMiddleC (int octaveNum)\r
+{\r
+ octaveNumForMiddleC = octaveNum;\r
+ repaint();\r
+}\r
+\r
+//==============================================================================\r
+void KeyboardComponentBase::drawUpDownButton (Graphics& g, int w, int h, bool mouseOver, bool buttonDown, bool movesOctavesUp)\r
+{\r
+ g.fillAll (findColour (upDownButtonBackgroundColourId));\r
+\r
+ float angle = 0;\r
+\r
+ switch (getOrientation())\r
+ {\r
+ case horizontalKeyboard: angle = movesOctavesUp ? 0.0f : 0.5f; break;\r
+ case verticalKeyboardFacingLeft: angle = movesOctavesUp ? 0.25f : 0.75f; break;\r
+ case verticalKeyboardFacingRight: angle = movesOctavesUp ? 0.75f : 0.25f; break;\r
+ default: jassertfalse; break;\r
+ }\r
+\r
+ Path path;\r
+ path.addTriangle (0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f);\r
+ path.applyTransform (AffineTransform::rotation (MathConstants<float>::twoPi * angle, 0.5f, 0.5f));\r
+\r
+ g.setColour (findColour (upDownButtonArrowColourId)\r
+ .withAlpha (buttonDown ? 1.0f : (mouseOver ? 0.6f : 0.4f)));\r
+\r
+ g.fillPath (path, path.getTransformToScaleToFit (1.0f, 1.0f, (float) w - 2.0f, (float) h - 2.0f, true));\r
+}\r
+\r
+Range<float> KeyboardComponentBase::getKeyPosition (int midiNoteNumber, float targetKeyWidth) const\r
+{\r
+ auto ratio = getBlackNoteWidthProportion();\r
+\r
+ static const float notePos[] = { 0.0f, 1 - ratio * 0.6f,\r
+ 1.0f, 2 - ratio * 0.4f,\r
+ 2.0f,\r
+ 3.0f, 4 - ratio * 0.7f,\r
+ 4.0f, 5 - ratio * 0.5f,\r
+ 5.0f, 6 - ratio * 0.3f,\r
+ 6.0f };\r
+\r
+ auto octave = midiNoteNumber / 12;\r
+ auto note = midiNoteNumber % 12;\r
+\r
+ auto start = (float) octave * 7.0f * targetKeyWidth + notePos[note] * targetKeyWidth;\r
+ auto width = MidiMessage::isMidiNoteBlack (note) ? blackNoteWidthRatio * targetKeyWidth : targetKeyWidth;\r
+\r
+ return { start, start + width };\r
+}\r
+\r
+//==============================================================================\r
+void KeyboardComponentBase::paint (Graphics& g)\r
+{\r
+ drawKeyboardBackground (g, getLocalBounds().toFloat());\r
+\r
+ for (int octaveBase = 0; octaveBase < 128; octaveBase += 12)\r
+ {\r
+ for (auto noteNum : whiteNotes)\r
+ {\r
+ const auto key = octaveBase + noteNum;\r
+\r
+ if (rangeStart <= key && key <= rangeEnd)\r
+ drawWhiteKey (key, g, getRectangleForKey (key));\r
+ }\r
+\r
+ for (auto noteNum : blackNotes)\r
+ {\r
+ const auto key = octaveBase + noteNum;\r
+\r
+ if (rangeStart <= key && key <= rangeEnd)\r
+ drawBlackKey (key, g, getRectangleForKey (key));\r
+ }\r
+ }\r
+}\r
+\r
+void KeyboardComponentBase::resized()\r
+{\r
+ auto w = getWidth();\r
+ auto h = getHeight();\r
+\r
+ if (w > 0 && h > 0)\r
+ {\r
+ if (orientation != horizontalKeyboard)\r
+ std::swap (w, h);\r
+\r
+ auto kx2 = getKeyPos (rangeEnd).getEnd();\r
+\r
+ if ((int) firstKey != rangeStart)\r
+ {\r
+ auto kx1 = getKeyPos (rangeStart).getStart();\r
+\r
+ if (kx2 - kx1 <= (float) w)\r
+ {\r
+ firstKey = (float) rangeStart;\r
+ sendChangeMessage();\r
+ repaint();\r
+ }\r
+ }\r
+\r
+ scrollDown->setVisible (canScroll && firstKey > (float) rangeStart);\r
+\r
+ xOffset = 0;\r
+\r
+ if (canScroll)\r
+ {\r
+ auto scrollButtonW = jmin (scrollButtonWidth, w / 2);\r
+ auto r = getLocalBounds();\r
+\r
+ if (orientation == horizontalKeyboard)\r
+ {\r
+ scrollDown->setBounds (r.removeFromLeft (scrollButtonW));\r
+ scrollUp ->setBounds (r.removeFromRight (scrollButtonW));\r
+ }\r
+ else if (orientation == verticalKeyboardFacingLeft)\r
+ {\r
+ scrollDown->setBounds (r.removeFromTop (scrollButtonW));\r
+ scrollUp ->setBounds (r.removeFromBottom (scrollButtonW));\r
+ }\r
+ else\r
+ {\r
+ scrollDown->setBounds (r.removeFromBottom (scrollButtonW));\r
+ scrollUp ->setBounds (r.removeFromTop (scrollButtonW));\r
+ }\r
+\r
+ auto endOfLastKey = getKeyPos (rangeEnd).getEnd();\r
+\r
+ auto spaceAvailable = w;\r
+ auto lastStartKey = remappedXYToNote ({ endOfLastKey - (float) spaceAvailable, 0 }).note + 1;\r
+\r
+ if (lastStartKey >= 0 && ((int) firstKey) > lastStartKey)\r
+ {\r
+ firstKey = (float) jlimit (rangeStart, rangeEnd, lastStartKey);\r
+ sendChangeMessage();\r
+ }\r
+\r
+ xOffset = getKeyPos ((int) firstKey).getStart();\r
+ }\r
+ else\r
+ {\r
+ firstKey = (float) rangeStart;\r
+ }\r
+\r
+ scrollUp->setVisible (canScroll && getKeyPos (rangeEnd).getStart() > (float) w);\r
+ repaint();\r
+ }\r
+}\r
+\r
+//==============================================================================\r
+void KeyboardComponentBase::mouseWheelMove (const MouseEvent&, const MouseWheelDetails& wheel)\r
+{\r
+ auto amount = (orientation == horizontalKeyboard && wheel.deltaX != 0)\r
+ ? wheel.deltaX : (orientation == verticalKeyboardFacingLeft ? wheel.deltaY\r
+ : -wheel.deltaY);\r
+\r
+ setLowestVisibleKeyFloat (firstKey - amount * keyWidth);\r
+}\r
+\r
+} // namespace juce\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2020 - Raw Material Software Limited\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 6 End-User License\r
+ Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+ End User License Agreement: www.juce.com/juce-6-licence\r
+ Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+//==============================================================================\r
+/**\r
+ A base class for drawing a custom MIDI keyboard component.\r
+\r
+ Implement the drawKeyboardBackground(), drawWhiteKey(), and drawBlackKey() methods\r
+ to draw your content and this class will handle the underlying keyboard logic.\r
+\r
+ The component is a ChangeBroadcaster, so if you want to be informed when the\r
+ keyboard is scrolled, you can register a ChangeListener for callbacks.\r
+\r
+ @tags{Audio}\r
+*/\r
+class JUCE_API KeyboardComponentBase : public Component,\r
+ public ChangeBroadcaster\r
+{\r
+public:\r
+ //==============================================================================\r
+ /** The direction of the keyboard.\r
+\r
+ @see setOrientation\r
+ */\r
+ enum Orientation\r
+ {\r
+ horizontalKeyboard,\r
+ verticalKeyboardFacingLeft,\r
+ verticalKeyboardFacingRight,\r
+ };\r
+\r
+ //==============================================================================\r
+ /** Constructor.\r
+\r
+ @param orientation whether the keyboard is horizontal or vertical\r
+ */\r
+ explicit KeyboardComponentBase (Orientation orientation);\r
+\r
+ /** Destructor. */\r
+ ~KeyboardComponentBase() override = default;\r
+\r
+ //==============================================================================\r
+ /** Changes the width used to draw the white keys. */\r
+ void setKeyWidth (float widthInPixels);\r
+\r
+ /** Returns the width that was set by setKeyWidth(). */\r
+ float getKeyWidth() const noexcept { return keyWidth; }\r
+\r
+ /** Changes the width used to draw the buttons that scroll the keyboard up/down in octaves. */\r
+ void setScrollButtonWidth (int widthInPixels);\r
+\r
+ /** Returns the width that was set by setScrollButtonWidth(). */\r
+ int getScrollButtonWidth() const noexcept { return scrollButtonWidth; }\r
+\r
+ /** Changes the keyboard's current direction. */\r
+ void setOrientation (Orientation newOrientation);\r
+\r
+ /** Returns the keyboard's current direction. */\r
+ Orientation getOrientation() const noexcept { return orientation; }\r
+\r
+ /** Returns true if the keyboard's orientation is horizontal. */\r
+ bool isHorizontal() const noexcept { return orientation == horizontalKeyboard; }\r
+\r
+ /** Sets the range of midi notes that the keyboard will be limited to.\r
+\r
+ By default the range is 0 to 127 (inclusive), but you can limit this if you\r
+ only want a restricted set of the keys to be shown.\r
+\r
+ Note that the values here are inclusive and must be between 0 and 127.\r
+ */\r
+ void setAvailableRange (int lowestNote, int highestNote);\r
+\r
+ /** Returns the first note in the available range.\r
+\r
+ @see setAvailableRange\r
+ */\r
+ int getRangeStart() const noexcept { return rangeStart; }\r
+\r
+ /** Returns the last note in the available range.\r
+\r
+ @see setAvailableRange\r
+ */\r
+ int getRangeEnd() const noexcept { return rangeEnd; }\r
+\r
+ /** If the keyboard extends beyond the size of the component, this will scroll\r
+ it to show the given key at the start.\r
+\r
+ Whenever the keyboard's position is changed, this will use the ChangeBroadcaster\r
+ base class to send a callback to any ChangeListeners that have been registered.\r
+ */\r
+ void setLowestVisibleKey (int noteNumber);\r
+\r
+ /** Returns the number of the first key shown in the component.\r
+\r
+ @see setLowestVisibleKey\r
+ */\r
+ int getLowestVisibleKey() const noexcept { return (int) firstKey; }\r
+\r
+ /** Returns the absolute length of the white notes.\r
+\r
+ This will be their vertical or horizontal length, depending on the keyboard's orientation.\r
+ */\r
+ float getWhiteNoteLength() const noexcept;\r
+\r
+ /** Sets the length of the black notes as a proportion of the white note length. */\r
+ void setBlackNoteLengthProportion (float ratio) noexcept;\r
+\r
+ /** Returns the length of the black notes as a proportion of the white note length. */\r
+ float getBlackNoteLengthProportion() const noexcept { return blackNoteLengthRatio; }\r
+\r
+ /** Returns the absolute length of the black notes.\r
+\r
+ This will be their vertical or horizontal length, depending on the keyboard's orientation.\r
+ */\r
+ float getBlackNoteLength() const noexcept;\r
+\r
+ /** Sets the width of the black notes as a proportion of the white note width. */\r
+ void setBlackNoteWidthProportion (float ratio) noexcept;\r
+\r
+ /** Returns the width of the black notes as a proportion of the white note width. */\r
+ float getBlackNoteWidthProportion() const noexcept { return blackNoteWidthRatio; }\r
+\r
+ /** Returns the absolute width of the black notes.\r
+\r
+ This will be their vertical or horizontal width, depending on the keyboard's orientation.\r
+ */\r
+ float getBlackNoteWidth() const noexcept { return keyWidth * blackNoteWidthRatio; }\r
+\r
+ /** If set to true, then scroll buttons will appear at either end of the keyboard\r
+ if there are too many notes to fit them all in the component at once.\r
+ */\r
+ void setScrollButtonsVisible (bool canScroll);\r
+\r
+ //==============================================================================\r
+ /** Colour IDs to use to change the colour of the octave scroll buttons.\r
+\r
+ These constants can be used either via the Component::setColour(), or LookAndFeel::setColour()\r
+ methods.\r
+\r
+ @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour\r
+ */\r
+ enum ColourIds\r
+ {\r
+ upDownButtonBackgroundColourId = 0x1004000,\r
+ upDownButtonArrowColourId = 0x1004001\r
+ };\r
+\r
+ /** Returns the position within the component of the left-hand edge of a key.\r
+\r
+ Depending on the keyboard's orientation, this may be a horizontal or vertical\r
+ distance, in either direction.\r
+ */\r
+ float getKeyStartPosition (int midiNoteNumber) const;\r
+\r
+ /** Returns the total width needed to fit all the keys in the available range. */\r
+ float getTotalKeyboardWidth() const noexcept;\r
+\r
+ /** This structure is returned by the getNoteAndVelocityAtPosition() method.\r
+ */\r
+ struct JUCE_API NoteAndVelocity\r
+ {\r
+ int note;\r
+ float velocity;\r
+ };\r
+\r
+ /** Returns the note number and velocity for a given position within the component.\r
+\r
+ If includeChildComponents is true then this will return a key obscured by any child\r
+ components.\r
+ */\r
+ NoteAndVelocity getNoteAndVelocityAtPosition (Point<float> position, bool includeChildComponents = false);\r
+\r
+ #ifndef DOXYGEN\r
+ /** Returns the key at a given coordinate, or -1 if the position does not intersect a key. */\r
+ [[deprecated ("This method has been deprecated in favour of getNoteAndVelocityAtPosition.")]]\r
+ int getNoteAtPosition (Point<float> p) { return getNoteAndVelocityAtPosition (p).note; }\r
+ #endif\r
+\r
+ /** Returns the rectangle for a given key. */\r
+ Rectangle<float> getRectangleForKey (int midiNoteNumber) const;\r
+\r
+ //==============================================================================\r
+ /** This sets the octave number which is shown as the octave number for middle C.\r
+\r
+ This affects only the default implementation of getWhiteNoteText(), which\r
+ passes this octave number to MidiMessage::getMidiNoteName() in order to\r
+ get the note text. See MidiMessage::getMidiNoteName() for more info about\r
+ the parameter.\r
+\r
+ By default this value is set to 3.\r
+\r
+ @see getOctaveForMiddleC\r
+ */\r
+ void setOctaveForMiddleC (int octaveNumForMiddleC);\r
+\r
+ /** This returns the value set by setOctaveForMiddleC().\r
+\r
+ @see setOctaveForMiddleC\r
+ */\r
+ int getOctaveForMiddleC() const noexcept { return octaveNumForMiddleC; }\r
+\r
+ //==============================================================================\r
+ /** Use this method to draw the background of the keyboard that will be drawn under\r
+ the white and black notes. This can also be used to draw any shadow or outline effects.\r
+ */\r
+ virtual void drawKeyboardBackground (Graphics& g, Rectangle<float> area) = 0;\r
+\r
+ /** Use this method to draw a white key of the keyboard in a given rectangle.\r
+\r
+ When doing this, be sure to note the keyboard's orientation.\r
+ */\r
+ virtual void drawWhiteKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) = 0;\r
+\r
+ /** Use this method to draw a black key of the keyboard in a given rectangle.\r
+\r
+ When doing this, be sure to note the keyboard's orientation.\r
+ */\r
+ virtual void drawBlackKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) = 0;\r
+\r
+ /** This can be overridden to draw the up and down buttons that scroll the keyboard\r
+ up/down in octaves.\r
+ */\r
+ virtual void drawUpDownButton (Graphics& g, int w, int h, bool isMouseOver, bool isButtonPressed, bool movesOctavesUp);\r
+\r
+ /** Calculates the position of a given midi-note.\r
+\r
+ This can be overridden to create layouts with custom key-widths.\r
+\r
+ @param midiNoteNumber the note to find\r
+ @param keyWidth the desired width in pixels of one key - see setKeyWidth()\r
+ @returns the start and length of the key along the axis of the keyboard\r
+ */\r
+ virtual Range<float> getKeyPosition (int midiNoteNumber, float keyWidth) const;\r
+\r
+ //==============================================================================\r
+ /** @internal */\r
+ void paint (Graphics&) override;\r
+ /** @internal */\r
+ void resized() override;\r
+ /** @internal */\r
+ void mouseWheelMove (const MouseEvent&, const MouseWheelDetails&) override;\r
+\r
+private:\r
+ //==============================================================================\r
+ struct UpDownButton;\r
+\r
+ Range<float> getKeyPos (int midiNoteNumber) const;\r
+ NoteAndVelocity remappedXYToNote (Point<float>) const;\r
+ void setLowestVisibleKeyFloat (float noteNumber);\r
+\r
+ //==============================================================================\r
+ Orientation orientation;\r
+\r
+ float blackNoteLengthRatio = 0.7f, blackNoteWidthRatio = 0.7f;\r
+ float xOffset = 0.0f;\r
+ float keyWidth = 16.0f;\r
+ float firstKey = 12 * 4.0f;\r
+\r
+ int scrollButtonWidth = 12;\r
+ int rangeStart = 0, rangeEnd = 127;\r
+ int octaveNumForMiddleC = 3;\r
+\r
+ bool canScroll = true;\r
+ std::unique_ptr<Button> scrollDown, scrollUp;\r
+\r
+ //==============================================================================\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (KeyboardComponentBase)\r
+};\r
+\r
+} // namespace juce\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2020 - Raw Material Software Limited\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 6 End-User License\r
+ Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+ End User License Agreement: www.juce.com/juce-6-licence\r
+ Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+struct MPEKeyboardComponent::MPENoteComponent : public Component\r
+{\r
+ MPENoteComponent (MPEKeyboardComponent& o, uint16 sID, uint8 initial, float noteOnVel, float press)\r
+ : owner (o),\r
+ radiusScale (owner.getKeyWidth() / 1.5f),\r
+ noteOnVelocity (noteOnVel),\r
+ pressure (press),\r
+ sourceID (sID),\r
+ initialNote (initial)\r
+ {\r
+ }\r
+\r
+ float getStrikeRadius() const { return 5.0f + getNoteOnVelocity() * radiusScale * 2.0f; }\r
+ float getPressureRadius() const { return 5.0f + getPressure() * radiusScale * 2.0f; }\r
+\r
+ float getNoteOnVelocity() const { return noteOnVelocity; }\r
+ float getPressure() const { return pressure; }\r
+\r
+ Point<float> getCentrePos() const { return getBounds().toFloat().getCentre(); }\r
+\r
+ void paint (Graphics& g) override\r
+ {\r
+ auto strikeSize = getStrikeRadius() * 2.0f;\r
+ auto pressSize = getPressureRadius() * 2.0f;\r
+ auto bounds = getLocalBounds().toFloat();\r
+\r
+ g.setColour (owner.findColour (noteCircleFillColourId));\r
+ g.fillEllipse (bounds.withSizeKeepingCentre (strikeSize, strikeSize));\r
+\r
+ g.setColour (owner.findColour (noteCircleOutlineColourId));\r
+ g.drawEllipse (bounds.withSizeKeepingCentre (pressSize, pressSize), 1.0f);\r
+ }\r
+\r
+ //==========================================================================\r
+ MPEKeyboardComponent& owner;\r
+\r
+ float radiusScale = 0.0f, noteOnVelocity = 0.0f, pressure = 0.5f;\r
+ uint16 sourceID = 0;\r
+ uint8 initialNote = 0;\r
+ bool isLatched = true;\r
+};\r
+\r
+//==============================================================================\r
+MPEKeyboardComponent::MPEKeyboardComponent (MPEInstrument& instr, Orientation orientationToUse)\r
+ : KeyboardComponentBase (orientationToUse),\r
+ instrument (instr)\r
+{\r
+ updateZoneLayout();\r
+ colourChanged();\r
+ setKeyWidth (25.0f);\r
+\r
+ instrument.addListener (this);\r
+}\r
+\r
+MPEKeyboardComponent::~MPEKeyboardComponent()\r
+{\r
+ instrument.removeListener (this);\r
+}\r
+\r
+//==============================================================================\r
+void MPEKeyboardComponent::drawKeyboardBackground (Graphics& g, Rectangle<float> area)\r
+{\r
+ g.setColour (findColour (whiteNoteColourId));\r
+ g.fillRect (area);\r
+}\r
+\r
+void MPEKeyboardComponent::drawWhiteKey (int midiNoteNumber, Graphics& g, Rectangle<float> area)\r
+{\r
+ if (midiNoteNumber % 12 == 0)\r
+ {\r
+ auto fontHeight = jmin (12.0f, getKeyWidth() * 0.9f);\r
+ auto text = MidiMessage::getMidiNoteName (midiNoteNumber, true, true, getOctaveForMiddleC());\r
+\r
+ g.setColour (findColour (textLabelColourId));\r
+ g.setFont (Font (fontHeight).withHorizontalScale (0.8f));\r
+\r
+ switch (getOrientation())\r
+ {\r
+ case horizontalKeyboard:\r
+ g.drawText (text, area.withTrimmedLeft (1.0f).withTrimmedBottom (2.0f),\r
+ Justification::centredBottom, false);\r
+ break;\r
+ case verticalKeyboardFacingLeft:\r
+ g.drawText (text, area.reduced (2.0f), Justification::centredLeft, false);\r
+ break;\r
+ case verticalKeyboardFacingRight:\r
+ g.drawText (text, area.reduced (2.0f), Justification::centredRight, false);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+void MPEKeyboardComponent::drawBlackKey (int /*midiNoteNumber*/, Graphics& g, Rectangle<float> area)\r
+{\r
+ g.setColour (findColour (whiteNoteColourId));\r
+ g.fillRect (area);\r
+\r
+ g.setColour (findColour (blackNoteColourId));\r
+\r
+ if (isHorizontal())\r
+ {\r
+ g.fillRoundedRectangle (area.toFloat().reduced ((area.getWidth() / 2.0f) - (getBlackNoteWidth() / 12.0f),\r
+ area.getHeight() / 4.0f), 1.0f);\r
+ }\r
+ else\r
+ {\r
+ g.fillRoundedRectangle (area.toFloat().reduced (area.getWidth() / 4.0f,\r
+ (area.getHeight() / 2.0f) - (getBlackNoteWidth() / 12.0f)), 1.0f);\r
+ }\r
+}\r
+\r
+void MPEKeyboardComponent::colourChanged()\r
+{\r
+ setOpaque (findColour (whiteNoteColourId).isOpaque());\r
+ repaint();\r
+}\r
+\r
+//==========================================================================\r
+MPEValue MPEKeyboardComponent::mousePositionToPitchbend (int initialNote, Point<float> mousePos)\r
+{\r
+ auto constrainedMousePos = [&]\r
+ {\r
+ auto horizontal = isHorizontal();\r
+\r
+ auto posToCheck = jlimit (0.0f,\r
+ horizontal ? (float) getWidth() - 1.0f : (float) getHeight(),\r
+ horizontal ? mousePos.x : mousePos.y);\r
+\r
+ auto bottomKeyRange = getRectangleForKey (jmax (getRangeStart(), initialNote - perNotePitchbendRange));\r
+ auto topKeyRange = getRectangleForKey (jmin (getRangeEnd(), initialNote + perNotePitchbendRange));\r
+\r
+ auto lowerLimit = horizontal ? bottomKeyRange.getCentreX()\r
+ : getOrientation() == Orientation::verticalKeyboardFacingRight ? topKeyRange.getCentreY()\r
+ : bottomKeyRange.getCentreY();\r
+\r
+ auto upperLimit = horizontal ? topKeyRange.getCentreX()\r
+ : getOrientation() == Orientation::verticalKeyboardFacingRight ? bottomKeyRange.getCentreY()\r
+ : topKeyRange.getCentreY();\r
+\r
+ posToCheck = jlimit (lowerLimit, upperLimit, posToCheck);\r
+\r
+ return horizontal ? Point<float> (posToCheck, 0.0f)\r
+ : Point<float> (0.0f, posToCheck);\r
+ }();\r
+\r
+ auto note = getNoteAndVelocityAtPosition (constrainedMousePos, true).note;\r
+\r
+ if (note == -1)\r
+ {\r
+ jassertfalse;\r
+ return {};\r
+ }\r
+\r
+ auto fractionalSemitoneBend = [&]\r
+ {\r
+ auto noteRect = getRectangleForKey (note);\r
+\r
+ switch (getOrientation())\r
+ {\r
+ case horizontalKeyboard: return (constrainedMousePos.x - noteRect.getCentreX()) / noteRect.getWidth();\r
+ case verticalKeyboardFacingRight: return (noteRect.getCentreY() - constrainedMousePos.y) / noteRect.getHeight();\r
+ case verticalKeyboardFacingLeft: return (constrainedMousePos.y - noteRect.getCentreY()) / noteRect.getHeight();\r
+ }\r
+\r
+ jassertfalse;\r
+ return 0.0f;\r
+ }();\r
+\r
+ auto totalNumSemitones = ((float) note + fractionalSemitoneBend) - (float) initialNote;\r
+\r
+ return MPEValue::fromUnsignedFloat (jmap (totalNumSemitones, (float) -perNotePitchbendRange, (float) perNotePitchbendRange, 0.0f, 1.0f));\r
+}\r
+\r
+MPEValue MPEKeyboardComponent::mousePositionToTimbre (Point<float> mousePos)\r
+{\r
+ auto delta = [mousePos, this]\r
+ {\r
+ switch (getOrientation())\r
+ {\r
+ case horizontalKeyboard: return mousePos.y;\r
+ case verticalKeyboardFacingLeft: return (float) getWidth() - mousePos.x;\r
+ case verticalKeyboardFacingRight: return mousePos.x;\r
+ }\r
+\r
+ jassertfalse;\r
+ return 0.0f;\r
+ }();\r
+\r
+ return MPEValue::fromUnsignedFloat (jlimit (0.0f, 1.0f, 1.0f - (delta / getWhiteNoteLength())));\r
+}\r
+\r
+void MPEKeyboardComponent::mouseDown (const MouseEvent& e)\r
+{\r
+ auto newNote = getNoteAndVelocityAtPosition (e.position).note;\r
+\r
+ if (newNote >= 0)\r
+ {\r
+ auto channel = channelAssigner->findMidiChannelForNewNote (newNote);\r
+\r
+ instrument.noteOn (channel, newNote, MPEValue::fromUnsignedFloat (velocity));\r
+ sourceIDMap[e.source.getIndex()] = instrument.getNote (instrument.getNumPlayingNotes() - 1).noteID;\r
+\r
+ instrument.pitchbend (channel, MPEValue::centreValue());\r
+ instrument.timbre (channel, mousePositionToTimbre (e.position));\r
+ instrument.pressure (channel, MPEValue::fromUnsignedFloat (e.isPressureValid()\r
+ && useMouseSourcePressureForStrike ? e.pressure\r
+ : pressure));\r
+ }\r
+}\r
+\r
+void MPEKeyboardComponent::mouseDrag (const MouseEvent& e)\r
+{\r
+ auto noteID = sourceIDMap[e.source.getIndex()];\r
+ auto note = instrument.getNoteWithID (noteID);\r
+\r
+ if (! note.isValid())\r
+ return;\r
+\r
+ auto noteComponent = std::find_if (noteComponents.begin(),\r
+ noteComponents.end(),\r
+ [noteID] (auto& comp) { return comp->sourceID == noteID; });\r
+\r
+ if (noteComponent == noteComponents.end())\r
+ return;\r
+\r
+ if ((*noteComponent)->isLatched && std::abs (isHorizontal() ? e.getDistanceFromDragStartX()\r
+ : e.getDistanceFromDragStartY()) > roundToInt (getKeyWidth() / 4.0f))\r
+ {\r
+ (*noteComponent)->isLatched = false;\r
+ }\r
+\r
+ auto channel = channelAssigner->findMidiChannelForExistingNote (note.initialNote);\r
+\r
+ if (! (*noteComponent)->isLatched)\r
+ instrument.pitchbend (channel, mousePositionToPitchbend (note.initialNote, e.position));\r
+\r
+ instrument.timbre (channel, mousePositionToTimbre (e.position));\r
+ instrument.pressure (channel, MPEValue::fromUnsignedFloat (e.isPressureValid()\r
+ && useMouseSourcePressureForStrike ? e.pressure\r
+ : pressure));\r
+}\r
+\r
+void MPEKeyboardComponent::mouseUp (const MouseEvent& e)\r
+{\r
+ auto note = instrument.getNoteWithID (sourceIDMap[e.source.getIndex()]);\r
+\r
+ if (! note.isValid())\r
+ return;\r
+\r
+ instrument.noteOff (channelAssigner->findMidiChannelForExistingNote (note.initialNote),\r
+ note.initialNote, MPEValue::fromUnsignedFloat (lift));\r
+ channelAssigner->noteOff (note.initialNote);\r
+ sourceIDMap.erase (e.source.getIndex());\r
+}\r
+\r
+void MPEKeyboardComponent::focusLost (FocusChangeType)\r
+{\r
+ for (auto& comp : noteComponents)\r
+ {\r
+ auto note = instrument.getNoteWithID (comp->sourceID);\r
+\r
+ if (note.isValid())\r
+ instrument.noteOff (channelAssigner->findMidiChannelForExistingNote (note.initialNote),\r
+ note.initialNote, MPEValue::fromUnsignedFloat (lift));\r
+ }\r
+}\r
+\r
+//==============================================================================\r
+void MPEKeyboardComponent::updateZoneLayout()\r
+{\r
+ {\r
+ const ScopedLock noteLock (activeNotesLock);\r
+ activeNotes.clear();\r
+ }\r
+\r
+ noteComponents.clear();\r
+\r
+ if (instrument.isLegacyModeEnabled())\r
+ {\r
+ channelAssigner = std::make_unique<MPEChannelAssigner> (instrument.getLegacyModeChannelRange());\r
+ perNotePitchbendRange = instrument.getLegacyModePitchbendRange();\r
+ }\r
+ else\r
+ {\r
+ auto layout = instrument.getZoneLayout();\r
+\r
+ if (layout.isActive())\r
+ {\r
+ auto zone = layout.getLowerZone().isActive() ? layout.getLowerZone()\r
+ : layout.getUpperZone();\r
+\r
+ channelAssigner = std::make_unique<MPEChannelAssigner> (zone);\r
+ perNotePitchbendRange = zone.perNotePitchbendRange;\r
+ }\r
+ else\r
+ {\r
+ channelAssigner.reset();\r
+ }\r
+ }\r
+}\r
+\r
+void MPEKeyboardComponent::addNewNote (MPENote note)\r
+{\r
+ noteComponents.push_back (std::make_unique<MPENoteComponent> (*this, note.noteID, note.initialNote,\r
+ note.noteOnVelocity.asUnsignedFloat(),\r
+ note.pressure.asUnsignedFloat()));\r
+ auto& comp = noteComponents.back();\r
+\r
+ addAndMakeVisible (*comp);\r
+ comp->toBack();\r
+}\r
+\r
+void MPEKeyboardComponent::handleNoteOns (std::set<MPENote>& notesToUpdate)\r
+{\r
+ for (auto& note : notesToUpdate)\r
+ {\r
+ if (! std::any_of (noteComponents.begin(),\r
+ noteComponents.end(),\r
+ [note] (auto& comp) { return comp->sourceID == note.noteID; }))\r
+ {\r
+ addNewNote (note);\r
+ }\r
+ }\r
+}\r
+\r
+void MPEKeyboardComponent::handleNoteOffs (std::set<MPENote>& notesToUpdate)\r
+{\r
+ auto removePredicate = [¬esToUpdate] (std::unique_ptr<MPENoteComponent>& comp)\r
+ {\r
+ return std::none_of (notesToUpdate.begin(),\r
+ notesToUpdate.end(),\r
+ [&comp] (auto& note) { return comp->sourceID == note.noteID; });\r
+ };\r
+\r
+ noteComponents.erase (std::remove_if (std::begin (noteComponents),\r
+ std::end (noteComponents),\r
+ removePredicate),\r
+ std::end (noteComponents));\r
+\r
+ if (noteComponents.empty())\r
+ stopTimer();\r
+}\r
+\r
+void MPEKeyboardComponent::updateNoteComponentBounds (const MPENote& note, MPENoteComponent& noteComponent)\r
+{\r
+ auto xPos = [&]\r
+ {\r
+ const auto currentNote = note.initialNote + (float) note.totalPitchbendInSemitones;\r
+ const auto noteBend = currentNote - std::floor (currentNote);\r
+\r
+ const auto noteBounds = getRectangleForKey ((int) currentNote);\r
+ const auto nextNoteBounds = getRectangleForKey ((int) currentNote + 1);\r
+\r
+ const auto horizontal = isHorizontal();\r
+\r
+ const auto distance = noteBend * (horizontal ? nextNoteBounds.getCentreX() - noteBounds.getCentreX()\r
+ : nextNoteBounds.getCentreY() - noteBounds.getCentreY());\r
+\r
+ return (horizontal ? noteBounds.getCentreX() : noteBounds.getCentreY()) + distance;\r
+ }();\r
+\r
+ auto yPos = [&]\r
+ {\r
+ const auto currentOrientation = getOrientation();\r
+\r
+ const auto timbrePosition = (currentOrientation == horizontalKeyboard\r
+ || currentOrientation == verticalKeyboardFacingRight ? 1.0f - note.timbre.asUnsignedFloat()\r
+ : note.timbre.asUnsignedFloat());\r
+\r
+ return timbrePosition * getWhiteNoteLength();\r
+ }();\r
+\r
+ const auto centrePos = (isHorizontal() ? Point<float> (xPos, yPos)\r
+ : Point<float> (yPos, xPos));\r
+\r
+ const auto radius = jmax (noteComponent.getStrikeRadius(), noteComponent.getPressureRadius());\r
+\r
+ noteComponent.setBounds (Rectangle<float> (radius * 2.0f, radius * 2.0f)\r
+ .withCentre (centrePos)\r
+ .getSmallestIntegerContainer());\r
+}\r
+\r
+static bool operator< (const MPENote& n1, const MPENote& n2) noexcept { return n1.noteID < n2.noteID; }\r
+\r
+void MPEKeyboardComponent::updateNoteComponents()\r
+{\r
+ std::set<MPENote> notesToUpdate;\r
+\r
+ {\r
+ ScopedLock noteLock (activeNotesLock);\r
+\r
+ for (const auto& note : activeNotes)\r
+ if (note.second)\r
+ notesToUpdate.insert (note.first);\r
+ };\r
+\r
+ handleNoteOns (notesToUpdate);\r
+ handleNoteOffs (notesToUpdate);\r
+\r
+ for (auto& comp : noteComponents)\r
+ {\r
+ auto noteForComponent = std::find_if (notesToUpdate.begin(),\r
+ notesToUpdate.end(),\r
+ [&comp] (auto& note) { return note.noteID == comp->sourceID; });\r
+\r
+ if (noteForComponent != notesToUpdate.end())\r
+ {\r
+ comp->pressure = noteForComponent->pressure.asUnsignedFloat();\r
+ updateNoteComponentBounds (*noteForComponent, *comp);\r
+\r
+ comp->repaint();\r
+ }\r
+ }\r
+}\r
+\r
+void MPEKeyboardComponent::timerCallback()\r
+{\r
+ updateNoteComponents();\r
+}\r
+\r
+//==============================================================================\r
+void MPEKeyboardComponent::noteAdded (MPENote newNote)\r
+{\r
+ {\r
+ const ScopedLock noteLock (activeNotesLock);\r
+ activeNotes.push_back ({ newNote, true });\r
+ }\r
+\r
+ startTimerHz (30);\r
+}\r
+\r
+void MPEKeyboardComponent::updateNoteData (MPENote& changedNote)\r
+{\r
+ const ScopedLock noteLock (activeNotesLock);\r
+\r
+ for (auto& note : activeNotes)\r
+ {\r
+ if (note.first.noteID == changedNote.noteID)\r
+ {\r
+ note.first = changedNote;\r
+ note.second = true;\r
+ return;\r
+ }\r
+ }\r
+}\r
+\r
+void MPEKeyboardComponent::notePressureChanged (MPENote changedNote)\r
+{\r
+ updateNoteData (changedNote);\r
+}\r
+\r
+void MPEKeyboardComponent::notePitchbendChanged (MPENote changedNote)\r
+{\r
+ updateNoteData (changedNote);\r
+}\r
+\r
+void MPEKeyboardComponent::noteTimbreChanged (MPENote changedNote)\r
+{\r
+ updateNoteData (changedNote);\r
+}\r
+\r
+void MPEKeyboardComponent::noteReleased (MPENote finishedNote)\r
+{\r
+ const ScopedLock noteLock (activeNotesLock);\r
+\r
+ activeNotes.erase (std::remove_if (std::begin (activeNotes),\r
+ std::end (activeNotes),\r
+ [finishedNote] (auto& note) { return note.first.noteID == finishedNote.noteID; }),\r
+ std::end (activeNotes));\r
+}\r
+\r
+void MPEKeyboardComponent::zoneLayoutChanged()\r
+{\r
+ MessageManager::callAsync ([this] { updateZoneLayout(); });\r
+}\r
+\r
+} // namespace juce\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2020 - Raw Material Software Limited\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 6 End-User License\r
+ Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+ End User License Agreement: www.juce.com/juce-6-licence\r
+ Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+//==============================================================================\r
+/**\r
+ A component that displays an MPE-compatible keyboard, whose notes can be clicked on.\r
+\r
+ This component will mimic a physical MPE-compatible keyboard, showing the current state\r
+ of an MPEInstrument object. When the on-screen keys are clicked on, it will play these\r
+ notes by calling the noteOn() and noteOff() methods of its MPEInstrument object. Moving\r
+ the mouse will update the pitchbend and timbre dimensions of the MPEInstrument.\r
+\r
+ @see MPEInstrument\r
+\r
+ @tags{Audio}\r
+*/\r
+class JUCE_API MPEKeyboardComponent : public KeyboardComponentBase,\r
+ private MPEInstrument::Listener,\r
+ private Timer\r
+{\r
+public:\r
+ //==============================================================================\r
+ /** Creates an MPEKeyboardComponent.\r
+\r
+ @param instrument the MPEInstrument that this component represents\r
+ @param orientation whether the keyboard is horizontal or vertical\r
+ */\r
+ MPEKeyboardComponent (MPEInstrument& instrument, Orientation orientation);\r
+\r
+ /** Destructor. */\r
+ virtual ~MPEKeyboardComponent() override;\r
+\r
+ //==============================================================================\r
+ /** Sets the note-on velocity, or "strike", value that will be used when triggering new notes. */\r
+ void setVelocity (float newVelocity) { velocity = jlimit (newVelocity, 0.0f, 1.0f); }\r
+\r
+ /** Sets the pressure value that will be used for new notes. */\r
+ void setPressure (float newPressure) { pressure = jlimit (newPressure, 0.0f, 1.0f); }\r
+\r
+ /** Sets the note-off velocity, or "lift", value that will be used when notes are released. */\r
+ void setLift (float newLift) { lift = jlimit (newLift, 0.0f, 1.0f); }\r
+\r
+ /** Use this to enable the mouse source pressure to be used for the initial note-on\r
+ velocity, or "strike", value if the mouse source supports it.\r
+ */\r
+ void setUseMouseSourcePressureForStrike (bool usePressureForStrike) { useMouseSourcePressureForStrike = usePressureForStrike; }\r
+\r
+ //==============================================================================\r
+ /** A set of colour IDs to use to change the colour of various aspects of the keyboard.\r
+\r
+ These constants can be used either via the Component::setColour(), or LookAndFeel::setColour()\r
+ methods.\r
+\r
+ @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour\r
+ */\r
+ enum ColourIds\r
+ {\r
+ whiteNoteColourId = 0x1006000,\r
+ blackNoteColourId = 0x1006001,\r
+ textLabelColourId = 0x1006002,\r
+ noteCircleFillColourId = 0x1006003,\r
+ noteCircleOutlineColourId = 0x1006004\r
+ };\r
+\r
+ //==============================================================================\r
+ /** @internal */\r
+ void mouseDrag (const MouseEvent&) override;\r
+ /** @internal */\r
+ void mouseDown (const MouseEvent&) override;\r
+ /** @internal */\r
+ void mouseUp (const MouseEvent&) override;\r
+ /** @internal */\r
+ void focusLost (FocusChangeType) override;\r
+ /** @internal */\r
+ void colourChanged() override;\r
+\r
+private:\r
+ //==========================================================================\r
+ struct MPENoteComponent;\r
+\r
+ //==============================================================================\r
+ void drawKeyboardBackground (Graphics& g, Rectangle<float> area) override;\r
+ void drawWhiteKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) override;\r
+ void drawBlackKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) override;\r
+\r
+ void updateNoteData (MPENote&);\r
+\r
+ void noteAdded (MPENote) override;\r
+ void notePressureChanged (MPENote) override;\r
+ void notePitchbendChanged (MPENote) override;\r
+ void noteTimbreChanged (MPENote) override;\r
+ void noteReleased (MPENote) override;\r
+ void zoneLayoutChanged() override;\r
+\r
+ void timerCallback() override;\r
+\r
+ //==============================================================================\r
+ MPEValue mousePositionToPitchbend (int, Point<float>);\r
+ MPEValue mousePositionToTimbre (Point<float>);\r
+\r
+ void addNewNote (MPENote);\r
+ void removeNote (MPENote);\r
+\r
+ void handleNoteOns (std::set<MPENote>&);\r
+ void handleNoteOffs (std::set<MPENote>&);\r
+ void updateNoteComponentBounds (const MPENote&, MPENoteComponent&);\r
+ void updateNoteComponents();\r
+\r
+ void updateZoneLayout();\r
+\r
+ //==============================================================================\r
+ MPEInstrument& instrument;\r
+ std::unique_ptr<MPEChannelAssigner> channelAssigner;\r
+\r
+ CriticalSection activeNotesLock;\r
+ std::vector<std::pair<MPENote, bool>> activeNotes;\r
+ std::vector<std::unique_ptr<MPENoteComponent>> noteComponents;\r
+ std::map<int, uint16> sourceIDMap;\r
+\r
+ float velocity = 0.7f, pressure = 1.0f, lift = 0.0f;\r
+ bool useMouseSourcePressureForStrike = false;\r
+ int perNotePitchbendRange = 48;\r
+\r
+ //==============================================================================\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPEKeyboardComponent)\r
+};\r
+\r
+} // namespace juce\r
namespace juce\r
{\r
\r
-static const uint8 whiteNotes[] = { 0, 2, 4, 5, 7, 9, 11 };\r
-static const uint8 blackNotes[] = { 1, 3, 6, 8, 10 };\r
-\r
-\r
-struct MidiKeyboardComponent::UpDownButton : public Button\r
-{\r
- UpDownButton (MidiKeyboardComponent& c, int d)\r
- : Button ({}), owner (c), delta (d)\r
- {\r
- }\r
-\r
- void clicked() override\r
- {\r
- auto note = owner.getLowestVisibleKey();\r
-\r
- if (delta < 0)\r
- note = (note - 1) / 12;\r
- else\r
- note = note / 12 + 1;\r
-\r
- owner.setLowestVisibleKey (note * 12);\r
- }\r
-\r
- using Button::clicked;\r
-\r
- void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
- {\r
- owner.drawUpDownButton (g, getWidth(), getHeight(),\r
- shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown,\r
- delta > 0);\r
- }\r
-\r
-private:\r
- MidiKeyboardComponent& owner;\r
- const int delta;\r
-\r
- JUCE_DECLARE_NON_COPYABLE (UpDownButton)\r
-};\r
-\r
//==============================================================================\r
-MidiKeyboardComponent::MidiKeyboardComponent (MidiKeyboardState& s, Orientation o)\r
- : state (s), orientation (o)\r
+MidiKeyboardComponent::MidiKeyboardComponent (MidiKeyboardState& stateToUse, Orientation orientationToUse)\r
+ : KeyboardComponentBase (orientationToUse), state (stateToUse)\r
{\r
- scrollDown.reset (new UpDownButton (*this, -1));\r
- scrollUp .reset (new UpDownButton (*this, 1));\r
-\r
- addChildComponent (scrollDown.get());\r
- addChildComponent (scrollUp.get());\r
+ state.addListener (this);\r
\r
// initialise with a default set of qwerty key-mappings..\r
int note = 0;\r
\r
for (char c : "awsedftgyhujkolp;")\r
- setKeyPressForNote (KeyPress (c, 0, 0), note++);\r
+ setKeyPressForNote ({ c, 0, 0 }, note++);\r
\r
mouseOverNotes.insertMultiple (0, -1, 32);\r
mouseDownNotes.insertMultiple (0, -1, 32);\r
colourChanged();\r
setWantsKeyboardFocus (true);\r
\r
- state.addListener (this);\r
-\r
startTimerHz (20);\r
}\r
\r
}\r
\r
//==============================================================================\r
-void MidiKeyboardComponent::setKeyWidth (float widthInPixels)\r
+void MidiKeyboardComponent::setVelocity (float v, bool useMousePosition)\r
{\r
- jassert (widthInPixels > 0);\r
-\r
- if (keyWidth != widthInPixels) // Prevent infinite recursion if the width is being computed in a 'resized()' call-back\r
- {\r
- keyWidth = widthInPixels;\r
- resized();\r
- }\r
+ velocity = v;\r
+ useMousePositionForVelocity = useMousePosition;\r
}\r
\r
-void MidiKeyboardComponent::setScrollButtonWidth (int widthInPixels)\r
+//==============================================================================\r
+void MidiKeyboardComponent::setMidiChannel (int midiChannelNumber)\r
{\r
- jassert (widthInPixels > 0);\r
-\r
- if (scrollButtonWidth != widthInPixels)\r
- {\r
- scrollButtonWidth = widthInPixels;\r
- resized();\r
- }\r
-}\r
+ jassert (midiChannelNumber > 0 && midiChannelNumber <= 16);\r
\r
-void MidiKeyboardComponent::setOrientation (Orientation newOrientation)\r
-{\r
- if (orientation != newOrientation)\r
+ if (midiChannel != midiChannelNumber)\r
{\r
- orientation = newOrientation;\r
- resized();\r
+ resetAnyKeysInUse();\r
+ midiChannel = jlimit (1, 16, midiChannelNumber);\r
}\r
}\r
\r
-void MidiKeyboardComponent::setAvailableRange (int lowestNote, int highestNote)\r
+void MidiKeyboardComponent::setMidiChannelsToDisplay (int midiChannelMask)\r
{\r
- jassert (lowestNote >= 0 && lowestNote <= 127);\r
- jassert (highestNote >= 0 && highestNote <= 127);\r
- jassert (lowestNote <= highestNote);\r
-\r
- if (rangeStart != lowestNote || rangeEnd != highestNote)\r
- {\r
- rangeStart = jlimit (0, 127, lowestNote);\r
- rangeEnd = jlimit (0, 127, highestNote);\r
- firstKey = jlimit ((float) rangeStart, (float) rangeEnd, firstKey);\r
- resized();\r
- }\r
+ midiInChannelMask = midiChannelMask;\r
+ noPendingUpdates.store (false);\r
}\r
\r
-void MidiKeyboardComponent::setLowestVisibleKey (int noteNumber)\r
+//==============================================================================\r
+void MidiKeyboardComponent::clearKeyMappings()\r
{\r
- setLowestVisibleKeyFloat ((float) noteNumber);\r
+ resetAnyKeysInUse();\r
+ keyPressNotes.clear();\r
+ keyPresses.clear();\r
}\r
\r
-void MidiKeyboardComponent::setLowestVisibleKeyFloat (float noteNumber)\r
+void MidiKeyboardComponent::setKeyPressForNote (const KeyPress& key, int midiNoteOffsetFromC)\r
{\r
- noteNumber = jlimit ((float) rangeStart, (float) rangeEnd, noteNumber);\r
-\r
- if (noteNumber != firstKey)\r
- {\r
- bool hasMoved = (((int) firstKey) != (int) noteNumber);\r
- firstKey = noteNumber;\r
-\r
- if (hasMoved)\r
- sendChangeMessage();\r
+ removeKeyPressForNote (midiNoteOffsetFromC);\r
\r
- resized();\r
- }\r
+ keyPressNotes.add (midiNoteOffsetFromC);\r
+ keyPresses.add (key);\r
}\r
\r
-void MidiKeyboardComponent::setScrollButtonsVisible (bool newCanScroll)\r
+void MidiKeyboardComponent::removeKeyPressForNote (int midiNoteOffsetFromC)\r
{\r
- if (canScroll != newCanScroll)\r
+ for (int i = keyPressNotes.size(); --i >= 0;)\r
{\r
- canScroll = newCanScroll;\r
- resized();\r
+ if (keyPressNotes.getUnchecked (i) == midiNoteOffsetFromC)\r
+ {\r
+ keyPressNotes.remove (i);\r
+ keyPresses.remove (i);\r
+ }\r
}\r
}\r
\r
-void MidiKeyboardComponent::colourChanged()\r
+void MidiKeyboardComponent::setKeyPressBaseOctave (int newOctaveNumber)\r
{\r
- setOpaque (findColour (whiteNoteColourId).isOpaque());\r
- repaint();\r
+ jassert (newOctaveNumber >= 0 && newOctaveNumber <= 10);\r
+\r
+ keyMappingOctave = newOctaveNumber;\r
}\r
\r
//==============================================================================\r
-void MidiKeyboardComponent::setMidiChannel (int midiChannelNumber)\r
+void MidiKeyboardComponent::resetAnyKeysInUse()\r
{\r
- jassert (midiChannelNumber > 0 && midiChannelNumber <= 16);\r
+ if (! keysPressed.isZero())\r
+ {\r
+ for (int i = 128; --i >= 0;)\r
+ if (keysPressed[i])\r
+ state.noteOff (midiChannel, i, 0.0f);\r
\r
- if (midiChannel != midiChannelNumber)\r
+ keysPressed.clear();\r
+ }\r
+\r
+ for (int i = mouseDownNotes.size(); --i >= 0;)\r
{\r
- resetAnyKeysInUse();\r
- midiChannel = jlimit (1, 16, midiChannelNumber);\r
+ auto noteDown = mouseDownNotes.getUnchecked (i);\r
+\r
+ if (noteDown >= 0)\r
+ {\r
+ state.noteOff (midiChannel, noteDown, 0.0f);\r
+ mouseDownNotes.set (i, -1);\r
+ }\r
+\r
+ mouseOverNotes.set (i, -1);\r
}\r
}\r
\r
-void MidiKeyboardComponent::setMidiChannelsToDisplay (int midiChannelMask)\r
+void MidiKeyboardComponent::updateNoteUnderMouse (const MouseEvent& e, bool isDown)\r
{\r
- midiInChannelMask = midiChannelMask;\r
- noPendingUpdates.store (false);\r
+ updateNoteUnderMouse (e.getEventRelativeTo (this).position, isDown, e.source.getIndex());\r
}\r
\r
-void MidiKeyboardComponent::setVelocity (float v, bool useMousePosition)\r
+void MidiKeyboardComponent::updateNoteUnderMouse (Point<float> pos, bool isDown, int fingerNum)\r
{\r
- velocity = jlimit (0.0f, 1.0f, v);\r
- useMousePositionForVelocity = useMousePosition;\r
-}\r
+ const auto noteInfo = getNoteAndVelocityAtPosition (pos);\r
+ const auto newNote = noteInfo.note;\r
+ const auto oldNote = mouseOverNotes.getUnchecked (fingerNum);\r
+ const auto oldNoteDown = mouseDownNotes.getUnchecked (fingerNum);\r
+ const auto eventVelocity = useMousePositionForVelocity ? noteInfo.velocity * velocity : velocity;\r
\r
-//==============================================================================\r
-Range<float> MidiKeyboardComponent::getKeyPosition (int midiNoteNumber, float targetKeyWidth) const\r
-{\r
- jassert (midiNoteNumber >= 0 && midiNoteNumber < 128);\r
+ if (oldNote != newNote)\r
+ {\r
+ repaintNote (oldNote);\r
+ repaintNote (newNote);\r
+ mouseOverNotes.set (fingerNum, newNote);\r
+ }\r
\r
- static const float notePos[] = { 0.0f, 1 - blackNoteWidthRatio * 0.6f,\r
- 1.0f, 2 - blackNoteWidthRatio * 0.4f,\r
- 2.0f,\r
- 3.0f, 4 - blackNoteWidthRatio * 0.7f,\r
- 4.0f, 5 - blackNoteWidthRatio * 0.5f,\r
- 5.0f, 6 - blackNoteWidthRatio * 0.3f,\r
- 6.0f };\r
+ if (isDown)\r
+ {\r
+ if (newNote != oldNoteDown)\r
+ {\r
+ if (oldNoteDown >= 0)\r
+ {\r
+ mouseDownNotes.set (fingerNum, -1);\r
\r
- auto octave = midiNoteNumber / 12;\r
- auto note = midiNoteNumber % 12;\r
+ if (! mouseDownNotes.contains (oldNoteDown))\r
+ state.noteOff (midiChannel, oldNoteDown, eventVelocity);\r
+ }\r
\r
- auto start = (float) octave * 7.0f * targetKeyWidth + notePos[note] * targetKeyWidth;\r
- auto width = MidiMessage::isMidiNoteBlack (note) ? blackNoteWidthRatio * targetKeyWidth : targetKeyWidth;\r
+ if (newNote >= 0 && ! mouseDownNotes.contains (newNote))\r
+ {\r
+ state.noteOn (midiChannel, newNote, eventVelocity);\r
+ mouseDownNotes.set (fingerNum, newNote);\r
+ }\r
+ }\r
+ }\r
+ else if (oldNoteDown >= 0)\r
+ {\r
+ mouseDownNotes.set (fingerNum, -1);\r
\r
- return { start, start + width };\r
+ if (! mouseDownNotes.contains (oldNoteDown))\r
+ state.noteOff (midiChannel, oldNoteDown, eventVelocity);\r
+ }\r
}\r
\r
-Range<float> MidiKeyboardComponent::getKeyPos (int midiNoteNumber) const\r
+void MidiKeyboardComponent::repaintNote (int noteNum)\r
{\r
- return getKeyPosition (midiNoteNumber, keyWidth)\r
- - xOffset\r
- - getKeyPosition (rangeStart, keyWidth).getStart();\r
+ if (getRangeStart() <= noteNum && noteNum <= getRangeEnd())\r
+ repaint (getRectangleForKey (noteNum).getSmallestIntegerContainer());\r
}\r
\r
-Rectangle<float> MidiKeyboardComponent::getRectangleForKey (int note) const\r
+\r
+void MidiKeyboardComponent::mouseMove (const MouseEvent& e)\r
{\r
- jassert (note >= rangeStart && note <= rangeEnd);\r
+ updateNoteUnderMouse (e, false);\r
+}\r
\r
- auto pos = getKeyPos (note);\r
- auto x = pos.getStart();\r
- auto w = pos.getLength();\r
+void MidiKeyboardComponent::mouseDrag (const MouseEvent& e)\r
+{\r
+ auto newNote = getNoteAndVelocityAtPosition (e.position).note;\r
\r
- if (MidiMessage::isMidiNoteBlack (note))\r
- {\r
- auto blackNoteLength = getBlackNoteLength();\r
+ if (newNote >= 0 && mouseDraggedToKey (newNote, e))\r
+ updateNoteUnderMouse (e, true);\r
+}\r
\r
- switch (orientation)\r
- {\r
- case horizontalKeyboard: return { x, 0, w, blackNoteLength };\r
- case verticalKeyboardFacingLeft: return { (float) getWidth() - blackNoteLength, x, blackNoteLength, w };\r
- case verticalKeyboardFacingRight: return { 0, (float) getHeight() - x - w, blackNoteLength, w };\r
- default: jassertfalse; break;\r
- }\r
- }\r
- else\r
- {\r
- switch (orientation)\r
- {\r
- case horizontalKeyboard: return { x, 0, w, (float) getHeight() };\r
- case verticalKeyboardFacingLeft: return { 0, x, (float) getWidth(), w };\r
- case verticalKeyboardFacingRight: return { 0, (float) getHeight() - x - w, (float) getWidth(), w };\r
- default: jassertfalse; break;\r
- }\r
- }\r
+void MidiKeyboardComponent::mouseDown (const MouseEvent& e)\r
+{\r
+ auto newNote = getNoteAndVelocityAtPosition (e.position).note;\r
\r
- return {};\r
+ if (newNote >= 0 && mouseDownOnKey (newNote, e))\r
+ updateNoteUnderMouse (e, true);\r
}\r
\r
-float MidiKeyboardComponent::getKeyStartPosition (int midiNoteNumber) const\r
+void MidiKeyboardComponent::mouseUp (const MouseEvent& e)\r
{\r
- return getKeyPos (midiNoteNumber).getStart();\r
+ updateNoteUnderMouse (e, false);\r
+\r
+ auto note = getNoteAndVelocityAtPosition (e.position).note;\r
+\r
+ if (note >= 0)\r
+ mouseUpOnKey (note, e);\r
}\r
\r
-float MidiKeyboardComponent::getTotalKeyboardWidth() const noexcept\r
+void MidiKeyboardComponent::mouseEnter (const MouseEvent& e)\r
{\r
- return getKeyPos (rangeEnd).getEnd();\r
+ updateNoteUnderMouse (e, false);\r
}\r
\r
-int MidiKeyboardComponent::getNoteAtPosition (Point<float> p)\r
+void MidiKeyboardComponent::mouseExit (const MouseEvent& e)\r
{\r
- return xyToNote (p).note;\r
+ updateNoteUnderMouse (e, false);\r
}\r
\r
-MidiKeyboardComponent::NoteAndVelocity MidiKeyboardComponent::xyToNote (Point<float> pos)\r
+void MidiKeyboardComponent::timerCallback()\r
{\r
- if (! reallyContains (pos, false))\r
- return { -1, 0.0f };\r
-\r
- auto p = pos;\r
+ if (noPendingUpdates.exchange (true))\r
+ return;\r
\r
- if (orientation != horizontalKeyboard)\r
+ for (auto i = getRangeStart(); i <= getRangeEnd(); ++i)\r
{\r
- p = { p.y, p.x };\r
+ const auto isOn = state.isNoteOnForChannels (midiInChannelMask, i);\r
\r
- if (orientation == verticalKeyboardFacingLeft)\r
- p = { p.x, (float) getWidth() - p.y };\r
- else\r
- p = { (float) getHeight() - p.x, p.y };\r
+ if (keysCurrentlyDrawnDown[i] != isOn)\r
+ {\r
+ keysCurrentlyDrawnDown.setBit (i, isOn);\r
+ repaintNote (i);\r
+ }\r
}\r
-\r
- return remappedXYToNote (p + Point<float> (xOffset, 0));\r
}\r
\r
-MidiKeyboardComponent::NoteAndVelocity MidiKeyboardComponent::remappedXYToNote (Point<float> pos) const\r
+bool MidiKeyboardComponent::keyStateChanged (bool /*isKeyDown*/)\r
{\r
- auto blackNoteLength = getBlackNoteLength();\r
+ bool keyPressUsed = false;\r
\r
- if (pos.getY() < blackNoteLength)\r
+ for (int i = keyPresses.size(); --i >= 0;)\r
{\r
- for (int octaveStart = 12 * (rangeStart / 12); octaveStart <= rangeEnd; octaveStart += 12)\r
+ auto note = 12 * keyMappingOctave + keyPressNotes.getUnchecked (i);\r
+\r
+ if (keyPresses.getReference(i).isCurrentlyDown())\r
{\r
- for (int i = 0; i < 5; ++i)\r
+ if (! keysPressed[note])\r
{\r
- auto note = octaveStart + blackNotes[i];\r
-\r
- if (rangeStart <= note && note <= rangeEnd)\r
- {\r
- if (getKeyPos (note).contains (pos.x - xOffset))\r
- {\r
- return { note, jmax (0.0f, pos.y / blackNoteLength) };\r
- }\r
- }\r
+ keysPressed.setBit (note);\r
+ state.noteOn (midiChannel, note, velocity);\r
+ keyPressUsed = true;\r
}\r
}\r
- }\r
-\r
- for (int octaveStart = 12 * (rangeStart / 12); octaveStart <= rangeEnd; octaveStart += 12)\r
- {\r
- for (int i = 0; i < 7; ++i)\r
+ else\r
{\r
- auto note = octaveStart + whiteNotes[i];\r
-\r
- if (note >= rangeStart && note <= rangeEnd)\r
+ if (keysPressed[note])\r
{\r
- if (getKeyPos (note).contains (pos.x - xOffset))\r
- {\r
- auto whiteNoteLength = (orientation == horizontalKeyboard) ? getHeight() : getWidth();\r
- return { note, jmax (0.0f, pos.y / (float) whiteNoteLength) };\r
- }\r
+ keysPressed.clearBit (note);\r
+ state.noteOff (midiChannel, note, 0.0f);\r
+ keyPressUsed = true;\r
}\r
}\r
}\r
\r
- return { -1, 0 };\r
+ return keyPressUsed;\r
}\r
\r
-//==============================================================================\r
-void MidiKeyboardComponent::repaintNote (int noteNum)\r
+bool MidiKeyboardComponent::keyPressed (const KeyPress& key)\r
{\r
- if (noteNum >= rangeStart && noteNum <= rangeEnd)\r
- repaint (getRectangleForKey (noteNum).getSmallestIntegerContainer());\r
+ return keyPresses.contains (key);\r
}\r
\r
-void MidiKeyboardComponent::paint (Graphics& g)\r
+void MidiKeyboardComponent::focusLost (FocusChangeType)\r
+{\r
+ resetAnyKeysInUse();\r
+}\r
+\r
+//==============================================================================\r
+void MidiKeyboardComponent::drawKeyboardBackground (Graphics& g, Rectangle<float> area)\r
{\r
g.fillAll (findColour (whiteNoteColourId));\r
\r
- auto lineColour = findColour (keySeparatorLineColourId);\r
- auto textColour = findColour (textLabelColourId);\r
+ auto width = area.getWidth();\r
+ auto height = area.getHeight();\r
+ auto currentOrientation = getOrientation();\r
+ Point<float> shadowGradientStart, shadowGradientEnd;\r
\r
- for (int octave = 0; octave < 128; octave += 12)\r
+ if (currentOrientation == verticalKeyboardFacingLeft)\r
{\r
- for (int white = 0; white < 7; ++white)\r
- {\r
- auto noteNum = octave + whiteNotes[white];\r
-\r
- if (noteNum >= rangeStart && noteNum <= rangeEnd)\r
- drawWhiteNote (noteNum, g, getRectangleForKey (noteNum),\r
- state.isNoteOnForChannels (midiInChannelMask, noteNum),\r
- mouseOverNotes.contains (noteNum), lineColour, textColour);\r
- }\r
+ shadowGradientStart.x = width - 1.0f;\r
+ shadowGradientEnd.x = width - 5.0f;\r
}\r
-\r
- float x1 = 0.0f, y1 = 0.0f, x2 = 0.0f, y2 = 0.0f;\r
- auto width = getWidth();\r
- auto height = getHeight();\r
-\r
- if (orientation == verticalKeyboardFacingLeft)\r
+ else if (currentOrientation == verticalKeyboardFacingRight)\r
{\r
- x1 = (float) width - 1.0f;\r
- x2 = (float) width - 5.0f;\r
+ shadowGradientEnd.x = 5.0f;\r
}\r
- else if (orientation == verticalKeyboardFacingRight)\r
- x2 = 5.0f;\r
else\r
- y2 = 5.0f;\r
+ {\r
+ shadowGradientEnd.y = 5.0f;\r
+ }\r
\r
- auto x = getKeyPos (rangeEnd).getEnd();\r
- auto shadowCol = findColour (shadowColourId);\r
+ auto keyboardWidth = getRectangleForKey (getRangeEnd()).getRight();\r
+ auto shadowColour = findColour (shadowColourId);\r
\r
- if (! shadowCol.isTransparent())\r
+ if (! shadowColour.isTransparent())\r
{\r
- g.setGradientFill (ColourGradient (shadowCol, x1, y1, shadowCol.withAlpha (0.0f), x2, y2, false));\r
+ g.setGradientFill ({ shadowColour, shadowGradientStart,\r
+ shadowColour.withAlpha (0.0f), shadowGradientEnd,\r
+ false });\r
\r
- switch (orientation)\r
+ switch (currentOrientation)\r
{\r
- case horizontalKeyboard: g.fillRect (0.0f, 0.0f, x, 5.0f); break;\r
- case verticalKeyboardFacingLeft: g.fillRect ((float) width - 5.0f, 0.0f, 5.0f, x); break;\r
- case verticalKeyboardFacingRight: g.fillRect (0.0f, 0.0f, 5.0f, x); break;\r
+ case horizontalKeyboard: g.fillRect (0.0f, 0.0f, keyboardWidth, 5.0f); break;\r
+ case verticalKeyboardFacingLeft: g.fillRect (width - 5.0f, 0.0f, 5.0f, keyboardWidth); break;\r
+ case verticalKeyboardFacingRight: g.fillRect (0.0f, 0.0f, 5.0f, keyboardWidth); break;\r
default: break;\r
}\r
}\r
\r
+ auto lineColour = findColour (keySeparatorLineColourId);\r
+\r
if (! lineColour.isTransparent())\r
{\r
g.setColour (lineColour);\r
\r
- switch (orientation)\r
+ switch (currentOrientation)\r
{\r
- case horizontalKeyboard: g.fillRect (0.0f, (float) height - 1.0f, x, 1.0f); break;\r
- case verticalKeyboardFacingLeft: g.fillRect (0.0f, 0.0f, 1.0f, x); break;\r
- case verticalKeyboardFacingRight: g.fillRect ((float) width - 1.0f, 0.0f, 1.0f, x); break;\r
+ case horizontalKeyboard: g.fillRect (0.0f, height - 1.0f, keyboardWidth, 1.0f); break;\r
+ case verticalKeyboardFacingLeft: g.fillRect (0.0f, 0.0f, 1.0f, keyboardWidth); break;\r
+ case verticalKeyboardFacingRight: g.fillRect (width - 1.0f, 0.0f, 1.0f, keyboardWidth); break;\r
default: break;\r
}\r
}\r
-\r
- auto blackNoteColour = findColour (blackNoteColourId);\r
-\r
- for (int octave = 0; octave < 128; octave += 12)\r
- {\r
- for (int black = 0; black < 5; ++black)\r
- {\r
- auto noteNum = octave + blackNotes[black];\r
-\r
- if (noteNum >= rangeStart && noteNum <= rangeEnd)\r
- drawBlackNote (noteNum, g, getRectangleForKey (noteNum),\r
- state.isNoteOnForChannels (midiInChannelMask, noteNum),\r
- mouseOverNotes.contains (noteNum), blackNoteColour);\r
- }\r
- }\r
}\r
\r
void MidiKeyboardComponent::drawWhiteNote (int midiNoteNumber, Graphics& g, Rectangle<float> area,\r
g.setColour (c);\r
g.fillRect (area);\r
\r
+ const auto currentOrientation = getOrientation();\r
+\r
auto text = getWhiteNoteText (midiNoteNumber);\r
\r
if (text.isNotEmpty())\r
{\r
- auto fontHeight = jmin (12.0f, keyWidth * 0.9f);\r
+ auto fontHeight = jmin (12.0f, getKeyWidth() * 0.9f);\r
\r
g.setColour (textColour);\r
g.setFont (Font (fontHeight).withHorizontalScale (0.8f));\r
\r
- switch (orientation)\r
+ switch (currentOrientation)\r
{\r
case horizontalKeyboard: g.drawText (text, area.withTrimmedLeft (1.0f).withTrimmedBottom (2.0f), Justification::centredBottom, false); break;\r
case verticalKeyboardFacingLeft: g.drawText (text, area.reduced (2.0f), Justification::centredLeft, false); break;\r
{\r
g.setColour (lineColour);\r
\r
- switch (orientation)\r
+ switch (currentOrientation)\r
{\r
case horizontalKeyboard: g.fillRect (area.withWidth (1.0f)); break;\r
case verticalKeyboardFacingLeft: g.fillRect (area.withHeight (1.0f)); break;\r
default: break;\r
}\r
\r
- if (midiNoteNumber == rangeEnd)\r
+ if (midiNoteNumber == getRangeEnd())\r
{\r
- switch (orientation)\r
+ switch (currentOrientation)\r
{\r
case horizontalKeyboard: g.fillRect (area.expanded (1.0f, 0).removeFromRight (1.0f)); break;\r
case verticalKeyboardFacingLeft: g.fillRect (area.expanded (0, 1.0f).removeFromBottom (1.0f)); break;\r
auto w = area.getWidth();\r
auto h = area.getHeight();\r
\r
- switch (orientation)\r
+ switch (getOrientation())\r
{\r
case horizontalKeyboard: g.fillRect (area.reduced (w * sideIndent, 0).removeFromTop (h * topIndent)); break;\r
case verticalKeyboardFacingLeft: g.fillRect (area.reduced (0, h * sideIndent).removeFromRight (w * topIndent)); break;\r
}\r
}\r
\r
-void MidiKeyboardComponent::setOctaveForMiddleC (int octaveNum)\r
-{\r
- octaveNumForMiddleC = octaveNum;\r
- repaint();\r
-}\r
-\r
String MidiKeyboardComponent::getWhiteNoteText (int midiNoteNumber)\r
{\r
if (midiNoteNumber % 12 == 0)\r
- return MidiMessage::getMidiNoteName (midiNoteNumber, true, true, octaveNumForMiddleC);\r
+ return MidiMessage::getMidiNoteName (midiNoteNumber, true, true, getOctaveForMiddleC());\r
\r
return {};\r
}\r
\r
-void MidiKeyboardComponent::drawUpDownButton (Graphics& g, int w, int h,\r
- bool mouseOver,\r
- bool buttonDown,\r
- bool movesOctavesUp)\r
-{\r
- g.fillAll (findColour (upDownButtonBackgroundColourId));\r
-\r
- float angle = 0;\r
-\r
- switch (orientation)\r
- {\r
- case horizontalKeyboard: angle = movesOctavesUp ? 0.0f : 0.5f; break;\r
- case verticalKeyboardFacingLeft: angle = movesOctavesUp ? 0.25f : 0.75f; break;\r
- case verticalKeyboardFacingRight: angle = movesOctavesUp ? 0.75f : 0.25f; break;\r
- default: jassertfalse; break;\r
- }\r
-\r
- Path path;\r
- path.addTriangle (0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f);\r
- path.applyTransform (AffineTransform::rotation (MathConstants<float>::twoPi * angle, 0.5f, 0.5f));\r
-\r
- g.setColour (findColour (upDownButtonArrowColourId)\r
- .withAlpha (buttonDown ? 1.0f : (mouseOver ? 0.6f : 0.4f)));\r
-\r
- g.fillPath (path, path.getTransformToScaleToFit (1.0f, 1.0f, (float) w - 2.0f, (float) h - 2.0f, true));\r
-}\r
-\r
-void MidiKeyboardComponent::setBlackNoteLengthProportion (float ratio) noexcept\r
-{\r
- jassert (ratio >= 0.0f && ratio <= 1.0f);\r
-\r
- if (blackNoteLengthRatio != ratio)\r
- {\r
- blackNoteLengthRatio = ratio;\r
- resized();\r
- }\r
-}\r
-\r
-float MidiKeyboardComponent::getBlackNoteLength() const noexcept\r
+void MidiKeyboardComponent::colourChanged()\r
{\r
- auto whiteNoteLength = orientation == horizontalKeyboard ? getHeight() : getWidth();\r
- return (float) whiteNoteLength * blackNoteLengthRatio;\r
+ setOpaque (findColour (whiteNoteColourId).isOpaque());\r
+ repaint();\r
}\r
\r
-void MidiKeyboardComponent::setBlackNoteWidthProportion (float ratio) noexcept\r
+//==============================================================================\r
+void MidiKeyboardComponent::drawWhiteKey (int midiNoteNumber, Graphics& g, Rectangle<float> area)\r
{\r
- jassert (ratio >= 0.0f && ratio <= 1.0f);\r
-\r
- if (blackNoteWidthRatio != ratio)\r
- {\r
- blackNoteWidthRatio = ratio;\r
- resized();\r
- }\r
+ drawWhiteNote (midiNoteNumber, g, area, state.isNoteOnForChannels (midiInChannelMask, midiNoteNumber),\r
+ mouseOverNotes.contains (midiNoteNumber), findColour (keySeparatorLineColourId), findColour (textLabelColourId));\r
}\r
\r
-void MidiKeyboardComponent::resized()\r
+void MidiKeyboardComponent::drawBlackKey (int midiNoteNumber, Graphics& g, Rectangle<float> area)\r
{\r
- auto w = getWidth();\r
- auto h = getHeight();\r
-\r
- if (w > 0 && h > 0)\r
- {\r
- if (orientation != horizontalKeyboard)\r
- std::swap (w, h);\r
-\r
- auto kx2 = getKeyPos (rangeEnd).getEnd();\r
-\r
- if ((int) firstKey != rangeStart)\r
- {\r
- auto kx1 = getKeyPos (rangeStart).getStart();\r
-\r
- if (kx2 - kx1 <= (float) w)\r
- {\r
- firstKey = (float) rangeStart;\r
- sendChangeMessage();\r
- repaint();\r
- }\r
- }\r
-\r
- scrollDown->setVisible (canScroll && firstKey > (float) rangeStart);\r
-\r
- xOffset = 0;\r
-\r
- if (canScroll)\r
- {\r
- auto scrollButtonW = jmin (scrollButtonWidth, w / 2);\r
- auto r = getLocalBounds();\r
-\r
- if (orientation == horizontalKeyboard)\r
- {\r
- scrollDown->setBounds (r.removeFromLeft (scrollButtonW));\r
- scrollUp ->setBounds (r.removeFromRight (scrollButtonW));\r
- }\r
- else if (orientation == verticalKeyboardFacingLeft)\r
- {\r
- scrollDown->setBounds (r.removeFromTop (scrollButtonW));\r
- scrollUp ->setBounds (r.removeFromBottom (scrollButtonW));\r
- }\r
- else\r
- {\r
- scrollDown->setBounds (r.removeFromBottom (scrollButtonW));\r
- scrollUp ->setBounds (r.removeFromTop (scrollButtonW));\r
- }\r
-\r
- auto endOfLastKey = getKeyPos (rangeEnd).getEnd();\r
-\r
- auto spaceAvailable = w;\r
- auto lastStartKey = remappedXYToNote ({ endOfLastKey - (float) spaceAvailable, 0 }).note + 1;\r
-\r
- if (lastStartKey >= 0 && ((int) firstKey) > lastStartKey)\r
- {\r
- firstKey = (float) jlimit (rangeStart, rangeEnd, lastStartKey);\r
- sendChangeMessage();\r
- }\r
-\r
- xOffset = getKeyPos ((int) firstKey).getStart();\r
- }\r
- else\r
- {\r
- firstKey = (float) rangeStart;\r
- }\r
-\r
- scrollUp->setVisible (canScroll && getKeyPos (rangeEnd).getStart() > (float) w);\r
- repaint();\r
- }\r
+ drawBlackNote (midiNoteNumber, g, area, state.isNoteOnForChannels (midiInChannelMask, midiNoteNumber),\r
+ mouseOverNotes.contains (midiNoteNumber), findColour (blackNoteColourId));\r
}\r
\r
//==============================================================================\r
noPendingUpdates.store (false);\r
}\r
\r
-//==============================================================================\r
-void MidiKeyboardComponent::resetAnyKeysInUse()\r
-{\r
- if (! keysPressed.isZero())\r
- {\r
- for (int i = 128; --i >= 0;)\r
- if (keysPressed[i])\r
- state.noteOff (midiChannel, i, 0.0f);\r
-\r
- keysPressed.clear();\r
- }\r
-\r
- for (int i = mouseDownNotes.size(); --i >= 0;)\r
- {\r
- auto noteDown = mouseDownNotes.getUnchecked(i);\r
-\r
- if (noteDown >= 0)\r
- {\r
- state.noteOff (midiChannel, noteDown, 0.0f);\r
- mouseDownNotes.set (i, -1);\r
- }\r
-\r
- mouseOverNotes.set (i, -1);\r
- }\r
-}\r
-\r
-void MidiKeyboardComponent::updateNoteUnderMouse (const MouseEvent& e, bool isDown)\r
-{\r
- updateNoteUnderMouse (e.getEventRelativeTo (this).position, isDown, e.source.getIndex());\r
-}\r
-\r
-void MidiKeyboardComponent::updateNoteUnderMouse (Point<float> pos, bool isDown, int fingerNum)\r
-{\r
- const auto noteInfo = xyToNote (pos);\r
- const auto newNote = noteInfo.note;\r
- const auto oldNote = mouseOverNotes.getUnchecked (fingerNum);\r
- const auto oldNoteDown = mouseDownNotes.getUnchecked (fingerNum);\r
- const auto eventVelocity = useMousePositionForVelocity ? noteInfo.velocity * velocity : velocity;\r
-\r
- if (oldNote != newNote)\r
- {\r
- repaintNote (oldNote);\r
- repaintNote (newNote);\r
- mouseOverNotes.set (fingerNum, newNote);\r
- }\r
-\r
- if (isDown)\r
- {\r
- if (newNote != oldNoteDown)\r
- {\r
- if (oldNoteDown >= 0)\r
- {\r
- mouseDownNotes.set (fingerNum, -1);\r
-\r
- if (! mouseDownNotes.contains (oldNoteDown))\r
- state.noteOff (midiChannel, oldNoteDown, eventVelocity);\r
- }\r
-\r
- if (newNote >= 0 && ! mouseDownNotes.contains (newNote))\r
- {\r
- state.noteOn (midiChannel, newNote, eventVelocity);\r
- mouseDownNotes.set (fingerNum, newNote);\r
- }\r
- }\r
- }\r
- else if (oldNoteDown >= 0)\r
- {\r
- mouseDownNotes.set (fingerNum, -1);\r
-\r
- if (! mouseDownNotes.contains (oldNoteDown))\r
- state.noteOff (midiChannel, oldNoteDown, eventVelocity);\r
- }\r
-}\r
-\r
-void MidiKeyboardComponent::mouseMove (const MouseEvent& e)\r
-{\r
- updateNoteUnderMouse (e, false);\r
-}\r
-\r
-void MidiKeyboardComponent::mouseDrag (const MouseEvent& e)\r
-{\r
- auto newNote = xyToNote (e.position).note;\r
-\r
- if (newNote >= 0 && mouseDraggedToKey (newNote, e))\r
- updateNoteUnderMouse (e, true);\r
-}\r
-\r
-bool MidiKeyboardComponent::mouseDownOnKey (int, const MouseEvent&) { return true; }\r
-bool MidiKeyboardComponent::mouseDraggedToKey (int, const MouseEvent&) { return true; }\r
-void MidiKeyboardComponent::mouseUpOnKey (int, const MouseEvent&) {}\r
-\r
-void MidiKeyboardComponent::mouseDown (const MouseEvent& e)\r
-{\r
- auto newNote = xyToNote (e.position).note;\r
-\r
- if (newNote >= 0 && mouseDownOnKey (newNote, e))\r
- updateNoteUnderMouse (e, true);\r
-}\r
-\r
-void MidiKeyboardComponent::mouseUp (const MouseEvent& e)\r
-{\r
- updateNoteUnderMouse (e, false);\r
-\r
- auto note = xyToNote (e.position).note;\r
-\r
- if (note >= 0)\r
- mouseUpOnKey (note, e);\r
-}\r
-\r
-void MidiKeyboardComponent::mouseEnter (const MouseEvent& e)\r
-{\r
- updateNoteUnderMouse (e, false);\r
-}\r
-\r
-void MidiKeyboardComponent::mouseExit (const MouseEvent& e)\r
-{\r
- updateNoteUnderMouse (e, false);\r
-}\r
-\r
-void MidiKeyboardComponent::mouseWheelMove (const MouseEvent&, const MouseWheelDetails& wheel)\r
-{\r
- auto amount = (orientation == horizontalKeyboard && wheel.deltaX != 0)\r
- ? wheel.deltaX : (orientation == verticalKeyboardFacingLeft ? wheel.deltaY\r
- : -wheel.deltaY);\r
-\r
- setLowestVisibleKeyFloat (firstKey - amount * keyWidth);\r
-}\r
-\r
-void MidiKeyboardComponent::timerCallback()\r
-{\r
- if (noPendingUpdates.exchange (true))\r
- return;\r
-\r
- for (int i = rangeStart; i <= rangeEnd; ++i)\r
- {\r
- bool isOn = state.isNoteOnForChannels (midiInChannelMask, i);\r
-\r
- if (keysCurrentlyDrawnDown[i] != isOn)\r
- {\r
- keysCurrentlyDrawnDown.setBit (i, isOn);\r
- repaintNote (i);\r
- }\r
- }\r
-}\r
-\r
-//==============================================================================\r
-void MidiKeyboardComponent::clearKeyMappings()\r
-{\r
- resetAnyKeysInUse();\r
- keyPressNotes.clear();\r
- keyPresses.clear();\r
-}\r
-\r
-void MidiKeyboardComponent::setKeyPressForNote (const KeyPress& key, int midiNoteOffsetFromC)\r
-{\r
- removeKeyPressForNote (midiNoteOffsetFromC);\r
-\r
- keyPressNotes.add (midiNoteOffsetFromC);\r
- keyPresses.add (key);\r
-}\r
-\r
-void MidiKeyboardComponent::removeKeyPressForNote (int midiNoteOffsetFromC)\r
-{\r
- for (int i = keyPressNotes.size(); --i >= 0;)\r
- {\r
- if (keyPressNotes.getUnchecked (i) == midiNoteOffsetFromC)\r
- {\r
- keyPressNotes.remove (i);\r
- keyPresses.remove (i);\r
- }\r
- }\r
-}\r
-\r
-void MidiKeyboardComponent::setKeyPressBaseOctave (int newOctaveNumber)\r
-{\r
- jassert (newOctaveNumber >= 0 && newOctaveNumber <= 10);\r
-\r
- keyMappingOctave = newOctaveNumber;\r
-}\r
-\r
-bool MidiKeyboardComponent::keyStateChanged (bool /*isKeyDown*/)\r
-{\r
- bool keyPressUsed = false;\r
-\r
- for (int i = keyPresses.size(); --i >= 0;)\r
- {\r
- auto note = 12 * keyMappingOctave + keyPressNotes.getUnchecked (i);\r
-\r
- if (keyPresses.getReference(i).isCurrentlyDown())\r
- {\r
- if (! keysPressed[note])\r
- {\r
- keysPressed.setBit (note);\r
- state.noteOn (midiChannel, note, velocity);\r
- keyPressUsed = true;\r
- }\r
- }\r
- else\r
- {\r
- if (keysPressed[note])\r
- {\r
- keysPressed.clearBit (note);\r
- state.noteOff (midiChannel, note, 0.0f);\r
- keyPressUsed = true;\r
- }\r
- }\r
- }\r
-\r
- return keyPressUsed;\r
-}\r
-\r
-bool MidiKeyboardComponent::keyPressed (const KeyPress& key)\r
-{\r
- return keyPresses.contains (key);\r
-}\r
-\r
-void MidiKeyboardComponent::focusLost (FocusChangeType)\r
-{\r
- resetAnyKeysInUse();\r
-}\r
-\r
} // namespace juce\r
\r
@tags{Audio}\r
*/\r
-class JUCE_API MidiKeyboardComponent : public Component,\r
- public MidiKeyboardState::Listener,\r
- public ChangeBroadcaster,\r
+class JUCE_API MidiKeyboardComponent : public KeyboardComponentBase,\r
+ private MidiKeyboardState::Listener,\r
private Timer\r
{\r
public:\r
//==============================================================================\r
- /** The direction of the keyboard.\r
- @see setOrientation\r
- */\r
- enum Orientation\r
- {\r
- horizontalKeyboard,\r
- verticalKeyboardFacingLeft,\r
- verticalKeyboardFacingRight,\r
- };\r
-\r
/** Creates a MidiKeyboardComponent.\r
\r
@param state the midi keyboard model that this component will represent\r
@param orientation whether the keyboard is horizontal or vertical\r
*/\r
- MidiKeyboardComponent (MidiKeyboardState& state,\r
- Orientation orientation);\r
+ MidiKeyboardComponent (MidiKeyboardState& state, Orientation orientation);\r
\r
/** Destructor. */\r
~MidiKeyboardComponent() override;\r
*/\r
void setVelocity (float velocity, bool useMousePositionForVelocity);\r
\r
+ //==============================================================================\r
/** Changes the midi channel number that will be used for events triggered by clicking\r
on the component.\r
\r
/** Returns the midi channel that the keyboard is using for midi messages.\r
@see setMidiChannel\r
*/\r
- int getMidiChannel() const noexcept { return midiChannel; }\r
+ int getMidiChannel() const noexcept { return midiChannel; }\r
\r
/** Sets a mask to indicate which incoming midi channels should be represented by\r
key movements.\r
/** Returns the current set of midi channels represented by the component.\r
This is the value that was set with setMidiChannelsToDisplay().\r
*/\r
- int getMidiChannelsToDisplay() const noexcept { return midiInChannelMask; }\r
+ int getMidiChannelsToDisplay() const noexcept { return midiInChannelMask; }\r
\r
//==============================================================================\r
- /** Changes the width used to draw the white keys. */\r
- void setKeyWidth (float widthInPixels);\r
-\r
- /** Returns the width that was set by setKeyWidth(). */\r
- float getKeyWidth() const noexcept { return keyWidth; }\r
-\r
- /** Changes the width used to draw the buttons that scroll the keyboard up/down in octaves. */\r
- void setScrollButtonWidth (int widthInPixels);\r
-\r
- /** Returns the width that was set by setScrollButtonWidth(). */\r
- int getScrollButtonWidth() const noexcept { return scrollButtonWidth; }\r
-\r
- /** Changes the keyboard's current direction. */\r
- void setOrientation (Orientation newOrientation);\r
-\r
- /** Returns the keyboard's current direction. */\r
- Orientation getOrientation() const noexcept { return orientation; }\r
-\r
- /** Sets the range of midi notes that the keyboard will be limited to.\r
-\r
- By default the range is 0 to 127 (inclusive), but you can limit this if you\r
- only want a restricted set of the keys to be shown.\r
-\r
- Note that the values here are inclusive and must be between 0 and 127.\r
- */\r
- void setAvailableRange (int lowestNote,\r
- int highestNote);\r
-\r
- /** Returns the first note in the available range.\r
- @see setAvailableRange\r
- */\r
- int getRangeStart() const noexcept { return rangeStart; }\r
+ /** Deletes all key-mappings.\r
\r
- /** Returns the last note in the available range.\r
- @see setAvailableRange\r
+ @see setKeyPressForNote\r
*/\r
- int getRangeEnd() const noexcept { return rangeEnd; }\r
-\r
- /** If the keyboard extends beyond the size of the component, this will scroll\r
- it to show the given key at the start.\r
+ void clearKeyMappings();\r
\r
- Whenever the keyboard's position is changed, this will use the ChangeBroadcaster\r
- base class to send a callback to any ChangeListeners that have been registered.\r
- */\r
- void setLowestVisibleKey (int noteNumber);\r
+ /** Maps a key-press to a given note.\r
\r
- /** Returns the number of the first key shown in the component.\r
- @see setLowestVisibleKey\r
+ @param key the key that should trigger the note\r
+ @param midiNoteOffsetFromC how many semitones above C the triggered note should\r
+ be. The actual midi note that gets played will be\r
+ this value + (12 * the current base octave). To change\r
+ the base octave, see setKeyPressBaseOctave()\r
*/\r
- int getLowestVisibleKey() const noexcept { return (int) firstKey; }\r
-\r
- /** Sets the length of the black notes as a proportion of the white note length. */\r
- void setBlackNoteLengthProportion (float ratio) noexcept;\r
+ void setKeyPressForNote (const KeyPress& key, int midiNoteOffsetFromC);\r
\r
- /** Returns the length of the black notes as a proportion of the white note length. */\r
- float getBlackNoteLengthProportion() const noexcept { return blackNoteLengthRatio; }\r
+ /** Removes any key-mappings for a given note.\r
\r
- /** Returns the absolute length of the black notes.\r
- This will be their vertical or horizontal length, depending on the keyboard's orientation.\r
+ For a description of what the note number means, see setKeyPressForNote().\r
*/\r
- float getBlackNoteLength() const noexcept;\r
-\r
- /** Sets the width of the black notes as a proportion of the white note width. */\r
- void setBlackNoteWidthProportion (float ratio) noexcept;\r
+ void removeKeyPressForNote (int midiNoteOffsetFromC);\r
\r
- /** Returns the width of the black notes as a proportion of the white note width. */\r
- float getBlackNoteWidthProportion() const noexcept { return blackNoteWidthRatio; }\r
+ /** Changes the base note above which key-press-triggered notes are played.\r
\r
- /** Returns the absolute width of the black notes.\r
- This will be their vertical or horizontal width, depending on the keyboard's orientation.\r
- */\r
- float getBlackNoteWidth() const noexcept { return keyWidth * blackNoteWidthRatio; }\r
+ The set of key-mappings that trigger notes can be moved up and down to cover\r
+ the entire scale using this method.\r
\r
- /** If set to true, then scroll buttons will appear at either end of the keyboard\r
- if there are too many notes to fit them all in the component at once.\r
+ The value passed in is an octave number between 0 and 10 (inclusive), and\r
+ indicates which C is the base note to which the key-mapped notes are\r
+ relative.\r
*/\r
- void setScrollButtonsVisible (bool canScroll);\r
+ void setKeyPressBaseOctave (int newOctaveNumber);\r
\r
//==============================================================================\r
/** A set of colour IDs to use to change the colour of various aspects of the keyboard.\r
mouseOverKeyOverlayColourId = 0x1005003, /**< This colour will be overlaid on the normal note colour. */\r
keyDownOverlayColourId = 0x1005004, /**< This colour will be overlaid on the normal note colour. */\r
textLabelColourId = 0x1005005,\r
- upDownButtonBackgroundColourId = 0x1005006,\r
- upDownButtonArrowColourId = 0x1005007,\r
- shadowColourId = 0x1005008\r
+ shadowColourId = 0x1005006\r
};\r
\r
- /** Returns the position within the component of the left-hand edge of a key.\r
+ //==============================================================================\r
+ /** Use this method to draw a white note of the keyboard in a given rectangle.\r
\r
- Depending on the keyboard's orientation, this may be a horizontal or vertical\r
- distance, in either direction.\r
+ isOver indicates whether the mouse is over the key, isDown indicates whether the key is\r
+ currently pressed down.\r
+\r
+ When doing this, be sure to note the keyboard's orientation.\r
*/\r
- float getKeyStartPosition (int midiNoteNumber) const;\r
+ virtual void drawWhiteNote (int midiNoteNumber, Graphics& g, Rectangle<float> area,\r
+ bool isDown, bool isOver, Colour lineColour, Colour textColour);\r
\r
- /** Returns the total width needed to fit all the keys in the available range. */\r
- float getTotalKeyboardWidth() const noexcept;\r
+ /** Use this method to draw a black note of the keyboard in a given rectangle.\r
\r
- /** Returns the key at a given coordinate. */\r
- int getNoteAtPosition (Point<float> position);\r
+ isOver indicates whether the mouse is over the key, isDown indicates whether the key is\r
+ currently pressed down.\r
\r
- //==============================================================================\r
- /** Deletes all key-mappings.\r
- @see setKeyPressForNote\r
+ When doing this, be sure to note the keyboard's orientation.\r
*/\r
- void clearKeyMappings();\r
+ virtual void drawBlackNote (int midiNoteNumber, Graphics& g, Rectangle<float> area,\r
+ bool isDown, bool isOver, Colour noteFillColour);\r
\r
- /** Maps a key-press to a given note.\r
+ /** Callback when the mouse is clicked on a key.\r
\r
- @param key the key that should trigger the note\r
- @param midiNoteOffsetFromC how many semitones above C the triggered note should\r
- be. The actual midi note that gets played will be\r
- this value + (12 * the current base octave). To change\r
- the base octave, see setKeyPressBaseOctave()\r
- */\r
- void setKeyPressForNote (const KeyPress& key,\r
- int midiNoteOffsetFromC);\r
+ You could use this to do things like handle right-clicks on keys, etc.\r
\r
- /** Removes any key-mappings for a given note.\r
- For a description of what the note number means, see setKeyPressForNote().\r
+ Return true if you want the click to trigger the note, or false if you\r
+ want to handle it yourself and not have the note played.\r
+\r
+ @see mouseDraggedToKey\r
*/\r
- void removeKeyPressForNote (int midiNoteOffsetFromC);\r
+ virtual bool mouseDownOnKey (int midiNoteNumber, const MouseEvent& e) { ignoreUnused (midiNoteNumber, e); return true; }\r
\r
- /** Changes the base note above which key-press-triggered notes are played.\r
+ /** Callback when the mouse is dragged from one key onto another.\r
\r
- The set of key-mappings that trigger notes can be moved up and down to cover\r
- the entire scale using this method.\r
+ Return true if you want the drag to trigger the new note, or false if you\r
+ want to handle it yourself and not have the note played.\r
\r
- The value passed in is an octave number between 0 and 10 (inclusive), and\r
- indicates which C is the base note to which the key-mapped notes are\r
- relative.\r
+ @see mouseDownOnKey\r
*/\r
- void setKeyPressBaseOctave (int newOctaveNumber);\r
+ virtual bool mouseDraggedToKey (int midiNoteNumber, const MouseEvent& e) { ignoreUnused (midiNoteNumber, e); return true; }\r
\r
- /** This sets the octave number which is shown as the octave number for middle C.\r
+ /** Callback when the mouse is released from a key.\r
\r
- This affects only the default implementation of getWhiteNoteText(), which\r
- passes this octave number to MidiMessage::getMidiNoteName() in order to\r
- get the note text. See MidiMessage::getMidiNoteName() for more info about\r
- the parameter.\r
+ @see mouseDownOnKey\r
+ */\r
+ virtual void mouseUpOnKey (int midiNoteNumber, const MouseEvent& e) { ignoreUnused (midiNoteNumber, e); }\r
\r
- By default this value is set to 3.\r
+ /** Allows text to be drawn on the white notes.\r
\r
- @see getOctaveForMiddleC\r
- */\r
- void setOctaveForMiddleC (int octaveNumForMiddleC);\r
+ By default this is used to label the C in each octave, but could be used for other things.\r
\r
- /** This returns the value set by setOctaveForMiddleC().\r
@see setOctaveForMiddleC\r
*/\r
- int getOctaveForMiddleC() const noexcept { return octaveNumForMiddleC; }\r
+ virtual String getWhiteNoteText (int midiNoteNumber);\r
\r
//==============================================================================\r
/** @internal */\r
- void paint (Graphics&) override;\r
- /** @internal */\r
- void resized() override;\r
- /** @internal */\r
void mouseMove (const MouseEvent&) override;\r
/** @internal */\r
void mouseDrag (const MouseEvent&) override;\r
/** @internal */\r
void mouseExit (const MouseEvent&) override;\r
/** @internal */\r
- void mouseWheelMove (const MouseEvent&, const MouseWheelDetails&) override;\r
- /** @internal */\r
void timerCallback() override;\r
/** @internal */\r
bool keyStateChanged (bool isKeyDown) override;\r
/** @internal */\r
void focusLost (FocusChangeType) override;\r
/** @internal */\r
- void handleNoteOn (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override;\r
- /** @internal */\r
- void handleNoteOff (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override;\r
- /** @internal */\r
void colourChanged() override;\r
\r
-protected:\r
+private:\r
//==============================================================================\r
- /** Draws a white note in the given rectangle.\r
-\r
- isOver indicates whether the mouse is over the key, isDown indicates whether the key is\r
- currently pressed down.\r
-\r
- When doing this, be sure to note the keyboard's orientation.\r
- */\r
- virtual void drawWhiteNote (int midiNoteNumber,\r
- Graphics& g, Rectangle<float> area,\r
- bool isDown, bool isOver,\r
- Colour lineColour, Colour textColour);\r
-\r
- /** Draws a black note in the given rectangle.\r
+ void drawKeyboardBackground (Graphics& g, Rectangle<float> area) override final;\r
+ void drawWhiteKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) override final;\r
+ void drawBlackKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) override final;\r
\r
- isOver indicates whether the mouse is over the key, isDown indicates whether the key is\r
- currently pressed down.\r
-\r
- When doing this, be sure to note the keyboard's orientation.\r
- */\r
- virtual void drawBlackNote (int midiNoteNumber,\r
- Graphics& g, Rectangle<float> area,\r
- bool isDown, bool isOver,\r
- Colour noteFillColour);\r
-\r
- /** Allows text to be drawn on the white notes.\r
- By default this is used to label the C in each octave, but could be used for other things.\r
- @see setOctaveForMiddleC\r
- */\r
- virtual String getWhiteNoteText (int midiNoteNumber);\r
-\r
- /** Draws the up and down buttons that scroll the keyboard up/down in octaves. */\r
- virtual void drawUpDownButton (Graphics& g, int w, int h,\r
- bool isMouseOver,\r
- bool isButtonPressed,\r
- bool movesOctavesUp);\r
-\r
- /** Callback when the mouse is clicked on a key.\r
-\r
- You could use this to do things like handle right-clicks on keys, etc.\r
+ void handleNoteOn (MidiKeyboardState*, int, int, float) override;\r
+ void handleNoteOff (MidiKeyboardState*, int, int, float) override;\r
\r
- Return true if you want the click to trigger the note, or false if you\r
- want to handle it yourself and not have the note played.\r
-\r
- @see mouseDraggedToKey\r
- */\r
- virtual bool mouseDownOnKey (int midiNoteNumber, const MouseEvent& e);\r
-\r
- /** Callback when the mouse is dragged from one key onto another.\r
-\r
- Return true if you want the drag to trigger the new note, or false if you\r
- want to handle it yourself and not have the note played.\r
-\r
- @see mouseDownOnKey\r
- */\r
- virtual bool mouseDraggedToKey (int midiNoteNumber, const MouseEvent& e);\r
-\r
- /** Callback when the mouse is released from a key.\r
- @see mouseDownOnKey\r
- */\r
- virtual void mouseUpOnKey (int midiNoteNumber, const MouseEvent& e);\r
-\r
- /** Calculates the position of a given midi-note.\r
-\r
- This can be overridden to create layouts with custom key-widths.\r
-\r
- @param midiNoteNumber the note to find\r
- @param keyWidth the desired width in pixels of one key - see setKeyWidth()\r
- @returns the start and length of the key along the axis of the keyboard\r
- */\r
- virtual Range<float> getKeyPosition (int midiNoteNumber, float keyWidth) const;\r
-\r
- /** Returns the rectangle for a given key if within the displayable range */\r
- Rectangle<float> getRectangleForKey (int midiNoteNumber) const;\r
-\r
-\r
-private:\r
//==============================================================================\r
- struct UpDownButton;\r
- struct NoteAndVelocity { int note; float velocity; };\r
+ void resetAnyKeysInUse();\r
+ void updateNoteUnderMouse (Point<float>, bool isDown, int fingerNum);\r
+ void updateNoteUnderMouse (const MouseEvent&, bool isDown);\r
+ void repaintNote (int midiNoteNumber);\r
\r
+ //==============================================================================\r
MidiKeyboardState& state;\r
- float blackNoteLengthRatio = 0.7f;\r
- float blackNoteWidthRatio = 0.7f;\r
- float xOffset = 0;\r
- float keyWidth = 16.0f;\r
- int scrollButtonWidth = 12;\r
- Orientation orientation;\r
-\r
int midiChannel = 1, midiInChannelMask = 0xffff;\r
+ int keyMappingOctave = 6;\r
+\r
float velocity = 1.0f;\r
+ bool useMousePositionForVelocity = true;\r
\r
Array<int> mouseOverNotes, mouseDownNotes;\r
- BigInteger keysPressed, keysCurrentlyDrawnDown;\r
- std::atomic<bool> noPendingUpdates { true };\r
-\r
- int rangeStart = 0, rangeEnd = 127;\r
- float firstKey = 12 * 4.0f;\r
- bool canScroll = true, useMousePositionForVelocity = true;\r
- std::unique_ptr<Button> scrollDown, scrollUp;\r
-\r
Array<KeyPress> keyPresses;\r
Array<int> keyPressNotes;\r
- int keyMappingOctave = 6, octaveNumForMiddleC = 3;\r
+ BigInteger keysPressed, keysCurrentlyDrawnDown;\r
\r
- Range<float> getKeyPos (int midiNoteNumber) const;\r
- NoteAndVelocity xyToNote (Point<float>);\r
- NoteAndVelocity remappedXYToNote (Point<float>) const;\r
- void resetAnyKeysInUse();\r
- void updateNoteUnderMouse (Point<float>, bool isDown, int fingerNum);\r
- void updateNoteUnderMouse (const MouseEvent&, bool isDown);\r
- void repaintNote (int midiNoteNumber);\r
- void setLowestVisibleKeyFloat (float noteNumber);\r
+ std::atomic<bool> noPendingUpdates { true };\r
\r
+ //==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiKeyboardComponent)\r
};\r
\r
#include "gui/juce_AudioThumbnail.cpp"\r
#include "gui/juce_AudioThumbnailCache.cpp"\r
#include "gui/juce_AudioVisualiserComponent.cpp"\r
+#include "gui/juce_KeyboardComponentBase.cpp"\r
#include "gui/juce_MidiKeyboardComponent.cpp"\r
+#include "gui/juce_MPEKeyboardComponent.cpp"\r
#include "gui/juce_AudioAppComponent.cpp"\r
#include "players/juce_SoundPlayer.cpp"\r
#include "players/juce_AudioProcessorPlayer.cpp"\r
\r
ID: juce_audio_utils\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE extra audio utility classes\r
description: Classes for audio-related GUI and miscellaneous tasks.\r
website: http://www.juce.com/juce\r
#include "gui/juce_AudioThumbnail.h"\r
#include "gui/juce_AudioThumbnailCache.h"\r
#include "gui/juce_AudioVisualiserComponent.h"\r
+#include "gui/juce_KeyboardComponentBase.h"\r
#include "gui/juce_MidiKeyboardComponent.h"\r
+#include "gui/juce_MPEKeyboardComponent.h"\r
#include "gui/juce_AudioAppComponent.h"\r
#include "gui/juce_BluetoothMidiDevicePairingDialogue.h"\r
#include "players/juce_SoundPlayer.h"\r
\r
ID: juce_box2d\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE wrapper for the Box2D physics engine\r
description: The Box2D physics engine and some utility classes.\r
website: http://www.juce.com/juce\r
{\r
}\r
\r
- /** Initalises from a null-terminated raw array of values.\r
+ /** Initialises from a null-terminated raw array of values.\r
@param data the data to copy from\r
*/\r
template <typename TypeToCreateFrom>\r
add (*data++);\r
}\r
\r
- /** Initalises from a raw array of values.\r
+ /** Initialises from a raw array of values.\r
@param data the data to copy from\r
@param numValues the number of values in the array\r
*/\r
values.addArray (data, numValues);\r
}\r
\r
- /** Initalises an Array of size 1 containing a single element. */\r
+ /** Initialises an Array of size 1 containing a single element. */\r
Array (const ElementType& singleElementToAdd)\r
{\r
add (singleElementToAdd);\r
}\r
\r
- /** Initalises an Array of size 1 containing a single element. */\r
+ /** Initialises an Array of size 1 containing a single element. */\r
Array (ElementType&& singleElementToAdd)\r
{\r
add (std::move (singleElementToAdd));\r
}\r
\r
- /** Initalises an Array from a list of items. */\r
+ /** Initialises an Array from a list of items. */\r
template <typename... OtherElements>\r
Array (const ElementType& firstNewElement, OtherElements&&... otherElements)\r
{\r
values.add (firstNewElement, std::forward<OtherElements> (otherElements)...);\r
}\r
\r
- /** Initalises an Array from a list of items. */\r
+ /** Initialises an Array from a list of items. */\r
template <typename... OtherElements>\r
Array (ElementType&& firstNewElement, OtherElements&&... otherElements)\r
{\r
// Have a few attempts at deleting the file before giving up..\r
for (int i = 5; --i >= 0;)\r
{\r
- if (temporaryFile.deleteFile())\r
+ if (temporaryFile.isDirectory() ? temporaryFile.deleteRecursively() : temporaryFile.deleteFile())\r
return true;\r
\r
Thread::sleep (50);\r
\r
ID: juce_core\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE core classes\r
description: The essential set of basic JUCE classes, as required by all the other JUCE modules. Includes text, container, memory, threading and i/o functionality.\r
website: http://www.juce.com/juce\r
}\r
\r
/** Scans an array of values for its min and max, and returns these as a Range. */\r
- static Range findMinAndMax (const ValueType* values, int numValues) noexcept\r
+ template <typename Integral, std::enable_if_t<std::is_integral<Integral>::value, int> = 0>\r
+ static Range findMinAndMax (const ValueType* values, Integral numValues) noexcept\r
{\r
if (numValues <= 0)\r
return Range();\r
#define STRICT 1\r
#define WIN32_LEAN_AND_MEAN 1\r
#if JUCE_MINGW\r
- #define _WIN32_WINNT 0x0600\r
+ #if ! defined (_WIN32_WINNT)\r
+ #define _WIN32_WINNT 0x0600\r
+ #endif\r
#else\r
#define _WIN32_WINNT 0x0602\r
#endif\r
\r
if (! connection->start (owner, webInputListener))\r
{\r
+ const auto errorCode = connection->getErrorCode();\r
connection.reset();\r
\r
if (@available (macOS 10.10, *))\r
\r
// Workaround for macOS versions below 10.10 where HTTPS POST requests with keep-alive\r
// fail with the NSURLErrorNetworkConnectionLost error code.\r
- if (numRetries == 0 && connection->getErrorCode() == NSURLErrorNetworkConnectionLost)\r
+ if (numRetries == 0 && errorCode == NSURLErrorNetworkConnectionLost)\r
return connect (webInputListener, ++numRetries);\r
\r
return false;\r
namespace juce\r
{\r
\r
-#if JUCE_MINGW || (! (defined (_MSC_VER) || defined (__uuidof)))\r
+#if (JUCE_MINGW && JUCE_32BIT) || (! defined (_MSC_VER) && ! defined (__uuidof))\r
#ifdef __uuidof\r
#undef __uuidof\r
#endif\r
\r
#else\r
#define JUCE_DECLARE_UUID_GETTER(name, uuid)\r
- #define JUCE_COMCLASS(name, guid) struct __declspec (uuid (guid)) name\r
+ #define JUCE_COMCLASS(name, guid) struct DECLSPEC_UUID (guid) name\r
#endif\r
\r
#define JUCE_IUNKNOWNCLASS(name, guid) JUCE_COMCLASS(name, guid) : public IUnknown\r
//==============================================================================\r
bool File::isSymbolicLink() const\r
{\r
- return (GetFileAttributes (fullPath.toWideCharPointer()) & FILE_ATTRIBUTE_REPARSE_POINT) != 0;\r
+ const auto attributes = WindowsFileHelpers::getAtts (fullPath);\r
+ return (attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0);\r
}\r
\r
bool File::isShortcut() const\r
\r
\r
//==============================================================================\r
-void JUCE_API juce_threadEntryPoint (void*);\r
-\r
static unsigned int STDMETHODCALLTYPE threadEntryProc (void* userData)\r
{\r
if (juce_messageWindowHandle != nullptr)\r
#pragma intrinsic (__debugbreak)\r
#endif\r
#define JUCE_BREAK_IN_DEBUGGER { __debugbreak(); }\r
-#elif JUCE_INTEL && (JUCE_GCC || JUCE_MAC)\r
+#elif JUCE_INTEL && (JUCE_GCC || JUCE_CLANG || JUCE_MAC)\r
#if JUCE_NO_INLINE_ASM\r
#define JUCE_BREAK_IN_DEBUGGER { }\r
#else\r
*/\r
#define JUCE_MAJOR_VERSION 6\r
#define JUCE_MINOR_VERSION 1\r
-#define JUCE_BUILDNUMBER 4\r
+#define JUCE_BUILDNUMBER 5\r
\r
/** Current JUCE version number.\r
\r
#include <typeindex>\r
#include <unordered_set>\r
#include <vector>\r
+#include <set>\r
\r
//==============================================================================\r
#include "juce_CompilerSupport.h"\r
values.minimiseStorageOverheads();\r
}\r
\r
-void StringPairArray::addMap (const std::map<String, String>& toAdd)\r
+template <typename Map>\r
+void StringPairArray::addMapImpl (const Map& toAdd)\r
{\r
// If we just called `set` for each item in `toAdd`, that would\r
// perform badly when adding to large StringPairArrays, as `set`\r
}\r
}\r
\r
+void StringPairArray::addUnorderedMap (const std::unordered_map<String, String>& toAdd) { addMapImpl (toAdd); }\r
+void StringPairArray::addMap (const std::map<String, String>& toAdd) { addMapImpl (toAdd); }\r
+\r
//==============================================================================\r
//==============================================================================\r
#if JUCE_UNIT_TESTS\r
/** Adds the contents of a map to this StringPairArray. */\r
void addMap (const std::map<String, String>& mapToAdd);\r
\r
+ /** Adds the contents of an unordered map to this StringPairArray. */\r
+ void addUnorderedMap (const std::unordered_map<String, String>& mapToAdd);\r
+\r
private:\r
//==============================================================================\r
+ template <typename Map>\r
+ void addMapImpl (const Map& mapToAdd);\r
+\r
StringArray keys, values;\r
bool ignoreCase;\r
\r
{\r
String zone[2];\r
\r
- #if JUCE_WINDOWS\r
- #if JUCE_MSVC || JUCE_CLANG\r
+ #if JUCE_WINDOWS && (JUCE_MSVC || JUCE_CLANG)\r
_tzset();\r
\r
for (int i = 0; i < 2; ++i)\r
_get_tzname (&length, name, sizeof (name) - 1, i);\r
zone[i] = name;\r
}\r
- #else\r
- #warning "Can't find a replacement for tzset on mingw - ideas welcome!"\r
- #endif\r
#else\r
tzset();\r
\r
/** Sets a flag to change the treatment of empty text elements.\r
\r
If this is true (the default state), then any text elements that contain only\r
- whitespace characters will be ingored during parsing. If you need to catch\r
+ whitespace characters will be ignored during parsing. If you need to catch\r
whitespace-only text, then you should set this to false before calling the\r
getDocumentElement() method.\r
*/\r
return 0;\r
}\r
\r
+static bool hasSymbolicPart (const File& root, const File& f)\r
+{\r
+ jassert (root == f || f.isAChildOf (root));\r
+\r
+ for (auto p = f; p != root; p = p.getParentDirectory())\r
+ {\r
+ if (p.isSymbolicLink())\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
//==============================================================================\r
struct ZipFile::ZipInputStream : public InputStream\r
{\r
}\r
\r
Result ZipFile::uncompressEntry (int index, const File& targetDirectory, bool shouldOverwriteFiles)\r
+{\r
+ return uncompressEntry (index,\r
+ targetDirectory,\r
+ shouldOverwriteFiles ? OverwriteFiles::yes : OverwriteFiles::no,\r
+ FollowSymlinks::no);\r
+}\r
+\r
+Result ZipFile::uncompressEntry (int index, const File& targetDirectory, OverwriteFiles overwriteFiles, FollowSymlinks followSymlinks)\r
{\r
auto* zei = entries.getUnchecked (index);\r
\r
\r
auto targetFile = targetDirectory.getChildFile (entryPath);\r
\r
+ if (! targetFile.isAChildOf (targetDirectory))\r
+ return Result::fail ("Entry " + entryPath + " is outside the target directory");\r
+\r
if (entryPath.endsWithChar ('/') || entryPath.endsWithChar ('\\'))\r
return targetFile.createDirectory(); // (entry is a directory, not a file)\r
\r
\r
if (targetFile.exists())\r
{\r
- if (! shouldOverwriteFiles)\r
+ if (overwriteFiles == OverwriteFiles::no)\r
return Result::ok();\r
\r
if (! targetFile.deleteFile())\r
return Result::fail ("Failed to write to target file: " + targetFile.getFullPathName());\r
}\r
\r
+ if (followSymlinks == FollowSymlinks::no && hasSymbolicPart (targetDirectory, targetFile.getParentDirectory()))\r
+ return Result::fail ("Parent directory leads through symlink for target file: " + targetFile.getFullPathName());\r
+\r
if (! targetFile.getParentDirectory().createDirectory())\r
return Result::fail ("Failed to create target folder: " + targetFile.getParentDirectory().getFullPathName());\r
\r
: UnitTest ("ZIP", UnitTestCategories::compression)\r
{}\r
\r
- void runTest() override\r
+ static MemoryBlock createZipMemoryBlock (const StringArray& entryNames)\r
{\r
- beginTest ("ZIP");\r
-\r
ZipFile::Builder builder;\r
- StringArray entryNames { "first", "second", "third" };\r
HashMap<String, MemoryBlock> blocks;\r
\r
for (auto& entryName : entryNames)\r
MemoryBlock data;\r
MemoryOutputStream mo (data, false);\r
builder.writeToStream (mo, nullptr);\r
+\r
+ return data;\r
+ }\r
+\r
+ void runZipSlipTest()\r
+ {\r
+ const std::map<String, bool> testCases = { { "a", true },\r
+#if JUCE_WINDOWS\r
+ { "C:/b", false },\r
+#else\r
+ { "/b", false },\r
+#endif\r
+ { "c/d", true },\r
+ { "../e/f", false },\r
+ { "../../g/h", false },\r
+ { "i/../j", true },\r
+ { "k/l/../", true },\r
+ { "m/n/../../", false },\r
+ { "o/p/../../../", false } };\r
+\r
+ StringArray entryNames;\r
+\r
+ for (const auto& testCase : testCases)\r
+ entryNames.add (testCase.first);\r
+\r
+ TemporaryFile tmpDir;\r
+ tmpDir.getFile().createDirectory();\r
+ auto data = createZipMemoryBlock (entryNames);\r
MemoryInputStream mi (data, false);\r
+ ZipFile zip (mi);\r
+\r
+ for (int i = 0; i < zip.getNumEntries(); ++i)\r
+ {\r
+ const auto result = zip.uncompressEntry (i, tmpDir.getFile());\r
+ const auto caseIt = testCases.find (zip.getEntry (i)->filename);\r
\r
+ if (caseIt != testCases.end())\r
+ {\r
+ expect (result.wasOk() == caseIt->second,\r
+ zip.getEntry (i)->filename + " was unexpectedly " + (result.wasOk() ? "OK" : "not OK"));\r
+ }\r
+ else\r
+ {\r
+ expect (false);\r
+ }\r
+ }\r
+ }\r
+\r
+ void runTest() override\r
+ {\r
+ beginTest ("ZIP");\r
+\r
+ StringArray entryNames { "first", "second", "third" };\r
+ auto data = createZipMemoryBlock (entryNames);\r
+ MemoryInputStream mi (data, false);\r
ZipFile zip (mi);\r
\r
expectEquals (zip.getNumEntries(), entryNames.size());\r
std::unique_ptr<InputStream> input (zip.createStreamForEntry (*entry));\r
expectEquals (input->readEntireStreamAsString(), entryName);\r
}\r
+\r
+ beginTest ("ZipSlip");\r
+ runZipSlipTest();\r
}\r
};\r
\r
const File& targetDirectory,\r
bool shouldOverwriteFiles = true);\r
\r
+ enum class OverwriteFiles { no, yes };\r
+ enum class FollowSymlinks { no, yes };\r
+\r
+ /** Uncompresses one of the entries from the zip file.\r
+\r
+ This will expand the entry and write it in a target directory. The entry's path is used to\r
+ determine which subfolder of the target should contain the new file.\r
+\r
+ @param index the index of the entry to uncompress - this must be a valid index\r
+ between 0 and (getNumEntries() - 1).\r
+ @param targetDirectory the root folder to uncompress into\r
+ @param overwriteFiles whether to overwrite existing files with similarly-named ones\r
+ @param followSymlinks whether to follow symlinks inside the target directory\r
+ @returns success if all the files are successfully unzipped\r
+ */\r
+ Result uncompressEntry (int index,\r
+ const File& targetDirectory,\r
+ OverwriteFiles overwriteFiles,\r
+ FollowSymlinks followSymlinks);\r
\r
//==============================================================================\r
/** Used to create a new zip file.\r
\r
ID: juce_cryptography\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE cryptography classes\r
description: Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc.\r
website: http://www.juce.com/juce\r
\r
ID: juce_data_structures\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE data model helper classes\r
description: Classes for undo/redo management, and smart data structures.\r
website: http://www.juce.com/juce\r
using Type = T;\r
};\r
\r
+ template <typename T>\r
+ struct ElementType<const T, false>\r
+ {\r
+ using Type = const typename T::value_type;\r
+ };\r
+\r
template <typename T>\r
struct ElementType<T, false>\r
{\r
engine->perform (input, output, inverse);\r
}\r
\r
-void FFT::performRealOnlyForwardTransform (float* inputOutputData, bool ignoreNeagtiveFreqs) const noexcept\r
+void FFT::performRealOnlyForwardTransform (float* inputOutputData, bool ignoreNegativeFreqs) const noexcept\r
{\r
if (engine != nullptr)\r
- engine->performRealOnlyForwardTransform (inputOutputData, ignoreNeagtiveFreqs);\r
+ engine->performRealOnlyForwardTransform (inputOutputData, ignoreNegativeFreqs);\r
}\r
\r
void FFT::performRealOnlyInverseTransform (float* inputOutputData) const noexcept\r
engine->performRealOnlyInverseTransform (inputOutputData);\r
}\r
\r
-void FFT::performFrequencyOnlyForwardTransform (float* inputOutputData) const noexcept\r
+void FFT::performFrequencyOnlyForwardTransform (float* inputOutputData, bool ignoreNegativeFreqs) const noexcept\r
{\r
if (size == 1)\r
return;\r
\r
- performRealOnlyForwardTransform (inputOutputData);\r
+ performRealOnlyForwardTransform (inputOutputData, ignoreNegativeFreqs);\r
auto* out = reinterpret_cast<Complex<float>*> (inputOutputData);\r
\r
- for (int i = 0; i < size; ++i)\r
+ const auto limit = ignoreNegativeFreqs ? (size / 2) + 1 : size;\r
+\r
+ for (int i = 0; i < limit; ++i)\r
inputOutputData[i] = std::abs (out[i]);\r
\r
- zeromem (&inputOutputData[size], static_cast<size_t> (size) * sizeof (float));\r
+ zeromem (inputOutputData + limit, static_cast<size_t> (size * 2 - limit) * sizeof (float));\r
}\r
\r
} // namespace dsp\r
As the coefficients of the negative frequencies (frequencies higher than\r
N/2 or pi) are the complex conjugate of their positive counterparts,\r
it may not be necessary to calculate them for your particular application.\r
- You can use dontCalculateNegativeFrequencies to let the FFT\r
+ You can use onlyCalculateNonNegativeFrequencies to let the FFT\r
engine know that you do not plan on using them. Note that this is only a\r
hint: some FFT engines (currently only the Fallback engine), will still\r
- calculate the negative frequencies even if dontCalculateNegativeFrequencies\r
+ calculate the negative frequencies even if onlyCalculateNonNegativeFrequencies\r
is true.\r
\r
The size of the array passed in must be 2 * getSize(), and the first half\r
should contain your raw input sample data. On return, if\r
- dontCalculateNegativeFrequencies is false, the array will contain size\r
+ onlyCalculateNonNegativeFrequencies is false, the array will contain size\r
complex real + imaginary parts data interleaved. If\r
- dontCalculateNegativeFrequencies is true, the array will contain at least\r
+ onlyCalculateNonNegativeFrequencies is true, the array will contain at least\r
(size / 2) + 1 complex numbers. Both outputs can be passed to\r
performRealOnlyInverseTransform() in order to convert it back to reals.\r
*/\r
void performRealOnlyForwardTransform (float* inputOutputData,\r
- bool dontCalculateNegativeFrequencies = false) const noexcept;\r
+ bool onlyCalculateNonNegativeFrequencies = false) const noexcept;\r
\r
/** Performs a reverse operation to data created in performRealOnlyForwardTransform().\r
\r
/** Takes an array and simply transforms it to the magnitude frequency response\r
spectrum. This may be handy for things like frequency displays or analysis.\r
The size of the array passed in must be 2 * getSize().\r
+\r
+ On return, if onlyCalculateNonNegativeFrequencies is false, the array will contain size\r
+ magnitude values. If onlyCalculateNonNegativeFrequencies is true, the array will contain\r
+ at least size / 2 + 1 magnitude values.\r
*/\r
- void performFrequencyOnlyForwardTransform (float* inputOutputData) const noexcept;\r
+ void performFrequencyOnlyForwardTransform (float* inputOutputData,\r
+ bool onlyCalculateNonNegativeFrequencies = false) const noexcept;\r
\r
/** Returns the number of data points that this FFT was created to work with. */\r
int getSize() const noexcept { return size; }\r
\r
struct FrequencyOnlyTest\r
{\r
- static void run(FFTUnitTest& u)\r
+ static void run (FFTUnitTest& u)\r
{\r
Random random (378272);\r
for (size_t order = 0; order <= 8; ++order)\r
\r
FFT fft ((int) order);\r
\r
- HeapBlock<float> inout (n << 1), reference (n << 1);\r
- HeapBlock<Complex<float>> frequency (n);\r
+ std::vector<float> inout ((size_t) n << 1), reference ((size_t) n << 1);\r
+ std::vector<Complex<float>> frequency (n);\r
\r
- fillRandom (random, inout.getData(), n);\r
- zeromem (reference.getData(), sizeof (float) * ((size_t) n << 1));\r
- performReferenceFourier (inout.getData(), frequency.getData(), n, false);\r
+ fillRandom (random, inout.data(), n);\r
+ zeromem (reference.data(), sizeof (float) * ((size_t) n << 1));\r
+ performReferenceFourier (inout.data(), frequency.data(), n, false);\r
\r
for (size_t i = 0; i < n; ++i)\r
- reference.getData()[i] = std::abs (frequency.getData()[i]);\r
-\r
- fft.performFrequencyOnlyForwardTransform (inout.getData());\r
-\r
- u.expect (checkArrayIsSimilar (inout.getData(), reference.getData(), n));\r
+ reference[i] = std::abs (frequency[i]);\r
+\r
+ for (auto ignoreNegative : { false, true })\r
+ {\r
+ auto inoutCopy = inout;\r
+ fft.performFrequencyOnlyForwardTransform (inoutCopy.data(), ignoreNegative);\r
+ auto numMatching = ignoreNegative ? (n / 2) + 1 : n;\r
+ u.expect (checkArrayIsSimilar (inoutCopy.data(), reference.data(), numMatching));\r
+ }\r
}\r
}\r
};\r
\r
ID: juce_dsp\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE DSP classes\r
description: Classes for audio buffer manipulation, digital audio processing, filtering, oversampling, fast math functions etc.\r
website: http://www.juce.com/juce\r
of the modulation.\r
\r
Note: To get classic chorus sounds try to use a centre delay time around 7-8 ms\r
- with a low feeback volume and a low depth. This effect can also be used as a\r
+ with a low feedback volume and a low depth. This effect can also be used as a\r
flanger with a lower centre delay time and a lot of feedback, and as a vibrato\r
effect if the mix value is 1.\r
\r
};\r
\r
//==============================================================================\r
-// Although clang supports C++17, their standard library still has no invoke_result\r
-// support. Remove the "|| JUCE_CLANG" once clang supports this properly!\r
-#if (! JUCE_CXX17_IS_AVAILABLE) || (JUCE_CLANG && ! JUCE_WINDOWS)\r
+#if JUCE_CXX17_IS_AVAILABLE\r
template <typename Functor>\r
-static WaveShaper<typename std::result_of<Functor>, Functor> CreateWaveShaper (Functor functionToUse) { return {functionToUse}; }\r
+static WaveShaper<typename std::invoke_result<Functor>, Functor> CreateWaveShaper (Functor functionToUse) { return {functionToUse}; }\r
#else\r
template <typename Functor>\r
-static WaveShaper<typename std::invoke_result<Functor>, Functor> CreateWaveShaper (Functor functionToUse) { return {functionToUse}; }\r
+static WaveShaper<typename std::result_of<Functor>, Functor> CreateWaveShaper (Functor functionToUse) { return {functionToUse}; }\r
#endif\r
\r
} // namespace dsp\r
\r
ID: juce_events\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE message and event handling classes\r
description: Classes for running an application's main event loop and sending/receiving messages, timers, etc.\r
website: http://www.juce.com/juce\r
ScaledImage (const Image& imageIn, double scaleIn)\r
: image (imageIn), scaleFactor (scaleIn) {}\r
\r
- /** Returns the image at its original dimentions. */\r
+ /** Returns the image at its original dimensions. */\r
Image getImage() const { return image; }\r
\r
/** Returns the image's scale. */\r
#endif\r
\r
#if JUCE_USE_DIRECTWRITE || JUCE_DIRECT2D\r
+ /* This is a workaround for broken-by-default function definitions\r
+ in the MinGW headers. If you're using a newer distribution of MinGW,\r
+ then your headers may substitute the broken definitions with working definitions\r
+ when this flag is enabled. Unfortunately, not all MinGW headers contain this\r
+ workaround, so Direct2D remains disabled by default when building with MinGW.\r
+ */\r
+ #define WIDL_EXPLICIT_AGGREGATE_RETURNS 1\r
+\r
/* If you hit a compile error trying to include these files, you may need to update\r
your version of the Windows SDK to the latest one. The DirectWrite and Direct2D\r
headers are in the version 7 SDKs.\r
\r
ID: juce_graphics\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE graphics classes\r
description: Classes for 2D vector graphics, image loading/saving, font handling, etc.\r
website: http://www.juce.com/juce\r
\r
ComSmartPtr<IDWriteFont> dwFont;\r
auto hr = fontCollection.GetFontFromFontFace (glyphRun.fontFace, dwFont.resetAndGetPointerAddress());\r
+ ignoreUnused (hr);\r
jassert (dwFont != nullptr);\r
\r
ComSmartPtr<IDWriteFontFamily> dwFontFamily;\r
\r
ComSmartPtr<IDWriteFontFamily> fontFamily;\r
auto hr = fontCollection.GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress());\r
+ ignoreUnused (hr);\r
\r
ComSmartPtr<IDWriteFont> dwFont;\r
uint32 fontFacesCount = 0;\r
\r
UINT32 actualLineCount = 0;\r
auto hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount);\r
+ ignoreUnused (hr);\r
\r
layout.ensureStorageAllocated ((int) actualLineCount);\r
\r
line.stringRange = Range<int> (lastLocation, lastLocation + (int) dwLineMetrics[i].length);\r
line.lineOrigin.y += yAdjustment;\r
yAdjustment += extraLineSpacing;\r
- lastLocation += dwLineMetrics[i].length;\r
+ lastLocation += (int) dwLineMetrics[i].length;\r
}\r
}\r
\r
uint32 index = 0;\r
BOOL exists = false;\r
auto hr = names->FindLocaleName (L"en-us", &index, &exists);\r
+ ignoreUnused (hr);\r
\r
if (! exists)\r
index = 0;\r
jassert (family != nullptr);\r
ComSmartPtr<IDWriteLocalizedStrings> familyNames;\r
auto hr = family->GetFamilyNames (familyNames.resetAndGetPointerAddress());\r
- jassert (SUCCEEDED (hr)); ignoreUnused (hr);\r
+ jassertquiet (SUCCEEDED (hr));\r
return getLocalisedName (familyNames);\r
}\r
\r
jassert (font != nullptr);\r
ComSmartPtr<IDWriteLocalizedStrings> faceNames;\r
auto hr = font->GetFaceNames (faceNames.resetAndGetPointerAddress());\r
- jassert (SUCCEEDED (hr)); ignoreUnused (hr);\r
+ jassertquiet (SUCCEEDED (hr));\r
return getLocalisedName (faceNames);\r
}\r
\r
\r
uint32 fontIndex = 0;\r
auto hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound);\r
+ ignoreUnused (hr);\r
\r
if (! fontFound)\r
fontIndex = 0;\r
BOOL fontFound = false;\r
uint32 fontIndex = 0;\r
auto hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound);\r
+ ignoreUnused (hr);\r
\r
if (! fontFound)\r
fontIndex = 0;\r
/** Returns the minimum value for this range. */\r
double getMinimumValue() const noexcept { return range.min; }\r
\r
- /** Returns the maxiumum value for this range. */\r
+ /** Returns the maximum value for this range. */\r
double getMaximumValue() const noexcept { return range.max; }\r
\r
/** Returns the interval for this range. */\r
*/\r
virtual std::unique_ptr<ComponentTraverser> createKeyboardFocusTraverser();\r
\r
+ /** Use this to indicate that the component should have an outline drawn around it\r
+ when it has keyboard focus.\r
+\r
+ If this is set to true, then when the component gains keyboard focus the\r
+ LookAndFeel::createFocusOutlineForComponent() method will be used to draw an outline\r
+ around it.\r
+\r
+ @see FocusOutline, hasFocusOutline\r
+ */\r
+ void setHasFocusOutline (bool hasFocusOutline) noexcept { flags.hasFocusOutlineFlag = hasFocusOutline; }\r
+\r
+ /** Returns true if this component should have a focus outline.\r
+\r
+ @see FocusOutline, setHasFocusOutline\r
+ */\r
+ bool hasFocusOutline() const noexcept { return flags.hasFocusOutlineFlag; }\r
+\r
//==============================================================================\r
/** Returns true if the component (and all its parents) are enabled.\r
\r
bool isKeyboardFocusContainerFlag : 1;\r
bool childKeyboardFocusedFlag : 1;\r
bool dontFocusOnMouseClickFlag : 1;\r
+ bool hasFocusOutlineFlag : 1;\r
bool alwaysOnTopFlag : 1;\r
bool bufferToImageFlag : 1;\r
bool bringToFrontOnClickFlag : 1;\r
void Desktop::removeFocusChangeListener (FocusChangeListener* l) { focusListeners.remove (l); }\r
void Desktop::triggerFocusCallback() { triggerAsyncUpdate(); }\r
\r
+void Desktop::updateFocusOutline()\r
+{\r
+ if (auto* currentFocus = Component::getCurrentlyFocusedComponent())\r
+ {\r
+ if (currentFocus->hasFocusOutline())\r
+ {\r
+ focusOutline = currentFocus->getLookAndFeel().createFocusOutlineForComponent (*currentFocus);\r
+\r
+ if (focusOutline != nullptr)\r
+ focusOutline->setOwner (currentFocus);\r
+\r
+ return;\r
+ }\r
+ }\r
+\r
+ focusOutline = nullptr;\r
+}\r
+\r
void Desktop::handleAsyncUpdate()\r
{\r
// The component may be deleted during this operation, but we'll use a SafePointer rather than a\r
{\r
l.globalFocusChanged (currentFocus.get());\r
});\r
+\r
+ updateFocusOutline();\r
}\r
\r
//==============================================================================\r
std::unique_ptr<LookAndFeel> defaultLookAndFeel;\r
WeakReference<LookAndFeel> currentLookAndFeel;\r
\r
+ std::unique_ptr<FocusOutline> focusOutline;\r
+\r
Component* kioskModeComponent = nullptr;\r
Rectangle<int> kioskComponentOriginalBounds;\r
bool kioskModeReentrant = false;\r
void setKioskComponent (Component*, bool shouldBeEnabled, bool allowMenusAndBars);\r
\r
void triggerFocusCallback();\r
+ void updateFocusOutline();\r
void handleAsyncUpdate() override;\r
\r
static Point<float> getMousePositionFloat();\r
#include <vfw.h>\r
#include <commdlg.h>\r
#include <commctrl.h>\r
-\r
- #if ! JUCE_MINGW\r
- #include <UIAutomation.h>\r
- #include <sapi.h>\r
- #endif\r
+ #include <UIAutomation.h>\r
+ #include <sapi.h>\r
\r
#if JUCE_WEB_BROWSER\r
#include <exdisp.h>\r
#endif\r
#endif\r
\r
-#include <set>\r
-\r
//==============================================================================\r
#define JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN \\r
jassert ((MessageManager::getInstanceWithoutCreating() != nullptr \\r
#include "application/juce_Application.cpp"\r
#include "misc/juce_BubbleComponent.cpp"\r
#include "misc/juce_DropShadower.cpp"\r
+#include "misc/juce_FocusOutline.cpp"\r
#include "misc/juce_JUCESplashScreen.cpp"\r
\r
#include "layout/juce_FlexBox.cpp"\r
#include "native/juce_mac_MouseCursor.mm"\r
\r
#elif JUCE_WINDOWS\r
-\r
- #if ! JUCE_MINGW\r
- #include "native/accessibility/juce_win32_WindowsUIAWrapper.h"\r
- #include "native/accessibility/juce_win32_AccessibilityElement.h"\r
- #include "native/accessibility/juce_win32_UIAHelpers.h"\r
- #include "native/accessibility/juce_win32_UIAProviders.h"\r
- #include "native/accessibility/juce_win32_AccessibilityElement.cpp"\r
- #include "native/accessibility/juce_win32_Accessibility.cpp"\r
- #else\r
- namespace juce\r
- {\r
- namespace WindowsAccessibility\r
- {\r
- long getUiaRootObjectId() { return -1; }\r
- bool handleWmGetObject (AccessibilityHandler*, WPARAM, LPARAM, LRESULT*) { return false; }\r
- void revokeUIAMapEntriesForWindow (HWND) {}\r
- }\r
- }\r
- #endif\r
-\r
+ #include "native/accessibility/juce_win32_ComInterfaces.h"\r
+ #include "native/accessibility/juce_win32_WindowsUIAWrapper.h"\r
+ #include "native/accessibility/juce_win32_AccessibilityElement.h"\r
+ #include "native/accessibility/juce_win32_UIAHelpers.h"\r
+ #include "native/accessibility/juce_win32_UIAProviders.h"\r
+ #include "native/accessibility/juce_win32_AccessibilityElement.cpp"\r
+ #include "native/accessibility/juce_win32_Accessibility.cpp"\r
#include "native/juce_win32_Windowing.cpp"\r
#include "native/juce_win32_DragAndDrop.cpp"\r
#include "native/juce_win32_FileChooser.cpp"\r
\r
//==============================================================================\r
#if JUCE_WINDOWS\r
+namespace juce\r
+{\r
+\r
+JUCE_COMCLASS (JuceIVirtualDesktopManager, "a5cd92ff-29be-454c-8d04-d82879fb3f1b") : public IUnknown\r
+{\r
+public:\r
+ virtual HRESULT STDMETHODCALLTYPE IsWindowOnCurrentVirtualDesktop(\r
+ __RPC__in HWND topLevelWindow,\r
+ __RPC__out BOOL * onCurrentDesktop) = 0;\r
+\r
+ virtual HRESULT STDMETHODCALLTYPE GetWindowDesktopId(\r
+ __RPC__in HWND topLevelWindow,\r
+ __RPC__out GUID * desktopId) = 0;\r
+\r
+ virtual HRESULT STDMETHODCALLTYPE MoveWindowToDesktop(\r
+ __RPC__in HWND topLevelWindow,\r
+ __RPC__in REFGUID desktopId) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (JuceVirtualDesktopManager, "aa509086-5ca9-4c25-8f95-589d3c07b48a");\r
+\r
+} // namespace juce\r
+\r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::JuceIVirtualDesktopManager, 0xa5cd92ff, 0x29be, 0x454c, 0x8d, 0x04, 0xd8, 0x28, 0x79, 0xfb, 0x3f, 0x1b)\r
+__CRT_UUID_DECL (juce::JuceVirtualDesktopManager, 0xaa509086, 0x5ca9, 0x4c25, 0x8f, 0x95, 0x58, 0x9d, 0x3c, 0x07, 0xb4, 0x8a)\r
+#endif\r
+\r
bool juce::isWindowOnCurrentVirtualDesktop (void* x)\r
{\r
if (x == nullptr)\r
\r
static auto* desktopManager = []\r
{\r
- // IVirtualDesktopManager Copied from ShObjdl_core.h, because it may not be defined\r
- MIDL_INTERFACE ("a5cd92ff-29be-454c-8d04-d82879fb3f1b")\r
- juce_IVirtualDesktopManager : public IUnknown\r
- {\r
- public:\r
- virtual HRESULT STDMETHODCALLTYPE IsWindowOnCurrentVirtualDesktop(\r
- __RPC__in HWND topLevelWindow,\r
- __RPC__out BOOL * onCurrentDesktop) = 0;\r
-\r
- virtual HRESULT STDMETHODCALLTYPE GetWindowDesktopId(\r
- __RPC__in HWND topLevelWindow,\r
- __RPC__out GUID * desktopId) = 0;\r
-\r
- virtual HRESULT STDMETHODCALLTYPE MoveWindowToDesktop(\r
- __RPC__in HWND topLevelWindow,\r
- __RPC__in REFGUID desktopId) = 0;\r
- };\r
-\r
- juce_IVirtualDesktopManager* result = nullptr;\r
+ JuceIVirtualDesktopManager* result = nullptr;\r
\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
\r
- class DECLSPEC_UUID("aa509086-5ca9-4c25-8f95-589d3c07b48a") juce_VirtualDesktopManager;\r
-\r
- if (SUCCEEDED (CoCreateInstance (__uuidof (juce_VirtualDesktopManager), nullptr, CLSCTX_ALL, IID_PPV_ARGS (&result))))\r
+ if (SUCCEEDED (CoCreateInstance (__uuidof (JuceVirtualDesktopManager), nullptr, CLSCTX_ALL, IID_PPV_ARGS (&result))))\r
return result;\r
\r
JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
\r
- return static_cast<juce_IVirtualDesktopManager*> (nullptr);\r
+ return static_cast<JuceIVirtualDesktopManager*> (nullptr);\r
}();\r
\r
BOOL current = false;\r
\r
return true;\r
}\r
+\r
#else\r
bool juce::isWindowOnCurrentVirtualDesktop (void*) { return true; }\r
juce::ScopedDPIAwarenessDisabler::ScopedDPIAwarenessDisabler() { ignoreUnused (previousContext); }\r
\r
ID: juce_gui_basics\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE GUI core classes\r
description: Basic user-interface components and related classes.\r
website: http://www.juce.com/juce\r
\r
class FlexBox;\r
class Grid;\r
+ class FocusOutline;\r
\r
#if JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX\r
Image createSnapshotOfNativeWindow (void* nativeWindowHandle);\r
#include "menus/juce_BurgerMenuComponent.h"\r
#include "buttons/juce_ToolbarButton.h"\r
#include "misc/juce_DropShadower.h"\r
+#include "misc/juce_FocusOutline.h"\r
#include "misc/juce_JUCESplashScreen.h"\r
#include "widgets/juce_TreeView.h"\r
#include "windows/juce_TopLevelWindow.h"\r
operation you could give a value of false to the callback to abort the close operation.\r
\r
If your component is based on the FileBasedDocument class, then you'd probably want\r
- to call FileBasedDocument::saveIfNeededAndUserAgreesAsync() and call the calback with\r
+ to call FileBasedDocument::saveIfNeededAndUserAgreesAsync() and call the callback with\r
true if this returned FileBasedDocument::savedOk.\r
\r
@see closeDocumentAsync, FileBasedDocument::saveIfNeededAndUserAgreesAsync()\r
Colour findColour (int colourId) const noexcept;\r
\r
/** Registers a colour to be used for a particular purpose.\r
+\r
For more details, see the comments for findColour().\r
+\r
@see findColour, Component::findColour, Component::setColour\r
*/\r
void setColour (int colourId, Colour colour) noexcept;\r
\r
//==============================================================================\r
/** Returns the typeface that should be used for a given font.\r
+\r
The default implementation just does what you'd expect it to, but you can override\r
this if you want to intercept fonts and use your own custom typeface object.\r
+\r
@see setDefaultTypeface\r
*/\r
virtual Typeface::Ptr getTypefaceForFont (const Font&);\r
\r
/** Allows you to supply a default typeface that will be returned as the default\r
sans-serif font.\r
+\r
Instead of a typeface object, you can specify a typeface by name using the\r
setDefaultSansSerifTypefaceName() method.\r
+\r
You can perform more complex typeface substitutions by overloading\r
getTypefaceForFont() but this lets you easily set a global typeface.\r
*/\r
void setDefaultSansSerifTypeface (Typeface::Ptr newDefaultTypeface);\r
\r
/** Allows you to change the default sans-serif font.\r
+\r
If you need to supply your own Typeface object for any of the default fonts, rather\r
than just supplying the name (e.g. if you want to use an embedded font), then\r
you can instead call setDefaultSansSerifTypeface() with an object to use.\r
void setDefaultSansSerifTypefaceName (const String& newName);\r
\r
//==============================================================================\r
- /** Override this to get the chance to swap a component's mouse cursor for a\r
- customised one.\r
+ /** Sets whether native alert windows (if available) or standard JUCE AlertWindows\r
+ drawn with AlertWindow::LookAndFeelMethods will be used.\r
+\r
+ @see isUsingNativeAlertWindows\r
*/\r
- virtual MouseCursor getMouseCursorFor (Component&);\r
+ void setUsingNativeAlertWindows (bool shouldUseNativeAlerts);\r
\r
- //==============================================================================\r
- /** Creates a new graphics context object. */\r
- virtual std::unique_ptr<LowLevelGraphicsContext> createGraphicsContext (const Image& imageToRenderOn,\r
- Point<int> origin,\r
- const RectangleList<int>& initialClip);\r
+ /** Returns true if native alert windows will be used (if available).\r
\r
- void setUsingNativeAlertWindows (bool shouldUseNativeAlerts);\r
+ The default setting for this is false.\r
+\r
+ @see setUsingNativeAlertWindows\r
+ */\r
bool isUsingNativeAlertWindows();\r
\r
//==============================================================================\r
/** Draws a small image that spins to indicate that something's happening.\r
+\r
This method should use the current time to animate itself, so just keep\r
repainting it every so often.\r
*/\r
virtual void drawSpinningWaitAnimation (Graphics&, const Colour& colour,\r
int x, int y, int w, int h) = 0;\r
\r
- //==============================================================================\r
/** Returns a tick shape for use in yes/no boxes, etc. */\r
virtual Path getTickShape (float height) = 0;\r
+\r
/** Returns a cross shape for use in yes/no boxes, etc. */\r
virtual Path getCrossShape (float height) = 0;\r
\r
- //==============================================================================\r
- virtual DropShadower* createDropShadowerForComponent (Component*) = 0;\r
+ /** Creates a drop-shadower for a given component, if required.\r
+\r
+ @see DropShadower\r
+ */\r
+ virtual std::unique_ptr<DropShadower> createDropShadowerForComponent (Component&) = 0;\r
+\r
+ /** Creates a focus outline for a given component, if required.\r
+\r
+ @see FocusOutline\r
+ */\r
+ virtual std::unique_ptr<FocusOutline> createFocusOutlineForComponent (Component&) = 0;\r
\r
//==============================================================================\r
- /** Plays the system's default 'beep' noise, to alert the user about something very important. */\r
+ /** Override this to get the chance to swap a component's mouse cursor for a\r
+ customised one.\r
+\r
+ @see MouseCursor\r
+ */\r
+ virtual MouseCursor getMouseCursorFor (Component&);\r
+\r
+ /** Creates a new graphics context object. */\r
+ virtual std::unique_ptr<LowLevelGraphicsContext> createGraphicsContext (const Image& imageToRenderOn,\r
+ Point<int> origin,\r
+ const RectangleList<int>& initialClip);\r
+\r
+ /** Plays the system's default 'beep' noise, to alert the user about something\r
+ very important. This is only supported on some platforms.\r
+ */\r
virtual void playAlertSound();\r
\r
private:\r
0x1000440, /*LassoComponent::lassoFillColourId*/ 0x66dddddd,\r
0x1000441, /*LassoComponent::lassoOutlineColourId*/ 0x99111111,\r
\r
+ 0x1004000, /*KeyboardComponentBase::upDownButtonBackgroundColourId*/ 0xffd3d3d3,\r
+ 0x1004001, /*KeyboardComponentBase::upDownButtonArrowColourId*/ 0xff000000,\r
+\r
0x1005000, /*MidiKeyboardComponent::whiteNoteColourId*/ 0xffffffff,\r
0x1005001, /*MidiKeyboardComponent::blackNoteColourId*/ 0xff000000,\r
0x1005002, /*MidiKeyboardComponent::keySeparatorLineColourId*/ 0x66000000,\r
0x1005003, /*MidiKeyboardComponent::mouseOverKeyOverlayColourId*/ 0x80ffff00,\r
0x1005004, /*MidiKeyboardComponent::keyDownOverlayColourId*/ 0xffb6b600,\r
0x1005005, /*MidiKeyboardComponent::textLabelColourId*/ 0xff000000,\r
- 0x1005006, /*MidiKeyboardComponent::upDownButtonBackgroundColourId*/ 0xffd3d3d3,\r
- 0x1005007, /*MidiKeyboardComponent::upDownButtonArrowColourId*/ 0xff000000,\r
- 0x1005008, /*MidiKeyboardComponent::shadowColourId*/ 0x4c000000,\r
+ 0x1005006, /*MidiKeyboardComponent::shadowColourId*/ 0x4c000000,\r
+\r
+ 0x1006000, /*MPEKeyboardComponent::whiteNoteColourId*/ 0xff1a1c27,\r
+ 0x1006001, /*MPEKeyboardComponent::blackNoteColourId*/ 0x99f1f1f1,\r
+ 0x1006002, /*MPEKeyboardComponent::textLabelColourId*/ 0xfff1f1f1,\r
+ 0x1006003, /*MPEKeyboardComponent::noteCircleFillColourId*/ 0x99ba00ff,\r
+ 0x1006004, /*MPEKeyboardComponent::noteCircleOutlineColourId*/ 0xfff1f1f1,\r
\r
0x1004500, /*CodeEditorComponent::backgroundColourId*/ 0xffffffff,\r
0x1004502, /*CodeEditorComponent::highlightColourId*/ textHighlightColour,\r
}\r
\r
//==============================================================================\r
-DropShadower* LookAndFeel_V2::createDropShadowerForComponent (Component*)\r
+std::unique_ptr<DropShadower> LookAndFeel_V2::createDropShadowerForComponent (Component&)\r
{\r
- return new DropShadower (DropShadow (Colours::black.withAlpha (0.4f), 10, Point<int> (0, 2)));\r
+ return std::make_unique<DropShadower> (DropShadow (Colours::black.withAlpha (0.4f), 10, Point<int> (0, 2)));\r
+}\r
+\r
+std::unique_ptr<FocusOutline> LookAndFeel_V2::createFocusOutlineForComponent (Component&)\r
+{\r
+ struct WindowProperties : public FocusOutline::OutlineWindowProperties\r
+ {\r
+ Rectangle<int> getOutlineBounds (Component& c) override\r
+ {\r
+ return c.getScreenBounds();\r
+ }\r
+\r
+ void drawOutline (Graphics& g, int width, int height) override\r
+ {\r
+ g.setColour (Colours::yellow.withAlpha (0.6f));\r
+ g.drawRoundedRectangle ({ (float) width, (float) height }, 3.0f, 3.0f);\r
+ }\r
+ };\r
+\r
+ return std::make_unique<FocusOutline> (std::make_unique<WindowProperties>());\r
}\r
\r
//==============================================================================\r
bool positionTitleBarButtonsOnLeft) override;\r
\r
//==============================================================================\r
- DropShadower* createDropShadowerForComponent (Component*) override;\r
+ std::unique_ptr<DropShadower> createDropShadowerForComponent (Component&) override;\r
+ std::unique_ptr<FocusOutline> createFocusOutlineForComponent (Component&) override;\r
\r
//==============================================================================\r
void drawStretchableLayoutResizerBar (Graphics&, int w, int h, bool isVerticalBar,\r
0x1000440, /*LassoComponent::lassoFillColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).getARGB(),\r
0x1000441, /*LassoComponent::lassoOutlineColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(),\r
\r
+ 0x1004000, /*KeyboardComponentBase::upDownButtonBackgroundColourId*/ 0xffd3d3d3,\r
+ 0x1004001, /*KeyboardComponentBase::upDownButtonArrowColourId*/ 0xff000000,\r
+\r
0x1005000, /*MidiKeyboardComponent::whiteNoteColourId*/ 0xffffffff,\r
0x1005001, /*MidiKeyboardComponent::blackNoteColourId*/ 0xff000000,\r
0x1005002, /*MidiKeyboardComponent::keySeparatorLineColourId*/ 0x66000000,\r
0x1005003, /*MidiKeyboardComponent::mouseOverKeyOverlayColourId*/ 0x80ffff00,\r
0x1005004, /*MidiKeyboardComponent::keyDownOverlayColourId*/ 0xffb6b600,\r
0x1005005, /*MidiKeyboardComponent::textLabelColourId*/ 0xff000000,\r
- 0x1005006, /*MidiKeyboardComponent::upDownButtonBackgroundColourId*/ 0xffd3d3d3,\r
- 0x1005007, /*MidiKeyboardComponent::upDownButtonArrowColourId*/ 0xff000000,\r
- 0x1005008, /*MidiKeyboardComponent::shadowColourId*/ 0x4c000000,\r
+ 0x1005006, /*MidiKeyboardComponent::shadowColourId*/ 0x4c000000,\r
+\r
+ 0x1006000, /*MPEKeyboardComponent::whiteNoteColourId*/ 0xff1a1c27,\r
+ 0x1006001, /*MPEKeyboardComponent::blackNoteColourId*/ 0x99f1f1f1,\r
+ 0x1006002, /*MPEKeyboardComponent::textLabelColourId*/ 0xfff1f1f1,\r
+ 0x1006003, /*MPEKeyboardComponent::noteCircleFillColourId*/ 0x99ba00ff,\r
+ 0x1006004, /*MPEKeyboardComponent::noteCircleOutlineColourId*/ 0xfff1f1f1,\r
\r
0x1004500, /*CodeEditorComponent::backgroundColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(),\r
0x1004502, /*CodeEditorComponent::highlightColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).withAlpha (0.4f).getARGB(),\r
class MouseSourceState;\r
struct MenuWindow;\r
\r
-static bool canBeTriggered (const PopupMenu::Item& item) noexcept { return item.isEnabled && item.itemID != 0 && ! item.isSectionHeader; }\r
-static bool hasActiveSubMenu (const PopupMenu::Item& item) noexcept { return item.isEnabled && item.subMenu != nullptr && item.subMenu->items.size() > 0; }\r
+static bool canBeTriggered (const PopupMenu::Item& item) noexcept\r
+{\r
+ return item.isEnabled\r
+ && item.itemID != 0\r
+ && ! item.isSectionHeader\r
+ && (item.customComponent == nullptr || item.customComponent->isTriggeredAutomatically());\r
+}\r
+\r
+static bool hasActiveSubMenu (const PopupMenu::Item& item) noexcept\r
+{\r
+ return item.isEnabled\r
+ && item.subMenu != nullptr\r
+ && item.subMenu->items.size() > 0;\r
+}\r
\r
//==============================================================================\r
struct HeaderItemComponent : public PopupMenu::CustomComponent\r
idealWidth += idealWidth / 4;\r
}\r
\r
+ std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override\r
+ {\r
+ return nullptr;\r
+ }\r
+\r
const Options& options;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HeaderItemComponent)\r
//==============================================================================\r
struct ItemComponent : public Component\r
{\r
- ItemComponent (const PopupMenu::Item& i,\r
- const PopupMenu::Options& o,\r
- MenuWindow& parent)\r
+ ItemComponent (const PopupMenu::Item& i, const PopupMenu::Options& o, MenuWindow& parent)\r
: item (i), parentWindow (parent), options (o), customComp (i.customComponent)\r
{\r
if (item.isSectionHeader)\r
}\r
}\r
\r
+ static bool isAccessibilityHandlerRequired (const PopupMenu::Item& item)\r
+ {\r
+ return item.isSectionHeader || hasActiveSubMenu (item) || canBeTriggered (item);\r
+ }\r
+\r
PopupMenu::Item item;\r
\r
private:\r
+ class ValueInterface : public AccessibilityValueInterface\r
+ {\r
+ public:\r
+ ValueInterface() = default;\r
+\r
+ bool isReadOnly() const override { return true; }\r
+\r
+ double getCurrentValue() const override\r
+ {\r
+ return 1.0;\r
+ }\r
+\r
+ String getCurrentValueAsString() const override\r
+ {\r
+ return TRANS ("Checked");\r
+ }\r
+\r
+ void setValue (double) override {}\r
+ void setValueAsString (const String&) override {}\r
+\r
+ AccessibleValueRange getRange() const override { return {}; }\r
+ };\r
+\r
//==============================================================================\r
class ItemAccessibilityHandler : public AccessibilityHandler\r
{\r
public:\r
explicit ItemAccessibilityHandler (ItemComponent& itemComponentToWrap)\r
: AccessibilityHandler (itemComponentToWrap,\r
- AccessibilityRole::menuItem,\r
- getAccessibilityActions (*this, itemComponentToWrap)),\r
+ isAccessibilityHandlerRequired (itemComponentToWrap.item) ? AccessibilityRole::menuItem\r
+ : AccessibilityRole::ignored,\r
+ getAccessibilityActions (*this, itemComponentToWrap),\r
+ AccessibilityHandler::Interfaces { itemComponentToWrap.item.isTicked ? std::make_unique<ValueInterface>()\r
+ : nullptr }),\r
itemComponent (itemComponentToWrap)\r
{\r
}\r
: state.withExpandable().withCollapsed();\r
}\r
\r
+ if (itemComponent.item.isTicked)\r
+ state = state.withChecked();\r
+\r
return state.isFocused() ? state.withSelected() : state;\r
}\r
\r
item.parentWindow.setCurrentlyHighlightedChild (&item);\r
};\r
\r
- auto onPress = [&item]\r
- {\r
- item.parentWindow.setCurrentlyHighlightedChild (&item);\r
- item.parentWindow.triggerCurrentlyHighlightedItem();\r
- };\r
-\r
auto onToggle = [&handler, &item, onFocus]\r
{\r
if (handler.getCurrentState().isSelected())\r
};\r
\r
auto actions = AccessibilityActions().addAction (AccessibilityActionType::focus, std::move (onFocus))\r
- .addAction (AccessibilityActionType::press, std::move (onPress))\r
.addAction (AccessibilityActionType::toggle, std::move (onToggle));\r
\r
+ if (canBeTriggered (item.item))\r
+ {\r
+ actions.addAction (AccessibilityActionType::press, [&item]\r
+ {\r
+ item.parentWindow.setCurrentlyHighlightedChild (&item);\r
+ item.parentWindow.triggerCurrentlyHighlightedItem();\r
+ });\r
+ }\r
+\r
if (hasActiveSubMenu (item.item))\r
{\r
auto showSubMenu = [&item]\r
\r
void triggerCurrentlyHighlightedItem()\r
{\r
- if (currentChild != nullptr\r
- && canBeTriggered (currentChild->item)\r
- && (currentChild->item.customComponent == nullptr\r
- || currentChild->item.customComponent->isTriggeredAutomatically()))\r
+ if (currentChild != nullptr && canBeTriggered (currentChild->item))\r
{\r
dismissMenu (¤tChild->item);\r
}\r
void PopupMenu::addItem (Item newItem)\r
{\r
// An ID of 0 is used as a return value to indicate that the user\r
- // didn't pick anything, so you shouldn't use it as the ID for an item..\r
+ // didn't pick anything, so you shouldn't use it as the ID for an item.\r
jassert (newItem.itemID != 0\r
|| newItem.isSeparator || newItem.isSectionHeader\r
|| newItem.subMenu != nullptr);\r
\r
void PopupMenu::addCustomItem (int itemResultID,\r
std::unique_ptr<CustomComponent> cc,\r
- std::unique_ptr<const PopupMenu> subMenu)\r
+ std::unique_ptr<const PopupMenu> subMenu,\r
+ const String& itemTitle)\r
{\r
Item i;\r
+ i.text = itemTitle;\r
i.itemID = itemResultID;\r
i.customComponent = cc.release();\r
i.subMenu.reset (createCopyIfNotNull (subMenu.get()));\r
+\r
+ // If this assertion is hit, this item will be visible to screen readers but with\r
+ // no name, which may be confusing to users.\r
+ // It's probably a good idea to add a title for this menu item that describes\r
+ // the meaning of the item, or the contents of the submenu, as appropriate.\r
+ // If you don't want this menu item to be press-able directly, pass "false" to the\r
+ // constructor of the CustomComponent.\r
+ jassert (! (HelperClasses::ItemComponent::isAccessibilityHandlerRequired (i) && itemTitle.isEmpty()));\r
+\r
addItem (std::move (i));\r
}\r
\r
Component& customComponent,\r
int idealWidth, int idealHeight,\r
bool triggerMenuItemAutomaticallyWhenClicked,\r
- std::unique_ptr<const PopupMenu> subMenu)\r
+ std::unique_ptr<const PopupMenu> subMenu,\r
+ const String& itemTitle)\r
{\r
auto comp = std::make_unique<HelperClasses::NormalComponentWrapper> (customComponent, idealWidth, idealHeight,\r
triggerMenuItemAutomaticallyWhenClicked);\r
- addCustomItem (itemResultID, std::move (comp), std::move (subMenu));\r
+ addCustomItem (itemResultID, std::move (comp), std::move (subMenu), itemTitle);\r
}\r
\r
void PopupMenu::addSubMenu (String subMenuName, PopupMenu subMenu, bool isActive)\r
}\r
\r
//==============================================================================\r
+PopupMenu::CustomComponent::CustomComponent() : CustomComponent (true) {}\r
+\r
PopupMenu::CustomComponent::CustomComponent (bool autoTrigger)\r
: triggeredAutomatically (autoTrigger)\r
{\r
}\r
\r
-PopupMenu::CustomComponent::~CustomComponent()\r
-{\r
-}\r
-\r
void PopupMenu::CustomComponent::setHighlighted (bool shouldBeHighlighted)\r
{\r
isHighlighted = shouldBeHighlighted;\r
m.addItem (1, "item 1");\r
m.addItem (2, "item 2");\r
\r
- const int result = m.show();\r
-\r
- if (result == 0)\r
- {\r
- // user dismissed the menu without picking anything\r
- }\r
- else if (result == 1)\r
- {\r
- // user picked item 1\r
- }\r
- else if (result == 2)\r
- {\r
- // user picked item 2\r
- }\r
+ m.showMenuAsync (PopupMenu::Options(),\r
+ [] (int result)\r
+ {\r
+ if (result == 0)\r
+ {\r
+ // user dismissed the menu without picking anything\r
+ }\r
+ else if (result == 1)\r
+ {\r
+ // user picked item 1\r
+ }\r
+ else if (result == 2)\r
+ {\r
+ // user picked item 2\r
+ }\r
+ });\r
}\r
@endcode\r
\r
mainMenu.addItem (3, "item 3");\r
mainMenu.addSubMenu ("other choices", subMenu);\r
\r
- const int result = m.show();\r
-\r
- ...etc\r
+ m.showMenuAsync (...);\r
}\r
@endcode\r
\r
\r
Note that native macOS menus do not support custom components.\r
\r
+ itemTitle will be used as the fallback text for this item, and will\r
+ be exposed to screen reader clients.\r
+\r
@see CustomComponent\r
*/\r
void addCustomItem (int itemResultID,\r
std::unique_ptr<CustomComponent> customComponent,\r
- std::unique_ptr<const PopupMenu> optionalSubMenu = nullptr);\r
+ std::unique_ptr<const PopupMenu> optionalSubMenu = nullptr,\r
+ const String& itemTitle = {});\r
\r
/** Appends a custom menu item that can't be used to trigger a result.\r
\r
menu ID specified in itemResultID. If this is false, the menu item can't\r
be triggered, so itemResultID is not used.\r
\r
+ itemTitle will be used as the fallback text for this item, and will\r
+ be exposed to screen reader clients.\r
+\r
Note that native macOS menus do not support custom components.\r
*/\r
void addCustomItem (int itemResultID,\r
int idealWidth,\r
int idealHeight,\r
bool triggerMenuItemAutomaticallyWhenClicked,\r
- std::unique_ptr<const PopupMenu> optionalSubMenu = nullptr);\r
+ std::unique_ptr<const PopupMenu> optionalSubMenu = nullptr,\r
+ const String& itemTitle = {});\r
\r
/** Appends a sub-menu.\r
\r
public SingleThreadedReferenceCountedObject\r
{\r
public:\r
+ /** Creates a custom item that is triggered automatically. */\r
+ CustomComponent();\r
+\r
/** Creates a custom item.\r
+\r
If isTriggeredAutomatically is true, then the menu will automatically detect\r
a mouse-click on this component and use that to invoke the menu item. If it's\r
false, then it's up to your class to manually trigger the item when it wants to.\r
- */\r
- CustomComponent (bool isTriggeredAutomatically = true);\r
\r
- /** Destructor. */\r
- ~CustomComponent() override;\r
+ If isTriggeredAutomatically is true, then an accessibility handler 'wrapper'\r
+ will be created for the item that allows pressing, focusing, and toggling.\r
+ If isTriggeredAutomatically is false, and the item has no submenu, then\r
+ no accessibility wrapper will be created and your component must be\r
+ independently accessible.\r
+ */\r
+ explicit CustomComponent (bool isTriggeredAutomatically);\r
\r
/** Returns a rectangle with the size that this component would like to have.\r
\r
/** Attaches the DropShadower to the component you want to shadow. */\r
void setOwner (Component* componentToFollow);\r
\r
-\r
private:\r
//==============================================================================\r
- class ShadowWindow;\r
-\r
- WeakReference<Component> owner;\r
- OwnedArray<Component> shadowWindows;\r
- DropShadow shadow;\r
- bool reentrant = false;\r
- WeakReference<Component> lastParentComp;\r
-\r
void componentMovedOrResized (Component&, bool, bool) override;\r
void componentBroughtToFront (Component&) override;\r
void componentChildrenChanged (Component&) override;\r
void updateParent();\r
void updateShadows();\r
\r
+ class ShadowWindow;\r
+\r
+ WeakReference<Component> owner;\r
+ OwnedArray<Component> shadowWindows;\r
+ DropShadow shadow;\r
+ bool reentrant = false;\r
+ WeakReference<Component> lastParentComp;\r
+\r
class ParentVisibilityChangedListener;\r
std::unique_ptr<ParentVisibilityChangedListener> visibilityChangedListener;\r
\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2020 - Raw Material Software Limited\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 6 End-User License\r
+ Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+ End User License Agreement: www.juce.com/juce-6-licence\r
+ Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+//==============================================================================\r
+struct OutlineWindowComponent : public Component\r
+{\r
+ OutlineWindowComponent (Component* c, FocusOutline::OutlineWindowProperties& p)\r
+ : target (c), props (p)\r
+ {\r
+ setVisible (true);\r
+ setInterceptsMouseClicks (false, false);\r
+\r
+ if (target->isOnDesktop())\r
+ {\r
+ setSize (1, 1);\r
+ addToDesktop (ComponentPeer::windowIgnoresMouseClicks\r
+ | ComponentPeer::windowIsTemporary\r
+ | ComponentPeer::windowIgnoresKeyPresses);\r
+ }\r
+ else if (auto* parent = target->getParentComponent())\r
+ {\r
+ auto targetIndex = parent->getIndexOfChildComponent (target);\r
+ parent->addChildComponent (this, targetIndex + 1);\r
+ }\r
+ }\r
+\r
+ void paint (Graphics& g) override\r
+ {\r
+ if (target != nullptr)\r
+ props.drawOutline (g, getWidth(), getHeight());\r
+ }\r
+\r
+ void resized() override\r
+ {\r
+ repaint();\r
+ }\r
+\r
+ float getDesktopScaleFactor() const override\r
+ {\r
+ return target != nullptr ? target->getDesktopScaleFactor()\r
+ : Component::getDesktopScaleFactor();\r
+ }\r
+\r
+private:\r
+ WeakReference<Component> target;\r
+ FocusOutline::OutlineWindowProperties& props;\r
+\r
+ JUCE_DECLARE_NON_COPYABLE (OutlineWindowComponent)\r
+};\r
+\r
+//==============================================================================\r
+FocusOutline::FocusOutline (std::unique_ptr<OutlineWindowProperties> props)\r
+ : properties (std::move (props))\r
+{\r
+}\r
+\r
+FocusOutline::~FocusOutline()\r
+{\r
+ if (owner != nullptr)\r
+ owner->removeComponentListener (this);\r
+\r
+ if (lastParentComp != nullptr)\r
+ lastParentComp->removeComponentListener (this);\r
+}\r
+\r
+void FocusOutline::setOwner (Component* componentToFollow)\r
+{\r
+ if (componentToFollow != owner)\r
+ {\r
+ if (owner != nullptr)\r
+ owner->removeComponentListener (this);\r
+\r
+ owner = componentToFollow;\r
+\r
+ if (owner != nullptr)\r
+ owner->addComponentListener (this);\r
+\r
+ updateParent();\r
+ updateOutlineWindow();\r
+ }\r
+}\r
+\r
+void FocusOutline::componentMovedOrResized (Component& c, bool, bool)\r
+{\r
+ if (owner == &c)\r
+ updateOutlineWindow();\r
+}\r
+\r
+void FocusOutline::componentBroughtToFront (Component& c)\r
+{\r
+ if (owner == &c)\r
+ updateOutlineWindow();\r
+}\r
+\r
+void FocusOutline::componentParentHierarchyChanged (Component& c)\r
+{\r
+ if (owner == &c)\r
+ {\r
+ updateParent();\r
+ updateOutlineWindow();\r
+ }\r
+}\r
+\r
+void FocusOutline::componentVisibilityChanged (Component& c)\r
+{\r
+ if (owner == &c)\r
+ updateOutlineWindow();\r
+}\r
+\r
+void FocusOutline::updateParent()\r
+{\r
+ lastParentComp = (owner != nullptr ? owner->getParentComponent()\r
+ : nullptr);\r
+}\r
+\r
+void FocusOutline::updateOutlineWindow()\r
+{\r
+ if (reentrant)\r
+ return;\r
+\r
+ const ScopedValueSetter<bool> setter (reentrant, true);\r
+\r
+ if (owner == nullptr)\r
+ {\r
+ outlineWindow = nullptr;\r
+ return;\r
+ }\r
+\r
+ if (owner->isShowing()\r
+ && owner->getWidth() > 0 && owner->getHeight() > 0)\r
+ {\r
+ if (outlineWindow == nullptr)\r
+ outlineWindow = std::make_unique<OutlineWindowComponent> (owner, *properties);\r
+\r
+ WeakReference<Component> deletionChecker (outlineWindow.get());\r
+\r
+ outlineWindow->setAlwaysOnTop (owner->isAlwaysOnTop());\r
+\r
+ if (deletionChecker == nullptr)\r
+ return;\r
+\r
+ const auto windowBounds = [this]\r
+ {\r
+ const auto bounds = properties->getOutlineBounds (*owner);\r
+\r
+ if (lastParentComp != nullptr)\r
+ return lastParentComp->getLocalArea (nullptr, bounds);\r
+\r
+ return bounds;\r
+ }();\r
+\r
+ outlineWindow->setBounds (windowBounds);\r
+ }\r
+ else\r
+ {\r
+ outlineWindow = nullptr;\r
+ }\r
+}\r
+\r
+} // namespace juce\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2020 - Raw Material Software Limited\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 6 End-User License\r
+ Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+ End User License Agreement: www.juce.com/juce-6-licence\r
+ Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+/**\r
+ Adds a focus outline to a component.\r
+\r
+ This object creates and manages a component that sits on top of a target\r
+ component. It will track the position of the target component and will be\r
+ brought to the front with the tracked component.\r
+\r
+ Use the Component::setHasFocusOutline() method to indicate that a component\r
+ should have a focus outline drawn around it, and when it receives keyboard\r
+ focus one of these objects will be created using the\r
+ LookAndFeel::createFocusOutlineForComponent() method. You can override this\r
+ method in your own LookAndFeel classes to draw a custom outline if required.\r
+\r
+ @tags{GUI}\r
+*/\r
+class JUCE_API FocusOutline : private ComponentListener\r
+{\r
+public:\r
+ //==============================================================================\r
+ /** Defines the focus outline window properties.\r
+\r
+ Pass an instance of one of these to the FocusOutline constructor to control\r
+ the bounds for the outline window and how it is drawn.\r
+ */\r
+ struct JUCE_API OutlineWindowProperties\r
+ {\r
+ virtual ~OutlineWindowProperties() = default;\r
+\r
+ /** Return the bounds for the outline window in screen coordinates. */\r
+ virtual Rectangle<int> getOutlineBounds (Component& focusedComponent) = 0;\r
+\r
+ /** This method will be called to draw the focus outline. */\r
+ virtual void drawOutline (Graphics&, int width, int height) = 0;\r
+ };\r
+\r
+ //==============================================================================\r
+ /** Creates a FocusOutline.\r
+\r
+ Call setOwner to attach it to a component.\r
+ */\r
+ FocusOutline (std::unique_ptr<OutlineWindowProperties> props);\r
+\r
+ /** Destructor. */\r
+ ~FocusOutline() override;\r
+\r
+ /** Attaches the outline to a component. */\r
+ void setOwner (Component* componentToFollow);\r
+\r
+private:\r
+ //==============================================================================\r
+ void componentMovedOrResized (Component&, bool, bool) override;\r
+ void componentBroughtToFront (Component&) override;\r
+ void componentParentHierarchyChanged (Component&) override;\r
+ void componentVisibilityChanged (Component&) override;\r
+\r
+ void updateOutlineWindow();\r
+ void updateParent();\r
+\r
+ //==============================================================================\r
+ std::unique_ptr<OutlineWindowProperties> properties;\r
+\r
+ WeakReference<Component> owner;\r
+ std::unique_ptr<Component> outlineWindow;\r
+ WeakReference<Component> lastParentComp;\r
+\r
+ bool reentrant = false;\r
+\r
+ //==============================================================================\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FocusOutline)\r
+};\r
+\r
+} // namespace juce\r
standard (false)\r
{\r
// your hotspot needs to be within the bounds of the image!\r
- jassert (image.getImage().getBounds().contains (hotSpot));\r
+ jassert (image.getScaledBounds().toNearestInt().contains (hotSpot));\r
}\r
\r
static std::shared_ptr<SharedCursorHandle> createStandard (const MouseCursor::StandardCursorType type)\r
isSelected ? ACTION_CLEAR_SELECTION : ACTION_SELECT);\r
}\r
\r
- if (accessibilityHandler.getActions().contains (AccessibilityActionType::press))\r
+ if ((accessibilityHandler.getCurrentState().isCheckable() && accessibilityHandler.getActions().contains (AccessibilityActionType::toggle))\r
+ || accessibilityHandler.getActions().contains (AccessibilityActionType::press))\r
{\r
env->CallVoidMethod (info,\r
AndroidAccessibilityNodeInfo.setClickable,\r
\r
case ACTION_CLICK:\r
{\r
- if (accessibilityHandler.getActions().invoke (AccessibilityActionType::press))\r
+ if ((accessibilityHandler.getCurrentState().isCheckable() && accessibilityHandler.getActions().invoke (AccessibilityActionType::toggle))\r
+ || accessibilityHandler.getActions().invoke (AccessibilityActionType::press))\r
{\r
sendAccessibilityEventImpl (accessibilityHandler, TYPE_VIEW_CLICKED, 0);\r
return true;\r
{\r
if (auto* handler = getHandler (self))\r
{\r
- // occasionaly VoiceOver sends accessibilityActivate to the wrong element, so we first query\r
+ // Occasionally VoiceOver sends accessibilityActivate to the wrong element, so we first query\r
// which element it thinks has focus and forward the event on to that element if it differs\r
id focusedElement = UIAccessibilityFocusedElement (UIAccessibilityNotificationVoiceOverIdentifier);\r
\r
- if (! [(id) handler->getNativeImplementation() isEqual: focusedElement])\r
+ if (focusedElement != nullptr && ! [(id) handler->getNativeImplementation() isEqual: focusedElement])\r
return [focusedElement accessibilityActivate];\r
\r
if (handler->hasFocus (false))\r
continue;\r
\r
if (selector == @selector (accessibilityPerformPress))\r
- return handler->getActions().contains (AccessibilityActionType::press);\r
+ return (handler->getCurrentState().isCheckable() && handler->getActions().contains (AccessibilityActionType::toggle))\r
+ || handler->getActions().contains (AccessibilityActionType::press);\r
\r
if (selector == @selector (accessibilityPerformShowMenu))\r
return handler->getActions().contains (AccessibilityActionType::showMenu);\r
\r
static BOOL accessibilityPerformPress (id self, SEL)\r
{\r
+ if (auto* handler = getHandler (self))\r
+ if (handler->getCurrentState().isCheckable() && handler->getActions().invoke (AccessibilityActionType::toggle))\r
+ return YES;\r
+\r
return performActionIfSupported (self, AccessibilityActionType::press);\r
}\r
\r
|| eventType == InternalAccessibilityEvent::elementDestroyed)\r
{\r
if (auto* parent = handler.getParent())\r
- sendAccessibilityAutomationEvent (*parent, UIA_LayoutInvalidatedEventId);\r
+ sendAccessibilityAutomationEvent (*parent, ComTypes::UIA_LayoutInvalidatedEventId);\r
\r
return;\r
}\r
{\r
switch (eventType)\r
{\r
- case InternalAccessibilityEvent::focusChanged: return UIA_AutomationFocusChangedEventId;\r
- case InternalAccessibilityEvent::windowOpened: return UIA_Window_WindowOpenedEventId;\r
- case InternalAccessibilityEvent::windowClosed: return UIA_Window_WindowClosedEventId;\r
+ case InternalAccessibilityEvent::focusChanged: return ComTypes::UIA_AutomationFocusChangedEventId;\r
+ case InternalAccessibilityEvent::windowOpened: return ComTypes::UIA_Window_WindowOpenedEventId;\r
+ case InternalAccessibilityEvent::windowClosed: return ComTypes::UIA_Window_WindowClosedEventId;\r
case InternalAccessibilityEvent::elementCreated:\r
case InternalAccessibilityEvent::elementDestroyed:\r
case InternalAccessibilityEvent::elementMovedOrResized: break;\r
{\r
switch (eventType)\r
{\r
- case AccessibilityEvent::textSelectionChanged: return UIA_Text_TextSelectionChangedEventId;\r
- case AccessibilityEvent::textChanged: return UIA_Text_TextChangedEventId;\r
- case AccessibilityEvent::structureChanged: return UIA_StructureChangedEventId;\r
- case AccessibilityEvent::rowSelectionChanged: return UIA_SelectionItem_ElementSelectedEventId;\r
+ case AccessibilityEvent::textSelectionChanged: return ComTypes::UIA_Text_TextSelectionChangedEventId;\r
+ case AccessibilityEvent::textChanged: return ComTypes::UIA_Text_TextChangedEventId;\r
+ case AccessibilityEvent::structureChanged: return ComTypes::UIA_StructureChangedEventId;\r
+ case AccessibilityEvent::rowSelectionChanged: return ComTypes::UIA_SelectionItem_ElementSelectedEventId;\r
case AccessibilityEvent::titleChanged:\r
case AccessibilityEvent::valueChanged: break;\r
}\r
{\r
SpVoiceWrapper()\r
{\r
- auto hr = voice.CoCreateInstance (CLSID_SpVoice);\r
+ auto hr = voice.CoCreateInstance (ComTypes::CLSID_SpVoice);\r
\r
jassertquiet (SUCCEEDED (hr));\r
}\r
case AccessibilityRole::popupMenu:\r
case AccessibilityRole::dialogWindow:\r
case AccessibilityRole::splashScreen:\r
- case AccessibilityRole::window: return UIA_WindowControlTypeId;\r
+ case AccessibilityRole::window: return ComTypes::UIA_WindowControlTypeId;\r
\r
case AccessibilityRole::label:\r
- case AccessibilityRole::staticText: return UIA_TextControlTypeId;\r
+ case AccessibilityRole::staticText: return ComTypes::UIA_TextControlTypeId;\r
\r
case AccessibilityRole::column:\r
- case AccessibilityRole::row: return UIA_HeaderItemControlTypeId;\r
-\r
- case AccessibilityRole::button: return UIA_ButtonControlTypeId;\r
- case AccessibilityRole::toggleButton: return UIA_CheckBoxControlTypeId;\r
- case AccessibilityRole::radioButton: return UIA_RadioButtonControlTypeId;\r
- case AccessibilityRole::comboBox: return UIA_ComboBoxControlTypeId;\r
- case AccessibilityRole::image: return UIA_ImageControlTypeId;\r
- case AccessibilityRole::slider: return UIA_SliderControlTypeId;\r
- case AccessibilityRole::editableText: return UIA_EditControlTypeId;\r
- case AccessibilityRole::menuItem: return UIA_MenuItemControlTypeId;\r
- case AccessibilityRole::menuBar: return UIA_MenuBarControlTypeId;\r
- case AccessibilityRole::table: return UIA_TableControlTypeId;\r
- case AccessibilityRole::tableHeader: return UIA_HeaderControlTypeId;\r
- case AccessibilityRole::cell: return UIA_DataItemControlTypeId;\r
- case AccessibilityRole::hyperlink: return UIA_HyperlinkControlTypeId;\r
- case AccessibilityRole::list: return UIA_ListControlTypeId;\r
- case AccessibilityRole::listItem: return UIA_ListItemControlTypeId;\r
- case AccessibilityRole::tree: return UIA_TreeControlTypeId;\r
- case AccessibilityRole::treeItem: return UIA_TreeItemControlTypeId;\r
- case AccessibilityRole::progressBar: return UIA_ProgressBarControlTypeId;\r
- case AccessibilityRole::group: return UIA_GroupControlTypeId;\r
- case AccessibilityRole::scrollBar: return UIA_ScrollBarControlTypeId;\r
- case AccessibilityRole::tooltip: return UIA_ToolTipControlTypeId;\r
+ case AccessibilityRole::row: return ComTypes::UIA_HeaderItemControlTypeId;\r
+\r
+ case AccessibilityRole::button: return ComTypes::UIA_ButtonControlTypeId;\r
+ case AccessibilityRole::toggleButton: return ComTypes::UIA_CheckBoxControlTypeId;\r
+ case AccessibilityRole::radioButton: return ComTypes::UIA_RadioButtonControlTypeId;\r
+ case AccessibilityRole::comboBox: return ComTypes::UIA_ComboBoxControlTypeId;\r
+ case AccessibilityRole::image: return ComTypes::UIA_ImageControlTypeId;\r
+ case AccessibilityRole::slider: return ComTypes::UIA_SliderControlTypeId;\r
+ case AccessibilityRole::editableText: return ComTypes::UIA_EditControlTypeId;\r
+ case AccessibilityRole::menuItem: return ComTypes::UIA_MenuItemControlTypeId;\r
+ case AccessibilityRole::menuBar: return ComTypes::UIA_MenuBarControlTypeId;\r
+ case AccessibilityRole::table: return ComTypes::UIA_TableControlTypeId;\r
+ case AccessibilityRole::tableHeader: return ComTypes::UIA_HeaderControlTypeId;\r
+ case AccessibilityRole::cell: return ComTypes::UIA_DataItemControlTypeId;\r
+ case AccessibilityRole::hyperlink: return ComTypes::UIA_HyperlinkControlTypeId;\r
+ case AccessibilityRole::list: return ComTypes::UIA_ListControlTypeId;\r
+ case AccessibilityRole::listItem: return ComTypes::UIA_ListItemControlTypeId;\r
+ case AccessibilityRole::tree: return ComTypes::UIA_TreeControlTypeId;\r
+ case AccessibilityRole::treeItem: return ComTypes::UIA_TreeItemControlTypeId;\r
+ case AccessibilityRole::progressBar: return ComTypes::UIA_ProgressBarControlTypeId;\r
+ case AccessibilityRole::group: return ComTypes::UIA_GroupControlTypeId;\r
+ case AccessibilityRole::scrollBar: return ComTypes::UIA_ScrollBarControlTypeId;\r
+ case AccessibilityRole::tooltip: return ComTypes::UIA_ToolTipControlTypeId;\r
\r
case AccessibilityRole::ignored:\r
case AccessibilityRole::unspecified: break;\r
};\r
\r
- return UIA_CustomControlTypeId;\r
+ return ComTypes::UIA_CustomControlTypeId;\r
}\r
\r
//==============================================================================\r
if (! isElementValid())\r
return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;\r
\r
- if ((refId == __uuidof (IRawElementProviderFragmentRoot) && ! isFragmentRoot()))\r
+ if ((refId == __uuidof (ComTypes::IRawElementProviderFragmentRoot) && ! isFragmentRoot()))\r
return E_NOINTERFACE;\r
\r
return ComBaseClassHelper::QueryInterface (refId, result);\r
if (options == nullptr)\r
return E_INVALIDARG;\r
\r
- *options = ProviderOptions_ServerSideProvider | ProviderOptions_UseComThreading;\r
+ *options = (ProviderOptions) (ProviderOptions_ServerSideProvider | ProviderOptions_UseComThreading);\r
return S_OK;\r
}\r
\r
\r
switch (pId)\r
{\r
- case UIA_WindowPatternId:\r
+ case ComTypes::UIA_WindowPatternId:\r
{\r
if (fragmentRoot)\r
return new UIAWindowProvider (this);\r
\r
break;\r
}\r
- case UIA_TransformPatternId:\r
+ case ComTypes::UIA_TransformPatternId:\r
{\r
if (fragmentRoot)\r
return new UIATransformProvider (this);\r
\r
break;\r
}\r
- case UIA_TextPatternId:\r
- case UIA_TextPattern2Id:\r
+ case ComTypes::UIA_TextPatternId:\r
+ case ComTypes::UIA_TextPattern2Id:\r
{\r
if (accessibilityHandler.getTextInterface() != nullptr)\r
return new UIATextProvider (this);\r
\r
break;\r
}\r
- case UIA_ValuePatternId:\r
+ case ComTypes::UIA_ValuePatternId:\r
{\r
if (accessibilityHandler.getValueInterface() != nullptr)\r
return new UIAValueProvider (this);\r
\r
break;\r
}\r
- case UIA_RangeValuePatternId:\r
+ case ComTypes::UIA_RangeValuePatternId:\r
{\r
if (accessibilityHandler.getValueInterface() != nullptr\r
&& accessibilityHandler.getValueInterface()->getRange().isValid())\r
\r
break;\r
}\r
- case UIA_TogglePatternId:\r
+ case ComTypes::UIA_TogglePatternId:\r
{\r
- if (accessibilityHandler.getActions().contains (AccessibilityActionType::toggle)\r
- && accessibilityHandler.getCurrentState().isCheckable())\r
+ if (accessibilityHandler.getCurrentState().isCheckable()\r
+ && (accessibilityHandler.getActions().contains (AccessibilityActionType::toggle)\r
+ || accessibilityHandler.getActions().contains (AccessibilityActionType::press)))\r
{\r
return new UIAToggleProvider (this);\r
}\r
\r
break;\r
}\r
- case UIA_SelectionPatternId:\r
+ case ComTypes::UIA_SelectionPatternId:\r
{\r
if (role == AccessibilityRole::list\r
|| role == AccessibilityRole::popupMenu\r
\r
break;\r
}\r
- case UIA_SelectionItemPatternId:\r
+ case ComTypes::UIA_SelectionItemPatternId:\r
{\r
auto state = accessibilityHandler.getCurrentState();\r
\r
\r
break;\r
}\r
- case UIA_GridPatternId:\r
+ case ComTypes::UIA_GridPatternId:\r
{\r
if (accessibilityHandler.getTableInterface() != nullptr)\r
return new UIAGridProvider (this);\r
\r
break;\r
}\r
- case UIA_GridItemPatternId:\r
+ case ComTypes::UIA_GridItemPatternId:\r
{\r
if (accessibilityHandler.getCellInterface() != nullptr)\r
return new UIAGridItemProvider (this);\r
\r
break;\r
}\r
- case UIA_InvokePatternId:\r
+ case ComTypes::UIA_InvokePatternId:\r
{\r
if (accessibilityHandler.getActions().contains (AccessibilityActionType::press))\r
return new UIAInvokeProvider (this);\r
\r
break;\r
}\r
- case UIA_ExpandCollapsePatternId:\r
+ case ComTypes::UIA_ExpandCollapsePatternId:\r
{\r
if (accessibilityHandler.getActions().contains (AccessibilityActionType::showMenu)\r
&& accessibilityHandler.getCurrentState().isExpandable())\r
VariantHelpers::setBool (textInterface->isDisplayingProtectedText(), pRetVal);\r
\r
break;\r
- case UIA_IsPeripheralPropertyId:\r
+ case ComTypes::UIA_IsPeripheralPropertyId:\r
VariantHelpers::setBool (role == AccessibilityRole::tooltip\r
|| role == AccessibilityRole::popupMenu\r
|| role == AccessibilityRole::splashScreen,\r
}\r
\r
//==============================================================================\r
-JUCE_COMRESULT AccessibilityNativeHandle::Navigate (NavigateDirection direction, IRawElementProviderFragment** pRetVal)\r
+JUCE_COMRESULT AccessibilityNativeHandle::Navigate (ComTypes::NavigateDirection direction, ComTypes::IRawElementProviderFragment** pRetVal)\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]\r
{\r
auto* handler = [&]() -> AccessibilityHandler*\r
{\r
- if (direction == NavigateDirection_Parent)\r
+ if (direction == ComTypes::NavigateDirection_Parent)\r
return accessibilityHandler.getParent();\r
\r
- if (direction == NavigateDirection_FirstChild\r
- || direction == NavigateDirection_LastChild)\r
+ if (direction == ComTypes::NavigateDirection_FirstChild\r
+ || direction == ComTypes::NavigateDirection_LastChild)\r
{\r
auto children = accessibilityHandler.getChildren();\r
\r
return children.empty() ? nullptr\r
- : (direction == NavigateDirection_FirstChild ? children.front()\r
- : children.back());\r
+ : (direction == ComTypes::NavigateDirection_FirstChild ? children.front()\r
+ : children.back());\r
}\r
\r
- if (direction == NavigateDirection_NextSibling\r
- || direction == NavigateDirection_PreviousSibling)\r
+ if (direction == ComTypes::NavigateDirection_NextSibling\r
+ || direction == ComTypes::NavigateDirection_PreviousSibling)\r
{\r
if (auto* parent = accessibilityHandler.getParent())\r
{\r
if (iter == siblings.end())\r
return nullptr;\r
\r
- if (direction == NavigateDirection_NextSibling && iter != std::prev (siblings.cend()))\r
+ if (direction == ComTypes::NavigateDirection_NextSibling && iter != std::prev (siblings.cend()))\r
return *std::next (iter);\r
\r
- if (direction == NavigateDirection_PreviousSibling && iter != siblings.cbegin())\r
+ if (direction == ComTypes::NavigateDirection_PreviousSibling && iter != siblings.cbegin())\r
return *std::prev (iter);\r
}\r
}\r
});\r
}\r
\r
-JUCE_COMRESULT AccessibilityNativeHandle::get_BoundingRectangle (UiaRect* pRetVal)\r
+JUCE_COMRESULT AccessibilityNativeHandle::get_BoundingRectangle (ComTypes::UiaRect* pRetVal)\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]\r
{\r
return S_OK;\r
}\r
\r
-JUCE_COMRESULT AccessibilityNativeHandle::get_FragmentRoot (IRawElementProviderFragmentRoot** pRetVal)\r
+JUCE_COMRESULT AccessibilityNativeHandle::get_FragmentRoot (ComTypes::IRawElementProviderFragmentRoot** pRetVal)\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT\r
{\r
}\r
\r
//==============================================================================\r
-JUCE_COMRESULT AccessibilityNativeHandle::ElementProviderFromPoint (double x, double y, IRawElementProviderFragment** pRetVal)\r
+JUCE_COMRESULT AccessibilityNativeHandle::ElementProviderFromPoint (double x, double y, ComTypes::IRawElementProviderFragment** pRetVal)\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]\r
{\r
});\r
}\r
\r
-JUCE_COMRESULT AccessibilityNativeHandle::GetFocus (IRawElementProviderFragment** pRetVal)\r
+JUCE_COMRESULT AccessibilityNativeHandle::GetFocus (ComTypes::IRawElementProviderFragment** pRetVal)\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]\r
{\r
#define UIA_IsDialogPropertyId 30174\r
\r
class AccessibilityNativeHandle : public ComBaseClassHelper<IRawElementProviderSimple,\r
- IRawElementProviderFragment,\r
- IRawElementProviderFragmentRoot>\r
+ ComTypes::IRawElementProviderFragment,\r
+ ComTypes::IRawElementProviderFragmentRoot>\r
{\r
public:\r
explicit AccessibilityNativeHandle (AccessibilityHandler& handler);\r
JUCE_COMRESULT GetPatternProvider (PATTERNID pId, IUnknown** provider) override;\r
JUCE_COMRESULT GetPropertyValue (PROPERTYID propertyId, VARIANT* pRetVal) override;\r
\r
- JUCE_COMRESULT Navigate (NavigateDirection direction, IRawElementProviderFragment** pRetVal) override;\r
+ JUCE_COMRESULT Navigate (ComTypes::NavigateDirection direction, ComTypes::IRawElementProviderFragment** pRetVal) override;\r
JUCE_COMRESULT GetRuntimeId (SAFEARRAY** pRetVal) override;\r
- JUCE_COMRESULT get_BoundingRectangle (UiaRect* pRetVal) override;\r
+ JUCE_COMRESULT get_BoundingRectangle (ComTypes::UiaRect* pRetVal) override;\r
JUCE_COMRESULT GetEmbeddedFragmentRoots (SAFEARRAY** pRetVal) override;\r
JUCE_COMRESULT SetFocus() override;\r
- JUCE_COMRESULT get_FragmentRoot (IRawElementProviderFragmentRoot** pRetVal) override;\r
+ JUCE_COMRESULT get_FragmentRoot (ComTypes::IRawElementProviderFragmentRoot** pRetVal) override;\r
\r
- JUCE_COMRESULT ElementProviderFromPoint (double x, double y, IRawElementProviderFragment** pRetVal) override;\r
- JUCE_COMRESULT GetFocus (IRawElementProviderFragment** pRetVal) override;\r
+ JUCE_COMRESULT ElementProviderFromPoint (double x, double y, ComTypes::IRawElementProviderFragment** pRetVal) override;\r
+ JUCE_COMRESULT GetFocus (ComTypes::IRawElementProviderFragment** pRetVal) override;\r
\r
private:\r
//==============================================================================\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2020 - Raw Material Software Limited\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 6 End-User License\r
+ Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+ End User License Agreement: www.juce.com/juce-6-licence\r
+ Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace ComTypes\r
+{\r
+\r
+/*\r
+ These interfaces would normally be included in the system platform headers.\r
+ However, those headers are likely to be incomplete when building with\r
+ MinGW. In order to allow building accessible applications under MinGW,\r
+ we reproduce all necessary definitions here.\r
+*/\r
+\r
+struct UiaPoint\r
+{\r
+ double x;\r
+ double y;\r
+};\r
+\r
+struct UiaRect\r
+{\r
+ double left;\r
+ double top;\r
+ double width;\r
+ double height;\r
+};\r
+\r
+enum NavigateDirection\r
+{\r
+ NavigateDirection_Parent = 0,\r
+ NavigateDirection_NextSibling = 1,\r
+ NavigateDirection_PreviousSibling = 2,\r
+ NavigateDirection_FirstChild = 3,\r
+ NavigateDirection_LastChild = 4\r
+};\r
+\r
+enum ExpandCollapseState\r
+{\r
+ ExpandCollapseState_Collapsed = 0,\r
+ ExpandCollapseState_Expanded = 1,\r
+ ExpandCollapseState_PartiallyExpanded = 2,\r
+ ExpandCollapseState_LeafNode = 3\r
+};\r
+\r
+enum TextPatternRangeEndpoint\r
+{\r
+ TextPatternRangeEndpoint_Start = 0,\r
+ TextPatternRangeEndpoint_End = 1\r
+};\r
+\r
+enum TextUnit\r
+{\r
+ TextUnit_Character = 0,\r
+ TextUnit_Format = 1,\r
+ TextUnit_Word = 2,\r
+ TextUnit_Line = 3,\r
+ TextUnit_Paragraph = 4,\r
+ TextUnit_Page = 5,\r
+ TextUnit_Document = 6\r
+};\r
+\r
+enum SupportedTextSelection\r
+{\r
+ SupportedTextSelection_None = 0,\r
+ SupportedTextSelection_Single = 1,\r
+ SupportedTextSelection_Multiple = 2\r
+};\r
+\r
+enum CaretPosition\r
+{\r
+ CaretPosition_Unknown = 0,\r
+ CaretPosition_EndOfLine = 1,\r
+ CaretPosition_BeginningOfLine = 2\r
+};\r
+\r
+enum ToggleState\r
+{\r
+ ToggleState_Off = 0,\r
+ ToggleState_On = 1,\r
+ ToggleState_Indeterminate = 2\r
+};\r
+\r
+enum WindowVisualState\r
+{\r
+ WindowVisualState_Normal = 0,\r
+ WindowVisualState_Maximized = 1,\r
+ WindowVisualState_Minimized = 2\r
+};\r
+\r
+enum WindowInteractionState\r
+{\r
+ WindowInteractionState_Running = 0,\r
+ WindowInteractionState_Closing = 1,\r
+ WindowInteractionState_ReadyForUserInteraction = 2,\r
+ WindowInteractionState_BlockedByModalWindow = 3,\r
+ WindowInteractionState_NotResponding = 4\r
+};\r
+\r
+const long UIA_InvokePatternId = 10000;\r
+const long UIA_SelectionPatternId = 10001;\r
+const long UIA_ValuePatternId = 10002;\r
+const long UIA_RangeValuePatternId = 10003;\r
+const long UIA_ExpandCollapsePatternId = 10005;\r
+const long UIA_GridPatternId = 10006;\r
+const long UIA_GridItemPatternId = 10007;\r
+const long UIA_WindowPatternId = 10009;\r
+const long UIA_SelectionItemPatternId = 10010;\r
+const long UIA_TextPatternId = 10014;\r
+const long UIA_TogglePatternId = 10015;\r
+const long UIA_TransformPatternId = 10016;\r
+const long UIA_TextPattern2Id = 10024;\r
+const long UIA_StructureChangedEventId = 20002;\r
+const long UIA_MenuOpenedEventId = 20003;\r
+const long UIA_AutomationFocusChangedEventId = 20005;\r
+const long UIA_MenuClosedEventId = 20007;\r
+const long UIA_LayoutInvalidatedEventId = 20008;\r
+const long UIA_Invoke_InvokedEventId = 20009;\r
+const long UIA_SelectionItem_ElementSelectedEventId = 20012;\r
+const long UIA_Text_TextSelectionChangedEventId = 20014;\r
+const long UIA_Text_TextChangedEventId = 20015;\r
+const long UIA_Window_WindowOpenedEventId = 20016;\r
+const long UIA_Window_WindowClosedEventId = 20017;\r
+const long UIA_IsPeripheralPropertyId = 30150;\r
+const long UIA_IsReadOnlyAttributeId = 40015;\r
+const long UIA_CaretPositionAttributeId = 40038;\r
+const long UIA_ButtonControlTypeId = 50000;\r
+const long UIA_CheckBoxControlTypeId = 50002;\r
+const long UIA_ComboBoxControlTypeId = 50003;\r
+const long UIA_EditControlTypeId = 50004;\r
+const long UIA_HyperlinkControlTypeId = 50005;\r
+const long UIA_ImageControlTypeId = 50006;\r
+const long UIA_ListItemControlTypeId = 50007;\r
+const long UIA_ListControlTypeId = 50008;\r
+const long UIA_MenuBarControlTypeId = 50010;\r
+const long UIA_MenuItemControlTypeId = 50011;\r
+const long UIA_ProgressBarControlTypeId = 50012;\r
+const long UIA_RadioButtonControlTypeId = 50013;\r
+const long UIA_ScrollBarControlTypeId = 50014;\r
+const long UIA_SliderControlTypeId = 50015;\r
+const long UIA_TextControlTypeId = 50020;\r
+const long UIA_ToolTipControlTypeId = 50022;\r
+const long UIA_TreeControlTypeId = 50023;\r
+const long UIA_TreeItemControlTypeId = 50024;\r
+const long UIA_CustomControlTypeId = 50025;\r
+const long UIA_GroupControlTypeId = 50026;\r
+const long UIA_DataItemControlTypeId = 50029;\r
+const long UIA_WindowControlTypeId = 50032;\r
+const long UIA_HeaderControlTypeId = 50034;\r
+const long UIA_HeaderItemControlTypeId = 50035;\r
+const long UIA_TableControlTypeId = 50036;\r
+\r
+interface IRawElementProviderFragmentRoot;\r
+interface IRawElementProviderFragment;\r
+\r
+JUCE_COMCLASS (IRawElementProviderFragmentRoot, "620ce2a5-ab8f-40a9-86cb-de3c75599b58") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL ElementProviderFromPoint (double x, double y, __RPC__deref_out_opt IRawElementProviderFragment** pRetVal) = 0;\r
+ JUCE_COMCALL GetFocus (__RPC__deref_out_opt IRawElementProviderFragment * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IRawElementProviderFragment, "f7063da8-8359-439c-9297-bbc5299a7d87") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL Navigate (NavigateDirection direction, __RPC__deref_out_opt IRawElementProviderFragment** pRetVal) = 0;\r
+ JUCE_COMCALL GetRuntimeId (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+ JUCE_COMCALL get_BoundingRectangle (__RPC__out UiaRect * pRetVal) = 0;\r
+ JUCE_COMCALL GetEmbeddedFragmentRoots (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+ JUCE_COMCALL SetFocus() = 0;\r
+ JUCE_COMCALL get_FragmentRoot (__RPC__deref_out_opt IRawElementProviderFragmentRoot * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IExpandCollapseProvider, "d847d3a5-cab0-4a98-8c32-ecb45c59ad24") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL Expand() = 0;\r
+ JUCE_COMCALL Collapse() = 0;\r
+ JUCE_COMCALL get_ExpandCollapseState (__RPC__out ExpandCollapseState * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IGridItemProvider, "d02541f1-fb81-4d64-ae32-f520f8a6dbd1") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL get_Row (__RPC__out int* pRetVal) = 0;\r
+ JUCE_COMCALL get_Column (__RPC__out int* pRetVal) = 0;\r
+ JUCE_COMCALL get_RowSpan (__RPC__out int* pRetVal) = 0;\r
+ JUCE_COMCALL get_ColumnSpan (__RPC__out int* pRetVal) = 0;\r
+ JUCE_COMCALL get_ContainingGrid (__RPC__deref_out_opt IRawElementProviderSimple * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IGridProvider, "b17d6187-0907-464b-a168-0ef17a1572b1") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL GetItem (int row, int column, __RPC__deref_out_opt IRawElementProviderSimple** pRetVal) = 0;\r
+ JUCE_COMCALL get_RowCount (__RPC__out int* pRetVal) = 0;\r
+ JUCE_COMCALL get_ColumnCount (__RPC__out int* pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IInvokeProvider, "54fcb24b-e18e-47a2-b4d3-eccbe77599a2") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL Invoke() = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IRangeValueProvider, "36dc7aef-33e6-4691-afe1-2be7274b3d33") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL SetValue (double val) = 0;\r
+ JUCE_COMCALL get_Value (__RPC__out double* pRetVal) = 0;\r
+ JUCE_COMCALL get_IsReadOnly (__RPC__out BOOL * pRetVal) = 0;\r
+ JUCE_COMCALL get_Maximum (__RPC__out double* pRetVal) = 0;\r
+ JUCE_COMCALL get_Minimum (__RPC__out double* pRetVal) = 0;\r
+ JUCE_COMCALL get_LargeChange (__RPC__out double* pRetVal) = 0;\r
+ JUCE_COMCALL get_SmallChange (__RPC__out double* pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ISelectionProvider, "fb8b03af-3bdf-48d4-bd36-1a65793be168") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL GetSelection (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+ JUCE_COMCALL get_CanSelectMultiple (__RPC__out BOOL * pRetVal) = 0;\r
+ JUCE_COMCALL get_IsSelectionRequired (__RPC__out BOOL * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ISelectionProvider2, "14f68475-ee1c-44f6-a869-d239381f0fe7") : public ISelectionProvider\r
+{\r
+ JUCE_COMCALL get_FirstSelectedItem (IRawElementProviderSimple * *retVal) = 0;\r
+ JUCE_COMCALL get_LastSelectedItem (IRawElementProviderSimple * *retVal) = 0;\r
+ JUCE_COMCALL get_CurrentSelectedItem (IRawElementProviderSimple * *retVal) = 0;\r
+ JUCE_COMCALL get_ItemCount (int* retVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ISelectionItemProvider, "2acad808-b2d4-452d-a407-91ff1ad167b2") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL Select() = 0;\r
+ JUCE_COMCALL AddToSelection() = 0;\r
+ JUCE_COMCALL RemoveFromSelection() = 0;\r
+ JUCE_COMCALL get_IsSelected (__RPC__out BOOL * pRetVal) = 0;\r
+ JUCE_COMCALL get_SelectionContainer (__RPC__deref_out_opt IRawElementProviderSimple * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ITextRangeProvider, "5347ad7b-c355-46f8-aff5-909033582f63") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL Clone (__RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+ JUCE_COMCALL Compare (__RPC__in_opt ITextRangeProvider * range, __RPC__out BOOL * pRetVal) = 0;\r
+ JUCE_COMCALL CompareEndpoints (TextPatternRangeEndpoint endpoint, __RPC__in_opt ITextRangeProvider * targetRange, TextPatternRangeEndpoint targetEndpoint, __RPC__out int* pRetVal) = 0;\r
+ JUCE_COMCALL ExpandToEnclosingUnit (TextUnit unit) = 0;\r
+ JUCE_COMCALL FindAttribute (TEXTATTRIBUTEID attributeId, VARIANT val, BOOL backward, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+ JUCE_COMCALL FindText (__RPC__in BSTR text, BOOL backward, BOOL ignoreCase, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+ JUCE_COMCALL GetAttributeValue (TEXTATTRIBUTEID attributeId, __RPC__out VARIANT * pRetVal) = 0;\r
+ JUCE_COMCALL GetBoundingRectangles (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+ JUCE_COMCALL GetEnclosingElement (__RPC__deref_out_opt IRawElementProviderSimple * *pRetVal) = 0;\r
+ JUCE_COMCALL GetText (int maxLength, __RPC__deref_out_opt BSTR* pRetVal) = 0;\r
+ JUCE_COMCALL Move (TextUnit unit, int count, __RPC__out int* pRetVal) = 0;\r
+ JUCE_COMCALL MoveEndpointByUnit (TextPatternRangeEndpoint endpoint, TextUnit unit, int count, __RPC__out int* pRetVal) = 0;\r
+ JUCE_COMCALL MoveEndpointByRange (TextPatternRangeEndpoint endpoint, __RPC__in_opt ITextRangeProvider * targetRange, TextPatternRangeEndpoint targetEndpoint) = 0;\r
+ JUCE_COMCALL Select() = 0;\r
+ JUCE_COMCALL AddToSelection() = 0;\r
+ JUCE_COMCALL RemoveFromSelection() = 0;\r
+ JUCE_COMCALL ScrollIntoView (BOOL alignToTop) = 0;\r
+ JUCE_COMCALL GetChildren (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ITextProvider, "3589c92c-63f3-4367-99bb-ada653b77cf2") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL GetSelection (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+ JUCE_COMCALL GetVisibleRanges (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+ JUCE_COMCALL RangeFromChild (__RPC__in_opt IRawElementProviderSimple * childElement, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+ JUCE_COMCALL RangeFromPoint (UiaPoint point, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+ JUCE_COMCALL get_DocumentRange (__RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+ JUCE_COMCALL get_SupportedTextSelection (__RPC__out SupportedTextSelection * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ITextProvider2, "0dc5e6ed-3e16-4bf1-8f9a-a979878bc195") : public ITextProvider\r
+{\r
+public:\r
+ JUCE_COMCALL RangeFromAnnotation (__RPC__in_opt IRawElementProviderSimple * annotationElement, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+ JUCE_COMCALL GetCaretRange (__RPC__out BOOL * isActive, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IToggleProvider, "56d00bd0-c4f4-433c-a836-1a52a57e0892") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL Toggle() = 0;\r
+ JUCE_COMCALL get_ToggleState (__RPC__out ToggleState * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ITransformProvider, "6829ddc4-4f91-4ffa-b86f-bd3e2987cb4c") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL Move (double x, double y) = 0;\r
+ JUCE_COMCALL Resize (double width, double height) = 0;\r
+ JUCE_COMCALL Rotate (double degrees) = 0;\r
+ JUCE_COMCALL get_CanMove (__RPC__out BOOL * pRetVal) = 0;\r
+ JUCE_COMCALL get_CanResize (__RPC__out BOOL * pRetVal) = 0;\r
+ JUCE_COMCALL get_CanRotate (__RPC__out BOOL * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IValueProvider, "c7935180-6fb3-4201-b174-7df73adbf64a") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL SetValue (__RPC__in LPCWSTR val) = 0;\r
+ JUCE_COMCALL get_Value (__RPC__deref_out_opt BSTR * pRetVal) = 0;\r
+ JUCE_COMCALL get_IsReadOnly (__RPC__out BOOL * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IWindowProvider, "987df77b-db06-4d77-8f8a-86a9c3bb90b9") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL SetVisualState (WindowVisualState state) = 0;\r
+ JUCE_COMCALL Close() = 0;\r
+ JUCE_COMCALL WaitForInputIdle (int milliseconds, __RPC__out BOOL* pRetVal) = 0;\r
+ JUCE_COMCALL get_CanMaximize (__RPC__out BOOL * pRetVal) = 0;\r
+ JUCE_COMCALL get_CanMinimize (__RPC__out BOOL * pRetVal) = 0;\r
+ JUCE_COMCALL get_IsModal (__RPC__out BOOL * pRetVal) = 0;\r
+ JUCE_COMCALL get_WindowVisualState (__RPC__out WindowVisualState * pRetVal) = 0;\r
+ JUCE_COMCALL get_WindowInteractionState (__RPC__out WindowInteractionState * pRetVal) = 0;\r
+ JUCE_COMCALL get_IsTopmost (__RPC__out BOOL * pRetVal) = 0;\r
+};\r
+\r
+constexpr CLSID CLSID_SpVoice { 0x96749377, 0x3391, 0x11D2, { 0x9E, 0xE3, 0x00, 0xC0, 0x4F, 0x79, 0x73, 0x96 } };\r
+\r
+} // namespace ComTypes\r
+} // namespace juce\r
+\r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::ComTypes::IRawElementProviderFragmentRoot, 0x620ce2a5, 0xab8f, 0x40a9, 0x86, 0xcb, 0xde, 0x3c, 0x75, 0x59, 0x9b, 0x58)\r
+__CRT_UUID_DECL (juce::ComTypes::IRawElementProviderFragment, 0xf7063da8, 0x8359, 0x439c, 0x92, 0x97, 0xbb, 0xc5, 0x29, 0x9a, 0x7d, 0x87)\r
+__CRT_UUID_DECL (juce::ComTypes::IExpandCollapseProvider, 0xd847d3a5, 0xcab0, 0x4a98, 0x8c, 0x32, 0xec, 0xb4, 0x5c, 0x59, 0xad, 0x24)\r
+__CRT_UUID_DECL (juce::ComTypes::IGridItemProvider, 0xd02541f1, 0xfb81, 0x4d64, 0xae, 0x32, 0xf5, 0x20, 0xf8, 0xa6, 0xdb, 0xd1)\r
+__CRT_UUID_DECL (juce::ComTypes::IGridProvider, 0xb17d6187, 0x0907, 0x464b, 0xa1, 0x68, 0x0e, 0xf1, 0x7a, 0x15, 0x72, 0xb1)\r
+__CRT_UUID_DECL (juce::ComTypes::IInvokeProvider, 0x54fcb24b, 0xe18e, 0x47a2, 0xb4, 0xd3, 0xec, 0xcb, 0xe7, 0x75, 0x99, 0xa2)\r
+__CRT_UUID_DECL (juce::ComTypes::IRangeValueProvider, 0x36dc7aef, 0x33e6, 0x4691, 0xaf, 0xe1, 0x2b, 0xe7, 0x27, 0x4b, 0x3d, 0x33)\r
+__CRT_UUID_DECL (juce::ComTypes::ISelectionProvider, 0xfb8b03af, 0x3bdf, 0x48d4, 0xbd, 0x36, 0x1a, 0x65, 0x79, 0x3b, 0xe1, 0x68)\r
+__CRT_UUID_DECL (juce::ComTypes::ISelectionProvider2, 0x14f68475, 0xee1c, 0x44f6, 0xa8, 0x69, 0xd2, 0x39, 0x38, 0x1f, 0x0f, 0xe7)\r
+__CRT_UUID_DECL (juce::ComTypes::ISelectionItemProvider, 0x2acad808, 0xb2d4, 0x452d, 0xa4, 0x07, 0x91, 0xff, 0x1a, 0xd1, 0x67, 0xb2)\r
+__CRT_UUID_DECL (juce::ComTypes::ITextRangeProvider, 0x5347ad7b, 0xc355, 0x46f8, 0xaf, 0xf5, 0x90, 0x90, 0x33, 0x58, 0x2f, 0x63)\r
+__CRT_UUID_DECL (juce::ComTypes::ITextProvider, 0x3589c92c, 0x63f3, 0x4367, 0x99, 0xbb, 0xad, 0xa6, 0x53, 0xb7, 0x7c, 0xf2)\r
+__CRT_UUID_DECL (juce::ComTypes::ITextProvider2, 0x0dc5e6ed, 0x3e16, 0x4bf1, 0x8f, 0x9a, 0xa9, 0x79, 0x87, 0x8b, 0xc1, 0x95)\r
+__CRT_UUID_DECL (juce::ComTypes::IToggleProvider, 0x56d00bd0, 0xc4f4, 0x433c, 0xa8, 0x36, 0x1a, 0x52, 0xa5, 0x7e, 0x08, 0x92)\r
+__CRT_UUID_DECL (juce::ComTypes::ITransformProvider, 0x6829ddc4, 0x4f91, 0x4ffa, 0xb8, 0x6f, 0xbd, 0x3e, 0x29, 0x87, 0xcb, 0x4c)\r
+__CRT_UUID_DECL (juce::ComTypes::IValueProvider, 0xc7935180, 0x6fb3, 0x4201, 0xb1, 0x74, 0x7d, 0xf7, 0x3a, 0xdb, 0xf6, 0x4a)\r
+__CRT_UUID_DECL (juce::ComTypes::IWindowProvider, 0x987df77b, 0xdb06, 0x4d77, 0x8f, 0x8a, 0x86, 0xa9, 0xc3, 0xbb, 0x90, 0xb9)\r
+#endif\r
\r
//==============================================================================\r
class UIAExpandCollapseProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<IExpandCollapseProvider>\r
+ public ComBaseClassHelper<ComTypes::IExpandCollapseProvider>\r
{\r
public:\r
- explicit UIAExpandCollapseProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle)\r
- {\r
- }\r
+ using UIAProviderBase::UIAProviderBase;\r
\r
//==============================================================================\r
JUCE_COMRESULT Expand() override\r
return invokeShowMenu();\r
}\r
\r
- JUCE_COMRESULT get_ExpandCollapseState (ExpandCollapseState* pRetVal) override\r
+ JUCE_COMRESULT get_ExpandCollapseState (ComTypes::ExpandCollapseState* pRetVal) override\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]\r
{\r
*pRetVal = getHandler().getCurrentState().isExpanded()\r
- ? ExpandCollapseState_Expanded\r
- : ExpandCollapseState_Collapsed;\r
+ ? ComTypes::ExpandCollapseState_Expanded\r
+ : ComTypes::ExpandCollapseState_Collapsed;\r
\r
return S_OK;\r
});\r
if (handler.getActions().invoke (AccessibilityActionType::showMenu))\r
{\r
sendAccessibilityAutomationEvent (handler, handler.getCurrentState().isExpanded()\r
- ? UIA_MenuOpenedEventId\r
- : UIA_MenuClosedEventId);\r
+ ? ComTypes::UIA_MenuOpenedEventId\r
+ : ComTypes::UIA_MenuClosedEventId);\r
\r
return S_OK;\r
}\r
\r
//==============================================================================\r
class UIAGridItemProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<IGridItemProvider>\r
+ public ComBaseClassHelper<ComTypes::IGridItemProvider>\r
{\r
public:\r
- explicit UIAGridItemProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle)\r
- {\r
- }\r
+ using UIAProviderBase::UIAProviderBase;\r
\r
//==============================================================================\r
JUCE_COMRESULT get_Row (int* pRetVal) override\r
\r
//==============================================================================\r
class UIAGridProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<IGridProvider>\r
+ public ComBaseClassHelper<ComTypes::IGridProvider>\r
{\r
public:\r
- explicit UIAGridProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle)\r
- {\r
- }\r
+ using UIAProviderBase::UIAProviderBase;\r
\r
//==============================================================================\r
JUCE_COMRESULT GetItem (int row, int column, IRawElementProviderSimple** pRetVal) override\r
\r
//==============================================================================\r
class UIAInvokeProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<IInvokeProvider>\r
+ public ComBaseClassHelper<ComTypes::IInvokeProvider>\r
{\r
public:\r
- explicit UIAInvokeProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle)\r
- {\r
- }\r
+ using UIAProviderBase::UIAProviderBase;\r
\r
//==============================================================================\r
JUCE_COMRESULT Invoke() override\r
if (handler.getActions().invoke (AccessibilityActionType::press))\r
{\r
if (isElementValid())\r
- sendAccessibilityAutomationEvent (handler, UIA_Invoke_InvokedEventId);\r
+ sendAccessibilityAutomationEvent (handler, ComTypes::UIA_Invoke_InvokedEventId);\r
\r
return S_OK;\r
}\r
\r
//==============================================================================\r
class UIARangeValueProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<IRangeValueProvider>\r
+ public ComBaseClassHelper<ComTypes::IRangeValueProvider>\r
{\r
public:\r
- explicit UIARangeValueProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle)\r
- {\r
- }\r
+ using UIAProviderBase::UIAProviderBase;\r
\r
//==============================================================================\r
JUCE_COMRESULT SetValue (double val) override\r
\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
\r
-JUCE_COMCLASS (ISelectionProvider2, "14f68475-ee1c-44f6-a869-d239381f0fe7") : public ISelectionProvider\r
-{\r
- JUCE_COMCALL get_FirstSelectedItem (IRawElementProviderSimple** retVal) = 0;\r
- JUCE_COMCALL get_LastSelectedItem (IRawElementProviderSimple** retVal) = 0;\r
- JUCE_COMCALL get_CurrentSelectedItem (IRawElementProviderSimple** retVal) = 0;\r
- JUCE_COMCALL get_ItemCount (int* retVal) = 0;\r
-};\r
-\r
//==============================================================================\r
class UIASelectionItemProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<ISelectionItemProvider>\r
+ public ComBaseClassHelper<ComTypes::ISelectionItemProvider>\r
{\r
public:\r
- explicit UIASelectionItemProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle),\r
+ explicit UIASelectionItemProvider (AccessibilityNativeHandle* handle)\r
+ : UIAProviderBase (handle),\r
isRadioButton (getHandler().getRole() == AccessibilityRole::radioButton)\r
{\r
}\r
if (isRadioButton)\r
{\r
handler.getActions().invoke (AccessibilityActionType::press);\r
- sendAccessibilityAutomationEvent (handler, UIA_SelectionItem_ElementSelectedEventId);\r
+ sendAccessibilityAutomationEvent (handler, ComTypes::UIA_SelectionItem_ElementSelectedEventId);\r
\r
return S_OK;\r
}\r
\r
//==============================================================================\r
class UIASelectionProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<ISelectionProvider2>\r
+ public ComBaseClassHelper<ComTypes::ISelectionProvider2>\r
{\r
public:\r
- explicit UIASelectionProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle)\r
- {\r
- }\r
+ using UIAProviderBase::UIAProviderBase;\r
\r
//==============================================================================\r
JUCE_COMRESULT QueryInterface (REFIID iid, void** result) override\r
{\r
- if (iid == _uuidof (IUnknown) || iid == _uuidof (ISelectionProvider))\r
- return castToType<ISelectionProvider> (result);\r
+ if (iid == __uuidof (IUnknown) || iid == __uuidof (ComTypes::ISelectionProvider))\r
+ return castToType<ComTypes::ISelectionProvider> (result);\r
\r
- if (iid == _uuidof (ISelectionProvider2))\r
- return castToType<ISelectionProvider2> (result);\r
+ if (iid == __uuidof (ComTypes::ISelectionProvider2))\r
+ return castToType<ComTypes::ISelectionProvider2> (result);\r
\r
*result = nullptr;\r
return E_NOINTERFACE;\r
\r
//==============================================================================\r
class UIATextProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<ITextProvider2>\r
+ public ComBaseClassHelper<ComTypes::ITextProvider2>\r
{\r
public:\r
- explicit UIATextProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle)\r
- {\r
- }\r
+ using UIAProviderBase::UIAProviderBase;\r
\r
//==============================================================================\r
JUCE_COMRESULT QueryInterface (REFIID iid, void** result) override\r
{\r
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
\r
- if (iid == _uuidof (IUnknown) || iid == _uuidof (ITextProvider))\r
- return castToType<ITextProvider> (result);\r
+ if (iid == __uuidof (IUnknown) || iid == __uuidof (ComTypes::ITextProvider))\r
+ return castToType<ComTypes::ITextProvider> (result);\r
\r
- if (iid == _uuidof (ITextProvider2))\r
- return castToType<ITextProvider2> (result);\r
+ if (iid == __uuidof (ComTypes::ITextProvider2))\r
+ return castToType<ComTypes::ITextProvider2> (result);\r
\r
*result = nullptr;\r
return E_NOINTERFACE;\r
}\r
\r
//=============================================================================\r
- JUCE_COMRESULT get_DocumentRange (ITextRangeProvider** pRetVal) override\r
+ JUCE_COMRESULT get_DocumentRange (ComTypes::ITextRangeProvider** pRetVal) override\r
{\r
return withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface)\r
{\r
});\r
}\r
\r
- JUCE_COMRESULT get_SupportedTextSelection (SupportedTextSelection* pRetVal) override\r
+ JUCE_COMRESULT get_SupportedTextSelection (ComTypes::SupportedTextSelection* pRetVal) override\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]\r
{\r
- *pRetVal = SupportedTextSelection_Single;\r
+ *pRetVal = ComTypes::SupportedTextSelection_Single;\r
return S_OK;\r
});\r
}\r
});\r
}\r
\r
- JUCE_COMRESULT RangeFromChild (IRawElementProviderSimple*, ITextRangeProvider** pRetVal) override\r
+ JUCE_COMRESULT RangeFromChild (IRawElementProviderSimple*, ComTypes::ITextRangeProvider** pRetVal) override\r
{\r
return withCheckedComArgs (pRetVal, *this, []\r
{\r
});\r
}\r
\r
- JUCE_COMRESULT RangeFromPoint (UiaPoint point, ITextRangeProvider** pRetVal) override\r
+ JUCE_COMRESULT RangeFromPoint (ComTypes::UiaPoint point, ComTypes::ITextRangeProvider** pRetVal) override\r
{\r
return withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface)\r
{\r
}\r
\r
//==============================================================================\r
- JUCE_COMRESULT GetCaretRange (BOOL* isActive, ITextRangeProvider** pRetVal) override\r
+ JUCE_COMRESULT GetCaretRange (BOOL* isActive, ComTypes::ITextRangeProvider** pRetVal) override\r
{\r
return withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface)\r
{\r
});\r
}\r
\r
- JUCE_COMRESULT RangeFromAnnotation (IRawElementProviderSimple*, ITextRangeProvider** pRetVal) override\r
+ JUCE_COMRESULT RangeFromAnnotation (IRawElementProviderSimple*, ComTypes::ITextRangeProvider** pRetVal) override\r
{\r
return withCheckedComArgs (pRetVal, *this, []\r
{\r
\r
//==============================================================================\r
class UIATextRangeProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<ITextRangeProvider>\r
+ public ComBaseClassHelper<ComTypes::ITextRangeProvider>\r
{\r
public:\r
UIATextRangeProvider (UIATextProvider& textProvider, Range<int> range)\r
return Select();\r
}\r
\r
- JUCE_COMRESULT Clone (ITextRangeProvider** pRetVal) override\r
+ JUCE_COMRESULT Clone (ComTypes::ITextRangeProvider** pRetVal) override\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]\r
{\r
});\r
}\r
\r
- JUCE_COMRESULT Compare (ITextRangeProvider* range, BOOL* pRetVal) override\r
+ JUCE_COMRESULT Compare (ComTypes::ITextRangeProvider* range, BOOL* pRetVal) override\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]\r
{\r
});\r
}\r
\r
- JUCE_COMRESULT CompareEndpoints (TextPatternRangeEndpoint endpoint,\r
- ITextRangeProvider* targetRange,\r
- TextPatternRangeEndpoint targetEndpoint,\r
+ JUCE_COMRESULT CompareEndpoints (ComTypes::TextPatternRangeEndpoint endpoint,\r
+ ComTypes::ITextRangeProvider* targetRange,\r
+ ComTypes::TextPatternRangeEndpoint targetEndpoint,\r
int* pRetVal) override\r
{\r
if (targetRange == nullptr)\r
\r
return withCheckedComArgs (pRetVal, *this, [&]\r
{\r
- auto offset = (endpoint == TextPatternRangeEndpoint_Start ? selectionRange.getStart()\r
- : selectionRange.getEnd());\r
+ auto offset = (endpoint == ComTypes::TextPatternRangeEndpoint_Start ? selectionRange.getStart()\r
+ : selectionRange.getEnd());\r
\r
auto otherRange = static_cast<UIATextRangeProvider*> (targetRange)->getSelectionRange();\r
- auto otherOffset = (targetEndpoint == TextPatternRangeEndpoint_Start ? otherRange.getStart()\r
- : otherRange.getEnd());\r
+ auto otherOffset = (targetEndpoint == ComTypes::TextPatternRangeEndpoint_Start ? otherRange.getStart()\r
+ : otherRange.getEnd());\r
\r
*pRetVal = offset - otherOffset;\r
return S_OK;\r
});\r
}\r
\r
- JUCE_COMRESULT ExpandToEnclosingUnit (TextUnit unit) override\r
+ JUCE_COMRESULT ExpandToEnclosingUnit (ComTypes::TextUnit unit) override\r
{\r
if (! isElementValid())\r
return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;\r
return (HRESULT) UIA_E_NOTSUPPORTED;\r
}\r
\r
- JUCE_COMRESULT FindAttribute (TEXTATTRIBUTEID, VARIANT, BOOL, ITextRangeProvider** pRetVal) override\r
+ JUCE_COMRESULT FindAttribute (TEXTATTRIBUTEID, VARIANT, BOOL, ComTypes::ITextRangeProvider** pRetVal) override\r
{\r
return withCheckedComArgs (pRetVal, *this, []\r
{\r
}\r
\r
JUCE_COMRESULT FindText (BSTR text, BOOL backward, BOOL ignoreCase,\r
- ITextRangeProvider** pRetVal) override\r
+ ComTypes::ITextRangeProvider** pRetVal) override\r
{\r
return owner->withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface)\r
{\r
\r
switch (attributeId)\r
{\r
- case UIA_IsReadOnlyAttributeId:\r
+ case ComTypes::UIA_IsReadOnlyAttributeId:\r
{\r
VariantHelpers::setBool (textInterface.isReadOnly(), pRetVal);\r
break;\r
}\r
\r
- case UIA_CaretPositionAttributeId:\r
+ case ComTypes::UIA_CaretPositionAttributeId:\r
{\r
auto cursorPos = textInterface.getTextInsertionOffset();\r
\r
auto caretPos = [&]\r
{\r
if (cursorPos == 0)\r
- return CaretPosition_BeginningOfLine;\r
+ return ComTypes::CaretPosition_BeginningOfLine;\r
\r
if (cursorPos == textInterface.getTotalNumCharacters())\r
- return CaretPosition_EndOfLine;\r
+ return ComTypes::CaretPosition_EndOfLine;\r
\r
- return CaretPosition_Unknown;\r
+ return ComTypes::CaretPosition_Unknown;\r
}();\r
\r
VariantHelpers::setInt (caretPos, pRetVal);\r
});\r
}\r
\r
- JUCE_COMRESULT Move (TextUnit unit, int count, int* pRetVal) override\r
+ JUCE_COMRESULT Move (ComTypes::TextUnit unit, int count, int* pRetVal) override\r
{\r
return owner->withTextInterface (pRetVal, [&] (const AccessibilityTextInterface&)\r
{\r
if (count > 0)\r
{\r
- MoveEndpointByUnit (TextPatternRangeEndpoint_End, unit, count, pRetVal);\r
- MoveEndpointByUnit (TextPatternRangeEndpoint_Start, unit, count, pRetVal);\r
+ MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_End, unit, count, pRetVal);\r
+ MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_Start, unit, count, pRetVal);\r
}\r
else if (count < 0)\r
{\r
- MoveEndpointByUnit (TextPatternRangeEndpoint_Start, unit, count, pRetVal);\r
- MoveEndpointByUnit (TextPatternRangeEndpoint_End, unit, count, pRetVal);\r
+ MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_Start, unit, count, pRetVal);\r
+ MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_End, unit, count, pRetVal);\r
}\r
\r
return S_OK;\r
});\r
}\r
\r
- JUCE_COMRESULT MoveEndpointByRange (TextPatternRangeEndpoint endpoint,\r
- ITextRangeProvider* targetRange,\r
- TextPatternRangeEndpoint targetEndpoint) override\r
+ JUCE_COMRESULT MoveEndpointByRange (ComTypes::TextPatternRangeEndpoint endpoint,\r
+ ComTypes::ITextRangeProvider* targetRange,\r
+ ComTypes::TextPatternRangeEndpoint targetEndpoint) override\r
{\r
if (targetRange == nullptr)\r
return E_INVALIDARG;\r
if (! isElementValid())\r
return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;\r
\r
- if (auto* textInterface = owner->getHandler().getTextInterface())\r
+ if (owner->getHandler().getTextInterface() != nullptr)\r
{\r
auto otherRange = static_cast<UIATextRangeProvider*> (targetRange)->getSelectionRange();\r
- auto targetPoint = (targetEndpoint == TextPatternRangeEndpoint_Start ? otherRange.getStart()\r
- : otherRange.getEnd());\r
+ auto targetPoint = (targetEndpoint == ComTypes::TextPatternRangeEndpoint_Start ? otherRange.getStart()\r
+ : otherRange.getEnd());\r
\r
setEndpointChecked (endpoint, targetPoint);\r
return S_OK;\r
return (HRESULT) UIA_E_NOTSUPPORTED;\r
}\r
\r
- JUCE_COMRESULT MoveEndpointByUnit (TextPatternRangeEndpoint endpoint,\r
- TextUnit unit,\r
+ JUCE_COMRESULT MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint endpoint,\r
+ ComTypes::TextUnit unit,\r
int count,\r
int* pRetVal) override\r
{\r
if (count == 0 || textInterface.getTotalNumCharacters() == 0)\r
return S_OK;\r
\r
- auto endpointToMove = (endpoint == TextPatternRangeEndpoint_Start ? selectionRange.getStart()\r
- : selectionRange.getEnd());\r
+ auto endpointToMove = (endpoint == ComTypes::TextPatternRangeEndpoint_Start ? selectionRange.getStart()\r
+ : selectionRange.getEnd());\r
\r
const auto direction = (count > 0 ? AccessibilityTextHelpers::Direction::forwards\r
: AccessibilityTextHelpers::Direction::backwards);\r
}\r
\r
private:\r
- static AccessibilityTextHelpers::BoundaryType getBoundaryType (TextUnit unit)\r
+ static AccessibilityTextHelpers::BoundaryType getBoundaryType (ComTypes::TextUnit unit)\r
{\r
switch (unit)\r
{\r
- case TextUnit_Character:\r
+ case ComTypes::TextUnit_Character:\r
return AccessibilityTextHelpers::BoundaryType::character;\r
\r
- case TextUnit_Format:\r
- case TextUnit_Word:\r
+ case ComTypes::TextUnit_Format:\r
+ case ComTypes::TextUnit_Word:\r
return AccessibilityTextHelpers::BoundaryType::word;\r
\r
- case TextUnit_Line:\r
+ case ComTypes::TextUnit_Line:\r
return AccessibilityTextHelpers::BoundaryType::line;\r
\r
- case TextUnit_Paragraph:\r
- case TextUnit_Page:\r
- case TextUnit_Document:\r
+ case ComTypes::TextUnit_Paragraph:\r
+ case ComTypes::TextUnit_Page:\r
+ case ComTypes::TextUnit_Document:\r
return AccessibilityTextHelpers::BoundaryType::document;\r
};\r
\r
return AccessibilityTextHelpers::BoundaryType::character;\r
}\r
\r
- void setEndpointChecked (TextPatternRangeEndpoint endpoint, int newEndpoint)\r
+ void setEndpointChecked (ComTypes::TextPatternRangeEndpoint endpoint, int newEndpoint)\r
{\r
- if (endpoint == TextPatternRangeEndpoint_Start)\r
+ if (endpoint == ComTypes::TextPatternRangeEndpoint_Start)\r
{\r
if (selectionRange.getEnd() < newEndpoint)\r
selectionRange.setEnd (newEndpoint);\r
\r
//==============================================================================\r
class UIAToggleProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<IToggleProvider>\r
+ public ComBaseClassHelper<ComTypes::IToggleProvider>\r
{\r
public:\r
- explicit UIAToggleProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle)\r
- {\r
- }\r
+ using UIAProviderBase::UIAProviderBase;\r
\r
//==============================================================================\r
JUCE_COMRESULT Toggle() override\r
\r
const auto& handler = getHandler();\r
\r
- if (handler.getActions().invoke (AccessibilityActionType::toggle))\r
+ if (handler.getActions().invoke (AccessibilityActionType::toggle)\r
+ || handler.getActions().invoke (AccessibilityActionType::press))\r
{\r
VARIANT newValue;\r
VariantHelpers::setInt (getCurrentToggleState(), &newValue);\r
return (HRESULT) UIA_E_NOTSUPPORTED;\r
}\r
\r
- JUCE_COMRESULT get_ToggleState (ToggleState* pRetVal) override\r
+ JUCE_COMRESULT get_ToggleState (ComTypes::ToggleState* pRetVal) override\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]\r
{\r
}\r
\r
private:\r
- ToggleState getCurrentToggleState() const\r
+ ComTypes::ToggleState getCurrentToggleState() const\r
{\r
- return getHandler().getCurrentState().isChecked() ? ToggleState_On\r
- : ToggleState_Off;\r
+ return getHandler().getCurrentState().isChecked() ? ComTypes::ToggleState_On\r
+ : ComTypes::ToggleState_Off;\r
}\r
\r
//==============================================================================\r
\r
//==============================================================================\r
class UIATransformProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<ITransformProvider>\r
+ public ComBaseClassHelper<ComTypes::ITransformProvider>\r
{\r
public:\r
- explicit UIATransformProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle)\r
- {\r
- }\r
+ using UIAProviderBase::UIAProviderBase;\r
\r
//==============================================================================\r
JUCE_COMRESULT Move (double x, double y) override\r
\r
//==============================================================================\r
class UIAValueProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<IValueProvider>\r
+ public ComBaseClassHelper<ComTypes::IValueProvider>\r
{\r
public:\r
- UIAValueProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle)\r
- {\r
- }\r
+ using UIAProviderBase::UIAProviderBase;\r
\r
//==============================================================================\r
JUCE_COMRESULT SetValue (LPCWSTR val) override\r
\r
//==============================================================================\r
class UIAWindowProvider : public UIAProviderBase,\r
- public ComBaseClassHelper<IWindowProvider>\r
+ public ComBaseClassHelper<ComTypes::IWindowProvider>\r
{\r
public:\r
- explicit UIAWindowProvider (AccessibilityNativeHandle* nativeHandle)\r
- : UIAProviderBase (nativeHandle)\r
- {\r
- }\r
+ using UIAProviderBase::UIAProviderBase;\r
\r
//==============================================================================\r
- JUCE_COMRESULT SetVisualState (WindowVisualState state) override\r
+ JUCE_COMRESULT SetVisualState (ComTypes::WindowVisualState state) override\r
{\r
if (! isElementValid())\r
return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;\r
{\r
switch (state)\r
{\r
- case WindowVisualState_Maximized:\r
+ case ComTypes::WindowVisualState_Maximized:\r
peer->setFullScreen (true);\r
break;\r
\r
- case WindowVisualState_Minimized:\r
+ case ComTypes::WindowVisualState_Minimized:\r
peer->setMinimised (true);\r
break;\r
\r
- case WindowVisualState_Normal:\r
+ case ComTypes::WindowVisualState_Normal:\r
peer->setFullScreen (false);\r
peer->setMinimised (false);\r
break;\r
});\r
}\r
\r
- JUCE_COMRESULT get_WindowVisualState (WindowVisualState* pRetVal) override\r
+ JUCE_COMRESULT get_WindowVisualState (ComTypes::WindowVisualState* pRetVal) override\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT\r
{\r
if (auto* peer = getPeer())\r
{\r
if (peer->isFullScreen())\r
- *pRetVal = WindowVisualState_Maximized;\r
+ *pRetVal = ComTypes::WindowVisualState_Maximized;\r
else if (peer->isMinimised())\r
- *pRetVal = WindowVisualState_Minimized;\r
+ *pRetVal = ComTypes::WindowVisualState_Minimized;\r
else\r
- *pRetVal = WindowVisualState_Normal;\r
+ *pRetVal = ComTypes::WindowVisualState_Normal;\r
\r
return S_OK;\r
}\r
});\r
}\r
\r
- JUCE_COMRESULT get_WindowInteractionState (WindowInteractionState* pRetVal) override\r
+ JUCE_COMRESULT get_WindowInteractionState (ComTypes::WindowInteractionState* pRetVal) override\r
{\r
return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT\r
{\r
if (auto* peer = getPeer())\r
{\r
*pRetVal = peer->getComponent().isCurrentlyBlockedByAnotherModalComponent()\r
- ? WindowInteractionState::WindowInteractionState_BlockedByModalWindow\r
- : WindowInteractionState::WindowInteractionState_Running;\r
+ ? ComTypes::WindowInteractionState::WindowInteractionState_BlockedByModalWindow\r
+ : ComTypes::WindowInteractionState::WindowInteractionState_Running;\r
\r
return S_OK;\r
}\r
template <typename FuncType>\r
static FuncType getUiaFunction (HMODULE module, LPCSTR funcName)\r
{\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wcast-function-type")\r
return (FuncType) GetProcAddress (module, funcName);\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
}\r
\r
//==============================================================================\r
private native void handleMouseDown (long host, int index, float x, float y, long time);\r
private native void handleMouseDrag (long host, int index, float x, float y, long time);\r
private native void handleMouseUp (long host, int index, float x, float y, long time);\r
+ private native void handleAccessibilityHover (long host, int action, float x, float y, long time);\r
\r
@Override\r
public boolean onTouchEvent (MotionEvent event)\r
@Override\r
public boolean onHoverEvent (MotionEvent event)\r
{\r
- if (host == 0 || ! accessibilityManager.isTouchExplorationEnabled ())\r
- return false;\r
-\r
- int action = event.getAction ();\r
- long time = event.getEventTime ();\r
-\r
- switch (action & MotionEvent.ACTION_MASK) // simulate "mouse" events when touch exploration is enabled\r
+ if (accessibilityManager.isTouchExplorationEnabled())\r
{\r
- case MotionEvent.ACTION_HOVER_ENTER:\r
- handleMouseDown (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time);\r
- return true;\r
-\r
- case MotionEvent.ACTION_HOVER_EXIT:\r
- handleMouseUp (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time);\r
- return true;\r
-\r
- case MotionEvent.ACTION_HOVER_MOVE:\r
- handleMouseDrag (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time);\r
- return true;\r
-\r
- default:\r
- break;\r
+ handleAccessibilityHover (host, event.getActionMasked(), event.getRawX(), event.getRawY(), event.getEventTime());\r
+ return true;\r
}\r
\r
return false;\r
}\r
\r
//==============================================================================\r
- private native void handleKeyDown (long host, int keycode, int textchar);\r
+ private native void handleKeyDown (long host, int keycode, int textchar, int kbFlags);\r
private native void handleKeyUp (long host, int keycode, int textchar);\r
private native void handleBackButton (long host);\r
private native void handleKeyboardHidden (long host);\r
return super.onKeyDown (keyCode, event);\r
case KeyEvent.KEYCODE_BACK:\r
{\r
- backButtonPressed();\r
+ backButtonPressed ();\r
return true;\r
}\r
\r
break;\r
}\r
\r
- handleKeyDown (host, keyCode, event.getUnicodeChar ());\r
+ handleKeyDown (host,\r
+ keyCode,\r
+ event.getUnicodeChar (),\r
+ event.getMetaState ());\r
return true;\r
}\r
\r
if (event.getCharacters () != null)\r
{\r
int utf8Char = event.getCharacters ().codePointAt (0);\r
- handleKeyDown (host, utf8Char, utf8Char);\r
+\r
+ handleKeyDown (host,\r
+ keyCode,\r
+ utf8Char,\r
+ event.getMetaState ());\r
return true;\r
}\r
\r
// This byte-code is generated from native/java/com/rmsl/juce/ComponentPeerView.java with min sdk version 16\r
// See juce_core/native/java/README.txt on how to generate this byte-code.\r
static const uint8 javaComponentPeerView[] =\r
-{31,139,8,8,244,59,63,97,0,3,74,97,118,97,68,101,120,66,121,116,101,67,111,100,101,46,100,101,120,0,165,155,9,120,91,197,181,\r
-199,207,204,213,98,203,178,45,203,137,237,36,86,44,59,155,226,196,182,156,61,56,64,118,226,196,89,136,29,67,236,180,141,108,95,\r
-219,74,228,43,69,146,55,66,31,41,80,8,75,41,75,216,67,129,54,165,27,143,165,44,31,229,81,186,1,165,101,41,180,240,160,45,180,\r
-208,242,74,88,74,83,118,104,31,188,255,153,59,178,229,44,77,219,231,124,191,123,206,204,156,153,59,119,230,204,153,185,215,113,\r
-151,57,228,9,207,157,79,197,179,155,15,182,174,201,59,197,108,45,216,252,173,174,187,158,170,250,166,177,120,119,238,69,203,47,\r
-157,71,148,32,162,161,214,121,126,210,63,143,207,37,10,8,59,127,17,120,197,65,180,28,242,33,39,81,25,228,11,57,68,103,64,238,\r
-207,37,66,17,197,242,137,14,76,39,122,19,242,242,0,209,62,112,53,184,14,124,21,220,2,30,4,63,2,15,131,71,193,227,224,41,240,43,\r
-240,28,120,31,20,78,38,242,131,18,48,17,76,6,83,64,8,212,128,85,96,55,184,10,220,9,30,7,111,2,111,5,209,66,112,42,216,1,206,\r
-2,87,130,219,192,207,193,123,192,19,36,154,10,182,129,207,131,59,192,43,160,188,146,168,9,164,192,141,224,73,80,88,69,116,26,\r
-184,28,220,3,126,13,62,2,229,83,136,26,192,22,208,11,46,6,223,5,63,5,175,131,79,64,96,42,81,61,216,14,206,4,87,128,3,224,94,240,\r
-0,248,57,120,2,60,13,158,7,47,128,87,192,235,224,16,120,15,124,4,62,1,198,52,162,28,80,0,252,96,34,8,128,42,16,2,53,96,30,56,\r
-1,156,4,86,128,117,96,51,104,5,109,192,2,231,128,47,131,235,193,55,192,93,224,7,224,49,240,28,248,35,248,11,248,59,200,195,60,\r
-86,130,153,96,1,88,10,218,65,55,136,130,51,193,185,224,98,176,15,220,48,221,158,251,59,193,131,224,73,240,34,248,19,248,51,240,\r
-204,32,242,129,98,48,17,44,1,167,128,13,96,27,136,130,243,192,1,112,59,120,4,60,11,126,15,222,0,31,1,71,136,104,2,168,5,139,\r
-193,90,112,58,136,128,29,96,16,92,0,174,5,183,129,239,131,39,192,27,224,175,224,3,240,49,200,155,137,241,3,117,224,36,176,14,\r
-68,64,18,156,3,46,7,55,130,187,193,131,224,57,240,50,120,21,188,14,222,7,127,3,222,106,162,73,96,54,88,8,86,129,141,224,52,208,\r
-9,250,192,94,112,5,216,15,238,1,15,129,199,192,111,192,75,224,32,56,4,222,1,31,1,57,11,237,130,137,160,10,132,64,45,88,6,90,65,\r
-47,216,13,174,1,223,1,15,130,231,192,239,193,91,224,19,174,63,155,168,20,76,7,117,96,49,88,3,90,193,103,65,15,216,5,134,192,\r
-185,224,10,112,29,248,30,120,0,60,12,94,3,238,26,248,28,40,6,83,64,61,88,11,218,64,47,56,27,92,11,238,5,63,1,191,4,191,3,111,\r
-129,191,131,188,90,140,15,168,6,43,193,90,176,9,156,14,182,131,110,176,19,236,2,187,193,127,128,47,130,75,192,62,240,117,112,\r
-7,248,49,120,26,188,8,94,2,127,4,175,130,55,192,95,192,59,224,3,224,66,12,66,72,162,60,80,2,74,201,142,83,19,192,68,48,9,148,\r
-3,132,24,66,184,32,132,3,194,210,39,44,117,194,178,38,44,91,194,114,35,184,63,193,101,9,46,71,112,23,194,84,19,166,134,48,180,\r
-132,97,33,60,26,225,118,84,7,194,160,30,204,1,8,151,132,48,74,243,193,2,176,80,199,205,197,224,4,208,0,150,128,19,193,73,224,\r
-100,176,20,44,35,59,174,174,0,171,192,26,112,26,136,128,14,208,9,186,200,126,190,204,143,91,203,15,39,217,207,44,116,218,163,\r
-117,206,231,113,144,58,223,155,209,49,0,133,89,109,249,245,152,229,232,252,2,157,95,168,203,50,250,120,173,251,244,184,114,251,\r
-197,90,247,233,186,101,89,109,242,88,151,149,219,58,143,113,80,219,76,207,106,103,166,110,167,72,235,33,216,140,211,122,184,\r
-220,190,39,143,249,34,221,14,235,75,117,59,53,186,157,241,122,30,214,148,219,253,225,185,216,84,110,143,225,28,109,211,168,117,\r
-190,215,90,173,159,14,155,117,90,231,251,54,105,189,11,250,122,173,167,161,111,208,250,30,232,27,181,126,49,244,77,90,223,7,\r
-125,179,214,247,103,229,31,200,210,111,133,222,162,245,187,179,242,127,152,165,63,154,165,63,149,213,230,243,89,249,47,65,111,\r
-214,250,193,172,252,131,147,70,117,30,231,83,181,30,206,106,231,80,150,61,143,225,150,204,152,64,111,205,140,85,96,212,198,151,\r
-165,151,5,108,127,156,171,199,243,116,173,7,145,191,85,235,161,44,125,30,244,54,173,47,133,222,174,245,53,208,183,105,189,5,250,\r
-103,181,190,29,250,103,180,222,155,149,207,126,245,57,173,39,144,191,93,235,123,178,236,47,14,176,111,11,26,34,91,230,10,94,\r
-235,211,40,73,182,188,75,73,65,247,106,121,159,150,223,211,242,126,45,255,75,219,63,162,134,33,72,46,97,203,66,193,177,98,46,\r
-61,76,44,43,200,45,56,110,216,229,21,186,188,2,37,126,193,126,94,162,206,74,65,172,180,187,149,172,160,135,148,12,208,47,148,\r
-156,75,255,163,100,30,29,84,126,62,157,86,67,58,17,121,254,66,188,38,93,244,101,37,199,211,13,144,185,136,92,134,146,115,233,\r
-109,226,181,61,67,165,243,116,126,30,162,192,59,234,185,237,116,33,238,123,137,146,37,116,169,78,127,133,199,81,231,251,112,74,\r
-187,66,167,175,81,210,160,107,201,94,139,215,105,121,189,146,130,190,166,229,1,226,181,39,105,159,146,33,250,42,241,58,155,170,\r
-238,87,140,200,246,123,37,23,209,75,74,78,162,63,18,175,201,217,148,214,242,16,113,44,158,79,63,34,142,21,94,122,74,201,9,244,\r
-22,251,149,238,247,4,172,108,150,229,136,142,223,85,114,38,189,175,228,73,42,152,5,176,194,13,53,47,121,116,142,146,101,116,190,\r
-78,239,85,114,33,189,174,230,167,70,217,77,70,139,47,18,207,139,93,175,2,249,166,150,221,74,22,82,143,146,19,72,8,91,74,53,\r
-127,211,148,125,16,51,210,171,100,45,69,149,92,74,59,148,44,166,157,90,198,148,60,153,250,148,156,64,131,90,158,169,228,2,218,\r
-163,100,144,46,84,210,79,23,43,153,79,95,82,210,69,151,107,63,217,167,203,175,84,114,30,93,165,100,46,237,87,210,67,55,106,187,\r
-155,148,204,161,155,149,180,231,33,136,17,186,69,203,111,104,249,77,37,39,211,183,180,252,182,206,255,142,246,195,91,181,252,\r
-79,45,111,211,126,122,187,146,39,208,29,74,206,167,31,106,249,99,37,171,232,87,74,86,210,51,90,62,171,229,127,235,242,231,116,\r
-250,121,45,127,173,100,1,253,70,201,233,244,91,37,103,209,11,74,158,72,191,83,210,246,159,160,246,31,78,191,172,228,28,250,131,\r
-146,182,63,177,253,43,74,54,208,155,74,214,211,187,90,190,167,100,53,125,168,228,68,250,88,201,48,253,77,167,255,174,237,254,\r
-87,203,79,116,249,167,122,92,124,130,247,164,82,186,154,88,46,163,31,168,117,41,233,251,74,22,81,129,224,125,199,246,211,89,88,\r
-17,151,17,41,47,251,188,146,146,126,70,188,255,140,163,7,137,207,2,19,180,159,218,107,41,179,31,226,117,137,110,66,140,254,\r
-178,222,144,38,235,124,222,207,56,118,115,249,125,144,183,233,242,10,93,127,86,86,253,71,81,254,35,93,30,36,123,207,228,253,238,\r
-144,174,255,60,228,107,186,156,247,249,19,160,47,155,99,159,5,214,205,177,243,182,67,246,0,67,151,239,2,187,181,205,185,42,\r
-223,80,250,199,181,246,153,160,93,120,40,225,227,222,180,203,60,204,101,14,90,225,123,57,235,236,115,145,95,180,116,120,104,151,\r
-111,14,242,243,100,9,94,1,235,165,116,44,150,14,114,251,138,168,165,35,143,118,97,139,72,98,213,179,93,75,167,109,107,80,158,\r
-99,215,166,121,180,188,223,35,23,203,63,127,106,249,120,60,220,190,208,171,14,125,255,73,117,246,249,164,10,35,154,240,13,171,\r
-167,229,123,115,191,167,213,217,231,171,99,221,219,160,34,225,247,207,157,49,225,200,123,134,231,211,114,167,23,190,118,8,247,\r
-228,253,193,35,172,224,52,68,39,175,8,253,233,72,235,5,202,58,244,26,199,89,135,234,79,67,157,61,119,45,9,219,142,75,74,164,58,\r
-115,200,197,176,241,35,174,180,236,242,100,151,75,113,174,184,210,125,203,160,107,33,158,204,67,161,67,6,250,203,207,120,74,\r
-29,199,117,140,172,63,31,207,152,70,158,159,182,249,188,234,252,149,131,20,63,235,166,58,123,31,45,118,141,163,42,233,133,29,\r
-143,66,75,42,159,90,230,22,144,229,91,14,43,175,88,44,150,140,230,5,87,99,47,25,181,56,25,22,30,99,243,84,126,23,20,116,103,203,\r
-101,100,56,230,111,159,72,91,82,24,7,163,132,252,198,54,104,25,251,150,116,62,250,93,139,39,241,58,184,255,14,53,14,115,105,133,\r
-147,237,23,27,110,90,184,221,73,254,98,174,195,247,26,143,117,110,249,198,241,147,29,118,143,208,147,60,151,236,115,187,235,\r
-236,243,90,187,191,64,63,103,21,198,48,17,156,9,15,111,247,129,226,66,245,204,66,253,35,186,168,206,254,150,144,240,241,169,174,\r
-96,36,255,138,145,252,176,202,151,250,196,123,125,157,237,207,45,190,66,181,38,216,131,248,190,95,171,179,207,188,45,193,66,\r
-244,145,79,214,120,206,74,31,122,61,17,119,46,24,177,251,246,49,237,38,41,187,2,120,60,63,201,157,176,123,156,253,206,237,47,\r
-73,4,75,16,95,171,28,121,232,141,11,189,106,223,87,130,84,5,37,194,179,104,95,110,251,190,98,164,2,72,77,85,169,113,104,247,36,\r
-204,181,215,49,209,25,71,187,152,65,232,21,142,18,212,43,162,114,135,19,121,187,176,207,122,28,139,28,159,161,10,15,167,121,63,\r
-110,219,239,135,214,71,195,180,237,250,241,208,186,177,23,89,193,30,117,237,197,190,93,133,54,19,62,181,15,59,198,209,148,101,\r
-243,104,186,224,211,158,21,116,160,231,45,220,39,39,214,111,208,73,220,162,27,119,245,27,150,175,95,247,228,3,242,79,159,210,\r
-189,0,207,211,145,83,74,235,115,92,110,127,105,121,78,158,210,172,112,130,90,92,94,99,145,49,142,252,210,63,117,202,202,133,228,\r
-119,238,242,165,48,14,94,215,122,151,195,233,31,239,87,210,10,15,209,21,14,246,52,246,110,126,42,187,247,251,40,116,115,190,35,\r
-244,46,120,27,28,2,191,1,188,57,24,14,117,198,31,253,217,115,50,253,75,233,195,127,236,114,62,39,150,96,61,242,247,40,62,183,\r
-72,35,116,173,152,113,181,168,189,82,200,217,55,136,234,235,5,233,232,130,53,28,182,125,166,57,232,87,113,214,161,34,31,98,75,\r
-88,251,88,184,137,42,141,2,172,121,167,138,119,181,97,59,198,38,182,152,84,185,194,163,252,57,83,167,33,83,22,94,138,58,94,229,\r
-131,153,178,149,35,101,75,70,202,220,234,148,135,119,12,93,54,224,58,85,69,6,110,211,169,215,253,182,176,189,102,154,151,250,\r
-179,226,139,1,95,228,156,68,184,145,28,34,244,241,232,243,116,233,182,248,157,183,13,207,84,160,251,192,63,59,194,118,236,247,\r
-251,10,71,214,76,58,156,89,51,227,84,159,50,249,103,232,252,45,190,241,234,254,82,175,189,61,97,251,189,210,242,173,84,125,85,\r
-177,14,237,225,60,248,137,161,239,115,94,216,222,71,10,84,61,251,173,243,146,172,60,151,142,223,87,30,231,217,78,209,207,150,\r
-177,255,202,113,236,215,140,140,133,221,143,111,28,165,31,183,31,37,239,222,172,60,135,190,215,247,195,246,183,0,191,224,175,\r
-5,237,97,73,182,52,104,107,61,226,222,161,173,97,55,109,13,187,116,110,46,252,24,51,233,219,26,118,160,60,7,235,113,2,250,131,\r
-51,159,40,210,207,203,115,242,120,216,222,171,143,222,255,150,229,120,99,216,188,137,28,167,134,62,100,223,48,148,255,61,115,\r
-204,58,115,87,125,250,169,122,238,165,13,228,136,112,29,47,238,195,123,245,203,168,195,103,84,255,4,63,53,127,21,245,120,71,20,\r
-210,177,8,123,120,203,205,69,152,187,114,158,59,236,22,6,113,164,243,98,173,120,114,44,95,62,100,158,235,217,47,124,74,179,4,\r
-127,135,8,189,221,124,51,199,157,66,46,71,188,240,177,116,88,216,207,33,157,238,155,6,114,248,141,88,92,26,250,221,241,236,214,\r
-219,118,63,63,158,221,70,219,142,95,208,132,67,125,215,224,49,224,249,224,243,19,127,111,201,69,138,199,50,191,222,254,222,226,\r
-247,53,119,140,62,225,98,97,239,188,179,221,252,45,130,75,44,95,30,198,196,35,18,167,174,165,233,169,208,59,241,112,41,13,228,\r
-96,247,125,203,242,45,194,204,132,248,101,65,218,99,157,249,62,196,223,23,242,53,30,148,240,253,66,245,246,119,6,191,24,185,159,\r
-62,99,20,138,197,238,92,220,39,23,125,243,72,255,148,57,115,220,20,95,90,70,3,215,120,68,232,109,203,231,225,40,43,23,169,\r
-211,141,173,91,193,1,220,195,163,250,151,216,132,126,25,254,162,208,139,246,156,243,189,86,214,219,223,50,198,206,185,253,100,\r
-156,199,207,228,194,189,18,155,215,193,91,252,190,208,123,164,35,9,246,221,250,81,95,206,213,49,107,123,189,237,67,241,211,113,\r
-18,26,200,110,117,17,238,105,175,157,56,214,14,215,41,212,62,180,11,197,229,104,168,249,105,88,27,60,186,194,80,163,43,10,133,\r
-165,206,38,158,92,246,152,2,202,115,63,123,25,123,204,251,106,116,66,127,109,254,165,31,146,103,121,178,154,93,222,57,61,78,\r
-158,101,72,151,251,105,246,6,156,112,138,66,47,28,223,114,163,109,249,211,227,91,110,128,165,229,227,61,218,147,231,47,90,56,\r
-169,154,252,149,83,202,231,195,219,150,209,19,228,159,56,255,254,74,226,86,184,141,219,184,13,196,70,72,225,119,174,116,122,157,\r
-103,111,121,100,188,21,44,182,115,74,86,186,188,174,179,187,31,41,201,180,251,188,7,51,249,18,250,113,206,56,193,47,11,247,92,\r
-246,178,71,228,44,246,148,209,63,251,4,51,169,251,211,236,254,252,59,61,225,150,66,191,253,215,123,176,94,247,96,218,255,187,\r
-7,235,85,15,120,109,218,95,28,217,183,56,254,213,105,201,235,148,191,117,164,148,239,73,117,86,58,88,111,127,31,69,31,113,222,\r
-112,195,251,39,26,31,145,127,220,148,149,56,111,56,59,92,56,111,168,179,67,130,230,56,248,252,234,70,191,243,177,151,128,191,\r
-251,253,83,170,112,218,48,248,180,145,131,19,197,122,135,52,248,148,177,75,134,222,202,151,161,55,193,235,224,32,251,123,17,250,\r
-198,223,25,189,28,109,229,236,146,234,50,35,20,154,49,187,182,58,43,206,143,155,51,186,54,12,157,91,62,199,62,123,47,146,110,\r
-226,17,217,9,139,2,242,47,13,253,141,159,79,191,103,204,177,191,47,241,217,141,79,217,19,229,3,234,236,86,137,187,85,224,189,\r
-113,17,34,135,229,27,196,10,245,136,19,69,49,70,219,10,79,161,48,158,120,149,178,183,194,85,228,115,180,212,23,227,68,61,91,181,\r
-159,41,241,75,43,92,73,62,105,151,213,240,248,190,109,255,206,140,127,50,223,113,249,59,233,135,249,52,250,65,86,255,120,15,75,\r
-151,31,150,230,250,227,200,222,243,139,208,59,161,243,152,160,150,57,186,220,175,247,247,137,58,191,66,75,169,9,234,241,154,\r
-69,11,85,126,141,206,175,161,5,90,10,21,67,133,254,231,164,209,179,132,212,190,145,57,67,216,186,123,228,155,180,196,232,142,\r
-230,179,204,87,105,135,238,131,75,151,185,96,39,117,158,91,203,92,45,51,223,180,11,84,79,72,159,101,248,185,230,234,254,7,85,\r
-254,92,237,183,115,71,122,106,215,159,167,229,124,93,79,232,243,23,203,124,125,127,214,11,71,202,11,85,255,164,182,200,60,95,\r
-233,72,63,236,182,125,250,126,193,17,75,251,185,130,218,90,144,253,110,47,66,132,119,55,215,146,168,21,77,159,68,242,164,6,42,\r
-89,17,239,75,196,45,211,74,111,50,205,100,107,212,28,172,221,17,25,136,144,88,77,114,117,35,137,70,146,141,51,1,212,181,36,215,\r
-54,81,96,109,127,167,185,172,179,211,76,165,162,29,209,88,52,61,188,33,222,101,110,74,198,7,162,93,102,146,74,215,153,195,29,\r
-241,72,178,107,101,52,213,23,77,165,154,162,169,180,105,161,64,52,145,108,66,107,77,104,166,169,137,140,38,36,112,89,203,151,\r
-38,42,105,138,88,93,201,120,180,171,46,146,72,212,45,235,76,71,7,208,114,3,205,27,155,159,72,196,162,157,145,116,52,110,77,205,\r
-216,52,69,187,205,206,225,206,152,185,34,18,139,117,68,58,119,166,26,104,194,177,106,101,23,117,198,45,244,44,93,183,130,229,\r
-80,58,187,168,39,25,73,244,70,59,83,117,43,34,214,64,4,13,78,62,74,81,60,22,79,174,142,198,210,102,242,216,229,235,35,233,100,\r
-116,168,129,102,254,195,242,49,77,149,29,105,186,41,18,181,208,191,210,35,75,54,155,157,40,40,30,41,136,167,234,150,247,91,93,\r
-49,179,129,198,101,103,54,46,143,90,93,220,250,104,27,3,152,234,58,76,214,170,1,147,27,159,56,182,96,125,156,135,75,151,205,\r
-28,91,198,78,50,117,163,181,58,222,217,159,90,209,27,177,122,204,204,36,103,119,101,196,52,251,145,70,50,79,73,198,251,19,13,\r
-180,224,200,146,150,164,105,110,236,72,153,201,1,51,137,187,156,18,139,119,68,98,77,145,225,120,127,122,244,54,21,255,184,94,\r
-3,213,143,53,136,100,251,107,221,24,239,93,31,177,34,61,92,101,206,63,93,133,29,190,209,234,142,31,209,255,227,212,201,44,146,\r
-6,170,29,91,47,106,37,250,211,125,102,186,55,222,85,183,60,146,66,227,72,195,47,45,76,175,242,218,105,199,182,95,213,21,77,199,\r
-147,118,119,170,143,109,118,68,147,53,199,177,93,175,244,145,209,57,185,169,51,222,87,151,236,75,197,234,118,32,0,212,29,17,54,\r
-166,254,195,184,208,64,171,143,219,192,49,34,199,212,177,51,187,248,223,109,167,129,42,143,87,181,129,170,154,186,34,177,129,\r
-232,206,186,136,101,197,211,42,102,212,173,178,58,99,241,84,212,234,89,17,139,164,84,48,56,210,166,17,3,155,212,229,149,71,41,\r
-95,111,246,117,104,3,19,38,129,163,152,52,71,123,172,72,186,63,105,242,130,225,24,92,23,195,218,170,195,10,75,54,155,187,250,\r
-77,171,19,37,69,217,37,246,237,170,178,178,26,99,49,179,39,18,179,167,97,213,80,167,153,176,39,123,234,81,108,146,61,253,125,\r
-120,246,44,171,226,108,43,4,197,30,123,208,70,51,55,196,155,251,59,123,109,207,200,170,231,207,50,217,216,177,67,197,164,64,86,\r
-94,179,217,217,159,132,67,28,163,74,51,98,160,213,195,30,57,154,151,52,187,99,104,7,221,24,136,219,161,187,37,146,236,49,179,\r
-123,59,241,40,230,118,215,26,104,188,93,214,159,142,198,234,150,37,147,145,97,118,130,6,42,204,202,230,28,242,29,150,129,119,\r
-220,150,173,155,86,145,55,219,231,72,180,146,108,109,36,103,107,35,126,160,174,37,87,235,218,198,213,171,215,146,3,178,145,175,\r
-188,163,181,174,109,67,33,43,188,171,181,170,172,166,54,148,54,181,97,207,107,109,67,173,54,213,130,104,35,163,141,235,225,\r
-210,196,106,19,57,219,214,178,238,128,192,62,217,198,185,216,31,93,109,77,42,219,201,18,249,237,216,148,219,27,201,223,126,164,\r
-23,20,183,31,101,18,60,118,64,154,26,14,135,71,244,250,44,125,78,150,62,55,75,159,151,165,207,207,210,23,100,233,11,179,244,\r
-69,208,243,108,125,117,44,210,147,162,252,49,145,144,198,69,142,18,113,201,21,81,161,136,107,178,108,138,116,152,49,202,137,232,\r
-125,157,38,68,186,186,142,30,255,41,55,162,157,55,69,162,131,138,120,215,95,222,159,78,199,173,77,73,220,198,236,34,87,71,\r
-28,201,62,72,181,27,146,171,83,109,228,228,238,84,251,85,23,57,113,96,136,36,41,175,147,99,84,28,219,235,178,52,39,70,182,100,\r
-42,80,137,150,100,196,74,117,199,147,125,148,207,199,5,236,195,41,101,141,134,236,83,3,26,138,247,35,61,169,51,105,70,210,71,\r
-198,63,142,203,228,232,138,118,119,147,48,201,105,242,134,74,193,110,236,198,71,53,77,45,31,110,225,86,115,217,66,109,176,228,\r
-236,86,194,219,61,186,221,118,81,158,74,113,200,106,236,162,73,88,23,99,90,91,157,85,88,126,120,225,152,211,90,174,42,85,179,\r
-48,158,213,209,147,146,62,21,81,62,178,57,4,97,90,204,36,94,144,56,201,30,71,30,214,180,145,151,87,38,63,90,75,180,207,84,141,\r
-174,49,163,61,189,105,42,134,170,118,147,236,46,113,102,147,94,213,27,173,102,140,156,105,169,74,246,234,165,66,168,106,148,\r
-17,48,213,224,122,71,51,80,221,141,212,230,200,224,233,25,101,43,229,177,18,143,167,185,125,242,33,209,60,12,71,233,107,198,234,\r
-141,118,154,84,128,156,45,86,148,167,154,159,68,221,255,240,19,131,122,206,214,232,136,199,114,157,211,48,7,241,193,150,248,\r
-78,116,175,124,36,173,140,98,38,54,151,68,44,50,188,58,25,193,19,59,80,122,186,186,110,37,209,75,133,152,37,120,29,70,115,83,\r
-164,159,221,209,55,146,177,217,76,193,113,71,114,150,143,120,46,229,219,57,216,188,86,198,7,177,40,70,146,91,18,52,110,36,161,\r
-54,182,53,209,174,46,244,73,223,102,125,28,247,80,117,198,100,36,35,61,153,54,85,6,154,209,109,170,227,36,21,235,132,153,100,\r
-255,214,78,144,211,27,73,217,110,87,218,11,7,105,142,119,235,233,75,198,251,236,199,135,9,106,43,39,117,244,198,17,66,69,148,\r
-60,152,245,141,42,42,167,200,136,246,245,81,33,191,95,68,35,177,21,145,68,106,61,134,157,242,117,70,179,25,91,101,117,141,148,\r
-35,217,156,142,36,225,239,234,248,209,50,156,48,201,171,212,207,217,71,17,202,193,205,90,35,177,126,44,225,40,182,130,157,38,\r
-110,150,106,180,82,233,8,182,67,148,166,54,38,34,216,27,105,66,52,213,18,199,222,180,106,40,129,101,171,92,107,149,21,193,60,\r
-117,161,237,148,158,51,114,239,52,135,87,112,127,74,119,30,227,45,37,63,83,208,220,203,35,234,140,169,160,148,143,153,54,147,\r
-220,189,13,56,47,144,35,102,118,167,201,21,51,173,158,116,47,185,116,87,133,69,14,139,189,193,109,153,131,27,88,201,177,50,17,\r
-192,107,101,175,58,87,188,131,67,9,57,226,177,174,94,117,29,164,162,184,149,121,163,89,161,66,9,214,201,104,214,74,51,149,78,\r
-198,135,217,113,70,51,181,115,101,213,204,120,215,164,209,172,230,200,128,153,25,47,140,117,218,204,182,87,131,63,182,137,230,\r
-116,60,145,64,86,41,66,128,234,199,97,7,71,116,222,130,111,13,82,126,60,251,13,128,10,226,99,66,53,121,227,214,154,56,22,150,\r
-10,11,148,27,183,50,142,157,175,212,245,253,177,116,52,193,83,162,146,112,206,28,222,1,84,85,88,52,71,207,48,51,177,14,45,217,\r
-83,171,90,114,197,237,9,119,219,242,115,168,215,143,224,157,70,108,114,38,148,99,123,18,145,36,44,85,48,200,79,140,113,111,103,\r
-66,5,239,64,34,158,232,143,29,51,92,139,36,185,147,246,59,37,85,37,205,30,246,141,228,177,95,55,169,60,105,246,225,81,237,199,\r
-223,104,29,182,87,57,147,42,18,26,41,51,77,5,41,142,153,35,47,123,228,69,90,13,34,123,42,149,102,167,26,237,135,86,171,135,171,\r
-101,157,201,85,181,166,140,71,82,25,82,71,125,27,163,241,169,76,40,220,18,205,138,109,147,142,154,205,135,225,8,54,193,148,29,\r
-28,149,3,231,167,198,4,69,79,38,25,179,251,116,90,52,22,219,16,79,43,119,240,166,176,96,50,1,10,21,145,26,137,30,48,102,71,179,\r
-251,133,163,30,138,225,101,163,201,178,148,221,155,198,209,123,233,39,117,168,237,197,145,238,141,166,200,197,215,169,97,45,235,\r
-145,203,155,141,129,150,160,242,64,228,244,167,187,23,169,8,47,6,200,57,160,162,134,91,137,141,221,228,224,183,28,42,228,107,\r
-182,115,229,114,70,75,124,75,202,36,223,192,17,123,194,64,52,153,238,143,196,244,190,229,25,24,29,10,49,72,98,136,228,80,24,212,\r
-131,57,96,46,152,71,98,152,110,119,72,186,92,186,11,218,106,232,94,135,216,39,221,1,153,247,180,28,10,236,48,232,23,162,236,\r
-15,235,232,167,14,249,69,137,252,2,122,194,33,46,20,238,192,99,242,140,192,219,6,93,44,170,107,46,119,18,189,224,48,246,201,228,\r
-128,187,224,39,21,244,103,41,8,77,45,161,119,37,185,103,183,27,242,45,145,127,129,33,94,23,197,181,67,31,24,244,69,33,119,\r
-44,17,69,69,209,37,50,21,112,210,18,145,231,66,125,105,119,64,46,216,42,215,13,214,208,175,165,184,134,239,118,184,252,3,154,\r
-44,184,155,94,181,197,18,227,108,241,170,184,71,184,103,203,167,169,65,238,149,131,242,41,49,56,36,159,223,253,210,94,33,157,\r
-158,101,53,75,106,151,44,57,169,221,160,179,60,103,26,98,143,152,191,228,150,74,195,120,76,132,69,233,248,240,100,67,62,42,164,\r
-40,42,117,74,121,42,122,226,20,78,195,229,145,179,14,56,61,46,114,9,151,116,25,213,213,114,96,182,83,86,203,212,108,90,104,\r
-247,96,161,188,70,94,171,20,7,43,215,201,235,199,230,142,40,206,76,241,126,78,238,231,30,95,88,78,3,16,235,232,45,67,94,45,111,\r
-224,252,55,28,200,160,189,60,98,244,138,193,215,125,14,153,62,3,242,18,135,72,67,124,104,176,64,205,27,85,250,162,114,218,171,\r
-13,174,179,13,206,182,197,245,134,56,136,121,89,183,174,166,109,93,91,45,157,37,118,171,90,247,27,242,75,242,187,2,21,39,213,\r
-208,159,132,56,159,7,171,236,19,185,51,176,206,200,73,202,38,195,117,129,52,100,94,175,40,46,148,131,1,92,131,172,13,5,232,235,\r
-82,62,196,214,129,243,165,63,32,19,1,89,216,32,251,15,108,147,195,107,233,81,105,60,36,206,81,133,50,255,60,57,16,184,170,125,\r
-199,249,240,5,41,219,232,65,93,173,224,252,96,249,85,116,151,225,60,243,103,226,66,249,182,24,70,23,191,109,56,174,146,183,136,\r
-95,137,95,162,252,196,243,219,232,106,97,155,202,71,41,32,239,63,11,93,202,229,46,185,185,75,63,161,173,114,233,108,116,38,108,\r
-227,107,50,242,30,23,242,196,37,134,247,77,177,224,68,33,12,207,189,66,214,136,242,252,147,157,30,167,183,222,153,183,195,229,\r
-169,21,197,37,114,119,195,18,151,247,68,17,24,207,249,99,51,229,106,17,40,160,159,25,226,74,140,125,208,16,231,202,176,240,151,\r
-72,239,108,217,23,168,48,232,60,81,51,217,73,74,153,53,197,73,47,135,171,233,97,67,60,137,46,210,107,134,24,116,23,68,203,233,\r
-2,41,46,66,229,135,12,186,79,4,106,119,172,27,218,62,225,124,146,149,226,75,178,44,40,171,164,229,240,63,46,74,243,229,84,100,\r
-148,187,75,69,233,210,210,220,210,149,165,178,180,186,212,97,91,85,40,43,9,171,83,70,236,11,228,20,182,23,101,147,109,69,150,\r
-5,202,42,72,10,135,231,210,160,240,79,253,194,30,199,129,242,105,226,161,114,33,14,4,132,248,33,120,96,50,138,133,87,138,75,131,\r
-51,247,236,113,236,173,168,22,183,86,144,225,162,2,174,33,252,179,80,231,80,80,236,13,222,84,137,203,125,124,121,170,82,200,\r
-131,224,210,42,114,149,78,42,242,195,247,253,246,191,122,24,223,87,5,147,115,167,227,178,159,47,119,243,229,41,190,188,201,151,\r
-189,51,28,103,75,18,128,165,91,235,255,12,227,128,7,44,18,7,102,8,241,12,56,52,3,3,31,26,47,246,135,132,184,27,60,15,222,4,\r
-123,102,10,113,7,120,9,188,11,246,86,11,177,31,28,2,7,102,193,14,60,80,35,196,173,181,66,92,83,39,28,207,128,131,117,176,9,59,\r
-197,43,243,96,55,95,138,115,23,72,241,205,5,250,251,114,246,239,10,88,102,254,78,135,191,67,103,254,86,135,191,79,103,254,94,\r
-39,243,187,78,254,155,29,254,54,157,249,187,29,23,141,254,237,142,225,179,203,248,119,17,34,104,255,142,103,106,1,108,130,182,\r
-13,255,31,54,225,179,127,183,195,255,111,77,6,237,251,242,223,250,24,218,158,255,239,152,35,104,255,142,225,132,57,246,47,29,\r
-184,174,250,191,111,62,187,175,252,119,69,255,7,207,224,91,10,144,52,0,0,0,0};\r
+{ 31,139,8,8,217,126,216,97,0,3,74,97,118,97,68,101,120,66,121,116,101,67,111,100,101,46,100,101,120,0,165,155,11,124,212,213,149,199,207,189,255,255,204,36,147,215,100,18,146,64,18,50,9,175,16,72,102,8,111,19,148,183,6,18,64,18,16,18,171,76,146,127,146,\r
+ 129,201,127,134,153,73,72,124,21,149,143,96,173,21,45,82,21,109,177,165,182,110,109,215,90,219,181,22,181,93,93,215,173,186,85,107,87,180,90,31,69,197,150,90,180,86,105,117,117,127,247,49,147,9,143,210,118,195,231,59,231,252,207,125,223,123,238,185,247,\r
+ 63,33,221,214,144,59,48,115,54,125,253,172,186,247,86,249,42,166,141,253,112,218,236,231,195,83,47,91,120,183,99,205,99,123,255,208,184,125,22,81,148,136,134,214,207,242,146,254,57,56,147,168,146,41,251,60,240,129,73,180,4,242,121,7,81,9,228,241,12,162,\r
+ 203,33,31,200,36,66,18,237,207,33,218,52,153,200,151,75,212,94,78,116,33,184,24,116,130,205,192,6,215,128,107,193,245,96,55,216,3,110,1,251,192,215,192,195,224,5,240,18,248,13,120,3,188,5,126,15,142,129,63,131,156,241,232,7,184,8,12,131,61,224,126,240,\r
+ 60,248,12,140,173,32,170,7,231,130,207,129,65,112,19,120,8,60,7,142,130,137,62,162,101,96,8,220,3,14,131,194,74,162,6,208,11,246,130,23,64,69,21,198,2,46,7,119,130,159,129,195,192,152,64,84,14,2,160,13,92,2,110,0,247,129,199,193,155,224,47,160,122,34,\r
+ 209,82,208,1,194,224,10,176,3,220,4,110,6,183,130,253,224,0,184,7,220,7,126,12,30,1,143,129,39,192,211,224,57,240,2,120,5,188,14,222,1,71,193,123,224,35,240,9,48,38,17,101,130,28,224,5,227,64,37,152,4,166,130,5,96,45,184,8,108,6,131,224,42,240,37,112,\r
+ 27,184,11,220,7,30,6,79,130,151,192,49,112,28,56,176,174,121,160,6,204,6,243,192,74,208,10,58,64,23,8,131,56,216,14,174,7,119,128,123,192,15,193,65,240,34,120,21,188,1,222,1,89,83,136,138,64,57,152,6,230,129,117,32,14,174,0,55,128,187,192,15,193,35,224,\r
+ 73,240,34,56,12,254,2,114,171,137,202,192,20,48,15,44,7,171,193,6,96,129,109,96,39,184,29,124,7,252,4,188,8,94,5,111,130,35,128,79,37,42,0,147,192,92,176,28,180,130,16,184,4,92,7,110,3,223,2,7,193,227,224,85,240,14,248,35,120,31,124,10,140,26,248,15,\r
+ 152,0,102,129,115,64,11,184,0,92,12,182,128,1,176,27,236,3,7,192,67,224,41,240,75,240,6,56,2,142,129,227,224,99,192,166,17,185,65,33,168,2,53,32,0,230,128,38,112,17,136,130,171,193,126,240,3,240,56,120,21,188,13,62,4,206,233,40,15,42,64,29,152,11,22,\r
+ 129,53,224,34,208,3,34,96,24,108,7,95,4,251,192,215,193,207,192,99,224,105,240,30,200,171,197,122,129,82,48,13,204,7,107,65,39,136,130,47,128,59,193,195,224,73,240,18,120,11,124,8,204,58,204,51,152,0,234,65,51,88,11,54,128,77,160,15,216,32,14,134,193,\r
+ 213,224,26,112,61,216,11,110,7,223,5,15,128,159,131,23,193,155,224,8,248,61,248,35,248,19,248,8,124,12,62,3,78,196,36,132,40,202,2,69,160,152,84,220,26,11,198,129,82,80,6,16,82,8,97,131,16,22,8,97,128,176,237,9,91,156,176,125,9,219,138,224,254,4,119,\r
+ 37,184,28,193,101,8,203,77,88,30,194,244,18,166,133,48,60,66,115,228,7,1,48,3,212,3,132,79,66,88,165,217,96,14,152,171,227,232,124,112,22,104,0,141,96,1,56,27,156,3,22,130,69,96,49,169,88,187,12,156,7,54,128,78,208,5,186,129,69,106,124,201,31,151,150,\r
+ 247,151,170,49,51,253,236,214,186,176,139,121,224,218,158,173,245,131,176,231,165,213,229,213,115,246,152,182,231,106,123,158,78,75,234,99,180,238,209,243,42,234,47,208,250,83,186,108,73,90,157,98,174,159,47,85,186,152,227,151,117,158,201,105,245,76,\r
+ 213,245,228,107,253,48,244,66,173,31,45,85,109,138,57,255,64,215,35,244,79,116,61,181,186,158,49,122,29,204,50,213,31,177,22,217,101,106,14,235,117,158,38,173,139,182,86,104,189,16,121,86,106,93,180,219,172,117,31,236,45,90,15,64,95,165,245,70,232,171,\r
+ 181,126,30,244,53,90,111,131,126,190,214,47,132,222,170,245,238,52,123,56,77,79,64,95,167,245,203,210,236,187,210,244,221,105,250,45,105,117,238,79,179,127,27,122,155,214,239,77,179,31,40,29,209,197,156,175,213,186,152,207,100,61,15,164,229,23,243,185,\r
+ 94,235,63,133,253,2,173,63,145,150,231,80,154,254,90,153,242,205,153,122,110,55,106,253,8,236,237,90,63,150,166,127,2,189,67,235,25,226,142,160,117,15,244,207,105,189,76,220,27,180,94,13,253,34,173,7,210,236,194,199,54,105,125,30,236,65,173,159,151,150,\r
+ 191,173,92,248,57,163,97,82,50,135,137,125,63,137,226,164,228,191,73,201,232,65,45,15,106,249,144,150,15,107,249,136,206,255,115,18,177,194,71,110,166,100,1,19,113,99,38,253,23,9,89,65,89,76,196,16,149,94,161,211,43,144,82,196,132,207,23,209,86,225,79,\r
+ 216,117,15,72,89,65,79,72,89,78,191,148,114,38,189,35,101,22,29,149,62,63,153,150,67,58,16,129,254,68,98,127,58,233,70,41,199,208,126,200,76,68,49,67,202,89,244,33,137,125,94,45,159,179,180,61,11,17,225,35,57,110,245,156,135,118,111,144,178,136,110,210,\r
+ 207,183,106,121,167,152,127,157,46,228,110,41,77,186,89,63,239,147,210,160,219,73,237,211,59,180,252,170,148,140,238,210,242,91,36,246,37,167,189,82,78,165,111,146,216,131,147,100,251,5,136,120,191,149,114,62,29,150,178,148,222,38,177,95,107,105,64,203,\r
+ 15,72,196,233,57,244,31,36,226,72,54,61,47,229,88,122,159,68,44,81,227,24,139,136,43,100,25,162,230,143,164,172,161,191,74,121,14,153,114,93,2,50,189,28,51,176,67,202,18,218,165,159,175,149,114,30,189,43,215,171,78,230,27,143,26,95,39,177,78,170,92,5,\r
+ 236,61,90,246,74,153,71,125,82,142,37,7,83,210,41,215,115,178,204,239,195,10,133,164,244,211,102,41,23,209,22,41,11,40,172,101,191,148,11,201,150,114,44,13,105,121,185,148,115,233,74,41,43,233,58,41,189,116,189,148,57,244,37,41,157,180,71,251,205,94,\r
+ 157,254,21,41,103,211,45,82,102,210,215,164,116,211,215,117,190,111,72,153,65,7,164,84,235,32,252,236,110,41,203,232,95,180,252,142,150,247,104,127,252,174,148,227,233,123,218,254,175,186,220,189,90,126,95,203,251,164,244,209,15,164,108,160,251,165,156,\r
+ 67,143,105,249,184,148,19,232,5,41,171,232,144,150,47,106,249,146,78,255,181,126,126,89,203,87,164,204,165,223,72,57,133,94,149,114,58,189,38,229,217,244,134,148,202,143,124,218,143,196,243,155,122,255,188,37,165,242,43,145,255,136,148,141,116,76,202,\r
+ 122,58,174,229,95,164,156,70,159,72,57,142,62,149,114,6,125,166,159,137,169,124,76,75,206,84,186,193,212,188,20,50,113,110,21,211,109,36,228,98,122,84,238,87,78,63,147,50,159,188,76,156,77,202,95,167,97,103,124,153,196,249,100,208,21,82,114,122,154,196,\r
+ 25,85,72,255,78,226,190,48,86,251,171,218,83,201,51,19,175,88,116,33,98,220,21,250,208,26,175,237,226,204,19,49,93,164,39,32,239,208,233,21,186,252,180,180,242,59,144,126,175,78,247,145,58,87,197,153,120,143,46,191,7,242,144,78,23,119,129,169,208,3,245,\r
+ 234,190,112,86,189,178,173,134,92,15,12,157,190,9,108,214,121,226,210,110,72,157,251,213,189,161,131,185,41,234,17,55,168,14,158,133,181,204,64,45,162,173,28,191,186,59,121,89,91,167,155,182,122,102,193,158,197,139,240,218,56,131,115,115,62,55,201,229,\r
+ 201,167,182,206,44,218,234,171,160,24,118,191,200,215,214,165,242,26,148,101,110,93,51,135,22,15,184,249,124,254,135,207,108,143,24,143,203,83,253,182,169,219,159,224,87,119,152,42,204,104,212,115,153,28,173,104,91,244,187,214,175,238,96,167,107,219,\r
+ 160,124,230,245,206,156,50,246,228,54,3,115,105,177,35,27,49,227,24,218,20,113,202,205,108,223,20,68,169,108,86,253,214,201,185,231,201,220,213,239,136,248,107,202,254,44,241,171,181,107,139,170,124,34,165,136,203,123,9,159,143,60,94,196,151,182,173,\r
+ 238,244,116,206,118,176,155,93,119,109,115,206,199,200,16,215,143,25,232,175,24,227,106,191,136,247,152,89,111,14,198,184,13,54,47,93,232,201,150,119,180,12,60,137,177,110,240,171,179,182,192,89,72,85,60,27,249,196,44,180,197,115,168,109,102,46,217,158,\r
+ 165,200,149,205,230,179,198,17,155,239,60,236,197,145,28,139,144,195,109,172,157,40,222,21,25,125,191,237,70,50,204,217,155,198,209,186,56,230,193,40,34,175,113,33,180,100,254,182,68,14,250,29,192,72,178,77,209,127,83,206,195,108,90,226,16,249,231,27,\r
+ 46,154,187,201,65,222,2,81,70,180,85,140,56,103,123,138,196,200,78,104,163,250,191,197,90,10,159,187,218,175,238,116,29,222,92,61,206,42,204,97,212,39,246,82,135,7,20,228,201,49,51,249,143,232,203,126,245,253,67,212,35,110,123,185,41,251,190,148,189,\r
+ 94,218,185,190,21,127,195,175,252,185,205,147,39,247,132,240,32,209,238,119,252,234,94,220,230,203,67,31,197,205,27,227,172,244,160,215,101,104,57,55,149,239,190,211,230,43,151,249,114,225,241,98,36,63,70,190,167,132,223,185,188,69,81,95,9,226,111,149,\r
+ 153,133,222,56,209,171,142,61,69,120,170,160,104,160,150,246,100,118,236,41,192,83,57,158,38,203,167,66,212,187,16,107,157,109,142,115,68,81,47,86,16,122,133,89,132,114,249,84,102,58,96,75,32,190,187,205,121,230,231,168,194,45,158,241,158,74,237,183,\r
+ 123,161,69,113,227,185,112,223,24,104,33,156,77,182,111,179,252,220,130,243,190,10,117,70,61,242,60,54,11,105,194,162,89,52,153,137,27,161,237,51,209,243,54,209,39,7,246,175,207,65,162,70,23,90,245,26,182,103,72,247,228,99,242,78,158,208,51,7,227,233,\r
+ 204,40,166,150,12,167,203,91,92,150,145,37,53,59,16,167,54,103,182,49,207,40,36,47,247,78,156,176,116,46,121,29,91,61,131,152,135,108,103,139,211,116,120,199,120,165,180,3,151,210,151,77,225,105,194,187,197,168,84,239,247,80,245,157,57,102,245,7,224,\r
+ 125,112,12,188,4,196,225,97,152,242,61,96,228,103,251,57,244,15,61,159,248,163,210,197,93,178,8,251,241,18,82,247,23,110,84,223,202,166,124,133,213,221,204,248,244,59,88,205,62,70,58,186,224,221,47,160,124,166,213,231,149,113,214,148,145,15,239,125,1,\r
+ 237,99,129,213,84,105,228,98,207,59,100,188,155,27,80,49,54,186,174,143,42,151,184,165,63,39,203,44,77,166,5,22,163,76,182,244,193,100,90,75,42,237,236,84,154,75,222,254,16,135,117,218,160,179,77,70,6,81,167,67,239,123,43,160,246,76,235,66,111,90,124,\r
+ 49,224,139,194,18,13,52,227,118,84,253,215,145,241,244,235,186,196,123,113,59,198,148,171,251,32,126,226,1,21,251,189,158,188,212,158,185,60,144,220,51,133,178,79,73,251,213,218,190,206,51,70,182,207,245,222,187,54,160,222,61,109,207,114,217,87,25,235,\r
+ 80,159,151,170,63,53,116,59,55,4,212,57,146,43,203,169,55,211,175,164,217,156,58,126,127,245,12,99,91,161,199,150,204,255,173,51,228,95,153,154,11,213,143,123,79,209,143,7,78,97,123,36,205,102,234,182,30,15,168,239,11,188,76,124,163,208,17,224,164,164,\r
+ 65,27,103,32,238,29,219,24,112,209,198,128,83,91,51,225,199,88,73,207,198,128,137,244,12,236,199,177,232,79,21,249,88,190,30,175,88,147,95,5,212,89,125,234,254,183,45,46,162,232,218,86,50,207,175,62,46,124,195,144,254,247,202,105,203,204,92,246,217,103,\r
+ 114,220,11,23,144,25,20,101,220,104,71,156,213,191,11,168,239,57,218,182,231,99,157,196,41,229,198,73,55,142,90,175,68,20,241,228,98,215,187,177,251,189,66,154,182,167,64,72,135,141,53,204,164,44,167,107,251,96,70,147,246,17,177,166,110,180,37,124,244,\r
+ 163,128,250,174,195,235,105,141,161,39,226,140,101,56,99,153,58,233,166,139,87,62,18,41,54,206,45,85,95,150,144,78,215,86,182,99,208,217,130,249,173,254,67,36,48,150,118,102,226,228,59,98,123,206,194,8,171,197,69,143,171,113,38,191,191,17,178,64,147,\r
+ 173,207,218,49,51,212,123,159,151,90,175,66,219,78,217,182,115,62,51,208,242,252,204,76,180,137,158,227,4,247,86,213,87,186,40,178,112,28,221,242,32,90,121,223,246,184,97,207,102,243,152,184,89,40,221,246,13,11,191,117,136,154,68,31,179,68,31,175,100,\r
+ 123,84,31,189,158,234,23,212,220,139,245,154,57,67,125,239,48,122,238,213,136,133,77,140,213,73,110,30,93,187,10,171,134,178,127,38,189,163,137,22,205,24,241,169,76,29,59,86,207,80,107,25,217,80,74,109,131,233,181,206,67,155,202,135,99,240,97,81,38,79,\r
+ 175,229,38,36,151,161,162,214,103,145,219,16,35,103,134,156,117,150,199,108,79,14,234,119,103,138,181,203,165,44,215,175,110,252,140,166,177,15,165,215,86,191,215,250,156,23,210,246,229,227,140,21,235,44,98,129,88,151,2,33,157,174,103,7,51,214,136,17,\r
+ 231,87,191,124,230,156,107,85,206,255,60,115,206,243,145,211,246,136,211,210,157,229,205,159,91,90,67,222,202,9,101,179,113,18,44,193,253,216,59,110,246,131,149,36,106,17,117,124,79,212,225,43,20,146,121,29,75,29,217,142,171,214,61,62,198,246,141,81,\r
+ 150,162,165,206,108,231,85,61,143,23,37,235,61,228,118,179,234,215,208,143,171,113,83,199,165,254,135,55,190,238,102,25,243,221,37,244,247,142,96,42,245,124,150,222,159,127,166,39,162,166,234,95,255,227,61,88,163,123,48,233,255,221,131,53,178,7,88,102,\r
+ 166,190,29,20,190,37,226,144,95,75,17,191,196,187,91,92,250,30,151,119,150,23,102,168,239,50,209,71,156,251,46,202,230,227,140,255,37,111,225,132,165,56,247,29,157,78,156,251,242,12,143,83,189,41,238,145,46,244,59,7,251,31,124,226,245,78,168,194,169,\r
+ 111,136,83,63,3,39,123,139,201,13,113,218,111,229,213,239,230,240,234,163,224,119,224,136,240,247,124,244,173,84,238,93,68,61,62,189,168,166,196,168,174,158,50,189,174,38,45,222,26,245,35,123,195,208,214,172,122,117,7,158,199,93,36,102,196,70,142,92,\r
+ 242,46,172,254,88,140,79,197,228,194,122,21,7,196,29,74,220,118,199,241,159,202,59,84,37,90,171,192,251,219,60,68,15,219,115,9,118,168,155,45,96,5,152,109,59,48,137,2,24,241,185,50,191,29,152,72,30,179,109,70,1,110,182,117,178,254,100,138,151,219,129,\r
+ 9,228,225,42,205,47,230,247,125,146,191,239,18,63,201,239,92,197,123,206,116,216,102,37,191,60,213,63,11,79,120,94,115,194,179,40,95,72,234,236,205,71,239,152,182,9,124,90,102,232,116,175,62,103,199,105,123,133,150,92,227,211,243,53,141,230,74,123,173,\r
+ 182,215,34,58,43,201,100,60,101,250,159,131,70,206,116,174,125,35,121,150,155,41,157,105,187,43,245,93,50,199,76,179,84,126,33,115,82,101,132,116,234,52,39,242,113,109,115,105,153,169,101,242,187,232,92,217,43,210,247,11,49,198,153,122,44,62,105,159,\r
+ 169,125,120,102,170,215,170,252,44,45,103,235,114,201,126,10,153,163,219,23,122,94,42,61,47,109,76,57,169,177,22,167,250,161,234,246,232,246,124,169,156,106,92,62,157,155,145,122,223,102,213,132,247,41,103,99,200,14,37,206,38,126,118,3,21,45,137,244,\r
+ 71,35,182,101,39,214,88,86,108,125,200,218,86,183,57,56,24,36,182,156,248,242,38,98,77,196,155,166,2,168,43,136,175,104,166,242,21,3,93,214,162,174,46,43,30,15,117,134,194,161,196,240,170,72,183,181,38,22,25,12,117,91,49,42,94,105,13,119,70,130,177,238,\r
+ 165,161,120,127,40,30,111,14,197,19,150,141,4,214,76,188,25,181,53,163,154,230,102,50,154,241,128,143,21,226,163,153,138,154,131,118,119,44,18,234,246,7,163,81,255,162,174,68,104,16,53,55,208,172,209,246,104,52,28,234,10,38,66,17,123,98,50,79,115,168,\r
+ 199,234,26,238,10,91,75,130,225,112,103,176,107,75,188,129,198,158,174,84,122,82,87,196,70,207,18,254,37,66,14,37,210,147,122,99,193,104,95,168,43,238,95,18,180,7,131,168,112,252,41,146,34,225,72,108,121,40,156,176,98,167,79,111,9,38,98,161,161,6,154,\r
+ 250,55,211,71,85,85,114,114,214,53,193,144,141,254,21,159,156,178,214,234,66,66,65,42,33,18,247,47,30,176,187,195,86,3,21,166,27,155,22,135,236,110,81,251,72,29,131,88,106,63,22,107,217,160,37,42,31,55,58,161,37,34,166,75,167,77,29,157,38,156,100,226,\r
+ 106,123,121,164,107,32,190,164,47,104,247,90,201,69,78,239,74,42,107,250,144,82,198,115,99,145,129,104,3,205,57,57,165,45,102,89,171,59,227,86,108,208,138,161,149,115,195,145,206,96,184,57,56,28,25,72,140,52,83,241,183,203,53,208,140,209,25,130,233,254,\r
+ 234,31,229,189,45,65,59,216,43,138,212,255,221,69,132,195,55,217,61,145,147,250,127,134,50,201,77,210,64,117,163,203,133,236,232,64,162,223,74,244,69,186,253,139,131,113,84,142,103,248,165,141,229,149,94,59,233,244,249,151,117,135,18,145,152,234,78,205,\r
+ 233,179,157,84,101,237,25,242,182,72,61,53,59,231,52,119,69,250,253,177,254,120,216,191,25,1,192,127,82,216,152,248,55,227,66,3,45,63,99,5,167,137,28,19,71,175,236,252,127,182,158,6,170,60,83,209,6,170,106,238,14,134,7,67,91,252,65,219,142,36,100,204,\r
+ 240,47,179,187,194,145,120,200,238,93,18,14,198,101,48,56,57,79,19,38,54,166,211,43,79,145,222,98,245,119,234,12,22,178,148,159,34,75,107,168,215,14,38,6,98,150,216,48,34,6,251,195,216,91,126,236,176,88,171,181,117,192,178,187,144,146,159,158,162,154,\r
+ 171,74,51,53,133,195,86,111,48,172,150,97,217,80,151,21,85,139,61,241,20,121,98,189,3,253,24,123,90,174,130,244,92,8,138,189,106,210,70,140,171,34,173,3,93,125,202,51,210,202,121,211,178,172,238,220,44,99,82,121,154,173,213,234,26,136,193,33,78,83,164,\r
+ 21,49,208,238,21,30,57,98,139,89,61,97,212,131,110,12,70,84,232,110,11,198,122,173,244,222,142,59,69,118,213,181,6,26,163,210,6,18,161,176,127,81,44,22,28,22,78,208,64,121,105,102,97,33,207,9,134,6,50,219,54,174,89,70,217,233,62,71,108,61,241,245,77,\r
+ 228,88,223,132,31,168,43,200,185,126,69,211,242,229,120,155,135,20,9,43,68,2,30,196,193,182,126,69,59,242,8,69,28,110,235,165,169,185,29,169,205,237,56,250,214,183,163,112,187,172,136,181,147,209,46,202,225,163,89,168,205,228,104,95,33,116,19,2,199,101,\r
+ 187,176,226,152,116,182,55,75,179,67,72,216,59,112,54,119,52,145,183,227,100,103,40,232,56,197,90,184,85,92,154,24,8,4,82,250,140,52,189,62,77,159,153,166,207,74,211,103,167,233,115,210,244,185,105,250,60,232,89,74,95,30,14,246,198,41,103,84,64,164,194,\r
+ 224,41,2,47,57,131,50,34,137,146,66,54,7,59,173,48,101,4,245,241,78,99,131,221,221,167,62,6,40,51,168,125,56,78,172,147,242,197,225,191,120,32,145,136,216,107,98,104,198,234,38,103,103,4,143,253,144,242,80,36,103,151,60,207,201,213,37,143,173,110,114,\r
+ 224,222,16,140,81,86,151,8,85,17,156,178,139,18,226,33,117,50,83,174,124,104,139,5,237,120,79,36,214,79,57,226,214,128,227,56,46,115,163,34,117,121,64,69,145,1,60,151,118,197,172,96,226,228,48,40,194,51,153,221,161,158,30,98,22,57,44,113,174,146,175,\r
+ 7,135,242,41,179,198,23,15,183,137,90,51,69,14,121,206,146,163,71,138,236,158,145,83,183,155,178,228,147,136,92,77,221,84,138,237,49,170,182,229,105,137,101,39,38,142,186,180,101,202,84,185,10,121,41,181,37,24,223,130,54,198,8,195,200,13,74,223,150,40,\r
+ 7,102,17,154,176,78,86,44,78,25,226,81,184,32,185,133,166,51,101,139,29,43,198,218,22,234,183,100,43,231,89,161,222,190,4,21,64,149,167,76,122,31,133,177,89,239,246,213,118,43,166,210,178,101,21,216,213,193,86,68,73,85,133,218,227,178,163,114,17,16,86,\r
+ 229,220,103,143,24,80,153,11,79,107,131,219,54,36,149,141,148,37,148,72,36,33,90,35,15,30,90,135,225,71,253,173,216,227,161,46,139,114,97,89,103,135,132,39,136,113,201,222,156,120,175,144,163,94,31,74,57,180,40,115,1,150,40,178,173,45,178,5,157,45,75,\r
+ 61,203,76,97,11,71,80,52,28,28,94,30,11,98,252,38,82,55,200,207,141,196,250,168,4,139,8,167,28,181,42,231,69,68,43,121,58,37,26,93,19,28,16,126,236,73,25,214,90,113,120,124,202,178,56,229,242,148,163,44,56,252,150,70,182,97,55,165,30,215,69,169,48,245,\r
+ 32,15,198,243,66,221,221,232,173,110,166,37,130,54,100,153,81,134,88,176,55,89,167,52,160,26,93,167,188,142,82,129,126,176,98,98,99,104,239,201,232,11,198,149,191,22,247,193,179,90,35,61,122,153,99,145,126,53,49,200,130,210,210,187,205,190,8,66,48,11,\r
+ 145,27,222,177,90,70,245,56,25,161,254,126,202,19,239,39,161,96,120,73,48,26,111,193,130,80,142,54,180,90,225,101,118,119,42,29,143,240,139,24,54,138,188,190,180,13,71,45,202,150,234,197,234,42,67,25,104,108,125,48,60,128,189,31,194,81,178,197,66,99,\r
+ 241,38,59,158,8,226,56,69,106,124,117,52,136,179,149,198,134,226,109,17,156,109,203,134,162,216,239,210,5,151,217,65,172,96,55,234,142,235,213,36,215,22,107,120,137,232,79,241,150,211,188,229,228,36,19,90,251,196,140,58,194,50,154,229,192,7,172,152,232,\r
+ 222,42,220,55,200,12,91,61,9,114,134,45,187,55,209,71,78,221,85,102,147,105,11,63,113,217,214,182,85,66,201,176,147,161,35,219,78,223,174,206,72,167,136,65,100,70,194,221,125,242,115,27,229,71,236,228,27,209,18,25,131,176,159,70,76,75,173,120,34,22,25,\r
+ 22,142,51,98,212,206,149,86,50,233,93,165,35,166,214,224,160,149,156,47,181,7,211,242,203,201,31,93,69,107,34,18,141,194,84,140,80,33,251,113,194,197,19,157,183,225,91,219,40,39,146,254,6,65,185,145,81,49,158,178,35,182,220,12,50,124,80,102,196,78,58,\r
+ 118,142,84,91,6,194,137,80,84,44,137,124,132,115,102,136,163,67,22,69,142,214,208,37,86,50,72,162,38,181,180,178,38,103,68,45,184,75,201,139,81,110,0,81,63,129,24,230,136,74,199,118,71,131,49,228,148,97,34,39,58,202,189,29,81,25,245,203,163,145,232,64,\r
+ 248,180,113,158,197,200,21,83,239,164,84,21,179,122,133,111,196,78,255,186,74,101,49,171,31,67,85,195,95,109,159,112,200,57,98,50,98,26,113,43,65,185,113,17,91,83,47,139,148,141,103,57,137,194,83,169,56,253,169,73,13,90,238,30,81,44,237,78,47,139,53,\r
+ 39,61,146,74,240,116,202,183,57,26,19,79,6,201,117,161,180,168,87,122,74,179,184,76,7,113,122,198,85,216,148,14,156,19,31,21,46,221,201,199,176,234,211,5,161,112,120,85,36,33,221,33,59,142,13,147,12,80,40,136,167,84,244,64,102,225,104,170,95,184,42,34,\r
+ 25,94,54,242,88,18,87,189,105,26,105,75,143,212,148,199,144,153,232,11,197,201,41,62,39,6,180,156,1,171,56,148,12,212,4,85,76,68,198,64,162,103,158,140,253,108,144,28,131,50,106,184,164,88,221,67,166,120,75,162,60,241,153,238,92,153,194,208,22,89,23,\r
+ 183,200,51,120,210,105,49,24,138,37,6,130,97,125,190,185,7,71,166,130,109,35,54,68,124,40,0,102,128,122,48,19,204,34,54,76,223,52,57,237,229,174,220,246,90,186,199,100,183,112,87,57,207,122,150,15,149,111,54,232,151,172,228,141,149,244,144,201,175,229,\r
+ 176,231,210,163,38,187,142,185,202,159,228,151,148,191,111,208,245,172,166,246,38,7,209,115,166,113,11,143,111,115,229,62,90,65,191,229,140,80,85,35,253,142,147,107,122,135,193,223,103,57,215,26,236,93,86,80,55,244,145,65,215,48,190,185,145,229,231,135,\r
+ 26,121,188,220,65,141,44,203,137,242,92,117,128,207,217,200,87,110,171,165,95,112,118,187,104,237,68,121,8,85,230,222,79,175,40,209,104,92,205,126,207,126,204,92,211,249,179,212,192,63,101,219,248,51,108,219,16,127,227,210,215,118,49,238,112,47,170,109,\r
+ 172,107,108,60,187,195,160,237,204,125,153,193,174,100,179,27,239,170,52,140,95,176,0,43,30,19,24,111,240,167,24,103,249,197,14,206,207,71,87,28,204,97,56,221,124,218,1,135,219,73,78,230,228,78,163,166,134,15,78,119,240,26,30,159,78,115,85,23,230,242,\r
+ 219,249,29,82,49,133,242,85,254,181,209,214,148,226,72,38,239,23,143,215,137,46,127,161,140,6,33,86,210,97,131,239,227,119,10,251,235,38,12,180,75,76,25,189,100,136,207,47,152,124,224,82,200,29,38,27,128,120,215,16,2,37,111,150,207,215,149,209,167,134,\r
+ 202,176,91,101,56,46,51,208,141,6,59,138,133,89,185,178,182,125,101,123,29,125,158,93,38,75,221,107,240,27,249,143,24,10,150,214,210,219,140,237,130,186,139,21,229,249,104,15,231,79,136,199,242,157,124,76,57,239,47,231,121,13,117,43,45,62,176,226,66,\r
+ 62,188,130,30,228,198,19,108,135,76,231,249,215,240,88,249,222,142,205,187,12,199,110,206,253,214,57,116,175,46,155,187,211,87,182,151,238,54,28,151,63,205,190,196,63,100,151,160,35,251,13,243,54,126,55,123,129,253,15,210,23,236,108,167,91,84,171,59,\r
+ 249,19,84,206,31,252,124,249,74,35,51,206,155,13,215,245,220,224,143,210,70,190,112,58,43,200,11,40,60,205,70,214,51,140,47,104,52,178,143,177,57,11,24,51,220,15,50,94,203,202,114,206,113,184,29,217,51,28,89,155,157,238,58,86,80,196,47,109,104,116,102,\r
+ 47,96,229,99,132,125,180,145,47,103,229,185,244,136,193,110,197,12,251,12,182,139,7,152,183,136,103,79,199,40,43,12,218,201,106,199,59,72,42,211,38,56,232,245,64,13,253,196,96,207,161,139,244,170,193,134,92,185,161,50,58,206,216,13,40,252,152,65,7,89,\r
+ 121,221,230,149,67,155,198,238,36,94,201,110,228,37,62,94,197,35,166,247,25,86,156,195,39,194,80,230,42,102,197,11,139,51,139,151,22,243,226,154,98,83,229,170,144,185,224,143,197,231,166,242,231,242,9,34,63,43,25,175,20,94,82,94,82,65,156,153,238,221,\r
+ 62,230,157,124,229,118,243,80,217,20,118,188,140,177,67,229,140,125,0,142,141,71,50,203,230,108,183,111,218,246,237,230,193,138,233,236,181,10,50,156,148,43,74,48,111,45,202,28,168,100,187,124,207,139,143,163,226,99,71,21,227,183,131,199,170,200,89,82,\r
+ 154,239,133,135,123,213,191,153,200,124,180,10,89,30,152,140,143,103,196,199,17,241,177,99,10,62,246,139,143,131,83,204,171,56,49,32,164,75,235,127,47,133,192,13,206,98,135,166,96,201,171,25,59,80,109,176,7,170,139,216,51,208,143,128,47,78,101,108,63,\r
+ 184,31,28,6,123,106,24,251,54,56,8,158,1,7,166,97,232,224,139,211,25,123,13,188,92,203,216,243,117,204,220,237,103,230,1,63,210,252,14,182,127,22,99,247,204,230,236,167,224,240,108,79,218,239,7,146,50,249,119,57,226,251,234,228,223,230,136,239,177,147,\r
+ 127,159,147,252,93,169,248,27,29,241,29,118,242,239,116,156,52,242,183,58,134,71,127,191,157,139,58,125,234,247,66,27,160,59,125,42,143,248,255,103,204,163,236,226,255,156,113,159,106,87,252,109,143,161,243,139,255,247,101,250,212,239,37,166,214,171,\r
+ 95,84,136,178,242,255,173,121,84,95,197,223,17,253,31,67,245,215,66,128,52,0,0,0,0 };\r
\r
//==============================================================================\r
#if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra\r
getInset (AndroidDisplayCutout.getSafeInsetRight) };\r
}\r
\r
+/* The usage of the KeyPress class relies on its keyCode member having the standard ASCII values\r
+ represent ASCII keycodes. However in the native Android keycodes the values for special keys\r
+ e.g. RETURN, F1-F12 overlap with the ASCII range. Hence we need to translate them.\r
+*/\r
+static constexpr int translateAndroidKeyCode (int keyCode) noexcept\r
+{\r
+ switch (keyCode)\r
+ {\r
+ case 7: return '0';\r
+ case 8: return '1';\r
+ case 9: return '2';\r
+ case 10: return '3';\r
+ case 11: return '4';\r
+ case 12: return '5';\r
+ case 13: return '6';\r
+ case 14: return '7';\r
+ case 15: return '8';\r
+ case 16: return '9';\r
+ case 17: return '*';\r
+ case 18: return '#';\r
+ case 19: return KeyPress::upKey; // KEYCODE_DPAD_UP\r
+ case 20: return KeyPress::downKey; // KEYCODE_DPAD_DOWN\r
+ case 21: return KeyPress::leftKey; // KEYCODE_DPAD_LEFT\r
+ case 22: return KeyPress::rightKey; // KEYCODE_DPAD_RIGHT\r
+ case 29: return 'A';\r
+ case 30: return 'B';\r
+ case 31: return 'C';\r
+ case 32: return 'D';\r
+ case 33: return 'E';\r
+ case 34: return 'F';\r
+ case 35: return 'G';\r
+ case 36: return 'H';\r
+ case 37: return 'I';\r
+ case 38: return 'J';\r
+ case 39: return 'K';\r
+ case 40: return 'L';\r
+ case 41: return 'M';\r
+ case 42: return 'N';\r
+ case 43: return 'O';\r
+ case 44: return 'P';\r
+ case 45: return 'Q';\r
+ case 46: return 'R';\r
+ case 47: return 'S';\r
+ case 48: return 'T';\r
+ case 49: return 'U';\r
+ case 50: return 'V';\r
+ case 51: return 'W';\r
+ case 52: return 'X';\r
+ case 53: return 'Y';\r
+ case 54: return 'Z';\r
+ case 55: return ',';\r
+ case 56: return '.';\r
+ case 61: return KeyPress::tabKey; // KEYCODE_TAB\r
+ case 62: return KeyPress::spaceKey; // KEYCODE_SPACE\r
+ case 66: return KeyPress::returnKey; // KEYCODE_ENTER\r
+ case 67: return KeyPress::backspaceKey; // KEYCODE_DEL\r
+ case 68: return '`';\r
+ case 69: return '-';\r
+ case 70: return '=';\r
+ case 71: return '[';\r
+ case 72: return ']';\r
+ case 73: return '\\';\r
+ case 74: return ';';\r
+ case 75: return '\'';\r
+ case 76: return '/';\r
+ case 77: return '@';\r
+ case 81: return '+';\r
+ case 85: return KeyPress::playKey; // KEYCODE_MEDIA_PLAY_PAUSE\r
+ case 86: return KeyPress::stopKey; // KEYCODE_MEDIA_STOP\r
+ case 87: return KeyPress::fastForwardKey; // KEYCODE_MEDIA_NEXT\r
+ case 88: return KeyPress::rewindKey; // KEYCODE_MEDIA_PREVIOUS\r
+ case 92: return KeyPress::pageUpKey; // KEYCODE_PAGE_UP\r
+ case 93: return KeyPress::pageDownKey; // KEYCODE_PAGE_DOWN\r
+ case 111: return KeyPress::escapeKey; // KEYCODE_ESCAPE\r
+ case 112: return KeyPress::deleteKey; // KEYCODE_FORWARD_DEL\r
+ case 122: return KeyPress::homeKey; // KEYCODE_MOVE_HOME\r
+ case 123: return KeyPress::endKey; // KEYCODE_MOVE_END\r
+ case 124: return KeyPress::insertKey; // KEYCODE_INSERT\r
+ case 131: return KeyPress::F1Key; // KEYCODE_F1\r
+ case 132: return KeyPress::F2Key; // KEYCODE_F2\r
+ case 133: return KeyPress::F3Key; // KEYCODE_F3\r
+ case 134: return KeyPress::F4Key; // KEYCODE_F4\r
+ case 135: return KeyPress::F5Key; // KEYCODE_F5\r
+ case 136: return KeyPress::F6Key; // KEYCODE_F6\r
+ case 137: return KeyPress::F7Key; // KEYCODE_F7\r
+ case 138: return KeyPress::F8Key; // KEYCODE_F8\r
+ case 139: return KeyPress::F9Key; // KEYCODE_F9\r
+ case 140: return KeyPress::F10Key; // KEYCODE_F10\r
+ case 141: return KeyPress::F11Key; // KEYCODE_F11\r
+ case 142: return KeyPress::F12Key; // KEYCODE_F12\r
+ case 144: return '0';\r
+ case 145: return '1';\r
+ case 146: return '2';\r
+ case 147: return '3';\r
+ case 148: return '4';\r
+ case 149: return '5';\r
+ case 150: return '6';\r
+ case 151: return '7';\r
+ case 152: return '8';\r
+ case 153: return '9';\r
+ case 154: return '/';\r
+ case 155: return '*';\r
+ case 156: return '-';\r
+ case 157: return '+';\r
+ case 158: return '.';\r
+ case 159: return ',';\r
+ case 161: return '=';\r
+ case 162: return '(';\r
+ case 163: return ')';\r
+\r
+ default: return 0;\r
+ }\r
+}\r
+\r
+static constexpr int translateAndroidKeyboardFlags (int javaFlags) noexcept\r
+{\r
+ constexpr int metaShiftOn = 0x1;\r
+ constexpr int metaAltOn = 0x02;\r
+ constexpr int metaCtrlOn = 0x1000;\r
+\r
+ int flags = 0;\r
+\r
+ if ((javaFlags & metaShiftOn) != 0) flags |= ModifierKeys::shiftModifier;\r
+ if ((javaFlags & metaAltOn) != 0) flags |= ModifierKeys::altModifier;\r
+ if ((javaFlags & metaCtrlOn) != 0) flags |= ModifierKeys::ctrlModifier;\r
+\r
+ return flags;\r
+}\r
+\r
//==============================================================================\r
class AndroidComponentPeer : public ComponentPeer,\r
private Timer\r
index);\r
}\r
\r
- void handleKeyDownCallback (int k, int kc)\r
+ void handleAccessibilityHoverCallback (int command, Point<float> sysPos, int64)\r
+ {\r
+ enum\r
+ {\r
+ TYPE_VIEW_HOVER_ENTER = 0x00000080,\r
+ TYPE_VIEW_HOVER_EXIT = 0x00000100,\r
+\r
+ ACTION_HOVER_ENTER = 0x00000009,\r
+ ACTION_HOVER_MOVE = 0x00000007,\r
+ ACTION_HOVER_EXIT = 0x0000000a\r
+ };\r
+\r
+ if (auto* topHandler = component.getAccessibilityHandler())\r
+ {\r
+ if (auto* virtualHandler = topHandler->getChildAt ((sysPos / scale).roundToInt()))\r
+ {\r
+ switch (command)\r
+ {\r
+ case ACTION_HOVER_ENTER:\r
+ case ACTION_HOVER_MOVE:\r
+ sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_ENTER, 0);\r
+ break;\r
+\r
+ case ACTION_HOVER_EXIT:\r
+ sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_EXIT, 0);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ void handleKeyDownCallback (int k, int kc, int kbFlags)\r
{\r
- handleKeyPress (k, static_cast<juce_wchar> (kc));\r
+ ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withOnlyMouseButtons()\r
+ .withFlags (translateAndroidKeyboardFlags (kbFlags));\r
+ handleKeyPress (translateAndroidKeyCode (k), static_cast<juce_wchar> (kc));\r
}\r
\r
void handleKeyUpCallback (int /*k*/, int /*kc*/)\r
CALLBACK (handleMouseDownJni, "handleMouseDown", "(JIFFJ)V") \\r
CALLBACK (handleMouseDragJni, "handleMouseDrag", "(JIFFJ)V") \\r
CALLBACK (handleMouseUpJni, "handleMouseUp", "(JIFFJ)V") \\r
- CALLBACK (handleKeyDownJni, "handleKeyDown", "(JII)V") \\r
+ CALLBACK (handleAccessibleHoverJni, "handleAccessibilityHover", "(JIFFJ)V") \\r
+ CALLBACK (handleKeyDownJni, "handleKeyDown", "(JIII)V") \\r
CALLBACK (handleKeyUpJni, "handleKeyUp", "(JII)V") \\r
CALLBACK (handleBackButtonJni, "handleBackButton", "(J)V") \\r
CALLBACK (handleKeyboardHiddenJni, "handleKeyboardHidden", "(J)V") \\r
static void JNICALL handleMouseDownJni (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMouseDownCallback (i, Point<float> ((float) x, (float) y), (int64) time); }\r
static void JNICALL handleMouseDragJni (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMouseDragCallback (i, Point<float> ((float) x, (float) y), (int64) time); }\r
static void JNICALL handleMouseUpJni (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMouseUpCallback (i, Point<float> ((float) x, (float) y), (int64) time); }\r
+ static void JNICALL handleAccessibleHoverJni(JNIEnv*, jobject /*view*/, jlong host, jint c, jfloat x, jfloat y, jlong time) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleAccessibilityHoverCallback ((int) c, Point<float> ((float) x, (float) y), (int64) time); }\r
static void JNICALL viewSizeChangedJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMovedOrResized(); }\r
static void JNICALL focusChangedJni (JNIEnv*, jobject /*view*/, jlong host, jboolean hasFocus) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleFocusChangeCallback (hasFocus); }\r
- static void JNICALL handleKeyDownJni (JNIEnv*, jobject /*view*/, jlong host, jint k, jint kc) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyDownCallback ((int) k, (int) kc); }\r
+ static void JNICALL handleKeyDownJni (JNIEnv*, jobject /*view*/, jlong host, jint k, jint kc, jint kbFlags) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyDownCallback ((int) k, (int) kc, (int) kbFlags); }\r
static void JNICALL handleKeyUpJni (JNIEnv*, jobject /*view*/, jlong host, jint k, jint kc) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyUpCallback ((int) k, (int) kc); }\r
static void JNICALL handleBackButtonJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleBackButtonCallback(); }\r
static void JNICALL handleKeyboardHiddenJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyboardHiddenCallback(); }\r
}\r
\r
//==============================================================================\r
-const int extendedKeyModifier = 0x10000;\r
-\r
-const int KeyPress::spaceKey = ' ';\r
-const int KeyPress::returnKey = 66;\r
-const int KeyPress::escapeKey = 4;\r
-const int KeyPress::backspaceKey = 67;\r
-const int KeyPress::leftKey = extendedKeyModifier + 1;\r
-const int KeyPress::rightKey = extendedKeyModifier + 2;\r
-const int KeyPress::upKey = extendedKeyModifier + 3;\r
-const int KeyPress::downKey = extendedKeyModifier + 4;\r
-const int KeyPress::pageUpKey = extendedKeyModifier + 5;\r
-const int KeyPress::pageDownKey = extendedKeyModifier + 6;\r
-const int KeyPress::endKey = extendedKeyModifier + 7;\r
-const int KeyPress::homeKey = extendedKeyModifier + 8;\r
-const int KeyPress::deleteKey = extendedKeyModifier + 9;\r
-const int KeyPress::insertKey = -1;\r
-const int KeyPress::tabKey = 61;\r
-const int KeyPress::F1Key = extendedKeyModifier + 10;\r
-const int KeyPress::F2Key = extendedKeyModifier + 11;\r
-const int KeyPress::F3Key = extendedKeyModifier + 12;\r
-const int KeyPress::F4Key = extendedKeyModifier + 13;\r
-const int KeyPress::F5Key = extendedKeyModifier + 14;\r
-const int KeyPress::F6Key = extendedKeyModifier + 16;\r
-const int KeyPress::F7Key = extendedKeyModifier + 17;\r
-const int KeyPress::F8Key = extendedKeyModifier + 18;\r
-const int KeyPress::F9Key = extendedKeyModifier + 19;\r
-const int KeyPress::F10Key = extendedKeyModifier + 20;\r
-const int KeyPress::F11Key = extendedKeyModifier + 21;\r
-const int KeyPress::F12Key = extendedKeyModifier + 22;\r
-const int KeyPress::F13Key = extendedKeyModifier + 23;\r
-const int KeyPress::F14Key = extendedKeyModifier + 24;\r
-const int KeyPress::F15Key = extendedKeyModifier + 25;\r
-const int KeyPress::F16Key = extendedKeyModifier + 26;\r
-const int KeyPress::F17Key = extendedKeyModifier + 50;\r
-const int KeyPress::F18Key = extendedKeyModifier + 51;\r
-const int KeyPress::F19Key = extendedKeyModifier + 52;\r
-const int KeyPress::F20Key = extendedKeyModifier + 53;\r
-const int KeyPress::F21Key = extendedKeyModifier + 54;\r
-const int KeyPress::F22Key = extendedKeyModifier + 55;\r
-const int KeyPress::F23Key = extendedKeyModifier + 56;\r
-const int KeyPress::F24Key = extendedKeyModifier + 57;\r
-const int KeyPress::F25Key = extendedKeyModifier + 58;\r
-const int KeyPress::F26Key = extendedKeyModifier + 59;\r
-const int KeyPress::F27Key = extendedKeyModifier + 60;\r
-const int KeyPress::F28Key = extendedKeyModifier + 61;\r
-const int KeyPress::F29Key = extendedKeyModifier + 62;\r
-const int KeyPress::F30Key = extendedKeyModifier + 63;\r
-const int KeyPress::F31Key = extendedKeyModifier + 64;\r
-const int KeyPress::F32Key = extendedKeyModifier + 65;\r
-const int KeyPress::F33Key = extendedKeyModifier + 66;\r
-const int KeyPress::F34Key = extendedKeyModifier + 67;\r
-const int KeyPress::F35Key = extendedKeyModifier + 68;\r
-const int KeyPress::numberPad0 = extendedKeyModifier + 27;\r
-const int KeyPress::numberPad1 = extendedKeyModifier + 28;\r
-const int KeyPress::numberPad2 = extendedKeyModifier + 29;\r
-const int KeyPress::numberPad3 = extendedKeyModifier + 30;\r
-const int KeyPress::numberPad4 = extendedKeyModifier + 31;\r
-const int KeyPress::numberPad5 = extendedKeyModifier + 32;\r
-const int KeyPress::numberPad6 = extendedKeyModifier + 33;\r
-const int KeyPress::numberPad7 = extendedKeyModifier + 34;\r
-const int KeyPress::numberPad8 = extendedKeyModifier + 35;\r
-const int KeyPress::numberPad9 = extendedKeyModifier + 36;\r
-const int KeyPress::numberPadAdd = extendedKeyModifier + 37;\r
-const int KeyPress::numberPadSubtract = extendedKeyModifier + 38;\r
-const int KeyPress::numberPadMultiply = extendedKeyModifier + 39;\r
-const int KeyPress::numberPadDivide = extendedKeyModifier + 40;\r
-const int KeyPress::numberPadSeparator = extendedKeyModifier + 41;\r
-const int KeyPress::numberPadDecimalPoint = extendedKeyModifier + 42;\r
-const int KeyPress::numberPadEquals = extendedKeyModifier + 43;\r
-const int KeyPress::numberPadDelete = extendedKeyModifier + 44;\r
-const int KeyPress::playKey = extendedKeyModifier + 45;\r
-const int KeyPress::stopKey = extendedKeyModifier + 46;\r
-const int KeyPress::fastForwardKey = extendedKeyModifier + 47;\r
-const int KeyPress::rewindKey = extendedKeyModifier + 48;\r
+constexpr int extendedKeyModifier = 0x10000;\r
+\r
+const int KeyPress::spaceKey = ' ';\r
+const int KeyPress::returnKey = extendedKeyModifier + 2;\r
+const int KeyPress::escapeKey = extendedKeyModifier + 3;\r
+const int KeyPress::backspaceKey = extendedKeyModifier + 4;\r
+const int KeyPress::leftKey = extendedKeyModifier + 5;\r
+const int KeyPress::rightKey = extendedKeyModifier + 6;\r
+const int KeyPress::upKey = extendedKeyModifier + 7;\r
+const int KeyPress::downKey = extendedKeyModifier + 8;\r
+const int KeyPress::pageUpKey = extendedKeyModifier + 9;\r
+const int KeyPress::pageDownKey = extendedKeyModifier + 10;\r
+const int KeyPress::endKey = extendedKeyModifier + 11;\r
+const int KeyPress::homeKey = extendedKeyModifier + 12;\r
+const int KeyPress::deleteKey = extendedKeyModifier + 13;\r
+const int KeyPress::insertKey = extendedKeyModifier + 14;\r
+const int KeyPress::tabKey = extendedKeyModifier + 15;\r
+const int KeyPress::F1Key = extendedKeyModifier + 16;\r
+const int KeyPress::F2Key = extendedKeyModifier + 17;\r
+const int KeyPress::F3Key = extendedKeyModifier + 18;\r
+const int KeyPress::F4Key = extendedKeyModifier + 19;\r
+const int KeyPress::F5Key = extendedKeyModifier + 20;\r
+const int KeyPress::F6Key = extendedKeyModifier + 21;\r
+const int KeyPress::F7Key = extendedKeyModifier + 22;\r
+const int KeyPress::F8Key = extendedKeyModifier + 23;\r
+const int KeyPress::F9Key = extendedKeyModifier + 24;\r
+const int KeyPress::F10Key = extendedKeyModifier + 25;\r
+const int KeyPress::F11Key = extendedKeyModifier + 26;\r
+const int KeyPress::F12Key = extendedKeyModifier + 27;\r
+const int KeyPress::F13Key = extendedKeyModifier + 28;\r
+const int KeyPress::F14Key = extendedKeyModifier + 29;\r
+const int KeyPress::F15Key = extendedKeyModifier + 30;\r
+const int KeyPress::F16Key = extendedKeyModifier + 31;\r
+const int KeyPress::F17Key = extendedKeyModifier + 32;\r
+const int KeyPress::F18Key = extendedKeyModifier + 33;\r
+const int KeyPress::F19Key = extendedKeyModifier + 34;\r
+const int KeyPress::F20Key = extendedKeyModifier + 35;\r
+const int KeyPress::F21Key = extendedKeyModifier + 36;\r
+const int KeyPress::F22Key = extendedKeyModifier + 37;\r
+const int KeyPress::F23Key = extendedKeyModifier + 38;\r
+const int KeyPress::F24Key = extendedKeyModifier + 39;\r
+const int KeyPress::F25Key = extendedKeyModifier + 40;\r
+const int KeyPress::F26Key = extendedKeyModifier + 41;\r
+const int KeyPress::F27Key = extendedKeyModifier + 42;\r
+const int KeyPress::F28Key = extendedKeyModifier + 43;\r
+const int KeyPress::F29Key = extendedKeyModifier + 44;\r
+const int KeyPress::F30Key = extendedKeyModifier + 45;\r
+const int KeyPress::F31Key = extendedKeyModifier + 46;\r
+const int KeyPress::F32Key = extendedKeyModifier + 47;\r
+const int KeyPress::F33Key = extendedKeyModifier + 48;\r
+const int KeyPress::F34Key = extendedKeyModifier + 49;\r
+const int KeyPress::F35Key = extendedKeyModifier + 50;\r
+const int KeyPress::numberPad0 = extendedKeyModifier + 51;\r
+const int KeyPress::numberPad1 = extendedKeyModifier + 52;\r
+const int KeyPress::numberPad2 = extendedKeyModifier + 53;\r
+const int KeyPress::numberPad3 = extendedKeyModifier + 54;\r
+const int KeyPress::numberPad4 = extendedKeyModifier + 55;\r
+const int KeyPress::numberPad5 = extendedKeyModifier + 56;\r
+const int KeyPress::numberPad6 = extendedKeyModifier + 57;\r
+const int KeyPress::numberPad7 = extendedKeyModifier + 58;\r
+const int KeyPress::numberPad8 = extendedKeyModifier + 59;\r
+const int KeyPress::numberPad9 = extendedKeyModifier + 60;\r
+const int KeyPress::numberPadAdd = extendedKeyModifier + 61;\r
+const int KeyPress::numberPadSubtract = extendedKeyModifier + 62;\r
+const int KeyPress::numberPadMultiply = extendedKeyModifier + 63;\r
+const int KeyPress::numberPadDivide = extendedKeyModifier + 64;\r
+const int KeyPress::numberPadSeparator = extendedKeyModifier + 65;\r
+const int KeyPress::numberPadDecimalPoint = extendedKeyModifier + 66;\r
+const int KeyPress::numberPadEquals = extendedKeyModifier + 67;\r
+const int KeyPress::numberPadDelete = extendedKeyModifier + 68;\r
+const int KeyPress::playKey = extendedKeyModifier + 69;\r
+const int KeyPress::stopKey = extendedKeyModifier + 70;\r
+const int KeyPress::fastForwardKey = extendedKeyModifier + 71;\r
+const int KeyPress::rewindKey = extendedKeyModifier + 72;\r
\r
//==============================================================================\r
#ifdef JUCE_PUSH_NOTIFICATIONS_ACTIVITY\r
{"psd", "application/octet-stream"},\r
{"pvu", "paleovu/x-pv"},\r
{"pwz", "application/vnd.ms-powerpoint"},\r
- {"py", "text/x-script.phyton"},\r
+ {"py", "text/x-script.python"},\r
{"pyc", "application/x-bytecode.python"},\r
{"qcp", "audio/vnd.qcelp"},\r
{"qd3", "x-world/x-3dmf"},\r
~Native() override\r
{\r
exitModalState (0);\r
+\r
+ // Our old peer may not have received a becomeFirstResponder call at this point,\r
+ // so the static currentlyFocusedPeer may be null.\r
+ // We'll try to find an appropriate peer to focus.\r
+\r
+ for (auto i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
+ if (auto* p = ComponentPeer::getPeer (i))\r
+ if (p != getPeer())\r
+ if (auto* view = (UIView*) p->getNativeHandle())\r
+ [view becomeFirstResponder];\r
}\r
\r
void launch() override\r
void pickerWasCancelled()\r
{\r
cancelPendingUpdate();\r
-\r
owner.finished ({});\r
- exitModalState (0);\r
+ // Calling owner.finished will delete this Pimpl instance, so don't call any more member functions here!\r
}\r
\r
//==============================================================================\r
static MultiTouchMapper<UITouch*> currentTouches;\r
\r
private:\r
+ void appStyleChanged() override\r
+ {\r
+ [controller setNeedsStatusBarAppearanceUpdate];\r
+ }\r
+\r
//==============================================================================\r
class AsyncRepaintMessage : public CallbackMessage\r
{\r
\r
- (UIStatusBarStyle) preferredStatusBarStyle\r
{\r
+ #if defined (__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0\r
+ if (@available (iOS 13.0, *))\r
+ {\r
+ if (auto* peer = getViewPeer (self))\r
+ {\r
+ switch (peer->getAppStyle())\r
+ {\r
+ case ComponentPeer::Style::automatic:\r
+ return UIStatusBarStyleDefault;\r
+ case ComponentPeer::Style::light:\r
+ return UIStatusBarStyleDarkContent;\r
+ case ComponentPeer::Style::dark:\r
+ return UIStatusBarStyleLightContent;\r
+ }\r
+ }\r
+ }\r
+ #endif\r
+\r
return UIStatusBarStyleDefault;\r
}\r
\r
Desktop::getInstance().addFocusChangeListener (this);\r
}\r
\r
+static UIViewComponentPeer* currentlyFocusedPeer = nullptr;\r
+\r
UIViewComponentPeer::~UIViewComponentPeer()\r
{\r
+ if (currentlyFocusedPeer == this)\r
+ currentlyFocusedPeer = nullptr;\r
+\r
currentTouches.deleteAllTouchesForPeer (this);\r
Desktop::getInstance().removeFocusChangeListener (this);\r
\r
#endif\r
\r
//==============================================================================\r
-static UIViewComponentPeer* currentlyFocusedPeer = nullptr;\r
-\r
void UIViewComponentPeer::viewFocusGain()\r
{\r
if (currentlyFocusedPeer != this)\r
namespace juce\r
{\r
\r
+//==============================================================================\r
+static constexpr int translateVirtualToAsciiKeyCode (int keyCode) noexcept\r
+{\r
+ switch (keyCode)\r
+ {\r
+ // The virtual keycodes are from HIToolbox/Events.h\r
+ case 0x00: return 'A';\r
+ case 0x01: return 'S';\r
+ case 0x02: return 'D';\r
+ case 0x03: return 'F';\r
+ case 0x04: return 'H';\r
+ case 0x05: return 'G';\r
+ case 0x06: return 'Z';\r
+ case 0x07: return 'X';\r
+ case 0x08: return 'C';\r
+ case 0x09: return 'V';\r
+ case 0x0B: return 'B';\r
+ case 0x0C: return 'Q';\r
+ case 0x0D: return 'W';\r
+ case 0x0E: return 'E';\r
+ case 0x0F: return 'R';\r
+ case 0x10: return 'Y';\r
+ case 0x11: return 'T';\r
+ case 0x12: return '1';\r
+ case 0x13: return '2';\r
+ case 0x14: return '3';\r
+ case 0x15: return '4';\r
+ case 0x16: return '6';\r
+ case 0x17: return '5';\r
+ case 0x18: return '='; // kVK_ANSI_Equal\r
+ case 0x19: return '9';\r
+ case 0x1A: return '7';\r
+ case 0x1B: return '-'; // kVK_ANSI_Minus\r
+ case 0x1C: return '8';\r
+ case 0x1D: return '0';\r
+ case 0x1E: return ']'; // kVK_ANSI_RightBracket\r
+ case 0x1F: return 'O';\r
+ case 0x20: return 'U';\r
+ case 0x21: return '['; // kVK_ANSI_LeftBracket\r
+ case 0x22: return 'I';\r
+ case 0x23: return 'P';\r
+ case 0x25: return 'L';\r
+ case 0x26: return 'J';\r
+ case 0x27: return '"'; // kVK_ANSI_Quote\r
+ case 0x28: return 'K';\r
+ case 0x29: return ';'; // kVK_ANSI_Semicolon\r
+ case 0x2A: return '\\'; // kVK_ANSI_Backslash\r
+ case 0x2B: return ','; // kVK_ANSI_Comma\r
+ case 0x2C: return '/'; // kVK_ANSI_Slash\r
+ case 0x2D: return 'N';\r
+ case 0x2E: return 'M';\r
+ case 0x2F: return '.'; // kVK_ANSI_Period\r
+ case 0x32: return '`'; // kVK_ANSI_Grave\r
+\r
+ default: return keyCode;\r
+ }\r
+}\r
+\r
+constexpr int extendedKeyModifier = 0x30000;\r
+\r
//==============================================================================\r
class NSViewComponentPeer : public ComponentPeer,\r
private Timer\r
[window setExcludedFromWindowsMenu: (windowStyleFlags & windowIsTemporary) != 0];\r
[window setIgnoresMouseEvents: (windowStyleFlags & windowIgnoresMouseClicks) != 0];\r
\r
- if ((windowStyleFlags & windowHasMaximiseButton) == windowHasMaximiseButton)\r
- [window setCollectionBehavior: NSWindowCollectionBehaviorFullScreenPrimary];\r
+ setCollectionBehaviour (false);\r
\r
[window setRestorable: NO];\r
\r
return [window isMiniaturized];\r
}\r
\r
+ NSWindowCollectionBehavior getCollectionBehavior (bool forceFullScreen) const\r
+ {\r
+ if (forceFullScreen)\r
+ return NSWindowCollectionBehaviorFullScreenPrimary;\r
+\r
+ // Some SDK versions don't define NSWindowCollectionBehaviorFullScreenNone\r
+ constexpr auto fullScreenNone = (NSUInteger) (1 << 9);\r
+\r
+ return (getStyleFlags() & (windowHasMaximiseButton | windowIsResizable)) == (windowHasMaximiseButton | windowIsResizable)\r
+ ? NSWindowCollectionBehaviorFullScreenPrimary\r
+ : fullScreenNone;\r
+ }\r
+\r
+ void setCollectionBehaviour (bool forceFullScreen) const\r
+ {\r
+ [window setCollectionBehavior: getCollectionBehavior (forceFullScreen)];\r
+ }\r
+\r
void setFullScreen (bool shouldBeFullScreen) override\r
{\r
- if (! isSharedWindow)\r
- {\r
- if (isMinimised())\r
- setMinimised (false);\r
+ if (isSharedWindow)\r
+ return;\r
\r
- if (hasNativeTitleBar())\r
- {\r
- if (shouldBeFullScreen != isFullScreen())\r
- [window toggleFullScreen: nil];\r
- }\r
- else\r
- {\r
- [window zoom: nil];\r
- }\r
+ setCollectionBehaviour (shouldBeFullScreen);\r
+\r
+ if (isMinimised())\r
+ setMinimised (false);\r
+\r
+ if (hasNativeTitleBar())\r
+ {\r
+ if (shouldBeFullScreen != isFullScreen())\r
+ [window toggleFullScreen: nil];\r
+ }\r
+ else\r
+ {\r
+ [window zoom: nil];\r
}\r
}\r
\r
else\r
keyCode = (int) CharacterFunctions::toUpperCase ((juce_wchar) keyCode);\r
\r
+ // The purpose of the keyCode is to provide information about non-printing characters to facilitate\r
+ // keyboard control over the application.\r
+ //\r
+ // So when keyCode is decoded as a printing character outside the ASCII range we need to replace it.\r
+ // This holds when the keyCode is larger than 0xff and not part one of the two MacOS specific\r
+ // non-printing ranges.\r
+ if (keyCode > 0xff\r
+ && ! (keyCode >= NSUpArrowFunctionKey && keyCode <= NSModeSwitchFunctionKey)\r
+ && ! (keyCode >= extendedKeyModifier))\r
+ {\r
+ keyCode = translateVirtualToAsciiKeyCode ([ev keyCode]);\r
+ }\r
+\r
if (([ev modifierFlags] & NSEventModifierFlagNumericPad) != 0)\r
{\r
const int numPadConversions[] = { '0', KeyPress::numberPad0, '1', KeyPress::numberPad1,\r
\r
void textInputRequired (Point<int>, TextInputTarget&) override {}\r
\r
+ void dismissPendingTextInput() override\r
+ {\r
+ stringBeingComposed.clear();\r
+ const auto* inputContext = [NSTextInputContext currentInputContext];\r
+\r
+ if (inputContext != nil)\r
+ [inputContext discardMarkedText];\r
+ }\r
+\r
void resetWindowPresentation()\r
{\r
if (hasNativeTitleBar())\r
}\r
\r
[NSApp setPresentationOptions: NSApplicationPresentationDefault];\r
+ setCollectionBehaviour (isFullScreen());\r
}\r
\r
void setHasChangedSinceSaved (bool b) override\r
addMethod (@selector (accessibilityRole), getAccessibilityRole);\r
addMethod (@selector (accessibilitySubrole), getAccessibilitySubrole);\r
\r
+ addMethod (@selector (keyDown:), keyDown);\r
+\r
addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), shouldAllowIconDrag);\r
\r
addProtocol (@protocol (NSWindowDelegate));\r
//==============================================================================\r
static BOOL isFlipped (id, SEL) { return true; }\r
\r
- static NSRect windowWillUseStandardFrame (id self, SEL, NSWindow*, NSRect)\r
+ // Key events will be processed by the peer's component.\r
+ // If the component is unable to use the event, it will be re-sent\r
+ // to performKeyEquivalent.\r
+ // performKeyEquivalent will send the event to the view's superclass,\r
+ // which will try passing the event to the main menu.\r
+ // If the event still hasn't been processed, it will be passed to the\r
+ // next responder in the chain, which will be the NSWindow for a peer\r
+ // that is on the desktop.\r
+ // If the NSWindow still doesn't handle the event, the Apple docs imply\r
+ // that the event should be sent to the NSApp for processing, but this\r
+ // doesn't seem to happen for keyDown events.\r
+ // Instead, the NSWindow attempts to process the event, fails, and\r
+ // triggers an annoying NSBeep.\r
+ // Overriding keyDown to "handle" the event seems to suppress the beep.\r
+ static void keyDown (id, SEL, NSEvent* ev)\r
+ {\r
+ ignoreUnused (ev);\r
+\r
+ #if JUCE_DEBUG_UNHANDLED_KEYPRESSES\r
+ DBG ("unhandled key down event with keycode: " << [ev keyCode]);\r
+ #endif\r
+ }\r
+\r
+ static NSRect windowWillUseStandardFrame (id self, SEL, NSWindow*, NSRect r)\r
{\r
if (auto* owner = getOwner (self))\r
{\r
if (auto* constrainer = owner->getConstrainer())\r
{\r
- return flippedScreenRect (makeNSRect (owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()\r
- .withWidth (constrainer->getMaximumWidth())\r
- .withHeight (constrainer->getMaximumHeight()))));\r
+ const auto originalBounds = owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()).toFloat();\r
+ const auto expanded = originalBounds.withWidth ((float) constrainer->getMaximumWidth())\r
+ .withHeight ((float) constrainer->getMaximumHeight());\r
+ const auto constrained = expanded.constrainedWithin (convertToRectFloat (flippedScreenRect (r)));\r
+ return flippedScreenRect (makeNSRect (constrained));\r
}\r
}\r
\r
- return makeNSRect (Rectangle<int> (10000, 10000));\r
+ return r;\r
}\r
\r
- static BOOL windowShouldZoomToFrame (id, SEL, NSWindow* window, NSRect frame)\r
+ static BOOL windowShouldZoomToFrame (id self, SEL, NSWindow* window, NSRect frame)\r
{\r
+ if (auto* owner = getOwner (self))\r
+ if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0)\r
+ return NO;\r
+\r
return convertToRectFloat ([window frame]).withZeroOrigin() != convertToRectFloat (frame).withZeroOrigin();\r
}\r
\r
else if (! shouldBeEnabled)\r
[NSApp setPresentationOptions: NSApplicationPresentationDefault];\r
\r
- [peer->window toggleFullScreen: nil];\r
+ peer->setFullScreen (true);\r
}\r
else\r
{\r
const int KeyPress::F34Key = NSF34FunctionKey;\r
const int KeyPress::F35Key = NSF35FunctionKey;\r
\r
-const int KeyPress::numberPad0 = 0x30020;\r
-const int KeyPress::numberPad1 = 0x30021;\r
-const int KeyPress::numberPad2 = 0x30022;\r
-const int KeyPress::numberPad3 = 0x30023;\r
-const int KeyPress::numberPad4 = 0x30024;\r
-const int KeyPress::numberPad5 = 0x30025;\r
-const int KeyPress::numberPad6 = 0x30026;\r
-const int KeyPress::numberPad7 = 0x30027;\r
-const int KeyPress::numberPad8 = 0x30028;\r
-const int KeyPress::numberPad9 = 0x30029;\r
-const int KeyPress::numberPadAdd = 0x3002a;\r
-const int KeyPress::numberPadSubtract = 0x3002b;\r
-const int KeyPress::numberPadMultiply = 0x3002c;\r
-const int KeyPress::numberPadDivide = 0x3002d;\r
-const int KeyPress::numberPadSeparator = 0x3002e;\r
-const int KeyPress::numberPadDecimalPoint = 0x3002f;\r
-const int KeyPress::numberPadEquals = 0x30030;\r
-const int KeyPress::numberPadDelete = 0x30031;\r
-const int KeyPress::playKey = 0x30000;\r
-const int KeyPress::stopKey = 0x30001;\r
-const int KeyPress::fastForwardKey = 0x30002;\r
-const int KeyPress::rewindKey = 0x30003;\r
+const int KeyPress::numberPad0 = extendedKeyModifier + 0x20;\r
+const int KeyPress::numberPad1 = extendedKeyModifier + 0x21;\r
+const int KeyPress::numberPad2 = extendedKeyModifier + 0x22;\r
+const int KeyPress::numberPad3 = extendedKeyModifier + 0x23;\r
+const int KeyPress::numberPad4 = extendedKeyModifier + 0x24;\r
+const int KeyPress::numberPad5 = extendedKeyModifier + 0x25;\r
+const int KeyPress::numberPad6 = extendedKeyModifier + 0x26;\r
+const int KeyPress::numberPad7 = extendedKeyModifier + 0x27;\r
+const int KeyPress::numberPad8 = extendedKeyModifier + 0x28;\r
+const int KeyPress::numberPad9 = extendedKeyModifier + 0x29;\r
+const int KeyPress::numberPadAdd = extendedKeyModifier + 0x2a;\r
+const int KeyPress::numberPadSubtract = extendedKeyModifier + 0x2b;\r
+const int KeyPress::numberPadMultiply = extendedKeyModifier + 0x2c;\r
+const int KeyPress::numberPadDivide = extendedKeyModifier + 0x2d;\r
+const int KeyPress::numberPadSeparator = extendedKeyModifier + 0x2e;\r
+const int KeyPress::numberPadDecimalPoint = extendedKeyModifier + 0x2f;\r
+const int KeyPress::numberPadEquals = extendedKeyModifier + 0x30;\r
+const int KeyPress::numberPadDelete = extendedKeyModifier + 0x31;\r
+const int KeyPress::playKey = extendedKeyModifier + 0x00;\r
+const int KeyPress::stopKey = extendedKeyModifier + 0x01;\r
+const int KeyPress::fastForwardKey = extendedKeyModifier + 0x02;\r
+const int KeyPress::rewindKey = extendedKeyModifier + 0x03;\r
\r
} // namespace juce\r
==============================================================================\r
*/\r
\r
-#if JUCE_MINGW\r
-LWSTDAPI IUnknown_GetWindow (IUnknown* punk, HWND* phwnd);\r
-#endif\r
-\r
namespace juce\r
{\r
\r
JUCE_COMRESULT updateHwnd (IFileDialog* d)\r
{\r
HWND hwnd = nullptr;\r
- IUnknown_GetWindow (d, &hwnd);\r
+\r
+ if (auto window = ComSmartPtr<IFileDialog> { d }.getInterface<IOleWindow>())\r
+ window->GetWindow (&hwnd);\r
\r
ScopedLock lock (owner.deletingDialog);\r
\r
\r
const Remover remover (*this);\r
\r
- #if ! JUCE_MINGW\r
if (SystemStats::getOperatingSystemType() >= SystemStats::WinVista\r
&& customComponent == nullptr)\r
{\r
return openDialogVistaAndUp (async);\r
}\r
- #endif\r
\r
return openDialogPreVista (async);\r
}\r
public FileChooser::Pimpl\r
{\r
public:\r
- Native (FileChooser& fileChooser, int flags, FilePreviewComponent* previewComp)\r
+ Native (FileChooser& fileChooser, int flagsIn, FilePreviewComponent* previewComp)\r
: owner (fileChooser),\r
- nativeFileChooser (std::make_unique<Win32NativeFileChooser> (this, flags, previewComp, fileChooser.startingFile,\r
+ nativeFileChooser (std::make_unique<Win32NativeFileChooser> (this, flagsIn, previewComp, fileChooser.startingFile,\r
fileChooser.title, fileChooser.filters))\r
{\r
auto mainMon = Desktop::getInstance().getDisplays().getPrimaryDisplay()->userArea;\r
\r
if (auto* dc = ::CreateCompatibleDC (deviceContext.dc))\r
{\r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wfour-char-constants")\r
BITMAPV5HEADER header = {};\r
header.bV5Size = sizeof (BITMAPV5HEADER);\r
header.bV5Width = bm.bmWidth;\r
header.bV5GreenMask = 0x0000FF00;\r
header.bV5BlueMask = 0x000000FF;\r
header.bV5AlphaMask = 0xFF000000;\r
-\r
- #if JUCE_MINGW\r
- header.bV5CSType = 'Win ';\r
- #else\r
- header.bV5CSType = LCS_WINDOWS_COLOR_SPACE;\r
- #endif\r
-\r
+ header.bV5CSType = 0x57696E20; // 'Win '\r
header.bV5Intent = LCS_GM_IMAGES;\r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
\r
uint32* bitmapImageData = nullptr;\r
\r
JUCE_COMCALL Toggle (HWND) = 0;\r
};\r
\r
+} // namespace juce\r
+\r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::ITipInvocation, 0x37c994e7, 0x432b, 0x4834, 0xa2, 0xf7, 0xdc, 0xe1, 0xf1, 0x3b, 0x83, 0x4b)\r
+#endif\r
+\r
+namespace juce\r
+{\r
+\r
struct OnScreenKeyboard : public DeletedAtShutdown,\r
private Timer\r
{\r
JUCE_COMCALL GetUserInteractionMode (UserInteractionMode*) = 0;\r
};\r
\r
+} // namespace juce\r
\r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::IUIViewSettingsInterop, 0x3694dbf9, 0x8f68, 0x44be, 0x8f, 0xf5, 0x19, 0x5c, 0x98, 0xed, 0xe8, 0xa6)\r
+__CRT_UUID_DECL (juce::IUIViewSettings, 0xc63657f6, 0x8850, 0x470d, 0x88, 0xf8, 0x45, 0x5e, 0x16, 0xea, 0x2c, 0x26)\r
+#endif\r
+\r
+namespace juce\r
+{\r
struct UWPUIViewSettings\r
{\r
UWPUIViewSettings()\r
if (! component.isCurrentlyModal() && (styleFlags & windowHasDropShadow) != 0\r
&& ((! hasTitleBar()) || SystemStats::getOperatingSystemType() < SystemStats::WinVista))\r
{\r
- shadower.reset (component.getLookAndFeel().createDropShadowerForComponent (&component));\r
+ shadower = component.getLookAndFeel().createDropShadowerForComponent (component);\r
\r
if (shadower != nullptr)\r
shadower->setOwner (&component);\r
public:\r
PreVistaMessageBox (const MessageBoxOptions& opts,\r
UINT extraFlags,\r
- std::unique_ptr<ModalComponentManager::Callback>&& callback)\r
- : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (callback)),\r
+ std::unique_ptr<ModalComponentManager::Callback>&& cb)\r
+ : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (cb)),\r
flags (extraFlags | getMessageBoxFlags (opts.getIconType())),\r
title (opts.getTitle()), message (opts.getMessage())\r
{\r
{\r
public:\r
WindowsTaskDialog (const MessageBoxOptions& opts,\r
- std::unique_ptr<ModalComponentManager::Callback>&& callback)\r
- : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (callback)),\r
+ std::unique_ptr<ModalComponentManager::Callback>&& cb)\r
+ : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (cb)),\r
iconType (opts.getIconType()),\r
title (opts.getTitle()), message (opts.getMessage()),\r
button1 (opts.getButtonText (0)), button2 (opts.getButtonText (1)), button3 (opts.getButtonText (2))\r
TASKDIALOGCONFIG config{};\r
\r
config.cbSize = sizeof (config);\r
+ config.hwndParent = getParentHWND();\r
config.pszWindowTitle = title.toWideCharPointer();\r
config.pszContent = message.toWideCharPointer();\r
config.hInstance = (HINSTANCE) Process::getCurrentModuleInstanceHandle();\r
if (iter != cursorsBySize.end())\r
return iter->second;\r
\r
- const auto img = info.image.getImage();\r
- const auto imgW = jmax (1, img.getWidth());\r
- const auto imgH = jmax (1, img.getHeight());\r
-\r
+ const auto logicalSize = info.image.getScaledBounds();\r
const auto scale = (float) size / (float) unityCursorSize;\r
- const auto scaleToUse = scale * jmin (1.0f, jmin ((float) unityCursorSize / (float) imgW,\r
- (float) unityCursorSize / (float) imgH)) / info.image.getScale();\r
- const auto rescaled = img.rescaled (roundToInt (scaleToUse * (float) imgW),\r
- roundToInt (scaleToUse * (float) imgH));\r
- const auto hx = jlimit (0, rescaled.getWidth(), roundToInt (scaleToUse * (float) info.hotspot.x));\r
- const auto hy = jlimit (0, rescaled.getHeight(), roundToInt (scaleToUse * (float) info.hotspot.y));\r
+ const auto physicalSize = logicalSize * scale;\r
+\r
+ const auto& image = info.image.getImage();\r
+ const auto rescaled = image.rescaled (roundToInt ((float) physicalSize.getWidth()),\r
+ roundToInt ((float) physicalSize.getHeight()));\r
+\r
+ const auto effectiveScale = rescaled.getWidth() / logicalSize.getWidth();\r
+\r
+ const auto hx = jlimit (0, rescaled.getWidth(), roundToInt ((float) info.hotspot.x * effectiveScale));\r
+ const auto hy = jlimit (0, rescaled.getHeight(), roundToInt ((float) info.hotspot.y * effectiveScale));\r
\r
return cursorsBySize.emplace (size, IconConverters::createHICONFromImage (rescaled, false, hx, hy)).first->second;\r
}\r
}\r
\r
//==============================================================================\r
-XWindowSystemUtilities::XSettings::XSettings (::Display* d)\r
- : display (d)\r
+std::unique_ptr<XWindowSystemUtilities::XSettings> XWindowSystemUtilities::XSettings::createXSettings (::Display* d)\r
{\r
- settingsAtom = Atoms::getCreating (display, "_XSETTINGS_SETTINGS");\r
+ const auto settingsAtom = Atoms::getCreating (d, "_XSETTINGS_SETTINGS");\r
+ const auto settingsWindow = X11Symbols::getInstance()->xGetSelectionOwner (d,\r
+ Atoms::getCreating (d, "_XSETTINGS_S0"));\r
\r
- settingsWindow = X11Symbols::getInstance()->xGetSelectionOwner (display,\r
- Atoms::getCreating (display, "_XSETTINGS_S0"));\r
+ if (settingsWindow == None)\r
+ return {};\r
+\r
+ return rawToUniquePtr (new XWindowSystemUtilities::XSettings (d, settingsWindow, settingsAtom));\r
+}\r
\r
- jassert (settingsWindow != None);\r
+XWindowSystemUtilities::XSettings::XSettings (::Display* d, ::Window settingsWindowIn, Atom settingsAtomIn)\r
+ : display (d), settingsWindow (settingsWindowIn), settingsAtom (settingsAtomIn)\r
+{\r
update();\r
}\r
\r
{\r
auto localContent = XWindowSystem::getInstance()->getLocalClipboardContent();\r
\r
- // translate to utf8\r
- numDataItems = localContent.getNumBytesAsUTF8() + 1;\r
- data.calloc (numDataItems);\r
- localContent.copyToUTF8 (data, numDataItems);\r
- propertyFormat = 8; // bits/item\r
+ // Translate to utf8\r
+ numDataItems = localContent.getNumBytesAsUTF8();\r
+ auto numBytesRequiredToStore = numDataItems + 1;\r
+ data.calloc (numBytesRequiredToStore);\r
+ localContent.copyToUTF8 (data, numBytesRequiredToStore);\r
+ propertyFormat = 8; // bits per item\r
}\r
else if (evt.target == atoms.targets)\r
{\r
- // another application wants to know what we are able to send\r
+ // Another application wants to know what we are able to send\r
+\r
numDataItems = 2;\r
- propertyFormat = 32; // atoms are 32-bit\r
- data.calloc (numDataItems * 4);\r
+ data.calloc (numDataItems * sizeof (Atom));\r
+\r
+ // Atoms are flagged as 32-bit irrespective of sizeof (Atom)\r
+ propertyFormat = 32;\r
\r
auto* dataAtoms = unalignedPointerCast<Atom*> (data.getData());\r
\r
{\r
X11Symbols::getInstance()->xChangeProperty (evt.display, evt.requestor,\r
evt.property, evt.target,\r
- propertyFormat /* 8 or 32 */, PropModeReplace,\r
+ propertyFormat, PropModeReplace,\r
reinterpret_cast<const unsigned char*> (data.getData()), (int) numDataItems);\r
reply.property = evt.property; // " == success"\r
}\r
\r
void XWindowSystem::initialiseXSettings()\r
{\r
- xSettings = std::make_unique<XWindowSystemUtilities::XSettings> (display);\r
+ xSettings = XWindowSystemUtilities::XSettings::createXSettings (display);\r
\r
- X11Symbols::getInstance()->xSelectInput (display,\r
- xSettings->getSettingsWindow(),\r
- StructureNotifyMask | PropertyChangeMask);\r
+ if (xSettings != nullptr)\r
+ X11Symbols::getInstance()->xSelectInput (display,\r
+ xSettings->getSettingsWindow(),\r
+ StructureNotifyMask | PropertyChangeMask);\r
}\r
\r
XWindowSystem::DisplayVisuals::DisplayVisuals (::Display* xDisplay)\r
class XSettings\r
{\r
public:\r
- explicit XSettings (::Display*);\r
+ static std::unique_ptr<XSettings> createXSettings (::Display*);\r
\r
//==============================================================================\r
void update();\r
std::unordered_map<String, XSetting> settings;\r
ListenerList<Listener> listeners;\r
\r
+ XSettings (::Display*, Atom, ::Window);\r
+\r
//==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XSettings)\r
};\r
//==============================================================================\r
/** An RAII class for sending slider listener drag messages.\r
\r
- This is useful if you are programatically updating the slider's value and want\r
+ This is useful if you are programmatically updating the slider's value and want\r
to imitate a mouse event, for example in a custom AccessibilityHandler.\r
\r
@see Slider::Listener\r
{\r
moveCaretTo (getTextIndexAt (e.x, e.y),\r
e.mods.isShiftDown());\r
+\r
+ if (auto* peer = getPeer())\r
+ peer->dismissPendingTextInput();\r
}\r
else\r
{\r
{\r
newTransaction();\r
moveCaretTo (newPos, selecting);\r
+\r
+ if (auto* peer = getPeer())\r
+ peer->dismissPendingTextInput();\r
+\r
return true;\r
}\r
\r
\r
if (iter != itemComponents.end())\r
{\r
+ if (itemUnderMouse == iter->get())\r
+ itemUnderMouse = nullptr;\r
+\r
if (isMouseDraggingInChildComp (*(iter->get())))\r
owner.hideDragHighlight();\r
\r
*/\r
virtual void setHasChangedSinceSaved (bool) {}\r
\r
+\r
+ enum class Style\r
+ {\r
+ /** A style that matches the system-wide style. */\r
+ automatic,\r
+\r
+ /** A light style, which will probably use dark text on a light background. */\r
+ light,\r
+\r
+ /** A dark style, which will probably use light text on a dark background. */\r
+ dark\r
+ };\r
+\r
+ /** On operating systems that support it, this will update the style of this\r
+ peer as requested.\r
+\r
+ Note that this will not update the theme system-wide. This will only\r
+ update UI elements so that they display appropriately for this peer!\r
+ */\r
+ void setAppStyle (Style s)\r
+ {\r
+ if (std::exchange (style, s) != style)\r
+ appStyleChanged();\r
+ }\r
+\r
+ /** Returns the style requested for this app. */\r
+ Style getAppStyle() const { return style; }\r
+\r
protected:\r
//==============================================================================\r
static void forceDisplayUpdate();\r
ComponentBoundsConstrainer* constrainer = nullptr;\r
static std::function<ModifierKeys()> getNativeRealtimeModifiers;\r
ListenerList<ScaleFactorListener> scaleFactorListeners;\r
+ Style style = Style::automatic;\r
\r
private:\r
//==============================================================================\r
+ virtual void appStyleChanged() {}\r
+\r
Component* getTargetForKeyPress();\r
\r
WeakReference<Component> lastFocusedComponent, dragAndDropTargetComponent;\r
void TooltipWindow::mouseDown (const MouseEvent&)\r
{\r
if (isVisible())\r
- dismissalMouseEventOccured = true;\r
+ dismissalMouseEventOccurred = true;\r
}\r
\r
void TooltipWindow::mouseWheelMove (const MouseEvent&, const MouseWheelDetails&)\r
{\r
if (isVisible())\r
- dismissalMouseEventOccured = true;\r
+ dismissalMouseEventOccurred = true;\r
}\r
\r
void TooltipWindow::updatePosition (const String& tip, Point<int> pos, Rectangle<int> parentArea)\r
\r
toFront (false);\r
manuallyShownTip = shownManually == ShownManually::yes ? tip : String();\r
- dismissalMouseEventOccured = false;\r
+ dismissalMouseEventOccurred = false;\r
}\r
}\r
\r
{\r
tipShowing = {};\r
manuallyShownTip = {};\r
- dismissalMouseEventOccured = false;\r
+ dismissalMouseEventOccurred = false;\r
\r
removeFromDesktop();\r
setVisible (false);\r
\r
if (manuallyShownTip.isNotEmpty())\r
{\r
- if (dismissalMouseEventOccured || newComp == nullptr)\r
+ if (dismissalMouseEventOccurred || newComp == nullptr)\r
hideTip();\r
\r
return;\r
const auto tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse);\r
const auto now = Time::getApproximateMillisecondCounter();\r
\r
- if (tipChanged || dismissalMouseEventOccured || mouseMovedQuickly)\r
+ if (tipChanged || dismissalMouseEventOccurred || mouseMovedQuickly)\r
lastCompChangeTime = now;\r
\r
const auto showTip = [this, &mouseSource, &mousePos, &newTip]\r
{\r
// if a tip is currently visible (or has just disappeared), update to a new one\r
// immediately if needed..\r
- if (newComp == nullptr || dismissalMouseEventOccured || newTip.isEmpty())\r
+ if (newComp == nullptr || dismissalMouseEventOccurred || newTip.isEmpty())\r
hideTip();\r
else if (tipChanged)\r
showTip();\r
String tipShowing, lastTipUnderMouse, manuallyShownTip;\r
int millisecondsBeforeTipAppears;\r
unsigned int lastCompChangeTime = 0, lastHideTime = 0;\r
- bool reentrant = false, dismissalMouseEventOccured = false;\r
+ bool reentrant = false, dismissalMouseEventOccurred = false;\r
\r
enum ShownManually { yes, no };\r
void displayTipInternal (Point<int>, const String&, ShownManually);\r
\r
TopLevelWindow::~TopLevelWindow()\r
{\r
- shadower.reset();\r
+ shadower = nullptr;\r
TopLevelWindowManager::getInstance()->removeWindow (this);\r
}\r
\r
\r
if (isOnDesktop())\r
{\r
- shadower.reset();\r
+ shadower = nullptr;\r
Component::addToDesktop (getDesktopWindowStyleFlags());\r
}\r
else\r
{\r
if (shadower == nullptr)\r
{\r
- shadower.reset (getLookAndFeel().createDropShadowerForComponent (this));\r
+ shadower = getLookAndFeel().createDropShadowerForComponent (*this);\r
\r
if (shadower != nullptr)\r
shadower->setOwner (this);\r
}\r
else\r
{\r
- shadower.reset();\r
+ shadower = nullptr;\r
}\r
}\r
}\r
\r
void TopLevelWindow::addToDesktop()\r
{\r
- shadower.reset();\r
+ shadower = nullptr;\r
Component::addToDesktop (getDesktopWindowStyleFlags());\r
setDropShadowEnabled (isDropShadowEnabled()); // force an update to clear away any fake shadows if necessary.\r
}\r
\r
ID: juce_gui_extra\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE extended GUI classes\r
description: Miscellaneous GUI classes for specialised tasks.\r
website: http://www.juce.com/juce\r
\r
struct InternalWebViewType\r
{\r
- InternalWebViewType() {}\r
- virtual ~InternalWebViewType() {}\r
+ InternalWebViewType() = default;\r
+ virtual ~InternalWebViewType() = default;\r
\r
virtual void createBrowser() = 0;\r
virtual bool hasBrowserBeenCreated() = 0;\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternalWebViewType)\r
};\r
\r
-#if JUCE_MINGW\r
- JUCE_DECLARE_UUID_GETTER (IOleClientSite, "00000118-0000-0000-c000-000000000046")\r
- JUCE_DECLARE_UUID_GETTER (IDispatch, "00020400-0000-0000-c000-000000000046")\r
-\r
- #ifndef WebBrowser\r
- class WebBrowser;\r
- #endif\r
-#endif\r
-\r
-JUCE_DECLARE_UUID_GETTER (DWebBrowserEvents2, "34A715A0-6587-11D0-924A-0020AFC7AC4D")\r
-JUCE_DECLARE_UUID_GETTER (IConnectionPointContainer, "B196B284-BAB4-101A-B69C-00AA00341D07")\r
-JUCE_DECLARE_UUID_GETTER (IWebBrowser2, "D30C1661-CDAF-11D0-8A3E-00C04FC9E26E")\r
-JUCE_DECLARE_UUID_GETTER (WebBrowser, "8856F961-340A-11D0-A96B-00C04FD705A2")\r
-\r
//==============================================================================\r
class Win32WebView : public InternalWebViewType,\r
public ActiveXControlComponent\r
\r
ID: juce_opengl\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE OpenGL classes\r
description: Classes for rendering OpenGL in a JUCE window.\r
website: http://www.juce.com/juce\r
{\r
MouseForwardingNSOpenGLViewClass() : ObjCClass<NSOpenGLView> ("JUCEGLView_")\r
{\r
- addMethod (@selector (rightMouseDown:), rightMouseDown);\r
- addMethod (@selector (rightMouseUp:), rightMouseUp);\r
- addMethod (@selector (acceptsFirstMouse:), acceptsFirstMouse);\r
+ addMethod (@selector (rightMouseDown:), rightMouseDown);\r
+ addMethod (@selector (rightMouseUp:), rightMouseUp);\r
+ addMethod (@selector (acceptsFirstMouse:), acceptsFirstMouse);\r
+ addMethod (@selector (accessibilityHitTest:), accessibilityHitTest);\r
\r
registerClass();\r
}\r
static void rightMouseDown (id self, SEL, NSEvent* ev) { [[(NSOpenGLView*) self superview] rightMouseDown: ev]; }\r
static void rightMouseUp (id self, SEL, NSEvent* ev) { [[(NSOpenGLView*) self superview] rightMouseUp: ev]; }\r
static BOOL acceptsFirstMouse (id, SEL, NSEvent*) { return YES; }\r
+ static id accessibilityHitTest (id self, SEL, NSPoint p) { return [[(NSOpenGLView*) self superview] accessibilityHitTest: p]; }\r
};\r
\r
\r
\r
ID: juce_osc\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE OSC classes\r
description: Open Sound Control implementation.\r
website: http://www.juce.com/juce\r
\r
ID: juce_product_unlocking\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE Online marketplace support\r
description: Classes for online product authentication\r
website: http://www.juce.com/juce\r
So for example you might use this in a command line app called "unlocker" and\r
then call it like this:\r
\r
- unlocker MyGreatApp Joe_Bloggs joebloggs@foobar.com 1234abcd,95432ff 22d9aec92d986dd1,923ad49e9e7ff294c\r
+ unlocker MyGreatApp joebloggs@foobar.com Joe_Bloggs 1234abcd,95432ff 22d9aec92d986dd1,923ad49e9e7ff294c\r
*/\r
static int keyGenerationAppMain (int argc, char* argv[])\r
{\r
void fetchReceiptDetailsFromAppStore (NSData* receiptData, const String& secret)\r
{\r
auto requestContents = [NSMutableDictionary dictionaryWithCapacity: (NSUInteger) (secret.isNotEmpty() ? 2 : 1)];\r
- [requestContents setObject: [receiptData base64EncodedStringWithOptions:0] forKey: nsStringLiteral ("receipt-data")];\r
+ [requestContents setObject: [receiptData base64EncodedStringWithOptions:0] forKey: @"receipt-data"];\r
\r
if (secret.isNotEmpty())\r
- [requestContents setObject: juceStringToNS (secret) forKey: nsStringLiteral ("password")];\r
+ [requestContents setObject: juceStringToNS (secret) forKey: @"password"];\r
\r
NSError* error;\r
auto requestData = [NSJSONSerialization dataWithJSONObject: requestContents\r
return;\r
}\r
\r
- #if JUCE_IN_APP_PURCHASES_USE_SANDBOX_ENVIRONMENT\r
- auto storeURL = "https://sandbox.itunes.apple.com/verifyReceipt";\r
- #else\r
- auto storeURL = "https://buy.itunes.apple.com/verifyReceipt";\r
- #endif\r
+ verifyReceipt ("https://buy.itunes.apple.com/verifyReceipt", requestData);\r
+ }\r
+\r
+ void verifyReceipt (const String& endpoint, NSData* requestData)\r
+ {\r
+ const auto nsurl = [NSURL URLWithString: juceStringToNS (endpoint)];\r
\r
- // TODO: use juce URL here\r
- auto* urlPtr = [NSURL URLWithString: nsStringLiteral (storeURL)];\r
- auto storeRequest = [NSMutableURLRequest requestWithURL: urlPtr];\r
- [storeRequest setHTTPMethod: nsStringLiteral ("POST")];\r
+ if (nsurl == nullptr)\r
+ return;\r
+\r
+ const auto storeRequest = [NSMutableURLRequest requestWithURL: nsurl];\r
+ [storeRequest setHTTPMethod: @"POST"];\r
[storeRequest setHTTPBody: requestData];\r
\r
- auto task = [[NSURLSession sharedSession] dataTaskWithRequest: storeRequest\r
- completionHandler:\r
- ^(NSData* data, NSURLResponse*, NSError* connectionError)\r
- {\r
- if (connectionError != nil)\r
- {\r
- sendReceiptFetchFail();\r
- }\r
- else\r
- {\r
- NSError* err;\r
+ constexpr auto sandboxURL = "https://sandbox.itunes.apple.com/verifyReceipt";\r
+\r
+ const auto shouldRetryWithSandboxUrl = [isProduction = (endpoint != sandboxURL)] (NSDictionary* receiptDetails)\r
+ {\r
+ if (isProduction)\r
+ if (const auto* status = getAs<NSNumber> (receiptDetails[@"status"]))\r
+ return [status intValue] == 21007;\r
+\r
+ return false;\r
+ };\r
+\r
+ [[[NSURLSession sharedSession] dataTaskWithRequest: storeRequest\r
+ completionHandler: ^(NSData* responseData, NSURLResponse*, NSError* connectionError)\r
+ {\r
+ if (connectionError == nullptr)\r
+ {\r
+ NSError* err = nullptr;\r
+\r
+ if (NSDictionary* receiptDetails = [NSJSONSerialization JSONObjectWithData: responseData options: 0 error: &err])\r
+ {\r
+ if (shouldRetryWithSandboxUrl (receiptDetails))\r
+ {\r
+ verifyReceipt (sandboxURL, requestData);\r
+ return;\r
+ }\r
\r
- if (NSDictionary* receiptDetails = [NSJSONSerialization JSONObjectWithData: data options: 0 error: &err])\r
- processReceiptDetails (receiptDetails);\r
- else\r
- sendReceiptFetchFail();\r
- }\r
- }];\r
+ processReceiptDetails (receiptDetails);\r
+ return;\r
+ }\r
+ }\r
\r
- [task resume];\r
+ sendReceiptFetchFail();\r
+ }] resume];\r
}\r
\r
void processReceiptDetails (NSDictionary* receiptDetails)\r
{\r
- if (auto receipt = getAs<NSDictionary> (receiptDetails[nsStringLiteral ("receipt")]))\r
+ if (auto receipt = getAs<NSDictionary> (receiptDetails[@"receipt"]))\r
{\r
- if (auto bundleId = getAs<NSString> (receipt[nsStringLiteral ("bundle_id")]))\r
+ if (auto bundleId = getAs<NSString> (receipt[@"bundle_id"]))\r
{\r
- if (auto inAppPurchases = getAs<NSArray> (receipt[nsStringLiteral ("in_app")]))\r
+ if (auto inAppPurchases = getAs<NSArray> (receipt[@"in_app"]))\r
{\r
Array<Listener::PurchaseInfo> purchases;\r
\r
if (auto* purchaseData = getAs<NSDictionary> (inAppPurchaseData))\r
{\r
// Ignore products that were cancelled.\r
- if (purchaseData[nsStringLiteral ("cancellation_date")] != nil)\r
+ if (purchaseData[@"cancellation_date"] != nil)\r
continue;\r
\r
- if (auto transactionId = getAs<NSString> (purchaseData[nsStringLiteral ("original_transaction_id")]))\r
+ if (auto transactionId = getAs<NSString> (purchaseData[@"original_transaction_id"]))\r
{\r
- if (auto productId = getAs<NSString> (purchaseData[nsStringLiteral ("product_id")]))\r
+ if (auto productId = getAs<NSString> (purchaseData[@"product_id"]))\r
{\r
- auto purchaseTime = getPurchaseDateMs (purchaseData[nsStringLiteral ("purchase_date_ms")]);\r
+ auto purchaseTime = getPurchaseDateMs (purchaseData[@"purchase_date_ms"]);\r
\r
if (purchaseTime > 0)\r
{\r
#import <AVKit/AVKit.h>\r
\r
//==============================================================================\r
-#elif JUCE_WINDOWS && ! JUCE_MINGW\r
- /* If you're using the camera classes, you'll need access to a few DirectShow headers.\r
- These files are provided in the normal Windows SDK. */\r
- #include <dshow.h>\r
- #include <dshowasf.h>\r
- #include <evr.h>\r
-\r
- #if ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES\r
+#elif JUCE_WINDOWS\r
+ #include "wmsdkidl.h"\r
+ #include "native/juce_win32_ComTypes.h"\r
+\r
+ #if ! JUCE_MINGW && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES\r
#pragma comment (lib, "strmiids.lib")\r
\r
#if JUCE_USE_CAMERA\r
\r
ID: juce_video\r
vendor: juce\r
- version: 6.1.4\r
+ version: 6.1.5\r
name: JUCE video playback and capture classes\r
description: Classes for playing video and capturing camera input.\r
website: http://www.juce.com/juce\r
{\r
static JuceCameraDeviceViewerClass cls;\r
\r
- // Initial size that can be overriden later.\r
+ // Initial size that can be overridden later.\r
setSize (640, 480);\r
\r
auto view = [cls.createInstance() init];\r
==============================================================================\r
*/\r
\r
-interface ISampleGrabberCB : public IUnknown\r
-{\r
- JUCE_COMCALL SampleCB (double, IMediaSample*) = 0;\r
- JUCE_COMCALL BufferCB (double, BYTE*, long) = 0;\r
-};\r
-\r
-interface ISampleGrabber : public IUnknown\r
-{\r
- JUCE_COMCALL SetOneShot (BOOL) = 0;\r
- JUCE_COMCALL SetMediaType (const AM_MEDIA_TYPE*) = 0;\r
- JUCE_COMCALL GetConnectedMediaType (AM_MEDIA_TYPE*) = 0;\r
- JUCE_COMCALL SetBufferSamples (BOOL) = 0;\r
- JUCE_COMCALL GetCurrentBuffer (long*, long*) = 0;\r
- JUCE_COMCALL GetCurrentSample (IMediaSample**) = 0;\r
- JUCE_COMCALL SetCallback (ISampleGrabberCB*, long) = 0;\r
-};\r
-\r
-static const IID IID_ISampleGrabberCB = { 0x0579154A, 0x2B53, 0x4994, { 0xB0, 0xD0, 0xE7, 0x73, 0x14, 0x8E, 0xFF, 0x85 } };\r
-static const IID IID_ISampleGrabber = { 0x6B652FFF, 0x11FE, 0x4fce, { 0x92, 0xAD, 0x02, 0x66, 0xB5, 0xD7, 0xC7, 0x8F } };\r
-static const CLSID CLSID_SampleGrabber = { 0xC1F400A0, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } };\r
-static const CLSID CLSID_NullRenderer = { 0xC1F400A4, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } };\r
-\r
-\r
struct CameraDevice::Pimpl : public ChangeBroadcaster\r
{\r
Pimpl (CameraDevice& ownerToUse, const String&, int index,\r
bool /*highQuality*/)\r
: owner (ownerToUse)\r
{\r
- HRESULT hr = captureGraphBuilder.CoCreateInstance (CLSID_CaptureGraphBuilder2);\r
+ HRESULT hr = captureGraphBuilder.CoCreateInstance (ComTypes::CLSID_CaptureGraphBuilder2);\r
if (FAILED (hr))\r
return;\r
\r
if (filter == nullptr)\r
return;\r
\r
- hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph);\r
+ hr = graphBuilder.CoCreateInstance (ComTypes::CLSID_FilterGraph);\r
if (FAILED (hr))\r
return;\r
\r
if (FAILED (hr))\r
return;\r
\r
- mediaControl = graphBuilder.getInterface<IMediaControl>();\r
+ mediaControl = graphBuilder.getInterface<ComTypes::IMediaControl>();\r
if (mediaControl == nullptr)\r
return;\r
\r
{\r
- ComSmartPtr<IAMStreamConfig> streamConfig;\r
+ ComSmartPtr<ComTypes::IAMStreamConfig> streamConfig;\r
\r
- hr = captureGraphBuilder->FindInterface (&PIN_CATEGORY_CAPTURE, nullptr, filter,\r
- IID_IAMStreamConfig, (void**) streamConfig.resetAndGetPointerAddress());\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+ hr = captureGraphBuilder->FindInterface (&ComTypes::PIN_CATEGORY_CAPTURE, nullptr, filter,\r
+ __uuidof (ComTypes::IAMStreamConfig), (void**) streamConfig.resetAndGetPointerAddress());\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
\r
if (streamConfig != nullptr)\r
{\r
if (FAILED (hr))\r
return;\r
\r
- hr = smartTee.CoCreateInstance (CLSID_SmartTee);\r
+ hr = smartTee.CoCreateInstance (ComTypes::CLSID_SmartTee);\r
if (FAILED (hr))\r
return;\r
\r
if (! connectFilters (filter, smartTee))\r
return;\r
\r
- ComSmartPtr<IBaseFilter> sampleGrabberBase;\r
- hr = sampleGrabberBase.CoCreateInstance (CLSID_SampleGrabber);\r
+ ComSmartPtr<ComTypes::IBaseFilter> sampleGrabberBase;\r
+ hr = sampleGrabberBase.CoCreateInstance (ComTypes::CLSID_SampleGrabber);\r
if (FAILED (hr))\r
return;\r
\r
- hr = sampleGrabberBase.QueryInterface (IID_ISampleGrabber, sampleGrabber);\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+ hr = sampleGrabberBase.QueryInterface (__uuidof (ComTypes::ISampleGrabber), sampleGrabber);\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
if (FAILED (hr))\r
return;\r
\r
{\r
- AM_MEDIA_TYPE mt = {};\r
- mt.majortype = MEDIATYPE_Video;\r
- mt.subtype = MEDIASUBTYPE_RGB24;\r
- mt.formattype = FORMAT_VideoInfo;\r
+ ComTypes::AM_MEDIA_TYPE mt = {};\r
+ mt.majortype = ComTypes::MEDIATYPE_Video;\r
+ mt.subtype = ComTypes::MEDIASUBTYPE_RGB24;\r
+ mt.formattype = ComTypes::FORMAT_VideoInfo;\r
sampleGrabber->SetMediaType (&mt);\r
}\r
\r
if (FAILED (hr))\r
return;\r
\r
- ComSmartPtr<IPin> grabberInputPin;\r
- if (! (getPin (smartTee, PINDIR_OUTPUT, smartTeeCaptureOutputPin, "capture")\r
- && getPin (smartTee, PINDIR_OUTPUT, smartTeePreviewOutputPin, "preview")\r
- && getPin (sampleGrabberBase, PINDIR_INPUT, grabberInputPin)))\r
+ ComSmartPtr<ComTypes::IPin> grabberInputPin;\r
+ if (! (getPin (smartTee, ComTypes::PINDIR_OUTPUT, smartTeeCaptureOutputPin, "capture")\r
+ && getPin (smartTee, ComTypes::PINDIR_OUTPUT, smartTeePreviewOutputPin, "preview")\r
+ && getPin (sampleGrabberBase, ComTypes::PINDIR_INPUT, grabberInputPin)))\r
return;\r
\r
hr = graphBuilder->Connect (smartTeePreviewOutputPin, grabberInputPin);\r
if (FAILED (hr))\r
return;\r
\r
- AM_MEDIA_TYPE mt = {};\r
+ ComTypes::AM_MEDIA_TYPE mt = {};\r
hr = sampleGrabber->GetConnectedMediaType (&mt);\r
\r
- if (auto* pVih = unalignedPointerCast<VIDEOINFOHEADER*> (mt.pbFormat))\r
+ if (auto* pVih = unalignedPointerCast<ComTypes::VIDEOINFOHEADER*> (mt.pbFormat))\r
{\r
width = pVih->bmiHeader.biWidth;\r
height = pVih->bmiHeader.biHeight;\r
}\r
\r
- ComSmartPtr<IBaseFilter> nullFilter;\r
- hr = nullFilter.CoCreateInstance (CLSID_NullRenderer);\r
+ ComSmartPtr<ComTypes::IBaseFilter> nullFilter;\r
+ hr = nullFilter.CoCreateInstance (ComTypes::CLSID_NullRenderer);\r
hr = graphBuilder->AddFilter (nullFilter, _T("Null Renderer"));\r
\r
if (connectFilters (sampleGrabberBase, nullFilter)\r
firstRecordedTime = Time::getCurrentTime() - RelativeTime (defaultCameraLatency);\r
recordNextFrameTime = false;\r
\r
- ComSmartPtr<IPin> pin;\r
- if (getPin (filter, PINDIR_OUTPUT, pin))\r
+ ComSmartPtr<ComTypes::IPin> pin;\r
+ if (getPin (filter, ComTypes::PINDIR_OUTPUT, pin))\r
{\r
- if (auto pushSource = pin.getInterface<IAMPushSource>())\r
+ if (auto pushSource = pin.getInterface<ComTypes::IAMPushSource>())\r
{\r
- REFERENCE_TIME latency = 0;\r
+ ComTypes::REFERENCE_TIME latency = 0;\r
pushSource->GetLatency (&latency);\r
\r
firstRecordedTime = firstRecordedTime - RelativeTime ((double) latency);\r
recordNextFrameTime = true;\r
previewMaxFPS = 60;\r
\r
- HRESULT hr = asfWriter.CoCreateInstance (CLSID_WMAsfWriter);\r
+ HRESULT hr = asfWriter.CoCreateInstance (ComTypes::CLSID_WMAsfWriter);\r
\r
if (SUCCEEDED (hr))\r
{\r
- if (auto fileSink = asfWriter.getInterface<IFileSinkFilter>())\r
+ if (auto fileSink = asfWriter.getInterface<ComTypes::IFileSinkFilter>())\r
{\r
hr = fileSink->SetFileName (file.getFullPathName().toWideCharPointer(), nullptr);\r
\r
\r
if (SUCCEEDED (hr))\r
{\r
- if (auto asfConfig = asfWriter.getInterface<IConfigAsfWriter>())\r
+ if (auto asfConfig = asfWriter.getInterface<ComTypes::IConfigAsfWriter>())\r
{\r
asfConfig->SetIndexMode (true);\r
ComSmartPtr<IWMProfileManager> profileManager;\r
- hr = WMCreateProfileManager (profileManager.resetAndGetPointerAddress());\r
+\r
+ using Fn = HRESULT (*) (IWMProfileManager**);\r
+\r
+ // This function is available on Windows 2000 and up, but we load it at runtime anyway\r
+ // because some versions of MinGW ship with libraries that don't include this symbol.\r
+ if (auto* fn = reinterpret_cast<Fn> (wmvcoreLibrary.getFunction ("WMCreateProfileManager")))\r
+ hr = fn (profileManager.resetAndGetPointerAddress());\r
+ else\r
+ jassertfalse;\r
\r
// This gibberish is the DirectShow profile for a video-only wmv file.\r
String prof ("<profile version=\"589824\" storageformat=\"1\" name=\"Quality\" description=\"Quality type for output.\">"\r
\r
if (SUCCEEDED (hr))\r
{\r
- ComSmartPtr<IPin> asfWriterInputPin;\r
+ ComSmartPtr<ComTypes::IPin> asfWriterInputPin;\r
\r
- if (getPin (asfWriter, PINDIR_INPUT, asfWriterInputPin, "Video Input 01"))\r
+ if (getPin (asfWriter, ComTypes::PINDIR_INPUT, asfWriterInputPin, "Video Input 01"))\r
{\r
hr = graphBuilder->Connect (smartTeeCaptureOutputPin, asfWriterInputPin);\r
\r
previewMaxFPS = 60;\r
}\r
\r
- static ComSmartPtr<IBaseFilter> enumerateCameras (StringArray* names, const int deviceIndexToOpen)\r
+ static ComSmartPtr<ComTypes::IBaseFilter> enumerateCameras (StringArray* names, const int deviceIndexToOpen)\r
{\r
int index = 0;\r
- ComSmartPtr<ICreateDevEnum> pDevEnum;\r
+ ComSmartPtr<ComTypes::ICreateDevEnum> pDevEnum;\r
\r
struct Deleter\r
{\r
\r
using ContextPtr = std::unique_ptr<IBindCtx, Deleter>;\r
\r
- if (SUCCEEDED (pDevEnum.CoCreateInstance (CLSID_SystemDeviceEnum)))\r
+ if (SUCCEEDED (pDevEnum.CoCreateInstance (ComTypes::CLSID_SystemDeviceEnum)))\r
{\r
ComSmartPtr<IEnumMoniker> enumerator;\r
- HRESULT hr = pDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, enumerator.resetAndGetPointerAddress(), 0);\r
+ HRESULT hr = pDevEnum->CreateClassEnumerator (ComTypes::CLSID_VideoInputDeviceCategory, enumerator.resetAndGetPointerAddress(), 0);\r
\r
if (SUCCEEDED (hr) && enumerator != nullptr)\r
{\r
return ContextPtr (ptr);\r
}();\r
\r
- ComSmartPtr<IBaseFilter> captureFilter;\r
- hr = moniker->BindToObject (context.get(), nullptr, IID_IBaseFilter, (void**) captureFilter.resetAndGetPointerAddress());\r
+ ComSmartPtr<ComTypes::IBaseFilter> captureFilter;\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+ hr = moniker->BindToObject (context.get(), nullptr, __uuidof (ComTypes::IBaseFilter), (void**) captureFilter.resetAndGetPointerAddress());\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
\r
if (SUCCEEDED (hr))\r
{\r
return devs;\r
}\r
\r
- struct GrabberCallback : public ComBaseClassHelperBase<ISampleGrabberCB>\r
+ struct GrabberCallback : public ComBaseClassHelperBase<ComTypes::ISampleGrabberCB>\r
{\r
GrabberCallback (Pimpl& p)\r
: ComBaseClassHelperBase (0), owner (p) {}\r
\r
JUCE_COMRESULT QueryInterface (REFIID refId, void** result)\r
{\r
- if (refId == IID_ISampleGrabberCB)\r
- return castToType<ISampleGrabberCB> (result);\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+ if (refId == __uuidof (ComTypes::ISampleGrabberCB))\r
+ return castToType<ComTypes::ISampleGrabberCB> (result);\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
\r
- return ComBaseClassHelperBase<ISampleGrabberCB>::QueryInterface (refId, result);\r
+ return ComBaseClassHelperBase<ComTypes::ISampleGrabberCB>::QueryInterface (refId, result);\r
}\r
\r
- JUCE_COMRESULT SampleCB (double, IMediaSample*) { return E_FAIL; }\r
+ JUCE_COMRESULT SampleCB (double, ComTypes::IMediaSample*) { return E_FAIL; }\r
\r
JUCE_COMRESULT BufferCB (double time, BYTE* buffer, long bufferSize)\r
{\r
JUCE_DECLARE_NON_COPYABLE (GrabberCallback)\r
};\r
\r
+ DynamicLibrary wmvcoreLibrary { "wmvcore" };\r
CameraDevice& owner;\r
\r
ComSmartPtr<GrabberCallback> callback;\r
\r
Array<ViewerComponent*> viewerComps;\r
\r
- ComSmartPtr<ICaptureGraphBuilder2> captureGraphBuilder;\r
- ComSmartPtr<IBaseFilter> filter, smartTee, asfWriter;\r
- ComSmartPtr<IGraphBuilder> graphBuilder;\r
- ComSmartPtr<ISampleGrabber> sampleGrabber;\r
- ComSmartPtr<IMediaControl> mediaControl;\r
- ComSmartPtr<IPin> smartTeePreviewOutputPin, smartTeeCaptureOutputPin;\r
+ ComSmartPtr<ComTypes::ICaptureGraphBuilder2> captureGraphBuilder;\r
+ ComSmartPtr<ComTypes::IBaseFilter> filter, smartTee, asfWriter;\r
+ ComSmartPtr<ComTypes::IGraphBuilder> graphBuilder;\r
+ ComSmartPtr<ComTypes::ISampleGrabber> sampleGrabber;\r
+ ComSmartPtr<ComTypes::IMediaControl> mediaControl;\r
+ ComSmartPtr<ComTypes::IPin> smartTeePreviewOutputPin, smartTeeCaptureOutputPin;\r
int activeUsers = 0;\r
Array<int> widths, heights;\r
DWORD graphRegistrationID;\r
JUCE_DECLARE_WEAK_REFERENCEABLE (Pimpl)\r
\r
private:\r
- void getVideoSizes (IAMStreamConfig* const streamConfig)\r
+ void getVideoSizes (ComTypes::IAMStreamConfig* const streamConfig)\r
{\r
widths.clear();\r
heights.clear();\r
int count = 0, size = 0;\r
streamConfig->GetNumberOfCapabilities (&count, &size);\r
\r
- if (size == sizeof (VIDEO_STREAM_CONFIG_CAPS))\r
+ if (size == (int) sizeof (ComTypes::VIDEO_STREAM_CONFIG_CAPS))\r
{\r
for (int i = 0; i < count; ++i)\r
{\r
- VIDEO_STREAM_CONFIG_CAPS scc;\r
- AM_MEDIA_TYPE* config;\r
+ ComTypes::VIDEO_STREAM_CONFIG_CAPS scc;\r
+ ComTypes::AM_MEDIA_TYPE* config;\r
\r
HRESULT hr = streamConfig->GetStreamCaps (i, &config, (BYTE*) &scc);\r
\r
}\r
}\r
\r
- bool selectVideoSize (IAMStreamConfig* const streamConfig,\r
+ bool selectVideoSize (ComTypes::IAMStreamConfig* const streamConfig,\r
const int minWidth, const int minHeight,\r
const int maxWidth, const int maxHeight)\r
{\r
int count = 0, size = 0, bestArea = 0, bestIndex = -1;\r
streamConfig->GetNumberOfCapabilities (&count, &size);\r
\r
- if (size == sizeof (VIDEO_STREAM_CONFIG_CAPS))\r
+ if (size == (int) sizeof (ComTypes::VIDEO_STREAM_CONFIG_CAPS))\r
{\r
- AM_MEDIA_TYPE* config;\r
- VIDEO_STREAM_CONFIG_CAPS scc;\r
+ ComTypes::AM_MEDIA_TYPE* config;\r
+ ComTypes::VIDEO_STREAM_CONFIG_CAPS scc;\r
\r
for (int i = 0; i < count; ++i)\r
{\r
return false;\r
}\r
\r
- static bool getPin (IBaseFilter* filter, const PIN_DIRECTION wantedDirection,\r
- ComSmartPtr<IPin>& result, const char* pinName = nullptr)\r
+ static bool getPin (ComTypes::IBaseFilter* filter, const ComTypes::PIN_DIRECTION wantedDirection,\r
+ ComSmartPtr<ComTypes::IPin>& result, const char* pinName = nullptr)\r
{\r
- ComSmartPtr<IEnumPins> enumerator;\r
- ComSmartPtr<IPin> pin;\r
+ ComSmartPtr<ComTypes::IEnumPins> enumerator;\r
+ ComSmartPtr<ComTypes::IPin> pin;\r
\r
filter->EnumPins (enumerator.resetAndGetPointerAddress());\r
\r
while (enumerator->Next (1, pin.resetAndGetPointerAddress(), nullptr) == S_OK)\r
{\r
- PIN_DIRECTION dir;\r
+ ComTypes::PIN_DIRECTION dir;\r
pin->QueryDirection (&dir);\r
\r
if (wantedDirection == dir)\r
{\r
- PIN_INFO info = {};\r
+ ComTypes::PIN_INFO info = {};\r
pin->QueryPinInfo (&info);\r
\r
if (pinName == nullptr || String (pinName).equalsIgnoreCase (String (info.achName)))\r
return false;\r
}\r
\r
- bool connectFilters (IBaseFilter* const first, IBaseFilter* const second) const\r
+ bool connectFilters (ComTypes::IBaseFilter* const first, ComTypes::IBaseFilter* const second) const\r
{\r
- ComSmartPtr<IPin> in, out;\r
+ ComSmartPtr<ComTypes::IPin> in, out;\r
\r
- return getPin (first, PINDIR_OUTPUT, out)\r
- && getPin (second, PINDIR_INPUT, in)\r
+ return getPin (first, ComTypes::PINDIR_OUTPUT, out)\r
+ && getPin (second, ComTypes::PINDIR_INPUT, in)\r
&& SUCCEEDED (graphBuilder->Connect (out, in));\r
}\r
\r
\r
void disconnectAnyViewers();\r
\r
- static void deleteMediaType (AM_MEDIA_TYPE* const pmt)\r
+ static void deleteMediaType (ComTypes::AM_MEDIA_TYPE* const pmt)\r
{\r
if (pmt->cbFormat != 0)\r
CoTaskMemFree ((PVOID) pmt->pbFormat);\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2020 - Raw Material Software Limited\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 6 End-User License\r
+ Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+ End User License Agreement: www.juce.com/juce-6-licence\r
+ Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace ComTypes\r
+{\r
+/*\r
+ These interfaces would normally be included in the system platform headers.\r
+ However, those headers are likely to be incomplete when building with\r
+ MinGW. In order to allow building video applications under MinGW,\r
+ we reproduce all necessary definitions here.\r
+*/\r
+\r
+enum PIN_DIRECTION\r
+{\r
+ PINDIR_INPUT = 0,\r
+ PINDIR_OUTPUT = PINDIR_INPUT + 1\r
+};\r
+\r
+enum VMRMode\r
+{\r
+ VMRMode_Windowed = 0x1,\r
+ VMRMode_Windowless = 0x2,\r
+ VMRMode_Renderless = 0x4,\r
+ VMRMode_Mask = 0x7\r
+};\r
+\r
+enum VMR_ASPECT_RATIO_MODE\r
+{\r
+ VMR_ARMODE_NONE = 0,\r
+ VMR_ARMODE_LETTER_BOX = VMR_ARMODE_NONE + 1\r
+};\r
+\r
+enum MFVideoAspectRatioMode\r
+{\r
+ MFVideoARMode_None = 0,\r
+ MFVideoARMode_PreservePicture = 0x1,\r
+ MFVideoARMode_PreservePixel = 0x2,\r
+ MFVideoARMode_NonLinearStretch = 0x4,\r
+ MFVideoARMode_Mask = 0x7\r
+};\r
+\r
+enum FILTER_STATE\r
+{\r
+ State_Stopped = 0,\r
+ State_Paused = State_Stopped + 1,\r
+ State_Running = State_Paused + 1\r
+};\r
+\r
+enum WMT_VERSION\r
+{\r
+ WMT_VER_4_0 = 0x40000,\r
+ WMT_VER_7_0 = 0x70000,\r
+ WMT_VER_8_0 = 0x80000,\r
+ WMT_VER_9_0 = 0x90000\r
+};\r
+\r
+// We only ever refer to these through a pointer, so we don't need definitions for them.\r
+struct IAMCopyCaptureFileProgress;\r
+struct IBaseFilter;\r
+struct IEnumFilters;\r
+struct IEnumMediaTypes;\r
+struct IReferenceClock;\r
+struct IVMRImageCompositor;\r
+\r
+struct FILTER_INFO;\r
+\r
+struct AM_MEDIA_TYPE\r
+{\r
+ GUID majortype;\r
+ GUID subtype;\r
+ BOOL bFixedSizeSamples;\r
+ BOOL bTemporalCompression;\r
+ ULONG lSampleSize;\r
+ GUID formattype;\r
+ IUnknown* pUnk;\r
+ ULONG cbFormat;\r
+ BYTE* pbFormat;\r
+};\r
+\r
+typedef LONGLONG REFERENCE_TIME;\r
+typedef LONG_PTR OAEVENT;\r
+typedef LONG_PTR OAHWND;\r
+typedef double REFTIME;\r
+typedef long OAFilterState;\r
+\r
+enum Constants\r
+{\r
+ EC_STATE_CHANGE = 0x32,\r
+ EC_REPAINT = 0x05,\r
+ EC_COMPLETE = 0x01,\r
+ EC_ERRORABORT = 0x03,\r
+ EC_ERRORABORTEX = 0x45,\r
+ EC_USERABORT = 0x02,\r
+\r
+ VFW_E_INVALID_FILE_FORMAT = (HRESULT) 0x8004022FL,\r
+ VFW_E_NOT_FOUND = (HRESULT) 0x80040216L,\r
+ VFW_E_UNKNOWN_FILE_TYPE = (HRESULT) 0x80040240L,\r
+ VFW_E_UNSUPPORTED_STREAM = (HRESULT) 0x80040265L,\r
+ VFW_E_CANNOT_CONNECT = (HRESULT) 0x80040217L,\r
+ VFW_E_CANNOT_LOAD_SOURCE_FILTER = (HRESULT) 0x80040241L,\r
+ VFW_E_NOT_CONNECTED = (HRESULT) 0x80040209L\r
+};\r
+\r
+struct MFVideoNormalizedRect\r
+{\r
+ float left;\r
+ float top;\r
+ float right;\r
+ float bottom;\r
+};\r
+\r
+struct VIDEOINFOHEADER\r
+{\r
+ RECT rcSource;\r
+ RECT rcTarget;\r
+ DWORD dwBitRate;\r
+ DWORD dwBitErrorRate;\r
+ REFERENCE_TIME AvgTimePerFrame;\r
+ BITMAPINFOHEADER bmiHeader;\r
+};\r
+\r
+struct VIDEO_STREAM_CONFIG_CAPS\r
+{\r
+ GUID guid;\r
+ ULONG VideoStandard;\r
+ SIZE InputSize;\r
+ SIZE MinCroppingSize;\r
+ SIZE MaxCroppingSize;\r
+ int CropGranularityX;\r
+ int CropGranularityY;\r
+ int CropAlignX;\r
+ int CropAlignY;\r
+ SIZE MinOutputSize;\r
+ SIZE MaxOutputSize;\r
+ int OutputGranularityX;\r
+ int OutputGranularityY;\r
+ int StretchTapsX;\r
+ int StretchTapsY;\r
+ int ShrinkTapsX;\r
+ int ShrinkTapsY;\r
+ LONGLONG MinFrameInterval;\r
+ LONGLONG MaxFrameInterval;\r
+ LONG MinBitsPerSecond;\r
+ LONG MaxBitsPerSecond;\r
+};\r
+\r
+struct PIN_INFO\r
+{\r
+ IBaseFilter* pFilter;\r
+ PIN_DIRECTION dir;\r
+ WCHAR achName[128];\r
+};\r
+\r
+JUCE_COMCLASS (ICreateDevEnum, "29840822-5B84-11D0-BD3B-00A0C911CE86") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL CreateClassEnumerator (REFCLSID clsidDeviceClass, _Out_ IEnumMoniker * *ppEnumMoniker, DWORD dwFlags) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IPin, "56a86891-0ad4-11ce-b03a-0020af0ba770") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL Connect (IPin * pReceivePin, _In_opt_ const AM_MEDIA_TYPE* pmt) = 0;\r
+ JUCE_COMCALL ReceiveConnection (IPin * pConnector, const AM_MEDIA_TYPE* pmt) = 0;\r
+ JUCE_COMCALL Disconnect() = 0;\r
+ JUCE_COMCALL ConnectedTo (_Out_ IPin * *pPin) = 0;\r
+ JUCE_COMCALL ConnectionMediaType (_Out_ AM_MEDIA_TYPE * pmt) = 0;\r
+ JUCE_COMCALL QueryPinInfo (_Out_ PIN_INFO * pInfo) = 0;\r
+ JUCE_COMCALL QueryDirection (_Out_ PIN_DIRECTION * pPinDir) = 0;\r
+ JUCE_COMCALL QueryId (_Out_ LPWSTR * Id) = 0;\r
+ JUCE_COMCALL QueryAccept (const AM_MEDIA_TYPE* pmt) = 0;\r
+ JUCE_COMCALL EnumMediaTypes (_Out_ IEnumMediaTypes * *ppEnum) = 0;\r
+ JUCE_COMCALL QueryInternalConnections (_Out_writes_to_opt_ (*nPin, *nPin) IPin * *apPin, ULONG * nPin) = 0;\r
+ JUCE_COMCALL EndOfStream() = 0;\r
+ JUCE_COMCALL BeginFlush() = 0;\r
+ JUCE_COMCALL EndFlush() = 0;\r
+ JUCE_COMCALL NewSegment (REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IFilterGraph, "56a8689f-0ad4-11ce-b03a-0020af0ba770") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL AddFilter (IBaseFilter * pFilter, LPCWSTR pName) = 0;\r
+ JUCE_COMCALL RemoveFilter (IBaseFilter * pFilter) = 0;\r
+ JUCE_COMCALL EnumFilters (_Out_ IEnumFilters * *ppEnum) = 0;\r
+ JUCE_COMCALL FindFilterByName (LPCWSTR pName, _Out_ IBaseFilter * *ppFilter) = 0;\r
+ JUCE_COMCALL ConnectDirect (IPin * ppinOut, IPin * ppinIn, _In_opt_ const AM_MEDIA_TYPE* pmt) = 0;\r
+ JUCE_COMCALL Reconnect (IPin * ppin) = 0;\r
+ JUCE_COMCALL Disconnect (IPin * ppin) = 0;\r
+ JUCE_COMCALL SetDefaultSyncSource() = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IGraphBuilder, "56a868a9-0ad4-11ce-b03a-0020af0ba770") : public IFilterGraph\r
+{\r
+public:\r
+ JUCE_COMCALL Connect (IPin * ppinOut, IPin * ppinIn) = 0;\r
+ JUCE_COMCALL Render (IPin * ppinOut) = 0;\r
+ JUCE_COMCALL RenderFile (LPCWSTR lpcwstrFile, _In_opt_ LPCWSTR lpcwstrPlayList) = 0;\r
+ JUCE_COMCALL AddSourceFilter (LPCWSTR lpcwstrFileName, _In_opt_ LPCWSTR lpcwstrFilterName, _Out_ IBaseFilter * *ppFilter) = 0;\r
+ JUCE_COMCALL SetLogFile (DWORD_PTR hFile) = 0;\r
+ JUCE_COMCALL Abort() = 0;\r
+ JUCE_COMCALL ShouldOperationContinue() = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaFilter, "56a86899-0ad4-11ce-b03a-0020af0ba770") : public IPersist\r
+{\r
+public:\r
+ JUCE_COMCALL Stop() = 0;\r
+ JUCE_COMCALL Pause() = 0;\r
+ JUCE_COMCALL Run (REFERENCE_TIME tStart) = 0;\r
+ JUCE_COMCALL GetState (DWORD dwMilliSecsTimeout, _Out_ FILTER_STATE * State) = 0;\r
+ JUCE_COMCALL SetSyncSource (_In_opt_ IReferenceClock * pClock) = 0;\r
+ JUCE_COMCALL GetSyncSource (_Outptr_result_maybenull_ IReferenceClock * *pClock) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IEnumPins, "56a86892-0ad4-11ce-b03a-0020af0ba770") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL Next (ULONG cPins, _Out_writes_to_ (cPins, *pcFetched) IPin * *ppPins, _Out_opt_ ULONG * pcFetched) = 0;\r
+ JUCE_COMCALL Skip (ULONG cPins) = 0;\r
+ JUCE_COMCALL Reset() = 0;\r
+ JUCE_COMCALL Clone (_Out_ IEnumPins * *ppEnum) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IBaseFilter, "56a86895-0ad4-11ce-b03a-0020af0ba770") : public IMediaFilter\r
+{\r
+public:\r
+ JUCE_COMCALL EnumPins (_Out_ IEnumPins * *ppEnum) = 0;\r
+ JUCE_COMCALL FindPin (LPCWSTR Id, _Out_ IPin * *ppPin) = 0;\r
+ JUCE_COMCALL QueryFilterInfo (_Out_ FILTER_INFO * pInfo) = 0;\r
+ JUCE_COMCALL JoinFilterGraph (_In_opt_ IFilterGraph * pGraph, _In_opt_ LPCWSTR pName) = 0;\r
+ JUCE_COMCALL QueryVendorInfo (_Out_ LPWSTR * pVendorInfo) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IVMRWindowlessControl, "0eb1088c-4dcd-46f0-878f-39dae86a51b7") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL GetNativeVideoSize (LONG * lpWidth, LONG * lpHeight, LONG * lpARWidth, LONG * lpARHeight) = 0;\r
+ JUCE_COMCALL GetMinIdealVideoSize (LONG * lpWidth, LONG * lpHeight) = 0;\r
+ JUCE_COMCALL GetMaxIdealVideoSize (LONG * lpWidth, LONG * lpHeight) = 0;\r
+ JUCE_COMCALL SetVideoPosition (const LPRECT lpSRCRect, const LPRECT lpDSTRect) = 0;\r
+ JUCE_COMCALL GetVideoPosition (LPRECT lpSRCRect, LPRECT lpDSTRect) = 0;\r
+ JUCE_COMCALL GetAspectRatioMode (DWORD * lpAspectRatioMode) = 0;\r
+ JUCE_COMCALL SetAspectRatioMode (DWORD AspectRatioMode) = 0;\r
+ JUCE_COMCALL SetVideoClippingWindow (HWND hwnd) = 0;\r
+ JUCE_COMCALL RepaintVideo (HWND hwnd, HDC hdc) = 0;\r
+ JUCE_COMCALL DisplayModeChanged() = 0;\r
+ JUCE_COMCALL GetCurrentImage (BYTE * *lpDib) = 0;\r
+ JUCE_COMCALL SetBorderColor (COLORREF Clr) = 0;\r
+ JUCE_COMCALL GetBorderColor (COLORREF * lpClr) = 0;\r
+ JUCE_COMCALL SetColorKey (COLORREF Clr) = 0;\r
+ JUCE_COMCALL GetColorKey (COLORREF * lpClr) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IVMRFilterConfig, "9e5530c5-7034-48b4-bb46-0b8a6efc8e36") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL SetImageCompositor (IVMRImageCompositor * lpVMRImgCompositor) = 0;\r
+ JUCE_COMCALL SetNumberOfStreams (DWORD dwMaxStreams) = 0;\r
+ JUCE_COMCALL GetNumberOfStreams (DWORD * pdwMaxStreams) = 0;\r
+ JUCE_COMCALL SetRenderingPrefs (DWORD dwRenderFlags) = 0;\r
+ JUCE_COMCALL GetRenderingPrefs (DWORD * pdwRenderFlags) = 0;\r
+ JUCE_COMCALL SetRenderingMode (DWORD Mode) = 0;\r
+ JUCE_COMCALL GetRenderingMode (DWORD * pMode) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMFVideoDisplayControl, "a490b1e4-ab84-4d31-a1b2-181e03b1077a") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL GetNativeVideoSize (__RPC__inout_opt SIZE * pszVideo, __RPC__inout_opt SIZE * pszARVideo) = 0;\r
+ JUCE_COMCALL GetIdealVideoSize (__RPC__inout_opt SIZE * pszMin, __RPC__inout_opt SIZE * pszMax) = 0;\r
+ JUCE_COMCALL SetVideoPosition (__RPC__in_opt const MFVideoNormalizedRect* pnrcSource, __RPC__in_opt const LPRECT prcDest) = 0;\r
+ JUCE_COMCALL GetVideoPosition (__RPC__out MFVideoNormalizedRect * pnrcSource, __RPC__out LPRECT prcDest) = 0;\r
+ JUCE_COMCALL SetAspectRatioMode (DWORD dwAspectRatioMode) = 0;\r
+ JUCE_COMCALL GetAspectRatioMode (__RPC__out DWORD * pdwAspectRatioMode) = 0;\r
+ JUCE_COMCALL SetVideoWindow (__RPC__in HWND hwndVideo) = 0;\r
+ JUCE_COMCALL GetVideoWindow (__RPC__deref_out_opt HWND * phwndVideo) = 0;\r
+ JUCE_COMCALL RepaintVideo() = 0;\r
+ JUCE_COMCALL GetCurrentImage (__RPC__inout BITMAPINFOHEADER * pBih, __RPC__deref_out_ecount_full_opt (*pcbDib) BYTE * *pDib, __RPC__out DWORD * pcbDib, __RPC__inout_opt LONGLONG * pTimeStamp) = 0;\r
+ JUCE_COMCALL SetBorderColor (COLORREF Clr) = 0;\r
+ JUCE_COMCALL GetBorderColor (__RPC__out COLORREF * pClr) = 0;\r
+ JUCE_COMCALL SetRenderingPrefs (DWORD dwRenderFlags) = 0;\r
+ JUCE_COMCALL GetRenderingPrefs (__RPC__out DWORD * pdwRenderFlags) = 0;\r
+ JUCE_COMCALL SetFullscreen (BOOL fFullscreen) = 0;\r
+ JUCE_COMCALL GetFullscreen (__RPC__out BOOL * pfFullscreen) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMFGetService, "fa993888-4383-415a-a930-dd472a8cf6f7") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL GetService (__RPC__in REFGUID guidService, __RPC__in REFIID riid, __RPC__deref_out_opt LPVOID * ppvObject) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaControl, "56a868b1-0ad4-11ce-b03a-0020af0ba770") : public IDispatch\r
+{\r
+public:\r
+ JUCE_COMCALL Run() = 0;\r
+ JUCE_COMCALL Pause() = 0;\r
+ JUCE_COMCALL Stop() = 0;\r
+ JUCE_COMCALL GetState (LONG msTimeout, __RPC__out OAFilterState * pfs) = 0;\r
+ JUCE_COMCALL RenderFile (__RPC__in BSTR strFilename) = 0;\r
+ JUCE_COMCALL AddSourceFilter (__RPC__in BSTR strFilename, __RPC__deref_out_opt IDispatch * *ppUnk) = 0;\r
+ JUCE_COMCALL get_FilterCollection (__RPC__deref_out_opt IDispatch * *ppUnk) = 0;\r
+ JUCE_COMCALL get_RegFilterCollection (__RPC__deref_out_opt IDispatch * *ppUnk) = 0;\r
+ JUCE_COMCALL StopWhenReady() = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaPosition, "56a868b2-0ad4-11ce-b03a-0020af0ba770") : public IDispatch\r
+{\r
+public:\r
+ JUCE_COMCALL get_Duration (__RPC__out REFTIME * plength) = 0;\r
+ JUCE_COMCALL put_CurrentPosition (REFTIME llTime) = 0;\r
+ JUCE_COMCALL get_CurrentPosition (__RPC__out REFTIME * pllTime) = 0;\r
+ JUCE_COMCALL get_StopTime (__RPC__out REFTIME * pllTime) = 0;\r
+ JUCE_COMCALL put_StopTime (REFTIME llTime) = 0;\r
+ JUCE_COMCALL get_PrerollTime (__RPC__out REFTIME * pllTime) = 0;\r
+ JUCE_COMCALL put_PrerollTime (REFTIME llTime) = 0;\r
+ JUCE_COMCALL put_Rate (double dRate) = 0;\r
+ JUCE_COMCALL get_Rate (__RPC__out double* pdRate) = 0;\r
+ JUCE_COMCALL CanSeekForward (__RPC__out LONG * pCanSeekForward) = 0;\r
+ JUCE_COMCALL CanSeekBackward (__RPC__out LONG * pCanSeekBackward) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaEvent, "56a868b6-0ad4-11ce-b03a-0020af0ba770") : public IDispatch\r
+{\r
+public:\r
+ JUCE_COMCALL GetEventHandle (__RPC__out OAEVENT * hEvent) = 0;\r
+ JUCE_COMCALL GetEvent (__RPC__out long* lEventCode, __RPC__out LONG_PTR* lParam1, __RPC__out LONG_PTR* lParam2, long msTimeout) = 0;\r
+ JUCE_COMCALL WaitForCompletion (long msTimeout, __RPC__out long* pEvCode) = 0;\r
+ JUCE_COMCALL CancelDefaultHandling (long lEvCode) = 0;\r
+ JUCE_COMCALL RestoreDefaultHandling (long lEvCode) = 0;\r
+ JUCE_COMCALL FreeEventParams (long lEvCode, LONG_PTR lParam1, LONG_PTR lParam2) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaEventEx, "56a868c0-0ad4-11ce-b03a-0020af0ba770") : public IMediaEvent\r
+{\r
+public:\r
+ JUCE_COMCALL SetNotifyWindow (OAHWND hwnd, long lMsg, LONG_PTR lInstanceData) = 0;\r
+ JUCE_COMCALL SetNotifyFlags (long lNoNotifyFlags) = 0;\r
+ JUCE_COMCALL GetNotifyFlags (__RPC__out long* lplNoNotifyFlags) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IBasicAudio, "56a868b3-0ad4-11ce-b03a-0020af0ba770") : public IDispatch\r
+{\r
+public:\r
+ JUCE_COMCALL put_Volume (long lVolume) = 0;\r
+ JUCE_COMCALL get_Volume (__RPC__out long* plVolume) = 0;\r
+ JUCE_COMCALL put_Balance (long lBalance) = 0;\r
+ JUCE_COMCALL get_Balance (__RPC__out long* plBalance) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaSample, "56a8689a-0ad4-11ce-b03a-0020af0ba770") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL GetPointer (BYTE * *ppBuffer) = 0;\r
+ virtual long STDMETHODCALLTYPE GetSize() = 0;\r
+ JUCE_COMCALL GetTime (_Out_ REFERENCE_TIME * pTimeStart, _Out_ REFERENCE_TIME * pTimeEnd) = 0;\r
+ JUCE_COMCALL SetTime (_In_opt_ REFERENCE_TIME * pTimeStart, _In_opt_ REFERENCE_TIME * pTimeEnd) = 0;\r
+ JUCE_COMCALL IsSyncPoint() = 0;\r
+ JUCE_COMCALL SetSyncPoint (BOOL bIsSyncPoint) = 0;\r
+ JUCE_COMCALL IsPreroll() = 0;\r
+ JUCE_COMCALL SetPreroll (BOOL bIsPreroll) = 0;\r
+ virtual long STDMETHODCALLTYPE GetActualDataLength() = 0;\r
+ JUCE_COMCALL SetActualDataLength (long __MIDL__IMediaSample0000) = 0;\r
+ JUCE_COMCALL GetMediaType (_Out_ AM_MEDIA_TYPE * *ppMediaType) = 0;\r
+ JUCE_COMCALL SetMediaType (_In_ AM_MEDIA_TYPE * pMediaType) = 0;\r
+ JUCE_COMCALL IsDiscontinuity() = 0;\r
+ JUCE_COMCALL SetDiscontinuity (BOOL bDiscontinuity) = 0;\r
+ JUCE_COMCALL GetMediaTime (_Out_ LONGLONG * pTimeStart, _Out_ LONGLONG * pTimeEnd) = 0;\r
+ JUCE_COMCALL SetMediaTime (_In_opt_ LONGLONG * pTimeStart, _In_opt_ LONGLONG * pTimeEnd) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IFileSinkFilter, "a2104830-7c70-11cf-8bce-00aa00a3f1a6") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL SetFileName (LPCOLESTR pszFileName, _In_opt_ const AM_MEDIA_TYPE* pmt) = 0;\r
+ JUCE_COMCALL GetCurFile (_Out_ LPOLESTR * ppszFileName, _Out_ AM_MEDIA_TYPE * pmt) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ICaptureGraphBuilder2, "93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL SetFiltergraph (IGraphBuilder * pfg) = 0;\r
+ JUCE_COMCALL GetFiltergraph (_Out_ IGraphBuilder * *ppfg) = 0;\r
+ JUCE_COMCALL SetOutputFileName (const GUID* pType, LPCOLESTR lpstrFile, _Outptr_ IBaseFilter** ppf, _Outptr_opt_ IFileSinkFilter** ppSink) = 0;\r
+ JUCE_COMCALL FindInterface (_In_opt_ const GUID* pCategory, _In_opt_ const GUID* pType, IBaseFilter* pf, REFIID riid, _Out_ void** ppint) = 0;\r
+ JUCE_COMCALL RenderStream (_In_opt_ const GUID* pCategory, const GUID* pType, IUnknown* pSource, IBaseFilter* pfCompressor, IBaseFilter* pfRenderer) = 0;\r
+ JUCE_COMCALL ControlStream (const GUID* pCategory, const GUID* pType, IBaseFilter* pFilter, _In_opt_ REFERENCE_TIME* pstart, _In_opt_ REFERENCE_TIME* pstop, WORD wStartCookie, WORD wStopCookie) = 0;\r
+ JUCE_COMCALL AllocCapFile (LPCOLESTR lpstr, DWORDLONG dwlSize) = 0;\r
+ JUCE_COMCALL CopyCaptureFile (_In_ LPOLESTR lpwstrOld, _In_ LPOLESTR lpwstrNew, int fAllowEscAbort, IAMCopyCaptureFileProgress* pCallback) = 0;\r
+ JUCE_COMCALL FindPin (IUnknown * pSource, PIN_DIRECTION pindir, _In_opt_ const GUID* pCategory, _In_opt_ const GUID* pType, BOOL fUnconnected, int num, _Out_ IPin** ppPin) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IAMStreamConfig, "C6E13340-30AC-11d0-A18C-00A0C9118956") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL SetFormat (AM_MEDIA_TYPE * pmt) = 0;\r
+ JUCE_COMCALL GetFormat (_Out_ AM_MEDIA_TYPE * *ppmt) = 0;\r
+ JUCE_COMCALL GetNumberOfCapabilities (_Out_ int* piCount, _Out_ int* piSize) = 0;\r
+ JUCE_COMCALL GetStreamCaps (int iIndex, _Out_ AM_MEDIA_TYPE** ppmt, _Out_ BYTE* pSCC) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ISampleGrabberCB, "0579154A-2B53-4994-B0D0-E773148EFF85") : public IUnknown\r
+{\r
+ JUCE_COMCALL SampleCB (double, ComTypes::IMediaSample*) = 0;\r
+ JUCE_COMCALL BufferCB (double, BYTE*, long) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ISampleGrabber, "6B652FFF-11FE-4fce-92AD-0266B5D7C78F") : public IUnknown\r
+{\r
+ JUCE_COMCALL SetOneShot (BOOL) = 0;\r
+ JUCE_COMCALL SetMediaType (const ComTypes::AM_MEDIA_TYPE*) = 0;\r
+ JUCE_COMCALL GetConnectedMediaType (ComTypes::AM_MEDIA_TYPE*) = 0;\r
+ JUCE_COMCALL SetBufferSamples (BOOL) = 0;\r
+ JUCE_COMCALL GetCurrentBuffer (long*, long*) = 0;\r
+ JUCE_COMCALL GetCurrentSample (ComTypes::IMediaSample**) = 0;\r
+ JUCE_COMCALL SetCallback (ISampleGrabberCB*, long) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IAMLatency, "62EA93BA-EC62-11d2-B770-00C04FB6BD3D") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL GetLatency (_Out_ REFERENCE_TIME * prtLatency) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IAMPushSource, "F185FE76-E64E-11d2-B76E-00C04FB6BD3D") : public IAMLatency\r
+{\r
+public:\r
+ JUCE_COMCALL GetPushSourceFlags (_Out_ ULONG * pFlags) = 0;\r
+ JUCE_COMCALL SetPushSourceFlags (ULONG Flags) = 0;\r
+ JUCE_COMCALL SetStreamOffset (REFERENCE_TIME rtOffset) = 0;\r
+ JUCE_COMCALL GetStreamOffset (_Out_ REFERENCE_TIME * prtOffset) = 0;\r
+ JUCE_COMCALL GetMaxStreamOffset (_Out_ REFERENCE_TIME * prtMaxOffset) = 0;\r
+ JUCE_COMCALL SetMaxStreamOffset (REFERENCE_TIME rtMaxOffset) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IConfigAsfWriter, "45086030-F7E4-486a-B504-826BB5792A3B") : public IUnknown\r
+{\r
+public:\r
+ JUCE_COMCALL ConfigureFilterUsingProfileId (DWORD dwProfileId) = 0;\r
+ JUCE_COMCALL GetCurrentProfileId (__RPC__out DWORD * pdwProfileId) = 0;\r
+ JUCE_COMCALL ConfigureFilterUsingProfileGuid (__RPC__in REFGUID guidProfile) = 0;\r
+ JUCE_COMCALL GetCurrentProfileGuid (__RPC__out GUID * pProfileGuid) = 0;\r
+ JUCE_COMCALL ConfigureFilterUsingProfile (__RPC__in_opt IWMProfile * pProfile) = 0;\r
+ JUCE_COMCALL GetCurrentProfile (__RPC__deref_out_opt IWMProfile * *ppProfile) = 0;\r
+ JUCE_COMCALL SetIndexMode (BOOL bIndexFile) = 0;\r
+ JUCE_COMCALL GetIndexMode (__RPC__out BOOL * pbIndexFile) = 0;\r
+};\r
+\r
+constexpr CLSID CLSID_CaptureGraphBuilder2 = { 0xBF87B6E1, 0x8C27, 0x11d0, { 0xB3, 0xF0, 0x00, 0xAA, 0x00, 0x37, 0x61, 0xC5 } };\r
+constexpr CLSID CLSID_EnhancedVideoRenderer = { 0xfa10746c, 0x9b63, 0x4b6c, { 0xbc, 0x49, 0xfc, 0x30, 0x0e, 0xa5, 0xf2, 0x56 } };\r
+constexpr CLSID CLSID_FilterGraph = { 0xe436ebb3, 0x524f, 0x11ce, { 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } };\r
+constexpr CLSID CLSID_NullRenderer = { 0xC1F400A4, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } };\r
+constexpr CLSID CLSID_SampleGrabber = { 0xC1F400A0, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } };\r
+constexpr CLSID CLSID_SmartTee = { 0xcc58e280, 0x8aa1, 0x11d1, { 0xb3, 0xf1, 0x00, 0xaa, 0x00, 0x37, 0x61, 0xc5 } };\r
+constexpr CLSID CLSID_SystemDeviceEnum = { 0x62BE5D10, 0x60EB, 0x11d0, { 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 } };\r
+constexpr CLSID CLSID_VideoInputDeviceCategory = { 0x860BB310, 0x5D01, 0x11d0, { 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 } };\r
+constexpr CLSID CLSID_VideoMixingRenderer = { 0xb87beb7b, 0x8d29, 0x423F, { 0xae, 0x4d, 0x65, 0x82, 0xc1, 0x01, 0x75, 0xac } };\r
+constexpr CLSID CLSID_WMAsfWriter = { 0x7c23220e, 0x55bb, 0x11d3, { 0x8b, 0x16, 0x00, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d } };\r
+constexpr CLSID FORMAT_VideoInfo = { 0x05589f80, 0xc356, 0x11ce, { 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a } };\r
+constexpr CLSID MEDIASUBTYPE_RGB24 = { 0xe436eb7d, 0x524f, 0x11ce, { 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } };\r
+constexpr CLSID MEDIATYPE_Video = { 0x73646976, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } };\r
+constexpr CLSID MR_VIDEO_RENDER_SERVICE = { 0x1092a86c, 0xab1a, 0x459a, { 0xa3, 0x36, 0x83, 0x1f, 0xbc, 0x4d, 0x11, 0xff } };\r
+constexpr CLSID PIN_CATEGORY_CAPTURE = { 0xfb6c4281, 0x0353, 0x11d1, { 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba } };\r
+\r
+} // namespace ComTypes\r
+} // namespace juce\r
+\r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::ComTypes::IAMPushSource, 0xF185FE76, 0xE64E, 0x11d2, 0xB7, 0x6E, 0x00, 0xC0, 0x4F, 0xB6, 0xBD, 0x3D)\r
+__CRT_UUID_DECL (juce::ComTypes::IAMStreamConfig, 0xC6E13340, 0x30AC, 0x11d0, 0xA1, 0x8C, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56)\r
+__CRT_UUID_DECL (juce::ComTypes::IBaseFilter, 0x56a86895, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::IBasicAudio, 0x56a868b3, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::ICaptureGraphBuilder2, 0x93E5A4E0, 0x2D50, 0x11d2, 0xAB, 0xFA, 0x00, 0xA0, 0xC9, 0xC6, 0xE3, 0x8D)\r
+__CRT_UUID_DECL (juce::ComTypes::IConfigAsfWriter, 0x45086030, 0xF7E4, 0x486a, 0xB5, 0x04, 0x82, 0x6B, 0xB5, 0x79, 0x2A, 0x3B)\r
+__CRT_UUID_DECL (juce::ComTypes::ICreateDevEnum, 0x29840822, 0x5B84, 0x11D0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86)\r
+__CRT_UUID_DECL (juce::ComTypes::IFileSinkFilter, 0xa2104830, 0x7c70, 0x11cf, 0x8b, 0xce, 0x00, 0xaa, 0x00, 0xa3, 0xf1, 0xa6)\r
+__CRT_UUID_DECL (juce::ComTypes::IGraphBuilder, 0x56a868a9, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::IMFGetService, 0xfa993888, 0x4383, 0x415a, 0xa9, 0x30, 0xdd, 0x47, 0x2a, 0x8c, 0xf6, 0xf7)\r
+__CRT_UUID_DECL (juce::ComTypes::IMFVideoDisplayControl, 0xa490b1e4, 0xab84, 0x4d31, 0xa1, 0xb2, 0x18, 0x1e, 0x03, 0xb1, 0x07, 0x7a)\r
+__CRT_UUID_DECL (juce::ComTypes::IMediaControl, 0x56a868b1, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::IMediaEventEx, 0x56a868c0, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::IMediaPosition, 0x56a868b2, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::ISampleGrabber, 0x6B652FFF, 0x11FE, 0x4fce, 0x92, 0xAD, 0x02, 0x66, 0xB5, 0xD7, 0xC7, 0x8F)\r
+__CRT_UUID_DECL (juce::ComTypes::ISampleGrabberCB, 0x0579154A, 0x2B53, 0x4994, 0xB0, 0xD0, 0xE7, 0x73, 0x14, 0x8E, 0xFF, 0x85)\r
+__CRT_UUID_DECL (juce::ComTypes::IVMRFilterConfig, 0x9e5530c5, 0x7034, 0x48b4, 0xbb, 0x46, 0x0b, 0x8a, 0x6e, 0xfc, 0x8e, 0x36)\r
+__CRT_UUID_DECL (juce::ComTypes::IVMRWindowlessControl, 0x0eb1088c, 0x4dcd, 0x46f0, 0x87, 0x8f, 0x39, 0xda, 0xe8, 0x6a, 0x51, 0xb7)\r
+#endif\r
//==============================================================================\r
struct Base\r
{\r
- virtual ~Base() {}\r
+ virtual ~Base() = default;\r
\r
- virtual HRESULT create (ComSmartPtr<IGraphBuilder>&, ComSmartPtr<IBaseFilter>&, HWND) = 0;\r
+ virtual HRESULT create (ComSmartPtr<ComTypes::IGraphBuilder>&, ComSmartPtr<ComTypes::IBaseFilter>&, HWND) = 0;\r
virtual void setVideoWindow (HWND) = 0;\r
virtual void setVideoPosition (HWND) = 0;\r
virtual void repaintVideo (HWND, HDC) = 0;\r
{\r
VMR7() {}\r
\r
- HRESULT create (ComSmartPtr<IGraphBuilder>& graphBuilder,\r
- ComSmartPtr<IBaseFilter>& baseFilter, HWND hwnd) override\r
+ HRESULT create (ComSmartPtr<ComTypes::IGraphBuilder>& graphBuilder,\r
+ ComSmartPtr<ComTypes::IBaseFilter>& baseFilter, HWND hwnd) override\r
{\r
- ComSmartPtr<IVMRFilterConfig> filterConfig;\r
+ ComSmartPtr<ComTypes::IVMRFilterConfig> filterConfig;\r
\r
- HRESULT hr = baseFilter.CoCreateInstance (CLSID_VideoMixingRenderer);\r
+ HRESULT hr = baseFilter.CoCreateInstance (ComTypes::CLSID_VideoMixingRenderer);\r
\r
if (SUCCEEDED (hr)) hr = graphBuilder->AddFilter (baseFilter, L"VMR-7");\r
if (SUCCEEDED (hr)) hr = baseFilter.QueryInterface (filterConfig);\r
- if (SUCCEEDED (hr)) hr = filterConfig->SetRenderingMode (VMRMode_Windowless);\r
+ if (SUCCEEDED (hr)) hr = filterConfig->SetRenderingMode (ComTypes::VMRMode_Windowless);\r
if (SUCCEEDED (hr)) hr = baseFilter.QueryInterface (windowlessControl);\r
if (SUCCEEDED (hr)) hr = windowlessControl->SetVideoClippingWindow (hwnd);\r
- if (SUCCEEDED (hr)) hr = windowlessControl->SetAspectRatioMode (VMR_ARMODE_LETTER_BOX);\r
+ if (SUCCEEDED (hr)) hr = windowlessControl->SetAspectRatioMode (ComTypes::VMR_ARMODE_LETTER_BOX);\r
\r
return hr;\r
}\r
return windowlessControl->GetNativeVideoSize (&videoWidth, &videoHeight, nullptr, nullptr);\r
}\r
\r
- ComSmartPtr<IVMRWindowlessControl> windowlessControl;\r
+ ComSmartPtr<ComTypes::IVMRWindowlessControl> windowlessControl;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VMR7)\r
};\r
//==============================================================================\r
struct EVR : public Base\r
{\r
- EVR() {}\r
+ EVR() = default;\r
\r
- HRESULT create (ComSmartPtr<IGraphBuilder>& graphBuilder,\r
- ComSmartPtr<IBaseFilter>& baseFilter, HWND hwnd) override\r
+ HRESULT create (ComSmartPtr<ComTypes::IGraphBuilder>& graphBuilder,\r
+ ComSmartPtr<ComTypes::IBaseFilter>& baseFilter, HWND hwnd) override\r
{\r
- ComSmartPtr<IMFGetService> getService;\r
+ ComSmartPtr<ComTypes::IMFGetService> getService;\r
\r
- HRESULT hr = baseFilter.CoCreateInstance (CLSID_EnhancedVideoRenderer);\r
+ HRESULT hr = baseFilter.CoCreateInstance (ComTypes::CLSID_EnhancedVideoRenderer);\r
\r
if (SUCCEEDED (hr)) hr = graphBuilder->AddFilter (baseFilter, L"EVR");\r
if (SUCCEEDED (hr)) hr = baseFilter.QueryInterface (getService);\r
- if (SUCCEEDED (hr)) hr = getService->GetService (MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl,\r
+ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+ if (SUCCEEDED (hr)) hr = getService->GetService (ComTypes::MR_VIDEO_RENDER_SERVICE, __uuidof (ComTypes::IMFVideoDisplayControl),\r
(void**) videoDisplayControl.resetAndGetPointerAddress());\r
+ JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
if (SUCCEEDED (hr)) hr = videoDisplayControl->SetVideoWindow (hwnd);\r
- if (SUCCEEDED (hr)) hr = videoDisplayControl->SetAspectRatioMode (MFVideoARMode_PreservePicture);\r
+ if (SUCCEEDED (hr)) hr = videoDisplayControl->SetAspectRatioMode (ComTypes::MFVideoARMode_PreservePicture);\r
\r
return hr;\r
}\r
\r
void setVideoPosition (HWND hwnd) override\r
{\r
- const MFVideoNormalizedRect src = { 0.0f, 0.0f, 1.0f, 1.0f };\r
+ const ComTypes::MFVideoNormalizedRect src { 0.0f, 0.0f, 1.0f, 1.0f };\r
\r
RECT dest;\r
GetClientRect (hwnd, &dest);\r
return hr;\r
}\r
\r
- ComSmartPtr<IMFVideoDisplayControl> videoDisplayControl;\r
+ ComSmartPtr<ComTypes::IMFVideoDisplayControl> videoDisplayControl;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EVR)\r
};\r
{\r
}\r
\r
+ using ComponentMovementWatcher::componentMovedOrResized;\r
void componentMovedOrResized (bool, bool) override\r
{\r
if (owner.videoLoaded)\r
owner.recreateNativeWindowAsync();\r
}\r
\r
+ using ComponentMovementWatcher::componentVisibilityChanged;\r
void componentVisibilityChanged() override\r
{\r
if (owner.videoLoaded)\r
\r
createNativeWindow();\r
\r
- mediaEvent->CancelDefaultHandling (EC_STATE_CHANGE);\r
- mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0);\r
+ mediaEvent->CancelDefaultHandling (ComTypes::EC_STATE_CHANGE);\r
+ mediaEvent->SetNotifyWindow ((ComTypes::OAHWND) hwnd, graphEventID, 0);\r
\r
if (videoRenderer != nullptr)\r
videoRenderer->setVideoWindow (hwnd);\r
if (! createNativeWindow())\r
return Result::fail ("Can't create window");\r
\r
- HRESULT hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph);\r
+ HRESULT hr = graphBuilder.CoCreateInstance (ComTypes::CLSID_FilterGraph);\r
\r
// basic playback interfaces\r
if (SUCCEEDED (hr)) hr = graphBuilder.QueryInterface (mediaControl);\r
// set window to receive events\r
if (SUCCEEDED (hr))\r
{\r
- mediaEvent->CancelDefaultHandling (EC_STATE_CHANGE);\r
- hr = mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0);\r
+ mediaEvent->CancelDefaultHandling (ComTypes::EC_STATE_CHANGE);\r
+ hr = mediaEvent->SetNotifyWindow ((ComTypes::OAHWND) hwnd, graphEventID, 0);\r
}\r
\r
if (SUCCEEDED (hr))\r
{\r
switch (hr)\r
{\r
- case VFW_E_INVALID_FILE_FORMAT: return Result::fail ("Invalid file format");\r
- case VFW_E_NOT_FOUND: return Result::fail ("File not found");\r
- case VFW_E_UNKNOWN_FILE_TYPE: return Result::fail ("Unknown file type");\r
- case VFW_E_UNSUPPORTED_STREAM: return Result::fail ("Unsupported stream");\r
- case VFW_E_CANNOT_CONNECT: return Result::fail ("Cannot connect");\r
- case VFW_E_CANNOT_LOAD_SOURCE_FILTER: return Result::fail ("Cannot load source filter");\r
+ case ComTypes::VFW_E_INVALID_FILE_FORMAT: return Result::fail ("Invalid file format");\r
+ case ComTypes::VFW_E_NOT_FOUND: return Result::fail ("File not found");\r
+ case ComTypes::VFW_E_UNKNOWN_FILE_TYPE: return Result::fail ("Unknown file type");\r
+ case ComTypes::VFW_E_UNSUPPORTED_STREAM: return Result::fail ("Unsupported stream");\r
+ case ComTypes::VFW_E_CANNOT_CONNECT: return Result::fail ("Cannot connect");\r
+ case ComTypes::VFW_E_CANNOT_LOAD_SOURCE_FILTER: return Result::fail ("Cannot load source filter");\r
}\r
\r
TCHAR messageBuffer[512] = { 0 };\r
\r
FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,\r
- nullptr, hr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),\r
+ nullptr, (DWORD) hr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),\r
messageBuffer, (DWORD) numElementsInArray (messageBuffer) - 1, nullptr);\r
\r
return Result::fail (String (messageBuffer));\r
\r
switch (ec)\r
{\r
- case EC_REPAINT:\r
+ case ComTypes::EC_REPAINT:\r
component.repaint();\r
break;\r
\r
- case EC_COMPLETE:\r
+ case ComTypes::EC_COMPLETE:\r
component.stop();\r
component.setPosition (0.0);\r
break;\r
\r
- case EC_ERRORABORT:\r
- case EC_ERRORABORTEX:\r
+ case ComTypes::EC_ERRORABORT:\r
+ case ComTypes::EC_ERRORABORTEX:\r
component.errorOccurred (getErrorMessageFromResult ((HRESULT) p1).getErrorMessage());\r
// intentional fallthrough\r
- case EC_USERABORT:\r
+ case ComTypes::EC_USERABORT:\r
component.close();\r
break;\r
\r
- case EC_STATE_CHANGE:\r
+ case ComTypes::EC_STATE_CHANGE:\r
switch (p1)\r
{\r
- case State_Paused: component.playbackStopped(); break;\r
- case State_Running: component.playbackStarted(); break;\r
+ case ComTypes::State_Paused: component.playbackStopped(); break;\r
+ case ComTypes::State_Running: component.playbackStarted(); break;\r
default: break;\r
}\r
\r
//==============================================================================\r
double getDuration() const\r
{\r
- REFTIME duration;\r
+ ComTypes::REFTIME duration;\r
mediaPosition->get_Duration (&duration);\r
return duration;\r
}\r
\r
double getPosition() const\r
{\r
- REFTIME seconds;\r
+ ComTypes::REFTIME seconds;\r
mediaPosition->get_CurrentPosition (&seconds);\r
return seconds;\r
}\r
HWND hwnd = {};\r
HDC hdc = {};\r
\r
- ComSmartPtr<IGraphBuilder> graphBuilder;\r
- ComSmartPtr<IMediaControl> mediaControl;\r
- ComSmartPtr<IMediaPosition> mediaPosition;\r
- ComSmartPtr<IMediaEventEx> mediaEvent;\r
- ComSmartPtr<IBasicAudio> basicAudio;\r
- ComSmartPtr<IBaseFilter> baseFilter;\r
+ ComSmartPtr<ComTypes::IGraphBuilder> graphBuilder;\r
+ ComSmartPtr<ComTypes::IMediaControl> mediaControl;\r
+ ComSmartPtr<ComTypes::IMediaPosition> mediaPosition;\r
+ ComSmartPtr<ComTypes::IMediaEventEx> mediaEvent;\r
+ ComSmartPtr<ComTypes::IBasicAudio> basicAudio;\r
+ ComSmartPtr<ComTypes::IBaseFilter> baseFilter;\r
\r
std::unique_ptr<VideoRenderers::Base> videoRenderer;\r
\r
\r
bool isRendererConnected()\r
{\r
- ComSmartPtr<IEnumPins> enumPins;\r
+ ComSmartPtr<ComTypes::IEnumPins> enumPins;\r
\r
HRESULT hr = baseFilter->EnumPins (enumPins.resetAndGetPointerAddress());\r
\r
if (SUCCEEDED (hr))\r
hr = enumPins->Reset();\r
\r
- ComSmartPtr<IPin> pin;\r
+ ComSmartPtr<ComTypes::IPin> pin;\r
\r
while (SUCCEEDED (hr)\r
&& enumPins->Next (1, pin.resetAndGetPointerAddress(), nullptr) == S_OK)\r
{\r
- ComSmartPtr<IPin> otherPin;\r
+ ComSmartPtr<ComTypes::IPin> otherPin;\r
\r
hr = pin->ConnectedTo (otherPin.resetAndGetPointerAddress());\r
\r
if (SUCCEEDED (hr))\r
{\r
- PIN_DIRECTION direction;\r
+ ComTypes::PIN_DIRECTION direction;\r
hr = pin->QueryDirection (&direction);\r
\r
- if (SUCCEEDED (hr) && direction == PINDIR_INPUT)\r
+ if (SUCCEEDED (hr) && direction == ComTypes::PINDIR_INPUT)\r
return true;\r
}\r
- else if (hr == VFW_E_NOT_CONNECTED)\r
+ else if (hr == ComTypes::VFW_E_NOT_CONNECTED)\r
{\r
hr = S_OK;\r
}\r