mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Merge remote-tracking branch 'upstream/develop' into develop
This commit is contained in:
commit
c0fd58db9c
53 changed files with 2317 additions and 1785 deletions
|
|
@ -4,6 +4,30 @@ JUCE breaking changes
|
|||
Develop
|
||||
=======
|
||||
|
||||
Change
|
||||
------
|
||||
The formatting of floating point numbers written to XML and JSON files has
|
||||
changed.
|
||||
|
||||
Note that there is no change in precision - the XML and JSON files containing
|
||||
the new format numbers will parse in exactly the same way, it is only the
|
||||
string representation that has changed.
|
||||
|
||||
Possible Issues
|
||||
---------------
|
||||
If you rely upon exactly reproducing XML or JSON files then the new files may
|
||||
be different.
|
||||
|
||||
Workaround
|
||||
----------
|
||||
Update any reference XML or JSON files to use the new format.
|
||||
|
||||
Rationale
|
||||
---------
|
||||
The new format retains full precision, provides a human friendly representation
|
||||
of values near 1, and uses scientific notation for small and large numbers.
|
||||
This prevents needless file size bloat from numbers like 0.00000000000000001.
|
||||
|
||||
|
||||
Version 5.4.3
|
||||
=============
|
||||
|
|
|
|||
|
|
@ -52,9 +52,9 @@
|
|||
//==============================================================================
|
||||
struct MidiDeviceListEntry : ReferenceCountedObject
|
||||
{
|
||||
MidiDeviceListEntry (const String& deviceName) : name (deviceName) {}
|
||||
MidiDeviceListEntry (MidiDeviceInfo info) : deviceInfo (info) {}
|
||||
|
||||
String name;
|
||||
MidiDeviceInfo deviceInfo;
|
||||
std::unique_ptr<MidiInput> inDevice;
|
||||
std::unique_ptr<MidiOutput> outDevice;
|
||||
|
||||
|
|
@ -187,7 +187,7 @@ public:
|
|||
if (isInput)
|
||||
{
|
||||
jassert (midiInputs[index]->inDevice.get() == nullptr);
|
||||
midiInputs[index]->inDevice.reset (MidiInput::openDevice (index, this));
|
||||
midiInputs[index]->inDevice.reset (MidiInput::openDevice (midiInputs[index]->deviceInfo.identifier, this));
|
||||
|
||||
if (midiInputs[index]->inDevice.get() == nullptr)
|
||||
{
|
||||
|
|
@ -200,7 +200,7 @@ public:
|
|||
else
|
||||
{
|
||||
jassert (midiOutputs[index]->outDevice.get() == nullptr);
|
||||
midiOutputs[index]->outDevice.reset (MidiOutput::openDevice (index));
|
||||
midiOutputs[index]->outDevice.reset (MidiOutput::openDevice (midiOutputs[index]->deviceInfo.identifier));
|
||||
|
||||
if (midiOutputs[index]->outDevice.get() == nullptr)
|
||||
{
|
||||
|
|
@ -278,14 +278,14 @@ private:
|
|||
if (isInput)
|
||||
{
|
||||
if (rowNumber < parent.getNumMidiInputs())
|
||||
g.drawText (parent.getMidiDevice (rowNumber, true)->name,
|
||||
g.drawText (parent.getMidiDevice (rowNumber, true)->deviceInfo.name,
|
||||
5, 0, width, height,
|
||||
Justification::centredLeft, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rowNumber < parent.getNumMidiOutputs())
|
||||
g.drawText (parent.getMidiDevice (rowNumber, false)->name,
|
||||
g.drawText (parent.getMidiDevice (rowNumber, false)->deviceInfo.name,
|
||||
5, 0, width, height,
|
||||
Justification::centredLeft, true);
|
||||
}
|
||||
|
|
@ -368,34 +368,34 @@ private:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
bool hasDeviceListChanged (const StringArray& deviceNames, bool isInputDevice)
|
||||
bool hasDeviceListChanged (const Array<MidiDeviceInfo>& availableDevices, bool isInputDevice)
|
||||
{
|
||||
ReferenceCountedArray<MidiDeviceListEntry>& midiDevices = isInputDevice ? midiInputs
|
||||
: midiOutputs;
|
||||
|
||||
if (deviceNames.size() != midiDevices.size())
|
||||
if (availableDevices.size() != midiDevices.size())
|
||||
return true;
|
||||
|
||||
for (auto i = 0; i < deviceNames.size(); ++i)
|
||||
if (deviceNames[i] != midiDevices[i]->name)
|
||||
for (auto i = 0; i < availableDevices.size(); ++i)
|
||||
if (availableDevices[i] != midiDevices[i]->deviceInfo)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
ReferenceCountedObjectPtr<MidiDeviceListEntry> findDeviceWithName (const String& name, bool isInputDevice) const
|
||||
ReferenceCountedObjectPtr<MidiDeviceListEntry> findDevice (MidiDeviceInfo device, bool isInputDevice) const
|
||||
{
|
||||
const ReferenceCountedArray<MidiDeviceListEntry>& midiDevices = isInputDevice ? midiInputs
|
||||
: midiOutputs;
|
||||
|
||||
for (auto midiDevice : midiDevices)
|
||||
if (midiDevice->name == name)
|
||||
return midiDevice;
|
||||
for (auto& d : midiDevices)
|
||||
if (d->deviceInfo == device)
|
||||
return d;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void closeUnpluggedDevices (StringArray& currentlyPluggedInDevices, bool isInputDevice)
|
||||
void closeUnpluggedDevices (const Array<MidiDeviceInfo>& currentlyPluggedInDevices, bool isInputDevice)
|
||||
{
|
||||
ReferenceCountedArray<MidiDeviceListEntry>& midiDevices = isInputDevice ? midiInputs
|
||||
: midiOutputs;
|
||||
|
|
@ -404,7 +404,7 @@ private:
|
|||
{
|
||||
auto& d = *midiDevices[i];
|
||||
|
||||
if (! currentlyPluggedInDevices.contains (d.name))
|
||||
if (! currentlyPluggedInDevices.contains (d.deviceInfo))
|
||||
{
|
||||
if (isInputDevice ? d.inDevice .get() != nullptr
|
||||
: d.outDevice.get() != nullptr)
|
||||
|
|
@ -417,26 +417,26 @@ private:
|
|||
|
||||
void updateDeviceList (bool isInputDeviceList)
|
||||
{
|
||||
auto newDeviceNames = isInputDeviceList ? MidiInput::getDevices()
|
||||
: MidiOutput::getDevices();
|
||||
auto availableDevices = isInputDeviceList ? MidiInput::getAvailableDevices()
|
||||
: MidiOutput::getAvailableDevices();
|
||||
|
||||
if (hasDeviceListChanged (newDeviceNames, isInputDeviceList))
|
||||
if (hasDeviceListChanged (availableDevices, isInputDeviceList))
|
||||
{
|
||||
|
||||
ReferenceCountedArray<MidiDeviceListEntry>& midiDevices
|
||||
= isInputDeviceList ? midiInputs : midiOutputs;
|
||||
|
||||
closeUnpluggedDevices (newDeviceNames, isInputDeviceList);
|
||||
closeUnpluggedDevices (availableDevices, isInputDeviceList);
|
||||
|
||||
ReferenceCountedArray<MidiDeviceListEntry> newDeviceList;
|
||||
|
||||
// add all currently plugged-in devices to the device list
|
||||
for (auto newDeviceName : newDeviceNames)
|
||||
for (auto& newDevice : availableDevices)
|
||||
{
|
||||
MidiDeviceListEntry::Ptr entry = findDeviceWithName (newDeviceName, isInputDeviceList);
|
||||
MidiDeviceListEntry::Ptr entry = findDevice (newDevice, isInputDeviceList);
|
||||
|
||||
if (entry == nullptr)
|
||||
entry = new MidiDeviceListEntry (newDeviceName);
|
||||
entry = new MidiDeviceListEntry (newDevice);
|
||||
|
||||
newDeviceList.add (entry);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -133,11 +133,10 @@ add_library( ${BINARY_NAME}
|
|||
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp"
|
||||
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
|
||||
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiInput.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.h"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp"
|
||||
|
|
@ -1727,11 +1726,10 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/
|
|||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiInput.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
|
|
|
|||
|
|
@ -264,10 +264,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2282,9 +2282,8 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
|
||||
|
|
|
|||
|
|
@ -670,10 +670,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2961,15 +2961,12 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h">
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -264,10 +264,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2282,9 +2282,8 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
|
||||
|
|
|
|||
|
|
@ -670,10 +670,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2961,15 +2961,12 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h">
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -266,10 +266,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2284,9 +2284,8 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
|
||||
|
|
|
|||
|
|
@ -670,10 +670,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2961,15 +2961,12 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h">
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -114,11 +114,10 @@ add_library( ${BINARY_NAME}
|
|||
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp"
|
||||
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
|
||||
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiInput.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.h"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp"
|
||||
|
|
@ -1395,11 +1394,10 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/
|
|||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiInput.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
|
|
|
|||
|
|
@ -247,10 +247,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -1887,9 +1887,8 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
|
||||
|
|
|
|||
|
|
@ -502,10 +502,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2364,15 +2364,12 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h">
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -131,11 +131,10 @@ add_library( ${BINARY_NAME}
|
|||
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp"
|
||||
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
|
||||
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiInput.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.h"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp"
|
||||
|
|
@ -1485,11 +1484,10 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/
|
|||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiInput.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
|
|
|
|||
|
|
@ -793,7 +793,6 @@
|
|||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"../../../../modules/juce_audio_processors/format_types/VST3_SDK",
|
||||
"$(HOME)/SDKs/VST_SDK/VST2_SDK",
|
||||
"../../JuceLibraryCode",
|
||||
"../../../../modules",
|
||||
"$(inherited)",
|
||||
|
|
@ -839,7 +838,6 @@
|
|||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"../../../../modules/juce_audio_processors/format_types/VST3_SDK",
|
||||
"$(HOME)/SDKs/VST_SDK/VST2_SDK",
|
||||
"../../JuceLibraryCode",
|
||||
"../../../../modules",
|
||||
"$(inherited)",
|
||||
|
|
|
|||
|
|
@ -254,10 +254,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -1963,9 +1963,8 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
|
||||
|
|
|
|||
|
|
@ -559,10 +559,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2517,15 +2517,12 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h">
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -252,10 +252,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -1961,9 +1961,8 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
|
||||
|
|
|
|||
|
|
@ -559,10 +559,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2517,15 +2517,12 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h">
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -254,10 +254,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -1963,9 +1963,8 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
|
||||
|
|
|
|||
|
|
@ -559,10 +559,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2517,15 +2517,12 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h">
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -807,7 +807,6 @@
|
|||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"../../../../modules/juce_audio_processors/format_types/VST3_SDK",
|
||||
"$(HOME)/SDKs/VST_SDK/VST2_SDK",
|
||||
"../../JuceLibraryCode",
|
||||
"../../../../modules",
|
||||
"$(inherited)",
|
||||
|
|
@ -853,7 +852,6 @@
|
|||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"../../../../modules/juce_audio_processors/format_types/VST3_SDK",
|
||||
"$(HOME)/SDKs/VST_SDK/VST2_SDK",
|
||||
"../../JuceLibraryCode",
|
||||
"../../../../modules",
|
||||
"$(inherited)",
|
||||
|
|
|
|||
|
|
@ -118,11 +118,10 @@ add_library( ${BINARY_NAME}
|
|||
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp"
|
||||
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
|
||||
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiInput.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp"
|
||||
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.h"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp"
|
||||
"../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp"
|
||||
|
|
@ -1474,11 +1473,10 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/
|
|||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiInput.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.h" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
|
|
|
|||
|
|
@ -247,10 +247,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -1972,9 +1972,8 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
|
||||
|
|
|
|||
|
|
@ -532,10 +532,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2499,15 +2499,12 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h">
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -247,10 +247,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -1972,9 +1972,8 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
|
||||
|
|
|
|||
|
|
@ -532,10 +532,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2499,15 +2499,12 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h">
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -137,6 +137,7 @@ public:
|
|||
String getCustomResourceFoldersString() const { return customXcodeResourceFoldersValue.get().toString().replaceCharacters ("\r\n", "::"); }
|
||||
String getCustomXcassetsFolderString() const { return customXcassetsFolderValue.get(); }
|
||||
String getCustomLaunchStoryboardString() const { return customLaunchStoryboardValue.get(); }
|
||||
bool shouldAddStoryboardToProject() const { return getCustomLaunchStoryboardString().isNotEmpty() || getCustomXcassetsFolderString().isEmpty(); }
|
||||
|
||||
bool isHardenedRuntimeEnabled() const { return hardenedRuntimeValue.get(); }
|
||||
Array<var> getHardenedRuntimeOptions() const { return *hardenedRuntimeOptionsValue.get().getArray(); }
|
||||
|
|
@ -217,9 +218,9 @@ public:
|
|||
"a launch storyboard from being used.");
|
||||
|
||||
props.add (new TextPropertyComponent (customLaunchStoryboardValue, "Custom Launch Storyboard", 256, false),
|
||||
"If this field is not empty then the specified launch storyboard will be used for the app's launch screen, "
|
||||
"otherwise a default blank launch storyboard will be generated. This should be the filename without the "
|
||||
"\".storyboard\" extension and the file should be added to the project's Xcode resources.");
|
||||
"If this field is not empty then the specified launch storyboard file will be added to the project as an Xcode "
|
||||
"resource and will be used for the app's launch screen, otherwise a default blank launch storyboard will be used. "
|
||||
"The file path should be relative to the project folder.");
|
||||
}
|
||||
|
||||
props.add (new TextPropertyComponent (customXcodeResourceFoldersValue, "Custom Xcode Resource Folders", 8192, true),
|
||||
|
|
@ -1438,11 +1439,12 @@ public:
|
|||
if (type != AudioUnitv3PlugIn)
|
||||
addPlistDictionaryKeyBool (dict, "UIViewControllerBasedStatusBarAppearance", false);
|
||||
|
||||
if (owner.getCustomXcassetsFolderString().isEmpty())
|
||||
if (owner.shouldAddStoryboardToProject())
|
||||
{
|
||||
auto customStoryboard = owner.getCustomLaunchStoryboardString();
|
||||
|
||||
addPlistDictionaryKey (dict, "UILaunchStoryboardName", customStoryboard.isNotEmpty() ? customStoryboard
|
||||
addPlistDictionaryKey (dict, "UILaunchStoryboardName", customStoryboard.isNotEmpty() ? customStoryboard.fromLastOccurrenceOf ("/", false, false)
|
||||
.upToLastOccurrenceOf (".storyboard", false, false)
|
||||
: owner.getDefaultLaunchStoryboardName());
|
||||
}
|
||||
}
|
||||
|
|
@ -1911,8 +1913,17 @@ private:
|
|||
{
|
||||
addXcassets();
|
||||
|
||||
if (getCustomXcassetsFolderString().isEmpty() && getCustomLaunchStoryboardString().isEmpty())
|
||||
writeDefaultLaunchStoryboardFile();
|
||||
if (shouldAddStoryboardToProject())
|
||||
{
|
||||
auto customLaunchStoryboard = getCustomLaunchStoryboardString();
|
||||
|
||||
if (customLaunchStoryboard.isEmpty())
|
||||
writeDefaultLaunchStoryboardFile();
|
||||
else if (getProject().getProjectFolder().getChildFile (customLaunchStoryboard).existsAsFile())
|
||||
addLaunchStoryboardFileReference (RelativePath (customLaunchStoryboard, RelativePath::projectFolder)
|
||||
.rebased (getProject().getProjectFolder(), getTargetFolder(), RelativePath::buildTargetFolder)
|
||||
.toUnixStyle());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -3515,9 +3526,13 @@ private:
|
|||
|
||||
overwriteFileIfDifferentOrThrow (storyboardFile, mo);
|
||||
|
||||
auto path = RelativePath (storyboardFile, getTargetFolder(), RelativePath::buildTargetFolder).toUnixStyle();
|
||||
auto refID = addFileReference (path);
|
||||
auto fileID = addBuildFile (path, refID, false, false);
|
||||
addLaunchStoryboardFileReference (RelativePath (storyboardFile, getTargetFolder(), RelativePath::buildTargetFolder).toUnixStyle());
|
||||
}
|
||||
|
||||
void addLaunchStoryboardFileReference (const String& relativePath) const
|
||||
{
|
||||
auto refID = addFileReference (relativePath);
|
||||
auto fileID = addBuildFile (relativePath, refID, false, false);
|
||||
|
||||
resourceIDs.add (fileID);
|
||||
resourceFileRefs.add (refID);
|
||||
|
|
|
|||
|
|
@ -263,10 +263,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2134,9 +2134,8 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
|
||||
|
|
|
|||
|
|
@ -619,10 +619,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2751,15 +2751,12 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h">
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -52,6 +52,9 @@ class ConsoleUnitTestRunner : public UnitTestRunner
|
|||
//==============================================================================
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
// Needed for tests that require a message thread
|
||||
ScopedJuceInitialiser_GUI guiInitialiser;
|
||||
|
||||
ConsoleLogger logger;
|
||||
Logger::setCurrentLogger (&logger);
|
||||
|
||||
|
|
|
|||
|
|
@ -246,10 +246,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -1948,9 +1948,8 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
|
||||
|
|
|
|||
|
|
@ -529,10 +529,10 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.cpp">
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.cpp">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_android_Audio.cpp">
|
||||
|
|
@ -2466,15 +2466,12 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiInput.h">
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiOutput.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\juce_ios_Audio.h">
|
||||
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -179,7 +179,7 @@
|
|||
#include "audio_io/juce_AudioIODevice.cpp"
|
||||
#include "audio_io/juce_AudioIODeviceType.cpp"
|
||||
#include "midi_io/juce_MidiMessageCollector.cpp"
|
||||
#include "midi_io/juce_MidiOutput.cpp"
|
||||
#include "midi_io/juce_MidiDevices.cpp"
|
||||
#include "sources/juce_AudioSourcePlayer.cpp"
|
||||
#include "sources/juce_AudioTransportSource.cpp"
|
||||
#include "native/juce_MidiDataConcatenator.h"
|
||||
|
|
|
|||
|
|
@ -171,9 +171,8 @@
|
|||
#endif
|
||||
|
||||
//==============================================================================
|
||||
#include "midi_io/juce_MidiInput.h"
|
||||
#include "midi_io/juce_MidiDevices.h"
|
||||
#include "midi_io/juce_MidiMessageCollector.h"
|
||||
#include "midi_io/juce_MidiOutput.h"
|
||||
#include "audio_io/juce_AudioIODevice.h"
|
||||
#include "audio_io/juce_AudioIODeviceType.h"
|
||||
#include "audio_io/juce_SystemAudioVolume.h"
|
||||
|
|
|
|||
|
|
@ -23,18 +23,8 @@
|
|||
namespace juce
|
||||
{
|
||||
|
||||
struct MidiOutput::PendingMessage
|
||||
{
|
||||
PendingMessage (const void* data, int len, double timeStamp)
|
||||
: message (data, len, timeStamp)
|
||||
{}
|
||||
|
||||
MidiMessage message;
|
||||
PendingMessage* next;
|
||||
};
|
||||
|
||||
MidiOutput::MidiOutput (const String& deviceName)
|
||||
: Thread ("midi out"), name (deviceName)
|
||||
MidiOutput::MidiOutput (const String& deviceName, const String& deviceIdentifier)
|
||||
: Thread ("midi out"), deviceInfo (deviceName, deviceIdentifier)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -116,7 +106,7 @@ void MidiOutput::run()
|
|||
{
|
||||
while (! threadShouldExit())
|
||||
{
|
||||
uint32 now = Time::getMillisecondCounter();
|
||||
auto now = Time::getMillisecondCounter();
|
||||
uint32 eventTime = 0;
|
||||
uint32 timeToWait = 500;
|
||||
|
||||
|
|
@ -167,4 +157,106 @@ void MidiOutput::run()
|
|||
clearAllPendingMessages();
|
||||
}
|
||||
|
||||
#if JUCE_UNIT_TESTS
|
||||
class MidiDevicesUnitTests : public UnitTest
|
||||
{
|
||||
public:
|
||||
MidiDevicesUnitTests() : UnitTest ("MidiInput/MidiOutput", "MIDI/MPE") {}
|
||||
|
||||
void runTest() override
|
||||
{
|
||||
beginTest ("default device (input)");
|
||||
{
|
||||
auto devices = MidiInput::getAvailableDevices();
|
||||
auto defaultDevice = MidiInput::getDefaultDevice();
|
||||
|
||||
if (devices.size() == 0)
|
||||
expect (defaultDevice == MidiDeviceInfo());
|
||||
else
|
||||
expect (devices.contains (defaultDevice));
|
||||
}
|
||||
|
||||
beginTest ("default device (output)");
|
||||
{
|
||||
auto devices = MidiOutput::getAvailableDevices();
|
||||
auto defaultDevice = MidiOutput::getDefaultDevice();
|
||||
|
||||
if (devices.size() == 0)
|
||||
expect (defaultDevice == MidiDeviceInfo());
|
||||
else
|
||||
expect (devices.contains (defaultDevice));
|
||||
}
|
||||
|
||||
#if JUCE_MAC || JUCE_LINUX || JUCE_IOS
|
||||
String testDeviceName ("TestDevice");
|
||||
String testDeviceName2 ("TestDevice2");
|
||||
|
||||
struct MessageCallbackHandler : public MidiInputCallback
|
||||
{
|
||||
void handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message) override
|
||||
{
|
||||
messageSource = source;
|
||||
messageReceived = message;
|
||||
}
|
||||
|
||||
MidiInput* messageSource = nullptr;
|
||||
MidiMessage messageReceived;
|
||||
};
|
||||
|
||||
MessageCallbackHandler handler;
|
||||
|
||||
beginTest ("create device (input)");
|
||||
{
|
||||
std::unique_ptr<MidiInput> device (MidiInput::createNewDevice (testDeviceName, &handler));
|
||||
|
||||
expect (device.get() != nullptr);
|
||||
expect (device->getName() == testDeviceName);
|
||||
|
||||
device->setName (testDeviceName2);
|
||||
expect (device->getName() == testDeviceName2);
|
||||
}
|
||||
|
||||
beginTest ("create device (output)");
|
||||
{
|
||||
std::unique_ptr<MidiOutput> device (MidiOutput::createNewDevice (testDeviceName));
|
||||
|
||||
expect (device.get() != nullptr);
|
||||
expect (device->getName() == testDeviceName);
|
||||
}
|
||||
|
||||
auto testMessage = MidiMessage::noteOn (5, 12, (uint8) 51);
|
||||
|
||||
beginTest ("send messages");
|
||||
{
|
||||
std::unique_ptr<MidiInput> midiInput (MidiInput::createNewDevice (testDeviceName, &handler));
|
||||
expect (midiInput.get() != nullptr);
|
||||
midiInput->start();
|
||||
|
||||
auto inputInfo = midiInput->getDeviceInfo();
|
||||
|
||||
expect (MidiOutput::getAvailableDevices().contains (inputInfo));
|
||||
|
||||
std::unique_ptr<MidiOutput> midiOutput (MidiOutput::openDevice (midiInput->getIdentifier()));
|
||||
expect (midiOutput.get() != nullptr);
|
||||
|
||||
midiOutput->sendMessageNow (testMessage);
|
||||
|
||||
// Pump the message thread for a bit to allow the message to be delivered
|
||||
MessageManager::getInstance()->runDispatchLoopUntil (100);
|
||||
|
||||
expect (handler.messageSource == midiInput.get());
|
||||
|
||||
expect (handler.messageReceived.getChannel() == testMessage.getChannel());
|
||||
expect (handler.messageReceived.getNoteNumber() == testMessage.getNoteNumber());
|
||||
expect (handler.messageReceived.getVelocity() == testMessage.getVelocity());
|
||||
|
||||
midiInput->stop();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
static MidiDevicesUnitTests MidiDevicesUnitTests;
|
||||
#endif
|
||||
|
||||
} // namespace juce
|
||||
365
modules/juce_audio_devices/midi_io/juce_MidiDevices.h
Normal file
365
modules/juce_audio_devices/midi_io/juce_MidiDevices.h
Normal file
|
|
@ -0,0 +1,365 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2017 - ROLI Ltd.
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
//==============================================================================
|
||||
/**
|
||||
This struct contains information about a MIDI input or output device.
|
||||
|
||||
You can get one of these structs by calling the static getAvailableDevices() or
|
||||
getDefaultDevice() methods of MidiInput and MidiOutput or by calling getDeviceInfo()
|
||||
on an instance of these classes. Devices can be opened by passing the identifier to
|
||||
the openDevice() method.
|
||||
*/
|
||||
struct MidiDeviceInfo
|
||||
{
|
||||
MidiDeviceInfo() = default;
|
||||
|
||||
MidiDeviceInfo (const String& deviceName, const String& deviceIdentifier)
|
||||
: name (deviceName), identifier (deviceIdentifier)
|
||||
{
|
||||
}
|
||||
|
||||
/** The name of this device.
|
||||
|
||||
This will be provided by the OS unless the device has been created with the
|
||||
createNewDevice() method.
|
||||
|
||||
Note that the name is not guaranteed to be unique and two devices with the
|
||||
same name will be indistinguishable. If you want to address a specific device
|
||||
it is better to use the identifier.
|
||||
*/
|
||||
String name;
|
||||
|
||||
/** The identifier for this device.
|
||||
|
||||
This will be provided by the OS and it's format will differ on different systems
|
||||
e.g. on macOS it will be a number whereas on Windows it will be a long alphanumeric string.
|
||||
*/
|
||||
String identifier;
|
||||
|
||||
//==============================================================================
|
||||
bool operator== (const MidiDeviceInfo& other) const noexcept { return name == other.name && identifier == other.identifier; }
|
||||
bool operator!= (const MidiDeviceInfo& other) const noexcept { return ! operator== (other); }
|
||||
};
|
||||
|
||||
class MidiInputCallback;
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Represents a midi input device.
|
||||
|
||||
To create one of these, use the static getAvailableDevices() method to find out what
|
||||
inputs are available, and then use the openDevice() method to try to open one.
|
||||
|
||||
@see MidiOutput
|
||||
|
||||
@tags{Audio}
|
||||
*/
|
||||
class JUCE_API MidiInput final
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Returns a list of the available midi input devices.
|
||||
|
||||
You can open one of the devices by passing its identifier into the openDevice() method.
|
||||
|
||||
@see MidiDeviceInfo, getDevices, getDefaultDeviceIndex, openDevice
|
||||
*/
|
||||
static Array<MidiDeviceInfo> getAvailableDevices();
|
||||
|
||||
/** Returns the MidiDeviceInfo of the default midi input device to use. */
|
||||
static MidiDeviceInfo getDefaultDevice();
|
||||
|
||||
/** Tries to open one of the midi input devices.
|
||||
|
||||
This will return a MidiInput object if it manages to open it. You can then
|
||||
call start() and stop() on this device, and delete it when no longer needed.
|
||||
|
||||
If the device can't be opened, this will return nullptr.
|
||||
|
||||
@param deviceIdentifier the ID of the device to open - use the getAvailableDevices() method to
|
||||
find the available devices that can be opened
|
||||
@param callback the object that will receive the midi messages from this device
|
||||
|
||||
@see MidiInputCallback, getDevices
|
||||
*/
|
||||
static MidiInput* openDevice (const String& deviceIdentifier, MidiInputCallback* callback);
|
||||
|
||||
#if JUCE_LINUX || JUCE_MAC || JUCE_IOS || DOXYGEN
|
||||
/** This will try to create a new midi input device (only available on Linux, macOS and iOS).
|
||||
|
||||
This will attempt to create a new midi input device with the specified name for other
|
||||
apps to connect to.
|
||||
|
||||
Returns nullptr if a device can't be created.
|
||||
|
||||
@param deviceName the name of the device to create
|
||||
@param callback the object that will receive the midi messages from this device
|
||||
*/
|
||||
static MidiInput* createNewDevice (const String& deviceName, MidiInputCallback* callback);
|
||||
#endif
|
||||
|
||||
//==============================================================================
|
||||
/** Destructor. */
|
||||
~MidiInput();
|
||||
|
||||
/** Starts the device running.
|
||||
|
||||
After calling this, the device will start sending midi messages to the MidiInputCallback
|
||||
object that was specified when the openDevice() method was called.
|
||||
|
||||
@see stop
|
||||
*/
|
||||
void start();
|
||||
|
||||
/** Stops the device running.
|
||||
|
||||
@see start
|
||||
*/
|
||||
void stop();
|
||||
|
||||
/** Returns the MidiDeviceInfo struct containing some information about this device. */
|
||||
MidiDeviceInfo getDeviceInfo() const noexcept { return deviceInfo; }
|
||||
|
||||
/** Returns the identifier of this device. */
|
||||
String getIdentifier() const noexcept { return deviceInfo.identifier; }
|
||||
|
||||
/** Returns the name of this device. */
|
||||
String getName() const noexcept { return deviceInfo.name; }
|
||||
|
||||
/** Sets a custom name for the device. */
|
||||
void setName (const String& newName) noexcept { deviceInfo.name = newName; }
|
||||
|
||||
//==============================================================================
|
||||
/** Deprecated. */
|
||||
static StringArray getDevices();
|
||||
/** Deprecated. */
|
||||
static int getDefaultDeviceIndex();
|
||||
/** Deprecated. */
|
||||
static MidiInput* openDevice (int, MidiInputCallback*);
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
explicit MidiInput (const String&, const String&);
|
||||
|
||||
MidiDeviceInfo deviceInfo;
|
||||
void* internal = nullptr;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiInput)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Receives incoming messages from a physical MIDI input device.
|
||||
|
||||
This class is overridden to handle incoming midi messages. See the MidiInput
|
||||
class for more details.
|
||||
|
||||
@see MidiInput
|
||||
|
||||
@tags{Audio}
|
||||
*/
|
||||
class JUCE_API MidiInputCallback
|
||||
{
|
||||
public:
|
||||
/** Destructor. */
|
||||
virtual ~MidiInputCallback() = default;
|
||||
|
||||
/** Receives an incoming message.
|
||||
|
||||
A MidiInput object will call this method when a midi event arrives. It'll be
|
||||
called on a high-priority system thread, so avoid doing anything time-consuming
|
||||
in here, and avoid making any UI calls. You might find the MidiBuffer class helpful
|
||||
for queueing incoming messages for use later.
|
||||
|
||||
@param source the MidiInput object that generated the message
|
||||
@param message the incoming message. The message's timestamp is set to a value
|
||||
equivalent to (Time::getMillisecondCounter() / 1000.0) to specify the
|
||||
time when the message arrived
|
||||
*/
|
||||
virtual void handleIncomingMidiMessage (MidiInput* source,
|
||||
const MidiMessage& message) = 0;
|
||||
|
||||
/** Notification sent each time a packet of a multi-packet sysex message arrives.
|
||||
|
||||
If a long sysex message is broken up into multiple packets, this callback is made
|
||||
for each packet that arrives until the message is finished, at which point
|
||||
the normal handleIncomingMidiMessage() callback will be made with the entire
|
||||
message.
|
||||
|
||||
The message passed in will contain the start of a sysex, but won't be finished
|
||||
with the terminating 0xf7 byte.
|
||||
*/
|
||||
virtual void handlePartialSysexMessage (MidiInput* source,
|
||||
const uint8* messageData,
|
||||
int numBytesSoFar,
|
||||
double timestamp)
|
||||
{
|
||||
ignoreUnused (source, messageData, numBytesSoFar, timestamp);
|
||||
}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Represents a midi output device.
|
||||
|
||||
To create one of these, use the static getAvailableDevices() method to find out what
|
||||
outputs are available, and then use the openDevice() method to try to open one.
|
||||
|
||||
@see MidiInput
|
||||
|
||||
@tags{Audio}
|
||||
*/
|
||||
class JUCE_API MidiOutput final : private Thread
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Returns a list of the available midi output devices.
|
||||
|
||||
You can open one of the devices by passing its identifier into the openDevice() method.
|
||||
|
||||
@see MidiDeviceInfo, getDevices, getDefaultDeviceIndex, openDevice
|
||||
*/
|
||||
static Array<MidiDeviceInfo> getAvailableDevices();
|
||||
|
||||
/** Returns the MidiDeviceInfo of the default midi output device to use. */
|
||||
static MidiDeviceInfo getDefaultDevice();
|
||||
|
||||
/** Tries to open one of the midi output devices.
|
||||
|
||||
This will return a MidiOutput object if it manages to open it. You can then
|
||||
send messages to this device, and delete it when no longer needed.
|
||||
|
||||
If the device can't be opened, this will return nullptr.
|
||||
|
||||
@param deviceIdentifier the ID of the device to open - use the getAvailableDevices() method to
|
||||
find the available devices that can be opened
|
||||
@see getDevices
|
||||
*/
|
||||
static MidiOutput* openDevice (const String& deviceIdentifier);
|
||||
|
||||
#if JUCE_LINUX || JUCE_MAC || JUCE_IOS || DOXYGEN
|
||||
/** This will try to create a new midi output device (only available on Linux, macOS and iOS).
|
||||
|
||||
This will attempt to create a new midi output device with the specified name that other
|
||||
apps can connect to and use as their midi input.
|
||||
|
||||
Returns nullptr if a device can't be created.
|
||||
|
||||
@param deviceName the name of the device to create
|
||||
*/
|
||||
static MidiOutput* createNewDevice (const String& deviceName);
|
||||
#endif
|
||||
|
||||
//==============================================================================
|
||||
/** Destructor. */
|
||||
~MidiOutput() override;
|
||||
|
||||
/** Returns the MidiDeviceInfo struct containing some information about this device. */
|
||||
MidiDeviceInfo getDeviceInfo() const noexcept { return deviceInfo; }
|
||||
|
||||
/** Returns the identifier of this device. */
|
||||
String getIdentifier() const noexcept { return deviceInfo.identifier; }
|
||||
|
||||
/** Returns the name of this device. */
|
||||
String getName() const noexcept { return deviceInfo.name; }
|
||||
|
||||
/** Sets a custom name for the device. */
|
||||
void setName (const String& newName) noexcept { deviceInfo.name = newName; }
|
||||
|
||||
//==============================================================================
|
||||
/** Sends out a MIDI message immediately. */
|
||||
void sendMessageNow (const MidiMessage& message);
|
||||
|
||||
/** Sends out a sequence of MIDI messages immediately. */
|
||||
void sendBlockOfMessagesNow (const MidiBuffer& buffer);
|
||||
|
||||
/** This lets you supply a block of messages that will be sent out at some point
|
||||
in the future.
|
||||
|
||||
The MidiOutput class has an internal thread that can send out timestamped
|
||||
messages - this appends a set of messages to its internal buffer, ready for
|
||||
sending.
|
||||
|
||||
This will only work if you've already started the thread with startBackgroundThread().
|
||||
|
||||
A time is specified, at which the block of messages should be sent. This time uses
|
||||
the same time base as Time::getMillisecondCounter(), and must be in the future.
|
||||
|
||||
The samplesPerSecondForBuffer parameter indicates the number of samples per second
|
||||
used by the MidiBuffer. Each event in a MidiBuffer has a sample position, and the
|
||||
samplesPerSecondForBuffer value is needed to convert this sample position to a
|
||||
real time.
|
||||
*/
|
||||
void sendBlockOfMessages (const MidiBuffer& buffer,
|
||||
double millisecondCounterToStartAt,
|
||||
double samplesPerSecondForBuffer);
|
||||
|
||||
/** Gets rid of any midi messages that had been added by sendBlockOfMessages(). */
|
||||
void clearAllPendingMessages();
|
||||
|
||||
/** Starts up a background thread so that the device can send blocks of data.
|
||||
Call this to get the device ready, before using sendBlockOfMessages().
|
||||
*/
|
||||
void startBackgroundThread();
|
||||
|
||||
/** Stops the background thread, and clears any pending midi events.
|
||||
@see startBackgroundThread
|
||||
*/
|
||||
void stopBackgroundThread();
|
||||
|
||||
//==============================================================================
|
||||
/** Deprecated. */
|
||||
static StringArray getDevices();
|
||||
/** Deprecated. */
|
||||
static int getDefaultDeviceIndex();
|
||||
/** Deprecated. */
|
||||
static MidiOutput* openDevice (int);
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
struct PendingMessage
|
||||
{
|
||||
PendingMessage (const void* data, int len, double timeStamp)
|
||||
: message (data, len, timeStamp)
|
||||
{
|
||||
}
|
||||
|
||||
MidiMessage message;
|
||||
PendingMessage* next;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
explicit MidiOutput (const String&, const String&);
|
||||
void run() override;
|
||||
|
||||
MidiDeviceInfo deviceInfo;
|
||||
void* internal = nullptr;
|
||||
CriticalSection lock;
|
||||
PendingMessage* firstMessage = nullptr;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiOutput)
|
||||
};
|
||||
|
||||
} // namespace juce
|
||||
|
|
@ -1,180 +0,0 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2017 - ROLI Ltd.
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
class MidiInput;
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Receives incoming messages from a physical MIDI input device.
|
||||
|
||||
This class is overridden to handle incoming midi messages. See the MidiInput
|
||||
class for more details.
|
||||
|
||||
@see MidiInput
|
||||
|
||||
@tags{Audio}
|
||||
*/
|
||||
class JUCE_API MidiInputCallback
|
||||
{
|
||||
public:
|
||||
/** Destructor. */
|
||||
virtual ~MidiInputCallback() = default;
|
||||
|
||||
|
||||
/** Receives an incoming message.
|
||||
|
||||
A MidiInput object will call this method when a midi event arrives. It'll be
|
||||
called on a high-priority system thread, so avoid doing anything time-consuming
|
||||
in here, and avoid making any UI calls. You might find the MidiBuffer class helpful
|
||||
for queueing incoming messages for use later.
|
||||
|
||||
@param source the MidiInput object that generated the message
|
||||
@param message the incoming message. The message's timestamp is set to a value
|
||||
equivalent to (Time::getMillisecondCounter() / 1000.0) to specify the
|
||||
time when the message arrived.
|
||||
*/
|
||||
virtual void handleIncomingMidiMessage (MidiInput* source,
|
||||
const MidiMessage& message) = 0;
|
||||
|
||||
/** Notification sent each time a packet of a multi-packet sysex message arrives.
|
||||
|
||||
If a long sysex message is broken up into multiple packets, this callback is made
|
||||
for each packet that arrives until the message is finished, at which point
|
||||
the normal handleIncomingMidiMessage() callback will be made with the entire
|
||||
message.
|
||||
|
||||
The message passed in will contain the start of a sysex, but won't be finished
|
||||
with the terminating 0xf7 byte.
|
||||
*/
|
||||
virtual void handlePartialSysexMessage (MidiInput* source,
|
||||
const uint8* messageData,
|
||||
int numBytesSoFar,
|
||||
double timestamp)
|
||||
{
|
||||
ignoreUnused (source, messageData, numBytesSoFar, timestamp);
|
||||
}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Represents a midi input device.
|
||||
|
||||
To create one of these, use the static getDevices() method to find out what inputs are
|
||||
available, and then use the openDevice() method to try to open one.
|
||||
|
||||
@see MidiOutput
|
||||
|
||||
@tags{Audio}
|
||||
*/
|
||||
class JUCE_API MidiInput final
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Returns a list of the available midi input devices.
|
||||
|
||||
You can open one of the devices by passing its index into the
|
||||
openDevice() method.
|
||||
|
||||
@see getDefaultDeviceIndex, openDevice
|
||||
*/
|
||||
static StringArray getDevices();
|
||||
|
||||
/** Returns the index of the default midi input device to use.
|
||||
|
||||
This refers to the index in the list returned by getDevices().
|
||||
*/
|
||||
static int getDefaultDeviceIndex();
|
||||
|
||||
/** Tries to open one of the midi input devices.
|
||||
|
||||
This will return a MidiInput object if it manages to open it. You can then
|
||||
call start() and stop() on this device, and delete it when no longer needed.
|
||||
|
||||
If the device can't be opened, this will return a null pointer.
|
||||
|
||||
@param deviceIndex the index of a device from the list returned by getDevices()
|
||||
@param callback the object that will receive the midi messages from this device.
|
||||
|
||||
@see MidiInputCallback, getDevices
|
||||
*/
|
||||
static MidiInput* openDevice (int deviceIndex,
|
||||
MidiInputCallback* callback);
|
||||
|
||||
#if JUCE_LINUX || JUCE_MAC || JUCE_IOS || DOXYGEN
|
||||
/** This will try to create a new midi input device (Not available on Windows).
|
||||
|
||||
This will attempt to create a new midi input device with the specified name,
|
||||
for other apps to connect to.
|
||||
|
||||
Returns nullptr if a device can't be created.
|
||||
|
||||
@param deviceName the name to use for the new device
|
||||
@param callback the object that will receive the midi messages from this device.
|
||||
*/
|
||||
static MidiInput* createNewDevice (const String& deviceName,
|
||||
MidiInputCallback* callback);
|
||||
#endif
|
||||
|
||||
//==============================================================================
|
||||
/** Destructor. */
|
||||
~MidiInput();
|
||||
|
||||
/** Returns the name of this device. */
|
||||
const String& getName() const noexcept { return name; }
|
||||
|
||||
/** Allows you to set a custom name for the device, in case you don't like the name
|
||||
it was given when created.
|
||||
*/
|
||||
void setName (const String& newName) noexcept { name = newName; }
|
||||
|
||||
//==============================================================================
|
||||
/** Starts the device running.
|
||||
|
||||
After calling this, the device will start sending midi messages to the
|
||||
MidiInputCallback object that was specified when the openDevice() method
|
||||
was called.
|
||||
|
||||
@see stop
|
||||
*/
|
||||
void start();
|
||||
|
||||
/** Stops the device running.
|
||||
@see start
|
||||
*/
|
||||
void stop();
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
String name;
|
||||
void* internal = nullptr;
|
||||
|
||||
// The input objects are created with the openDevice() method.
|
||||
explicit MidiInput (const String&);
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiInput)
|
||||
};
|
||||
|
||||
} // namespace juce
|
||||
|
|
@ -1,145 +0,0 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2017 - ROLI Ltd.
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Controls a physical MIDI output device.
|
||||
|
||||
To create one of these, use the static getDevices() method to get a list of the
|
||||
available output devices, then use the openDevice() method to try to open one.
|
||||
|
||||
@see MidiInput
|
||||
|
||||
@tags{Audio}
|
||||
*/
|
||||
class JUCE_API MidiOutput final : private Thread
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Returns a list of the available midi output devices.
|
||||
|
||||
You can open one of the devices by passing its index into the
|
||||
openDevice() method.
|
||||
|
||||
@see getDefaultDeviceIndex, openDevice
|
||||
*/
|
||||
static StringArray getDevices();
|
||||
|
||||
/** Returns the index of the default midi output device to use.
|
||||
|
||||
This refers to the index in the list returned by getDevices().
|
||||
*/
|
||||
static int getDefaultDeviceIndex();
|
||||
|
||||
/** Tries to open one of the midi output devices.
|
||||
|
||||
This will return a MidiOutput object if it manages to open it. You can then
|
||||
send messages to this device, and delete it when no longer needed.
|
||||
|
||||
If the device can't be opened, this will return a null pointer.
|
||||
|
||||
@param deviceIndex the index of a device from the list returned by getDevices()
|
||||
@see getDevices
|
||||
*/
|
||||
static MidiOutput* openDevice (int deviceIndex);
|
||||
|
||||
|
||||
#if JUCE_LINUX || JUCE_MAC || JUCE_IOS || DOXYGEN
|
||||
/** This will try to create a new midi output device (Not available on Windows).
|
||||
|
||||
This will attempt to create a new midi output device that other apps can connect
|
||||
to and use as their midi input.
|
||||
|
||||
Returns nullptr if a device can't be created.
|
||||
|
||||
@param deviceName the name to use for the new device
|
||||
*/
|
||||
static MidiOutput* createNewDevice (const String& deviceName);
|
||||
#endif
|
||||
|
||||
//==============================================================================
|
||||
/** Destructor. */
|
||||
~MidiOutput() override;
|
||||
|
||||
/** Returns the name of this device. */
|
||||
const String& getName() const noexcept { return name; }
|
||||
|
||||
/** Sends out a MIDI message immediately. */
|
||||
void sendMessageNow (const MidiMessage& message);
|
||||
|
||||
/** Sends out a sequence of MIDI messages immediately. */
|
||||
void sendBlockOfMessagesNow (const MidiBuffer& buffer);
|
||||
|
||||
//==============================================================================
|
||||
/** This lets you supply a block of messages that will be sent out at some point
|
||||
in the future.
|
||||
|
||||
The MidiOutput class has an internal thread that can send out timestamped
|
||||
messages - this appends a set of messages to its internal buffer, ready for
|
||||
sending.
|
||||
|
||||
This will only work if you've already started the thread with startBackgroundThread().
|
||||
|
||||
A time is specified, at which the block of messages should be sent. This time uses
|
||||
the same time base as Time::getMillisecondCounter(), and must be in the future.
|
||||
|
||||
The samplesPerSecondForBuffer parameter indicates the number of samples per second
|
||||
used by the MidiBuffer. Each event in a MidiBuffer has a sample position, and the
|
||||
samplesPerSecondForBuffer value is needed to convert this sample position to a
|
||||
real time.
|
||||
*/
|
||||
void sendBlockOfMessages (const MidiBuffer& buffer,
|
||||
double millisecondCounterToStartAt,
|
||||
double samplesPerSecondForBuffer);
|
||||
|
||||
/** Gets rid of any midi messages that had been added by sendBlockOfMessages(). */
|
||||
void clearAllPendingMessages();
|
||||
|
||||
/** Starts up a background thread so that the device can send blocks of data.
|
||||
Call this to get the device ready, before using sendBlockOfMessages().
|
||||
*/
|
||||
void startBackgroundThread();
|
||||
|
||||
/** Stops the background thread, and clears any pending midi events.
|
||||
@see startBackgroundThread
|
||||
*/
|
||||
void stopBackgroundThread();
|
||||
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
void* internal = nullptr;
|
||||
CriticalSection lock;
|
||||
struct PendingMessage;
|
||||
PendingMessage* firstMessage = nullptr;
|
||||
String name;
|
||||
|
||||
MidiOutput (const String& midiName); // These objects are created with the openDevice() method.
|
||||
void run() override;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiOutput)
|
||||
};
|
||||
|
||||
} // namespace juce
|
||||
|
|
@ -51,6 +51,8 @@ public class JuceMidiSupport
|
|||
|
||||
// send will do nothing on an input port
|
||||
void sendMidi (byte[] msg, int offset, int count);
|
||||
|
||||
String getName ();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -256,6 +258,12 @@ public class JuceMidiSupport
|
|||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName ()
|
||||
{
|
||||
return owner.getPortName (portPath);
|
||||
}
|
||||
|
||||
MidiDeviceManager owner;
|
||||
MidiOutputPort androidPort;
|
||||
MidiPortPath portPath;
|
||||
|
|
@ -331,6 +339,12 @@ public class JuceMidiSupport
|
|||
androidPort = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName ()
|
||||
{
|
||||
return owner.getPortName (portPath);
|
||||
}
|
||||
|
||||
MidiDeviceManager owner;
|
||||
MidiInputPort androidPort;
|
||||
MidiPortPath portPath;
|
||||
|
|
@ -343,7 +357,6 @@ public class JuceMidiSupport
|
|||
deviceId = deviceIdToUse;
|
||||
isInput = direction;
|
||||
portIndex = androidIndex;
|
||||
|
||||
}
|
||||
|
||||
public int deviceId;
|
||||
|
|
@ -555,17 +568,17 @@ public class JuceMidiSupport
|
|||
super.finalize ();
|
||||
}
|
||||
|
||||
public String[] getJuceAndroidMidiInputDevices ()
|
||||
public String[] getJuceAndroidMidiOutputDeviceNameAndIDs ()
|
||||
{
|
||||
return getJuceAndroidMidiDevices (MidiDeviceInfo.PortInfo.TYPE_OUTPUT);
|
||||
return getJuceAndroidMidiDeviceNameAndIDs (MidiDeviceInfo.PortInfo.TYPE_OUTPUT);
|
||||
}
|
||||
|
||||
public String[] getJuceAndroidMidiOutputDevices ()
|
||||
public String[] getJuceAndroidMidiInputDeviceNameAndIDs ()
|
||||
{
|
||||
return getJuceAndroidMidiDevices (MidiDeviceInfo.PortInfo.TYPE_INPUT);
|
||||
return getJuceAndroidMidiDeviceNameAndIDs (MidiDeviceInfo.PortInfo.TYPE_INPUT);
|
||||
}
|
||||
|
||||
private String[] getJuceAndroidMidiDevices (int portType)
|
||||
private String[] getJuceAndroidMidiDeviceNameAndIDs (int portType)
|
||||
{
|
||||
// only update the list when JUCE asks for a new list
|
||||
synchronized (MidiDeviceManager.class)
|
||||
|
|
@ -573,22 +586,24 @@ public class JuceMidiSupport
|
|||
deviceInfos = getDeviceInfos ();
|
||||
}
|
||||
|
||||
ArrayList<String> portNames = new ArrayList<String> ();
|
||||
ArrayList<String> portNameAndIDs = new ArrayList<String> ();
|
||||
|
||||
int index = 0;
|
||||
for (MidiPortPath portInfo = getPortPathForJuceIndex (portType, index); portInfo != null; portInfo = getPortPathForJuceIndex (portType, ++index))
|
||||
portNames.add (getPortName (portInfo));
|
||||
for (MidiPortPath portInfo : getAllPorts (portType))
|
||||
{
|
||||
portNameAndIDs.add (getPortName (portInfo));
|
||||
portNameAndIDs.add (Integer.toString (portInfo.hashCode ()));
|
||||
}
|
||||
|
||||
String[] names = new String[portNames.size ()];
|
||||
return portNames.toArray (names);
|
||||
String[] names = new String[portNameAndIDs.size ()];
|
||||
return portNameAndIDs.toArray (names);
|
||||
}
|
||||
|
||||
private JuceMidiPort openMidiPortWithJuceIndex (int index, long host, boolean isInput)
|
||||
private JuceMidiPort openMidiPortWithID (int deviceID, long host, boolean isInput)
|
||||
{
|
||||
synchronized (MidiDeviceManager.class)
|
||||
{
|
||||
int portTypeToFind = (isInput ? MidiDeviceInfo.PortInfo.TYPE_OUTPUT : MidiDeviceInfo.PortInfo.TYPE_INPUT);
|
||||
MidiPortPath portInfo = getPortPathForJuceIndex (portTypeToFind, index);
|
||||
int portTypeToFind = (isInput ? MidiDeviceInfo.PortInfo.TYPE_INPUT : MidiDeviceInfo.PortInfo.TYPE_OUTPUT);
|
||||
MidiPortPath portInfo = getPortPathForID (portTypeToFind, deviceID);
|
||||
|
||||
if (portInfo != null)
|
||||
{
|
||||
|
|
@ -633,14 +648,14 @@ public class JuceMidiSupport
|
|||
return null;
|
||||
}
|
||||
|
||||
public JuceMidiPort openMidiInputPortWithJuceIndex (int index, long host)
|
||||
public JuceMidiPort openMidiInputPortWithID (int deviceID, long host)
|
||||
{
|
||||
return openMidiPortWithJuceIndex (index, host, true);
|
||||
return openMidiPortWithID (deviceID, host, true);
|
||||
}
|
||||
|
||||
public JuceMidiPort openMidiOutputPortWithJuceIndex (int index)
|
||||
public JuceMidiPort openMidiOutputPortWithID (int deviceID)
|
||||
{
|
||||
return openMidiPortWithJuceIndex (index, 0, false);
|
||||
return openMidiPortWithID (deviceID, 0, false);
|
||||
}
|
||||
|
||||
/* 0: unpaired, 1: paired, 2: pairing */
|
||||
|
|
@ -773,24 +788,6 @@ public class JuceMidiSupport
|
|||
openPorts.remove (path);
|
||||
}
|
||||
|
||||
public String getInputPortNameForJuceIndex (int index)
|
||||
{
|
||||
MidiPortPath portInfo = getPortPathForJuceIndex (MidiDeviceInfo.PortInfo.TYPE_OUTPUT, index);
|
||||
if (portInfo != null)
|
||||
return getPortName (portInfo);
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
public String getOutputPortNameForJuceIndex (int index)
|
||||
{
|
||||
MidiPortPath portInfo = getPortPathForJuceIndex (MidiDeviceInfo.PortInfo.TYPE_INPUT, index);
|
||||
if (portInfo != null)
|
||||
return getPortName (portInfo);
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
public void onDeviceAdded (MidiDeviceInfo info)
|
||||
{
|
||||
// only add standard midi devices
|
||||
|
|
@ -980,24 +977,24 @@ public class JuceMidiSupport
|
|||
return "";
|
||||
}
|
||||
|
||||
public MidiPortPath getPortPathForJuceIndex (int portType, int juceIndex)
|
||||
public ArrayList<MidiPortPath> getAllPorts (int portType)
|
||||
{
|
||||
int portIdx = 0;
|
||||
for (MidiDeviceInfo info : deviceInfos)
|
||||
{
|
||||
for (MidiDeviceInfo.PortInfo portInfo : info.getPorts ())
|
||||
{
|
||||
if (portInfo.getType () == portType)
|
||||
{
|
||||
if (portIdx == juceIndex)
|
||||
return new MidiPortPath (info.getId (),
|
||||
(portType == MidiDeviceInfo.PortInfo.TYPE_INPUT),
|
||||
portInfo.getPortNumber ());
|
||||
ArrayList<MidiPortPath> ports = new ArrayList<MidiPortPath> ();
|
||||
|
||||
portIdx++;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (MidiDeviceInfo info : deviceInfos)
|
||||
for (MidiDeviceInfo.PortInfo portInfo : info.getPorts ())
|
||||
if (portInfo.getType () == portType)
|
||||
ports.add (new MidiPortPath (info.getId (), (portType == MidiDeviceInfo.PortInfo.TYPE_INPUT),
|
||||
portInfo.getPortNumber ()));
|
||||
|
||||
return ports;
|
||||
}
|
||||
|
||||
public MidiPortPath getPortPathForID (int portType, int deviceID)
|
||||
{
|
||||
for (MidiPortPath port : getAllPorts (portType))
|
||||
if (port.hashCode () == deviceID)
|
||||
return port;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -66,9 +66,9 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
static StringArray getDevices (bool input)
|
||||
static Array<MidiDeviceInfo> getDevices (bool input)
|
||||
{
|
||||
StringArray devices;
|
||||
Array<MidiDeviceInfo> devices;
|
||||
|
||||
for (auto& card : findAllALSACardIDs())
|
||||
findMidiDevices (devices, input, card);
|
||||
|
|
@ -96,7 +96,7 @@ private:
|
|||
}
|
||||
|
||||
// Adds all midi devices to the devices array of the given input/output type on the given card
|
||||
static void findMidiDevices (StringArray& devices, bool input, int cardNum)
|
||||
static void findMidiDevices (Array<MidiDeviceInfo>& devices, bool input, int cardNum)
|
||||
{
|
||||
snd_ctl_t* ctl = nullptr;
|
||||
auto status = snd_ctl_open (&ctl, ("hw:" + String (cardNum)).toRawUTF8(), 0);
|
||||
|
|
@ -131,9 +131,10 @@ private:
|
|||
status = snd_ctl_rawmidi_info (ctl, info);
|
||||
|
||||
if (status == 0)
|
||||
devices.add ("hw:" + String (cardNum) + ","
|
||||
+ String (device) + ","
|
||||
+ String (sub));
|
||||
{
|
||||
String deviceName ("hw:" + String (cardNum) + "," + String (device) + "," + String (sub));
|
||||
devices.add (MidiDeviceInfo (deviceName, deviceName));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -507,58 +508,74 @@ AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Bela()
|
|||
return new BelaAudioIODeviceType();
|
||||
}
|
||||
|
||||
|
||||
//==============================================================================
|
||||
// TODO: Add Bela MidiOutput support
|
||||
|
||||
StringArray MidiOutput::getDevices() { return {}; }
|
||||
int MidiOutput::getDefaultDeviceIndex() { return 0; }
|
||||
MidiOutput* MidiOutput::openDevice (int) { return {}; }
|
||||
MidiOutput* MidiOutput::createNewDevice (const String&) { return {}; }
|
||||
MidiOutput::~MidiOutput() {}
|
||||
void MidiOutput::sendMessageNow (const MidiMessage&) {}
|
||||
|
||||
|
||||
//==============================================================================
|
||||
MidiInput::MidiInput (const String& nm) : name (nm) {}
|
||||
|
||||
MidiInput::~MidiInput()
|
||||
MidiInput::MidiInput (const String& deviceName, const String& deviceID)
|
||||
: deviceInfo (deviceName, deviceID)
|
||||
{
|
||||
delete static_cast<BelaMidiInput*> (internal);
|
||||
}
|
||||
|
||||
void MidiInput::start() { static_cast<BelaMidiInput*> (internal)->start(); }
|
||||
void MidiInput::stop() { static_cast<BelaMidiInput*> (internal)->stop(); }
|
||||
MidiInput::~MidiInput() { delete static_cast<BelaMidiInput*> (internal); }
|
||||
void MidiInput::start() { static_cast<BelaMidiInput*> (internal)->start(); }
|
||||
void MidiInput::stop() { static_cast<BelaMidiInput*> (internal)->stop(); }
|
||||
|
||||
void Array<MidiDeviceInfo> MidiInput::getAvailableDevices()
|
||||
{
|
||||
return BelaMidiInput::getDevices (true);
|
||||
}
|
||||
|
||||
MidiDeviceInfo MidiInput::getDefaultDevice()
|
||||
{
|
||||
return getAvailableDevices().getFirst();
|
||||
}
|
||||
|
||||
MidiInput* MidiInput::openDevice (const String& deviceIdentifier, MidiInputCallback* callback)
|
||||
{
|
||||
if (deviceIdentifier.isEmpty())
|
||||
return nullptr;
|
||||
|
||||
std::unique_ptr<MidiInput> midiInput (new MidiInput (deviceIdentifier, deviceIdentifier));
|
||||
midiInput->internal = new BelaMidiInput (deviceIdentifier, result, callback);
|
||||
|
||||
return midiInput.release();
|
||||
}
|
||||
|
||||
MidiInput* MidiInput::createNewDevice (const String&, MidiInputCallback*)
|
||||
{
|
||||
// N/A on Bela
|
||||
jassertfalse;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
StringArray MidiInput::getDevices()
|
||||
{
|
||||
StringArray deviceNames;
|
||||
|
||||
for (auto& d : getAvailableDevices())
|
||||
deviceNames.add (d.name);
|
||||
|
||||
return deviceNames;
|
||||
}
|
||||
|
||||
int MidiInput::getDefaultDeviceIndex()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
StringArray MidiInput::getDevices()
|
||||
{
|
||||
return BelaMidiInput::getDevices (true);
|
||||
}
|
||||
|
||||
MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback)
|
||||
{
|
||||
auto devices = getDevices();
|
||||
|
||||
if (index >= 0 && index < devices.size())
|
||||
{
|
||||
auto deviceName = devices[index];
|
||||
auto result = new MidiInput (deviceName);
|
||||
result->internal = new BelaMidiInput (deviceName, result, callback);
|
||||
return result;
|
||||
}
|
||||
|
||||
return {};
|
||||
return openDevice (getAvailableDevices()[index].identifier, callback);
|
||||
}
|
||||
|
||||
MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback)
|
||||
{
|
||||
jassertfalse; // N/A on Bela
|
||||
return {};
|
||||
}
|
||||
//==============================================================================
|
||||
// TODO: Add Bela MidiOutput support
|
||||
MidiOutput::~MidiOutput() {}
|
||||
void MidiOutput::sendMessageNow (const MidiMessage&) {}
|
||||
Array<MidiDeviceInfo> MidiOutput::getAvailableDevices() { return {}; }
|
||||
MidiDeviceInfo MidiOutput::getDefaultDevice() { return {}; }
|
||||
MidiOutput* MidiOutput::openDevice (const String&) { return nullptr; }
|
||||
MidiOutput* MidiOutput::createNewDevice (const String&) { return nullptr; }
|
||||
StringArray MidiOutput::getDevices() { return {}; }
|
||||
int MidiOutput::getDefaultDeviceIndex() { return 0;}
|
||||
MidiOutput* MidiOutput::openDevice (int) { return nullptr; }
|
||||
|
||||
} // namespace juce
|
||||
|
|
|
|||
|
|
@ -67,12 +67,12 @@ public:
|
|||
static String getAlsaMidiName()
|
||||
{
|
||||
#ifdef JUCE_ALSA_MIDI_NAME
|
||||
return JUCE_ALSA_MIDI_NAME;
|
||||
return JUCE_ALSA_MIDI_NAME;
|
||||
#else
|
||||
if (auto* app = JUCEApplicationBase::getInstance())
|
||||
return app->getApplicationName();
|
||||
if (auto* app = JUCEApplicationBase::getInstance())
|
||||
return app->getApplicationName();
|
||||
|
||||
return "JUCE";
|
||||
return "JUCE";
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -198,7 +198,8 @@ public:
|
|||
isInput ? (SND_SEQ_PORT_CAP_WRITE | (enableSubscription ? SND_SEQ_PORT_CAP_SUBS_WRITE : 0))
|
||||
: (SND_SEQ_PORT_CAP_READ | (enableSubscription ? SND_SEQ_PORT_CAP_SUBS_READ : 0));
|
||||
|
||||
portId = snd_seq_create_simple_port (seqHandle, name.toUTF8(), caps,
|
||||
portName = name;
|
||||
portId = snd_seq_create_simple_port (seqHandle, portName.toUTF8(), caps,
|
||||
SND_SEQ_PORT_TYPE_MIDI_GENERIC |
|
||||
SND_SEQ_PORT_TYPE_APPLICATION);
|
||||
}
|
||||
|
|
@ -215,13 +216,15 @@ public:
|
|||
}
|
||||
|
||||
AlsaClient& client;
|
||||
|
||||
MidiInputCallback* callback = nullptr;
|
||||
snd_midi_event_t* midiParser = nullptr;
|
||||
MidiInput* midiInput = nullptr;
|
||||
int maxEventSize = 4096;
|
||||
int portId = -1;
|
||||
bool callbackEnabled = false;
|
||||
bool isInput = false;
|
||||
|
||||
String portName;
|
||||
|
||||
int maxEventSize = 4096, portId = -1;
|
||||
bool callbackEnabled = false, isInput = false;
|
||||
};
|
||||
|
||||
static Ptr getInstance()
|
||||
|
|
@ -359,11 +362,16 @@ private:
|
|||
AlsaClient* AlsaClient::instance = nullptr;
|
||||
|
||||
//==============================================================================
|
||||
static String getFormattedPortIdentifier (int clientId, int portId)
|
||||
{
|
||||
return String (clientId) + "-" + String (portId);
|
||||
}
|
||||
|
||||
static AlsaClient::Port* iterateMidiClient (const AlsaClient::Ptr& client,
|
||||
snd_seq_client_info_t* clientInfo,
|
||||
bool forInput,
|
||||
StringArray& deviceNamesFound,
|
||||
int deviceIndexToOpen)
|
||||
Array<MidiDeviceInfo>& devices,
|
||||
const String& deviceIdentifierToOpen)
|
||||
{
|
||||
AlsaClient::Port* port = nullptr;
|
||||
|
||||
|
|
@ -371,7 +379,7 @@ static AlsaClient::Port* iterateMidiClient (const AlsaClient::Ptr& client,
|
|||
snd_seq_port_info_t* portInfo = nullptr;
|
||||
|
||||
snd_seq_port_info_alloca (&portInfo);
|
||||
jassert (portInfo);
|
||||
jassert (portInfo != nullptr);
|
||||
auto numPorts = snd_seq_client_info_get_num_ports (clientInfo);
|
||||
auto sourceClient = snd_seq_client_info_get_client (clientInfo);
|
||||
|
||||
|
|
@ -384,19 +392,19 @@ static AlsaClient::Port* iterateMidiClient (const AlsaClient::Ptr& client,
|
|||
&& (snd_seq_port_info_get_capability (portInfo)
|
||||
& (forInput ? SND_SEQ_PORT_CAP_SUBS_READ : SND_SEQ_PORT_CAP_SUBS_WRITE)) != 0)
|
||||
{
|
||||
String portName = snd_seq_port_info_get_name(portInfo);
|
||||
String portName (snd_seq_port_info_get_name (portInfo));
|
||||
auto portID = snd_seq_port_info_get_port (portInfo);
|
||||
|
||||
deviceNamesFound.add (portName);
|
||||
MidiDeviceInfo device (portName, getFormattedPortIdentifier (sourceClient, portID));
|
||||
devices.add (device);
|
||||
|
||||
if (deviceNamesFound.size() == deviceIndexToOpen + 1)
|
||||
if (deviceIdentifierToOpen.isNotEmpty() && deviceIdentifierToOpen == device.identifier)
|
||||
{
|
||||
auto sourcePort = snd_seq_port_info_get_port (portInfo);
|
||||
|
||||
if (sourcePort != -1)
|
||||
if (portID != -1)
|
||||
{
|
||||
port = client->createPort (portName, forInput, false);
|
||||
jassert (port->isValid());
|
||||
port->connectWith (sourceClient, sourcePort);
|
||||
port->connectWith (sourceClient, portID);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -407,8 +415,8 @@ static AlsaClient::Port* iterateMidiClient (const AlsaClient::Ptr& client,
|
|||
}
|
||||
|
||||
static AlsaClient::Port* iterateMidiDevices (bool forInput,
|
||||
StringArray& deviceNamesFound,
|
||||
int deviceIndexToOpen)
|
||||
Array<MidiDeviceInfo>& devices,
|
||||
const String& deviceIdentifierToOpen)
|
||||
{
|
||||
AlsaClient::Port* port = nullptr;
|
||||
auto client = AlsaClient::getInstance();
|
||||
|
|
@ -432,85 +440,95 @@ static AlsaClient::Port* iterateMidiDevices (bool forInput,
|
|||
{
|
||||
if (snd_seq_query_next_client (seqHandle, clientInfo) == 0)
|
||||
{
|
||||
auto sourceClient = snd_seq_client_info_get_client (clientInfo);
|
||||
port = iterateMidiClient (client, clientInfo, forInput,
|
||||
devices, deviceIdentifierToOpen);
|
||||
|
||||
if (sourceClient != client->getId() && sourceClient != SND_SEQ_CLIENT_SYSTEM)
|
||||
{
|
||||
port = iterateMidiClient (client, clientInfo, forInput,
|
||||
deviceNamesFound, deviceIndexToOpen);
|
||||
if (port != nullptr)
|
||||
break;
|
||||
}
|
||||
if (port != nullptr)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
deviceNamesFound.appendNumbersToDuplicates (true, true);
|
||||
|
||||
return port;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
StringArray MidiOutput::getDevices()
|
||||
//==============================================================================
|
||||
Array<MidiDeviceInfo> MidiInput::getAvailableDevices()
|
||||
{
|
||||
StringArray devices;
|
||||
iterateMidiDevices (false, devices, -1);
|
||||
Array<MidiDeviceInfo> devices;
|
||||
iterateMidiDevices (true, devices, {});
|
||||
|
||||
return devices;
|
||||
}
|
||||
|
||||
int MidiOutput::getDefaultDeviceIndex()
|
||||
MidiDeviceInfo MidiInput::getDefaultDevice()
|
||||
{
|
||||
return 0;
|
||||
return getAvailableDevices().getFirst();
|
||||
}
|
||||
|
||||
MidiOutput* MidiOutput::openDevice (int deviceIndex)
|
||||
MidiInput* MidiInput::openDevice (const String& deviceIdentifier, MidiInputCallback* callback)
|
||||
{
|
||||
MidiOutput* newDevice = nullptr;
|
||||
if (deviceIdentifier.isEmpty())
|
||||
return nullptr;
|
||||
|
||||
StringArray devices;
|
||||
auto* port = iterateMidiDevices (false, devices, deviceIndex);
|
||||
Array<MidiDeviceInfo> devices;
|
||||
auto* port = iterateMidiDevices (true, devices, deviceIdentifier);
|
||||
|
||||
if (port == nullptr)
|
||||
return nullptr;
|
||||
|
||||
jassert (port->isValid());
|
||||
|
||||
newDevice = new MidiOutput (devices [deviceIndex]);
|
||||
port->setupOutput();
|
||||
newDevice->internal = port;
|
||||
std::unique_ptr<MidiInput> midiInput (new MidiInput (port->portName, deviceIdentifier));
|
||||
|
||||
return newDevice;
|
||||
port->setupInput (midiInput.get(), callback);
|
||||
midiInput->internal = port;
|
||||
|
||||
return midiInput.release();
|
||||
}
|
||||
|
||||
MidiOutput* MidiOutput::createNewDevice (const String& deviceName)
|
||||
MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback)
|
||||
{
|
||||
MidiOutput* newDevice = nullptr;
|
||||
auto client = AlsaClient::getInstance();
|
||||
auto* port = client->createPort (deviceName, false, true);
|
||||
jassert (port != nullptr && port->isValid());
|
||||
auto* port = client->createPort (deviceName, true, true);
|
||||
|
||||
newDevice = new MidiOutput (deviceName);
|
||||
port->setupOutput();
|
||||
newDevice->internal = port;
|
||||
jassert (port->isValid());
|
||||
|
||||
return newDevice;
|
||||
std::unique_ptr<MidiInput> midiInput (new MidiInput (deviceName, getFormattedPortIdentifier (client->getId(), port->portId)));
|
||||
|
||||
port->setupInput (midiInput.get(), callback);
|
||||
midiInput->internal = port;
|
||||
|
||||
return midiInput.release();
|
||||
}
|
||||
|
||||
MidiOutput::~MidiOutput()
|
||||
StringArray MidiInput::getDevices()
|
||||
{
|
||||
stopBackgroundThread();
|
||||
AlsaClient::getInstance()->deletePort (static_cast<AlsaClient::Port*> (internal));
|
||||
StringArray deviceNames;
|
||||
|
||||
for (auto& d : getAvailableDevices())
|
||||
deviceNames.add (d.name);
|
||||
|
||||
deviceNames.appendNumbersToDuplicates (true, true);
|
||||
|
||||
return deviceNames;
|
||||
}
|
||||
|
||||
void MidiOutput::sendMessageNow (const MidiMessage& message)
|
||||
int MidiInput::getDefaultDeviceIndex()
|
||||
{
|
||||
static_cast<AlsaClient::Port*> (internal)->sendMessageNow (message);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
MidiInput::MidiInput (const String& nm) : name (nm)
|
||||
MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback)
|
||||
{
|
||||
return openDevice (getAvailableDevices()[index].identifier, callback);
|
||||
}
|
||||
|
||||
MidiInput::MidiInput (const String& deviceName, const String& deviceIdentifier)
|
||||
: deviceInfo (deviceName, deviceIdentifier)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -530,68 +548,118 @@ void MidiInput::stop()
|
|||
static_cast<AlsaClient::Port*> (internal)->enableCallback (false);
|
||||
}
|
||||
|
||||
int MidiInput::getDefaultDeviceIndex()
|
||||
//==============================================================================
|
||||
Array<MidiDeviceInfo> MidiOutput::getAvailableDevices()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
Array<MidiDeviceInfo> devices;
|
||||
iterateMidiDevices (false, devices, {});
|
||||
|
||||
StringArray MidiInput::getDevices()
|
||||
{
|
||||
StringArray devices;
|
||||
iterateMidiDevices (true, devices, -1);
|
||||
return devices;
|
||||
}
|
||||
|
||||
MidiInput* MidiInput::openDevice (int deviceIndex, MidiInputCallback* callback)
|
||||
MidiDeviceInfo MidiOutput::getDefaultDevice()
|
||||
{
|
||||
StringArray devices;
|
||||
auto* port = iterateMidiDevices (true, devices, deviceIndex);
|
||||
return getAvailableDevices().getFirst();
|
||||
}
|
||||
|
||||
MidiOutput* MidiOutput::openDevice (const String& deviceIdentifier)
|
||||
{
|
||||
if (deviceIdentifier.isEmpty())
|
||||
return nullptr;
|
||||
|
||||
Array<MidiDeviceInfo> devices;
|
||||
auto* port = iterateMidiDevices (false, devices, deviceIdentifier);
|
||||
|
||||
if (port == nullptr)
|
||||
return nullptr;
|
||||
|
||||
jassert (port->isValid());
|
||||
|
||||
auto newDevice = new MidiInput (devices [deviceIndex]);
|
||||
port->setupInput (newDevice, callback);
|
||||
newDevice->internal = port;
|
||||
return newDevice;
|
||||
std::unique_ptr<MidiOutput> midiOutput (new MidiOutput (port->portName, deviceIdentifier));
|
||||
|
||||
port->setupOutput();
|
||||
midiOutput->internal = port;
|
||||
|
||||
return midiOutput.release();
|
||||
}
|
||||
|
||||
MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback)
|
||||
MidiOutput* MidiOutput::createNewDevice (const String& deviceName)
|
||||
{
|
||||
auto client = AlsaClient::getInstance();
|
||||
auto* port = client->createPort (deviceName, true, true);
|
||||
auto* port = client->createPort (deviceName, false, true);
|
||||
|
||||
jassert (port->isValid());
|
||||
jassert (port != nullptr && port->isValid());
|
||||
|
||||
auto newDevice = new MidiInput (deviceName);
|
||||
port->setupInput (newDevice, callback);
|
||||
newDevice->internal = port;
|
||||
return newDevice;
|
||||
std::unique_ptr<MidiOutput> midiOutput (new MidiOutput (deviceName, getFormattedPortIdentifier (client->getId(), port->portId)));
|
||||
|
||||
port->setupOutput();
|
||||
midiOutput->internal = port;
|
||||
|
||||
return midiOutput.release();
|
||||
}
|
||||
|
||||
StringArray MidiOutput::getDevices()
|
||||
{
|
||||
StringArray deviceNames;
|
||||
|
||||
for (auto& d : getAvailableDevices())
|
||||
deviceNames.add (d.name);
|
||||
|
||||
deviceNames.appendNumbersToDuplicates (true, true);
|
||||
|
||||
return deviceNames;
|
||||
}
|
||||
|
||||
int MidiOutput::getDefaultDeviceIndex()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
MidiOutput* MidiOutput::openDevice (int index)
|
||||
{
|
||||
return openDevice (getAvailableDevices()[index].identifier);
|
||||
}
|
||||
|
||||
MidiOutput::~MidiOutput()
|
||||
{
|
||||
stopBackgroundThread();
|
||||
AlsaClient::getInstance()->deletePort (static_cast<AlsaClient::Port*> (internal));
|
||||
}
|
||||
|
||||
void MidiOutput::sendMessageNow (const MidiMessage& message)
|
||||
{
|
||||
static_cast<AlsaClient::Port*> (internal)->sendMessageNow (message);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
#else
|
||||
|
||||
// (These are just stub functions if ALSA is unavailable...)
|
||||
MidiInput::MidiInput (const String& deviceName, const String& deviceID)
|
||||
: deviceInfo (deviceName, deviceID)
|
||||
{
|
||||
}
|
||||
|
||||
StringArray MidiOutput::getDevices() { return {}; }
|
||||
int MidiOutput::getDefaultDeviceIndex() { return 0; }
|
||||
MidiOutput* MidiOutput::openDevice (int) { return nullptr; }
|
||||
MidiOutput* MidiOutput::createNewDevice (const String&) { return nullptr; }
|
||||
MidiOutput::~MidiOutput() {}
|
||||
void MidiOutput::sendMessageNow (const MidiMessage&) {}
|
||||
|
||||
MidiInput::MidiInput (const String& nm) : name (nm) {}
|
||||
MidiInput::~MidiInput() {}
|
||||
void MidiInput::start() {}
|
||||
void MidiInput::stop() {}
|
||||
int MidiInput::getDefaultDeviceIndex() { return 0; }
|
||||
StringArray MidiInput::getDevices() { return {}; }
|
||||
MidiInput* MidiInput::openDevice (int, MidiInputCallback*) { return nullptr; }
|
||||
MidiInput::~MidiInput() {}
|
||||
void MidiInput::start() {}
|
||||
void MidiInput::stop() {}
|
||||
Array<MidiDeviceInfo> MidiInput::getAvailableDevices() { return {}; }
|
||||
MidiDeviceInfo MidiInput::getDefaultDevice() { return {}; }
|
||||
MidiInput* MidiInput::openDevice (const String&, MidiInputCallback*) { return nullptr; }
|
||||
MidiInput* MidiInput::createNewDevice (const String&, MidiInputCallback*) { return nullptr; }
|
||||
StringArray MidiInput::getDevices() { return {}; }
|
||||
int MidiInput::getDefaultDeviceIndex() { return 0;}
|
||||
MidiInput* MidiInput::openDevice (int, MidiInputCallback*) { return nullptr; }
|
||||
|
||||
MidiOutput::~MidiOutput() {}
|
||||
void MidiOutput::sendMessageNow (const MidiMessage&) {}
|
||||
Array<MidiDeviceInfo> MidiOutput::getAvailableDevices() { return {}; }
|
||||
MidiDeviceInfo MidiOutput::getDefaultDevice() { return {}; }
|
||||
MidiOutput* MidiOutput::openDevice (const String&) { return nullptr; }
|
||||
MidiOutput* MidiOutput::createNewDevice (const String&) { return nullptr; }
|
||||
StringArray MidiOutput::getDevices() { return {}; }
|
||||
int MidiOutput::getDefaultDeviceIndex() { return 0;}
|
||||
MidiOutput* MidiOutput::openDevice (int) { return nullptr; }
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -29,6 +29,22 @@ namespace juce
|
|||
|
||||
namespace CoreMidiHelpers
|
||||
{
|
||||
//==============================================================================
|
||||
struct ScopedCFString
|
||||
{
|
||||
ScopedCFString() = default;
|
||||
ScopedCFString (String s) : cfString (s.toCFString()) {}
|
||||
|
||||
~ScopedCFString() noexcept
|
||||
{
|
||||
if (cfString != nullptr)
|
||||
CFRelease (cfString);
|
||||
}
|
||||
|
||||
CFStringRef cfString = {};
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
static bool checkError (OSStatus err, int lineNum)
|
||||
{
|
||||
if (err == noErr)
|
||||
|
|
@ -45,30 +61,163 @@ namespace CoreMidiHelpers
|
|||
#undef CHECK_ERROR
|
||||
#define CHECK_ERROR(a) CoreMidiHelpers::checkError (a, __LINE__)
|
||||
|
||||
//==============================================================================
|
||||
struct ScopedCFString
|
||||
static MidiDeviceInfo getMidiObjectInfo (MIDIObjectRef entity)
|
||||
{
|
||||
ScopedCFString() noexcept {}
|
||||
~ScopedCFString() noexcept { if (cfString != nullptr) CFRelease (cfString); }
|
||||
MidiDeviceInfo info;
|
||||
|
||||
CFStringRef cfString = {};
|
||||
};
|
||||
|
||||
static String getMidiObjectName (MIDIObjectRef entity)
|
||||
{
|
||||
String result;
|
||||
CFStringRef str = nullptr;
|
||||
MIDIObjectGetStringProperty (entity, kMIDIPropertyName, &str);
|
||||
|
||||
if (str != nullptr)
|
||||
{
|
||||
result = String::fromCFString (str);
|
||||
CFRelease (str);
|
||||
ScopedCFString str;
|
||||
|
||||
if (CHECK_ERROR (MIDIObjectGetStringProperty (entity, kMIDIPropertyName, &str.cfString)))
|
||||
info.name = String::fromCFString (str.cfString);
|
||||
}
|
||||
|
||||
SInt32 objectID = 0;
|
||||
|
||||
if (CHECK_ERROR (MIDIObjectGetIntegerProperty (entity, kMIDIPropertyUniqueID, &objectID)))
|
||||
info.identifier = String (objectID);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
static MidiDeviceInfo getEndpointInfo (MIDIEndpointRef endpoint, bool isExternal)
|
||||
{
|
||||
// NB: don't attempt to use nullptr for refs - it fails in some types of build.
|
||||
MIDIEntityRef entity = 0;
|
||||
MIDIEndpointGetEntity (endpoint, &entity);
|
||||
|
||||
// probably virtual
|
||||
if (entity == 0)
|
||||
return getMidiObjectInfo (endpoint);
|
||||
|
||||
auto result = getMidiObjectInfo (endpoint);
|
||||
|
||||
// endpoint is empty - try the entity
|
||||
if (result == MidiDeviceInfo())
|
||||
result = getMidiObjectInfo (entity);
|
||||
|
||||
// now consider the device
|
||||
MIDIDeviceRef device = 0;
|
||||
MIDIEntityGetDevice (entity, &device);
|
||||
|
||||
if (device != 0)
|
||||
{
|
||||
auto info = getMidiObjectInfo (device);
|
||||
|
||||
if (info != MidiDeviceInfo())
|
||||
{
|
||||
// if an external device has only one entity, throw away
|
||||
// the endpoint name and just use the device name
|
||||
if (isExternal && MIDIDeviceGetNumberOfEntities (device) < 2)
|
||||
{
|
||||
result = info;
|
||||
}
|
||||
else if (! result.name.startsWithIgnoreCase (info.name))
|
||||
{
|
||||
// prepend the device name and identifier to the entity's
|
||||
result.name = (info.name + " " + result.name).trimEnd();
|
||||
result.identifier = info.identifier + " " + result.identifier;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static MidiDeviceInfo getConnectedEndpointInfo (MIDIEndpointRef endpoint)
|
||||
{
|
||||
MidiDeviceInfo result;
|
||||
|
||||
// Does the endpoint have connections?
|
||||
CFDataRef connections = nullptr;
|
||||
int numConnections = 0;
|
||||
|
||||
MIDIObjectGetDataProperty (endpoint, kMIDIPropertyConnectionUniqueID, &connections);
|
||||
|
||||
if (connections != nullptr)
|
||||
{
|
||||
numConnections = ((int) CFDataGetLength (connections)) / (int) sizeof (MIDIUniqueID);
|
||||
|
||||
if (numConnections > 0)
|
||||
{
|
||||
auto* pid = reinterpret_cast<const SInt32*> (CFDataGetBytePtr (connections));
|
||||
|
||||
for (int i = 0; i < numConnections; ++i, ++pid)
|
||||
{
|
||||
auto id = (MIDIUniqueID) ByteOrder::swapIfLittleEndian ((uint32) *pid);
|
||||
MIDIObjectRef connObject;
|
||||
MIDIObjectType connObjectType;
|
||||
auto err = MIDIObjectFindByUniqueID (id, &connObject, &connObjectType);
|
||||
|
||||
if (err == noErr)
|
||||
{
|
||||
MidiDeviceInfo deviceInfo;
|
||||
|
||||
if (connObjectType == kMIDIObjectType_ExternalSource
|
||||
|| connObjectType == kMIDIObjectType_ExternalDestination)
|
||||
{
|
||||
// Connected to an external device's endpoint (10.3 and later).
|
||||
deviceInfo = getEndpointInfo (static_cast<MIDIEndpointRef> (connObject), true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Connected to an external device (10.2) (or something else, catch-all)
|
||||
deviceInfo = getMidiObjectInfo (connObject);
|
||||
}
|
||||
|
||||
if (deviceInfo != MidiDeviceInfo())
|
||||
{
|
||||
if (result.name.isNotEmpty()) result.name += ", ";
|
||||
if (result.identifier.isNotEmpty()) result.identifier += ", ";
|
||||
|
||||
result.name += deviceInfo.name;
|
||||
result.identifier += deviceInfo.identifier;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease (connections);
|
||||
}
|
||||
|
||||
// Here, either the endpoint had no connections, or we failed to obtain names for them.
|
||||
if (result == MidiDeviceInfo())
|
||||
return getEndpointInfo (endpoint, false);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int createUniqueIDForMidiPort (String deviceName, bool isInput)
|
||||
{
|
||||
String uniqueID;
|
||||
|
||||
#ifdef JucePlugin_CFBundleIdentifier
|
||||
uniqueID = JUCE_STRINGIFY (JucePlugin_CFBundleIdentifier);
|
||||
#else
|
||||
auto appBundle = File::getSpecialLocation (File::currentApplicationFile);
|
||||
|
||||
if (auto bundleURL = CFURLCreateWithFileSystemPath (kCFAllocatorDefault, appBundle.getFullPathName().toCFString(),
|
||||
kCFURLPOSIXPathStyle, true))
|
||||
{
|
||||
auto bundleRef = CFBundleCreate (kCFAllocatorDefault, bundleURL);
|
||||
CFRelease (bundleURL);
|
||||
|
||||
if (bundleRef != nullptr)
|
||||
{
|
||||
if (auto bundleId = CFBundleGetIdentifier (bundleRef))
|
||||
uniqueID = String::fromCFString (bundleId);
|
||||
|
||||
CFRelease (bundleRef);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (uniqueID.isNotEmpty())
|
||||
uniqueID += "." + deviceName + (isInput ? ".input" : ".output");
|
||||
|
||||
return uniqueID.hashCode();
|
||||
}
|
||||
|
||||
static void enableSimulatorMidiSession()
|
||||
{
|
||||
#if TARGET_OS_SIMULATOR
|
||||
|
|
@ -85,139 +234,6 @@ namespace CoreMidiHelpers
|
|||
#endif
|
||||
}
|
||||
|
||||
static String getEndpointName (MIDIEndpointRef endpoint, bool isExternal)
|
||||
{
|
||||
auto result = getMidiObjectName (endpoint);
|
||||
|
||||
MIDIEntityRef entity = 0; // NB: don't attempt to use nullptr for refs - it fails in some types of build.
|
||||
MIDIEndpointGetEntity (endpoint, &entity);
|
||||
|
||||
if (entity == 0)
|
||||
return result; // probably virtual
|
||||
|
||||
if (result.isEmpty())
|
||||
result = getMidiObjectName (entity); // endpoint name is empty - try the entity
|
||||
|
||||
// now consider the device's name
|
||||
MIDIDeviceRef device = 0;
|
||||
MIDIEntityGetDevice (entity, &device);
|
||||
|
||||
if (device != 0)
|
||||
{
|
||||
auto deviceName = getMidiObjectName (device);
|
||||
|
||||
if (deviceName.isNotEmpty())
|
||||
{
|
||||
// if an external device has only one entity, throw away
|
||||
// the endpoint name and just use the device name
|
||||
if (isExternal && MIDIDeviceGetNumberOfEntities (device) < 2)
|
||||
{
|
||||
result = deviceName;
|
||||
}
|
||||
else if (! result.startsWithIgnoreCase (deviceName))
|
||||
{
|
||||
// prepend the device name to the entity name
|
||||
result = (deviceName + " " + result).trimEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static String getConnectedEndpointName (MIDIEndpointRef endpoint)
|
||||
{
|
||||
String result;
|
||||
|
||||
// Does the endpoint have connections?
|
||||
CFDataRef connections = nullptr;
|
||||
int numConnections = 0;
|
||||
|
||||
MIDIObjectGetDataProperty (endpoint, kMIDIPropertyConnectionUniqueID, &connections);
|
||||
|
||||
if (connections != nullptr)
|
||||
{
|
||||
numConnections = ((int) CFDataGetLength (connections)) / (int) sizeof (MIDIUniqueID);
|
||||
|
||||
if (numConnections > 0)
|
||||
{
|
||||
auto pid = reinterpret_cast<const SInt32*> (CFDataGetBytePtr (connections));
|
||||
|
||||
for (int i = 0; i < numConnections; ++i, ++pid)
|
||||
{
|
||||
auto uid = (MIDIUniqueID) ByteOrder::swapIfLittleEndian ((uint32) *pid);
|
||||
MIDIObjectRef connObject;
|
||||
MIDIObjectType connObjectType;
|
||||
auto err = MIDIObjectFindByUniqueID (uid, &connObject, &connObjectType);
|
||||
|
||||
if (err == noErr)
|
||||
{
|
||||
String s;
|
||||
|
||||
if (connObjectType == kMIDIObjectType_ExternalSource
|
||||
|| connObjectType == kMIDIObjectType_ExternalDestination)
|
||||
{
|
||||
// Connected to an external device's endpoint (10.3 and later).
|
||||
s = getEndpointName (static_cast<MIDIEndpointRef> (connObject), true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Connected to an external device (10.2) (or something else, catch-all)
|
||||
s = getMidiObjectName (connObject);
|
||||
}
|
||||
|
||||
if (s.isNotEmpty())
|
||||
{
|
||||
if (result.isNotEmpty())
|
||||
result += ", ";
|
||||
|
||||
result += s;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease (connections);
|
||||
}
|
||||
|
||||
if (result.isEmpty()) // Here, either the endpoint had no connections, or we failed to obtain names for them.
|
||||
result = getEndpointName (endpoint, false);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void setUniqueIdForMidiPort (MIDIObjectRef device, const String& portName, bool isInput)
|
||||
{
|
||||
String portUniqueId;
|
||||
#if defined (JucePlugin_CFBundleIdentifier)
|
||||
portUniqueId = JUCE_STRINGIFY (JucePlugin_CFBundleIdentifier);
|
||||
#else
|
||||
auto appBundle = File::getSpecialLocation (File::currentApplicationFile);
|
||||
|
||||
if (auto bundleURL = CFURLCreateWithFileSystemPath (kCFAllocatorDefault, appBundle.getFullPathName().toCFString(),
|
||||
kCFURLPOSIXPathStyle, true))
|
||||
{
|
||||
auto bundleRef = CFBundleCreate (kCFAllocatorDefault, bundleURL);
|
||||
CFRelease (bundleURL);
|
||||
|
||||
if (bundleRef != nullptr)
|
||||
{
|
||||
if (auto bundleId = CFBundleGetIdentifier (bundleRef))
|
||||
portUniqueId = String::fromCFString (bundleId);
|
||||
|
||||
CFRelease (bundleRef);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (portUniqueId.isNotEmpty())
|
||||
{
|
||||
portUniqueId += "." + portName + (isInput ? ".input" : ".output");
|
||||
|
||||
CHECK_ERROR (MIDIObjectSetStringProperty (device, kMIDIPropertyUniqueID, portUniqueId.toCFString()));
|
||||
}
|
||||
}
|
||||
|
||||
static void globalSystemChangeCallback (const MIDINotification*, void*)
|
||||
{
|
||||
// TODO.. Should pass-on this notification..
|
||||
|
|
@ -243,15 +259,14 @@ namespace CoreMidiHelpers
|
|||
|
||||
enableSimulatorMidiSession();
|
||||
|
||||
CoreMidiHelpers::ScopedCFString name;
|
||||
name.cfString = getGlobalMidiClientName().toCFString();
|
||||
CoreMidiHelpers::ScopedCFString name (getGlobalMidiClientName());
|
||||
CHECK_ERROR (MIDIClientCreate (name.cfString, &globalSystemChangeCallback, nullptr, &globalMidiClient));
|
||||
}
|
||||
|
||||
return globalMidiClient;
|
||||
}
|
||||
|
||||
static StringArray findDevices (bool forInput)
|
||||
static Array<MidiDeviceInfo> findDevices (bool forInput)
|
||||
{
|
||||
// It seems that OSX can be a bit picky about the thread that's first used to
|
||||
// search for devices. It's safest to use the message thread for calling this.
|
||||
|
|
@ -263,26 +278,25 @@ namespace CoreMidiHelpers
|
|||
return {};
|
||||
}
|
||||
|
||||
StringArray s;
|
||||
enableSimulatorMidiSession();
|
||||
|
||||
auto num = forInput ? MIDIGetNumberOfSources()
|
||||
: MIDIGetNumberOfDestinations();
|
||||
Array<MidiDeviceInfo> devices;
|
||||
auto numDevices = (forInput ? MIDIGetNumberOfSources() : MIDIGetNumberOfDestinations());
|
||||
|
||||
for (ItemCount i = 0; i < num; ++i)
|
||||
for (ItemCount i = 0; i < numDevices; ++i)
|
||||
{
|
||||
String name;
|
||||
MidiDeviceInfo deviceInfo;
|
||||
|
||||
if (auto dest = forInput ? MIDIGetSource (i) : MIDIGetDestination (i))
|
||||
name = getConnectedEndpointName (dest);
|
||||
deviceInfo = getConnectedEndpointInfo (dest);
|
||||
|
||||
if (name.isEmpty())
|
||||
name = "<error>";
|
||||
if (deviceInfo == MidiDeviceInfo())
|
||||
deviceInfo.name = deviceInfo.identifier = "<error>";
|
||||
|
||||
s.add (name);
|
||||
devices.add (deviceInfo);
|
||||
}
|
||||
|
||||
return s;
|
||||
return devices;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -290,7 +304,7 @@ namespace CoreMidiHelpers
|
|||
{
|
||||
public:
|
||||
MidiPortAndEndpoint (MIDIPortRef p, MIDIEndpointRef ep) noexcept
|
||||
: port (p), endPoint (ep)
|
||||
: port (p), endpoint (ep)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -299,20 +313,21 @@ namespace CoreMidiHelpers
|
|||
if (port != 0)
|
||||
MIDIPortDispose (port);
|
||||
|
||||
if (port == 0 && endPoint != 0) // if port == nullptr, it means we created the endpoint, so it's safe to delete it
|
||||
MIDIEndpointDispose (endPoint);
|
||||
// if port == nullptr, it means we created the endpoint, so it's safe to delete it
|
||||
if (port == 0 && endpoint != 0)
|
||||
MIDIEndpointDispose (endpoint);
|
||||
}
|
||||
|
||||
void send (const MIDIPacketList* packets) noexcept
|
||||
{
|
||||
if (port != 0)
|
||||
MIDISend (port, endPoint, packets);
|
||||
MIDISend (port, endpoint, packets);
|
||||
else
|
||||
MIDIReceived (endPoint, packets);
|
||||
MIDIReceived (endpoint, packets);
|
||||
}
|
||||
|
||||
MIDIPortRef port;
|
||||
MIDIEndpointRef endPoint;
|
||||
MIDIEndpointRef endpoint;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -334,7 +349,7 @@ namespace CoreMidiHelpers
|
|||
}
|
||||
|
||||
if (portAndEndpoint != nullptr && portAndEndpoint->port != 0)
|
||||
CHECK_ERROR (MIDIPortDisconnectSource (portAndEndpoint->port, portAndEndpoint->endPoint));
|
||||
CHECK_ERROR (MIDIPortDisconnectSource (portAndEndpoint->port, portAndEndpoint->endpoint));
|
||||
}
|
||||
|
||||
void handlePackets (const MIDIPacketList* pktlist)
|
||||
|
|
@ -370,63 +385,250 @@ namespace CoreMidiHelpers
|
|||
{
|
||||
static_cast<MidiPortAndCallback*> (readProcRefCon)->handlePackets (pktlist);
|
||||
}
|
||||
|
||||
static Array<MIDIEndpointRef> getEndpoints (bool isInput)
|
||||
{
|
||||
Array<MIDIEndpointRef> endpoints;
|
||||
auto numDevices = (isInput ? MIDIGetNumberOfSources() : MIDIGetNumberOfDevices());
|
||||
|
||||
for (ItemCount i = 0; i < numDevices; ++i)
|
||||
endpoints.add (isInput ? MIDIGetSource (i) : MIDIGetDestination (i));
|
||||
|
||||
return endpoints;
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
StringArray MidiOutput::getDevices() { return CoreMidiHelpers::findDevices (false); }
|
||||
int MidiOutput::getDefaultDeviceIndex() { return 0; }
|
||||
|
||||
MidiOutput* MidiOutput::openDevice (int index)
|
||||
Array<MidiDeviceInfo> MidiInput::getAvailableDevices()
|
||||
{
|
||||
MidiOutput* mo = nullptr;
|
||||
return CoreMidiHelpers::findDevices (true);
|
||||
}
|
||||
|
||||
if (auto client = CoreMidiHelpers::getGlobalMidiClient())
|
||||
MidiDeviceInfo MidiInput::getDefaultDevice()
|
||||
{
|
||||
return getAvailableDevices().getFirst();
|
||||
}
|
||||
|
||||
MidiInput* MidiInput::openDevice (const String& deviceIdentifier, MidiInputCallback* callback)
|
||||
{
|
||||
if (deviceIdentifier.isEmpty())
|
||||
return nullptr;
|
||||
|
||||
using namespace CoreMidiHelpers;
|
||||
|
||||
if (auto client = getGlobalMidiClient())
|
||||
{
|
||||
if (isPositiveAndBelow (index, MIDIGetNumberOfDestinations()))
|
||||
for (auto& endpoint : getEndpoints (true))
|
||||
{
|
||||
auto endPoint = MIDIGetDestination ((ItemCount) index);
|
||||
|
||||
CoreMidiHelpers::ScopedCFString pname;
|
||||
|
||||
if (CHECK_ERROR (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &pname.cfString)))
|
||||
if (deviceIdentifier == getConnectedEndpointInfo (endpoint).identifier)
|
||||
{
|
||||
MIDIPortRef port;
|
||||
auto deviceName = CoreMidiHelpers::getConnectedEndpointName (endPoint);
|
||||
ScopedCFString cfName;
|
||||
|
||||
if (CHECK_ERROR (MIDIOutputPortCreate (client, pname.cfString, &port)))
|
||||
if (CHECK_ERROR (MIDIObjectGetStringProperty (endpoint, kMIDIPropertyName, &cfName.cfString)))
|
||||
{
|
||||
mo = new MidiOutput (deviceName);
|
||||
mo->internal = new CoreMidiHelpers::MidiPortAndEndpoint (port, endPoint);
|
||||
MIDIPortRef port;
|
||||
std::unique_ptr<MidiPortAndCallback> mpc (new MidiPortAndCallback (*callback));
|
||||
|
||||
if (CHECK_ERROR (MIDIInputPortCreate (client, cfName.cfString, midiInputProc, mpc.get(), &port)))
|
||||
{
|
||||
if (CHECK_ERROR (MIDIPortConnectSource (port, endpoint, nullptr)))
|
||||
{
|
||||
mpc->portAndEndpoint.reset (new MidiPortAndEndpoint (port, endpoint));
|
||||
|
||||
std::unique_ptr<MidiInput> midiInput (new MidiInput (String::fromCFString (cfName.cfString), deviceIdentifier));
|
||||
|
||||
mpc->input = midiInput.get();
|
||||
midiInput->internal = mpc.get();
|
||||
|
||||
const ScopedLock sl (callbackLock);
|
||||
activeCallbacks.add (mpc.release());
|
||||
|
||||
return midiInput.release();
|
||||
}
|
||||
else
|
||||
{
|
||||
CHECK_ERROR (MIDIPortDispose (port));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mo;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
MidiOutput* MidiOutput::createNewDevice (const String& deviceName)
|
||||
MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback)
|
||||
{
|
||||
if (auto client = CoreMidiHelpers::getGlobalMidiClient())
|
||||
using namespace CoreMidiHelpers;
|
||||
jassert (callback != nullptr);
|
||||
|
||||
if (auto client = getGlobalMidiClient())
|
||||
{
|
||||
MIDIEndpointRef endPoint;
|
||||
auto mpc = std::make_unique<MidiPortAndCallback> (*callback);
|
||||
mpc->active = false;
|
||||
|
||||
CoreMidiHelpers::ScopedCFString name;
|
||||
name.cfString = deviceName.toCFString();
|
||||
MIDIEndpointRef endpoint;
|
||||
ScopedCFString name (deviceName);
|
||||
|
||||
if (CHECK_ERROR (MIDISourceCreate (client, name.cfString, &endPoint)))
|
||||
if (CHECK_ERROR (MIDIDestinationCreate (client, name.cfString, midiInputProc, mpc.get(), &endpoint)))
|
||||
{
|
||||
CoreMidiHelpers::setUniqueIdForMidiPort (endPoint, deviceName, false);
|
||||
auto deviceIdentifier = createUniqueIDForMidiPort (deviceName, true);
|
||||
|
||||
auto mo = new MidiOutput (deviceName);
|
||||
mo->internal = new CoreMidiHelpers::MidiPortAndEndpoint (0, endPoint);
|
||||
return mo;
|
||||
if (CHECK_ERROR (MIDIObjectSetIntegerProperty (endpoint, kMIDIPropertyUniqueID, (SInt32) deviceIdentifier)))
|
||||
{
|
||||
mpc->portAndEndpoint.reset (new MidiPortAndEndpoint (0, endpoint));
|
||||
|
||||
std::unique_ptr<MidiInput> midiInput (new MidiInput (deviceName, String (deviceIdentifier)));
|
||||
|
||||
mpc->input = midiInput.get();
|
||||
midiInput->internal = mpc.get();
|
||||
|
||||
const ScopedLock sl (callbackLock);
|
||||
activeCallbacks.add (mpc.release());
|
||||
|
||||
return midiInput.release();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
StringArray MidiInput::getDevices()
|
||||
{
|
||||
StringArray deviceNames;
|
||||
|
||||
for (auto& d : getAvailableDevices())
|
||||
deviceNames.add (d.name);
|
||||
|
||||
return deviceNames;
|
||||
}
|
||||
|
||||
int MidiInput::getDefaultDeviceIndex()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback)
|
||||
{
|
||||
return openDevice (getAvailableDevices()[index].identifier, callback);
|
||||
}
|
||||
|
||||
MidiInput::MidiInput (const String& deviceName, const String& deviceIdentifier)
|
||||
: deviceInfo (deviceName, deviceIdentifier)
|
||||
{
|
||||
}
|
||||
|
||||
MidiInput::~MidiInput()
|
||||
{
|
||||
delete static_cast<CoreMidiHelpers::MidiPortAndCallback*> (internal);
|
||||
}
|
||||
|
||||
void MidiInput::start()
|
||||
{
|
||||
const ScopedLock sl (CoreMidiHelpers::callbackLock);
|
||||
static_cast<CoreMidiHelpers::MidiPortAndCallback*> (internal)->active = true;
|
||||
}
|
||||
|
||||
void MidiInput::stop()
|
||||
{
|
||||
const ScopedLock sl (CoreMidiHelpers::callbackLock);
|
||||
static_cast<CoreMidiHelpers::MidiPortAndCallback*> (internal)->active = false;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
Array<MidiDeviceInfo> MidiOutput::getAvailableDevices()
|
||||
{
|
||||
return CoreMidiHelpers::findDevices (false);
|
||||
}
|
||||
|
||||
MidiDeviceInfo MidiOutput::getDefaultDevice()
|
||||
{
|
||||
return getAvailableDevices().getFirst();
|
||||
}
|
||||
|
||||
MidiOutput* MidiOutput::openDevice (const String& deviceIdentifier)
|
||||
{
|
||||
if (deviceIdentifier.isEmpty())
|
||||
return nullptr;
|
||||
|
||||
using namespace CoreMidiHelpers;
|
||||
|
||||
if (auto client = getGlobalMidiClient())
|
||||
{
|
||||
for (auto& endpoint : getEndpoints (false))
|
||||
{
|
||||
if (deviceIdentifier == getConnectedEndpointInfo (endpoint).identifier)
|
||||
{
|
||||
ScopedCFString cfName;
|
||||
|
||||
if (CHECK_ERROR (MIDIObjectGetStringProperty (endpoint, kMIDIPropertyName, &cfName.cfString)))
|
||||
{
|
||||
MIDIPortRef port;
|
||||
|
||||
if (CHECK_ERROR (MIDIOutputPortCreate (client, cfName.cfString, &port)))
|
||||
{
|
||||
std::unique_ptr<MidiOutput> midiOutput (new MidiOutput (String::fromCFString (cfName.cfString), deviceIdentifier));
|
||||
midiOutput->internal = new MidiPortAndEndpoint (port, endpoint);
|
||||
|
||||
return midiOutput.release();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
MidiOutput* MidiOutput::createNewDevice (const String& deviceName)
|
||||
{
|
||||
using namespace CoreMidiHelpers;
|
||||
|
||||
if (auto client = getGlobalMidiClient())
|
||||
{
|
||||
MIDIEndpointRef endpoint;
|
||||
|
||||
ScopedCFString name (deviceName);
|
||||
|
||||
if (CHECK_ERROR (MIDISourceCreate (client, name.cfString, &endpoint)))
|
||||
{
|
||||
auto deviceIdentifier = createUniqueIDForMidiPort (deviceName, true);
|
||||
|
||||
if (CHECK_ERROR (MIDIObjectSetIntegerProperty (endpoint, kMIDIPropertyUniqueID, (SInt32) deviceIdentifier)))
|
||||
{
|
||||
std::unique_ptr<MidiOutput> midiOutput (new MidiOutput (deviceName, String (deviceIdentifier)));
|
||||
midiOutput->internal = new MidiPortAndEndpoint (0, endpoint);
|
||||
|
||||
return midiOutput.release();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
StringArray MidiOutput::getDevices()
|
||||
{
|
||||
StringArray deviceNames;
|
||||
|
||||
for (auto& d : getAvailableDevices())
|
||||
deviceNames.add (d.name);
|
||||
|
||||
return deviceNames;
|
||||
}
|
||||
|
||||
int MidiOutput::getDefaultDeviceIndex()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
MidiOutput* MidiOutput::openDevice (int index)
|
||||
{
|
||||
return openDevice (getAvailableDevices()[index].identifier);
|
||||
}
|
||||
|
||||
MidiOutput::~MidiOutput()
|
||||
{
|
||||
stopBackgroundThread();
|
||||
|
|
@ -493,111 +695,6 @@ void MidiOutput::sendMessageNow (const MidiMessage& message)
|
|||
static_cast<CoreMidiHelpers::MidiPortAndEndpoint*> (internal)->send (packetToSend);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
StringArray MidiInput::getDevices() { return CoreMidiHelpers::findDevices (true); }
|
||||
int MidiInput::getDefaultDeviceIndex() { return 0; }
|
||||
|
||||
MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback)
|
||||
{
|
||||
jassert (callback != nullptr);
|
||||
|
||||
using namespace CoreMidiHelpers;
|
||||
MidiInput* newInput = nullptr;
|
||||
|
||||
if (auto client = getGlobalMidiClient())
|
||||
{
|
||||
if (isPositiveAndBelow (index, MIDIGetNumberOfSources()))
|
||||
{
|
||||
if (auto endPoint = MIDIGetSource ((ItemCount) index))
|
||||
{
|
||||
ScopedCFString name;
|
||||
|
||||
if (CHECK_ERROR (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &name.cfString)))
|
||||
{
|
||||
MIDIPortRef port;
|
||||
std::unique_ptr<MidiPortAndCallback> mpc (new MidiPortAndCallback (*callback));
|
||||
|
||||
if (CHECK_ERROR (MIDIInputPortCreate (client, name.cfString, midiInputProc, mpc.get(), &port)))
|
||||
{
|
||||
if (CHECK_ERROR (MIDIPortConnectSource (port, endPoint, nullptr)))
|
||||
{
|
||||
mpc->portAndEndpoint.reset (new MidiPortAndEndpoint (port, endPoint));
|
||||
|
||||
newInput = new MidiInput (getDevices() [index]);
|
||||
mpc->input = newInput;
|
||||
newInput->internal = mpc.get();
|
||||
|
||||
const ScopedLock sl (callbackLock);
|
||||
activeCallbacks.add (mpc.release());
|
||||
}
|
||||
else
|
||||
{
|
||||
CHECK_ERROR (MIDIPortDispose (port));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return newInput;
|
||||
}
|
||||
|
||||
MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback)
|
||||
{
|
||||
jassert (callback != nullptr);
|
||||
using namespace CoreMidiHelpers;
|
||||
|
||||
if (auto client = getGlobalMidiClient())
|
||||
{
|
||||
std::unique_ptr<MidiPortAndCallback> mpc (new MidiPortAndCallback (*callback));
|
||||
mpc->active = false;
|
||||
|
||||
MIDIEndpointRef endPoint;
|
||||
ScopedCFString name;
|
||||
name.cfString = deviceName.toCFString();
|
||||
|
||||
if (CHECK_ERROR (MIDIDestinationCreate (client, name.cfString, midiInputProc, mpc.get(), &endPoint)))
|
||||
{
|
||||
setUniqueIdForMidiPort (endPoint, deviceName, true);
|
||||
|
||||
mpc->portAndEndpoint.reset (new MidiPortAndEndpoint (0, endPoint));
|
||||
|
||||
auto mi = new MidiInput (deviceName);
|
||||
mpc->input = mi;
|
||||
mi->internal = mpc.get();
|
||||
|
||||
const ScopedLock sl (callbackLock);
|
||||
activeCallbacks.add (mpc.release());
|
||||
|
||||
return mi;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
MidiInput::MidiInput (const String& nm) : name (nm)
|
||||
{
|
||||
}
|
||||
|
||||
MidiInput::~MidiInput()
|
||||
{
|
||||
delete static_cast<CoreMidiHelpers::MidiPortAndCallback*> (internal);
|
||||
}
|
||||
|
||||
void MidiInput::start()
|
||||
{
|
||||
const ScopedLock sl (CoreMidiHelpers::callbackLock);
|
||||
static_cast<CoreMidiHelpers::MidiPortAndCallback*> (internal)->active = true;
|
||||
}
|
||||
|
||||
void MidiInput::stop()
|
||||
{
|
||||
const ScopedLock sl (CoreMidiHelpers::callbackLock);
|
||||
static_cast<CoreMidiHelpers::MidiPortAndCallback*> (internal)->active = false;
|
||||
}
|
||||
|
||||
#undef CHECK_ERROR
|
||||
|
||||
} // namespace juce
|
||||
|
|
|
|||
|
|
@ -20,6 +20,12 @@
|
|||
==============================================================================
|
||||
*/
|
||||
|
||||
#ifndef DRV_QUERYDEVICEINTERFACE
|
||||
#define DRV_RESERVED 0x0800
|
||||
#define DRV_QUERYDEVICEINTERFACE (DRV_RESERVED + 12)
|
||||
#define DRV_QUERYDEVICEINTERFACESIZE (DRV_RESERVED + 13)
|
||||
#endif
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
|
|
@ -29,7 +35,9 @@ struct MidiServiceType
|
|||
{
|
||||
virtual ~InputWrapper() {}
|
||||
|
||||
virtual String getDeviceIdentifier() = 0;
|
||||
virtual String getDeviceName() = 0;
|
||||
|
||||
virtual void start() = 0;
|
||||
virtual void stop() = 0;
|
||||
};
|
||||
|
|
@ -38,18 +46,20 @@ struct MidiServiceType
|
|||
{
|
||||
virtual ~OutputWrapper() {}
|
||||
|
||||
virtual String getDeviceIdentifier() = 0;
|
||||
virtual String getDeviceName() = 0;
|
||||
|
||||
virtual void sendMessageNow (const MidiMessage&) = 0;
|
||||
};
|
||||
|
||||
MidiServiceType() {}
|
||||
virtual ~MidiServiceType() {}
|
||||
|
||||
virtual StringArray getDevices (bool) = 0;
|
||||
virtual int getDefaultDeviceIndex (bool) = 0;
|
||||
virtual Array<MidiDeviceInfo> getAvailableDevices (bool) = 0;
|
||||
virtual MidiDeviceInfo getDefaultDevice (bool) = 0;
|
||||
|
||||
virtual InputWrapper* createInputWrapper (MidiInput&, int, MidiInputCallback&) = 0;
|
||||
virtual OutputWrapper* createOutputWrapper (int) = 0;
|
||||
virtual InputWrapper* createInputWrapper (MidiInput&, const String&, MidiInputCallback&) = 0;
|
||||
virtual OutputWrapper* createOutputWrapper (const String&) = 0;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiServiceType)
|
||||
};
|
||||
|
|
@ -60,26 +70,26 @@ struct Win32MidiService : public MidiServiceType,
|
|||
{
|
||||
Win32MidiService() {}
|
||||
|
||||
StringArray getDevices (bool isInput) override
|
||||
Array<MidiDeviceInfo> getAvailableDevices (bool isInput) override
|
||||
{
|
||||
return isInput ? Win32InputWrapper::getDevices()
|
||||
: Win32OutputWrapper::getDevices();
|
||||
return isInput ? Win32InputWrapper::getAvailableDevices()
|
||||
: Win32OutputWrapper::getAvailableDevices();
|
||||
}
|
||||
|
||||
int getDefaultDeviceIndex (bool isInput) override
|
||||
MidiDeviceInfo getDefaultDevice (bool isInput) override
|
||||
{
|
||||
return isInput ? Win32InputWrapper::getDefaultDeviceIndex()
|
||||
: Win32OutputWrapper::getDefaultDeviceIndex();
|
||||
return isInput ? Win32InputWrapper::getDefaultDevice()
|
||||
: Win32OutputWrapper::getDefaultDevice();
|
||||
}
|
||||
|
||||
InputWrapper* createInputWrapper (MidiInput& input, int index, MidiInputCallback& callback) override
|
||||
InputWrapper* createInputWrapper (MidiInput& input, const String& deviceIdentifier, MidiInputCallback& callback) override
|
||||
{
|
||||
return new Win32InputWrapper (*this, input, index, callback);
|
||||
return new Win32InputWrapper (*this, input, deviceIdentifier, callback);
|
||||
}
|
||||
|
||||
OutputWrapper* createOutputWrapper (int index) override
|
||||
OutputWrapper* createOutputWrapper (const String& deviceIdentifier) override
|
||||
{
|
||||
return new Win32OutputWrapper (*this, index);
|
||||
return new Win32OutputWrapper (*this, deviceIdentifier);
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
@ -88,7 +98,10 @@ private:
|
|||
//==============================================================================
|
||||
struct MidiInCollector : public ReferenceCountedObject
|
||||
{
|
||||
MidiInCollector (Win32MidiService& s, const String& name) : deviceName (name), midiService (s) {}
|
||||
MidiInCollector (Win32MidiService& s, MidiDeviceInfo d)
|
||||
: deviceInfo (d), midiService (s)
|
||||
{
|
||||
}
|
||||
|
||||
~MidiInCollector()
|
||||
{
|
||||
|
|
@ -216,7 +229,7 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
String deviceName;
|
||||
MidiDeviceInfo deviceInfo;
|
||||
HMIDIIN deviceHandle = 0;
|
||||
|
||||
private:
|
||||
|
|
@ -319,13 +332,59 @@ private:
|
|||
};
|
||||
|
||||
//==============================================================================
|
||||
struct Win32InputWrapper : public InputWrapper
|
||||
template<class WrapperType>
|
||||
struct Win32MidiDeviceQuery
|
||||
{
|
||||
Win32InputWrapper (Win32MidiService& parentService,
|
||||
MidiInput& midiInput, int index, MidiInputCallback& c)
|
||||
static Array<MidiDeviceInfo> getAvailableDevices()
|
||||
{
|
||||
StringArray deviceNames, deviceIDs;
|
||||
auto deviceCaps = WrapperType::getDeviceCaps();
|
||||
|
||||
for (int i = 0; i < deviceCaps.size(); ++i)
|
||||
{
|
||||
deviceNames.add ({ deviceCaps[i].szPname, (size_t) numElementsInArray (deviceCaps[i].szPname) });
|
||||
deviceIDs.add (getInterfaceIDForDevice ((UINT) i));
|
||||
}
|
||||
|
||||
deviceNames.appendNumbersToDuplicates (false, false, CharPointer_UTF8 ("-"), CharPointer_UTF8 (""));
|
||||
deviceIDs .appendNumbersToDuplicates (false, false, CharPointer_UTF8 ("-"), CharPointer_UTF8 (""));
|
||||
|
||||
Array<MidiDeviceInfo> devices;
|
||||
|
||||
for (int i = 0; i < deviceNames.size(); ++i)
|
||||
devices.add ({ deviceNames[i], deviceIDs[i] });
|
||||
|
||||
return devices;
|
||||
}
|
||||
|
||||
private:
|
||||
static String getInterfaceIDForDevice (UINT id)
|
||||
{
|
||||
ULONG size = 0;
|
||||
|
||||
if (WrapperType::sendMidiMessage ((UINT_PTR) id, DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR) &size, 0) == MMSYSERR_NOERROR)
|
||||
{
|
||||
WCHAR interfaceName[512] = {};
|
||||
|
||||
if (isPositiveAndBelow (size, sizeof (interfaceName))
|
||||
&& WrapperType::sendMidiMessage ((UINT_PTR) id, DRV_QUERYDEVICEINTERFACE,
|
||||
(DWORD_PTR) interfaceName, sizeof (interfaceName)) == MMSYSERR_NOERROR)
|
||||
{
|
||||
return interfaceName;
|
||||
}
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
};
|
||||
|
||||
struct Win32InputWrapper : public InputWrapper,
|
||||
public Win32MidiDeviceQuery<Win32InputWrapper>
|
||||
{
|
||||
Win32InputWrapper (Win32MidiService& parentService, MidiInput& midiInput, const String& deviceIdentifier, MidiInputCallback& c)
|
||||
: input (midiInput), callback (c)
|
||||
{
|
||||
collector = getOrCreateCollector (parentService, index);
|
||||
collector = getOrCreateCollector (parentService, deviceIdentifier);
|
||||
collector->addClient (this);
|
||||
}
|
||||
|
||||
|
|
@ -334,25 +393,31 @@ private:
|
|||
collector->removeClient (this);
|
||||
}
|
||||
|
||||
static MidiInCollector::Ptr getOrCreateCollector (Win32MidiService& parentService, int index)
|
||||
static MidiInCollector::Ptr getOrCreateCollector (Win32MidiService& parentService, const String& deviceIdentifier)
|
||||
{
|
||||
auto names = getDevices();
|
||||
UINT deviceID = MIDI_MAPPER;
|
||||
String deviceName;
|
||||
auto devices = getAvailableDevices();
|
||||
|
||||
if (isPositiveAndBelow (index, names.size()))
|
||||
for (int i = 0; i < devices.size(); ++i)
|
||||
{
|
||||
deviceName = names[index];
|
||||
deviceID = index;
|
||||
auto d = devices.getUnchecked (i);
|
||||
|
||||
if (d.identifier == deviceIdentifier)
|
||||
{
|
||||
deviceID = i;
|
||||
deviceName = d.name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const ScopedLock sl (parentService.activeCollectorLock);
|
||||
|
||||
for (auto& c : parentService.activeCollectors)
|
||||
if (c->deviceName == deviceName)
|
||||
if (c->deviceInfo.identifier == deviceIdentifier)
|
||||
return c;
|
||||
|
||||
MidiInCollector::Ptr c (new MidiInCollector (parentService, deviceName));
|
||||
MidiInCollector::Ptr c (new MidiInCollector (parentService, { deviceName, deviceIdentifier }));
|
||||
|
||||
HMIDIIN h;
|
||||
auto err = midiInOpen (&h, deviceID,
|
||||
|
|
@ -368,29 +433,33 @@ private:
|
|||
return c;
|
||||
}
|
||||
|
||||
static StringArray getDevices()
|
||||
static DWORD sendMidiMessage (UINT_PTR deviceID, UINT msg, DWORD_PTR arg1, DWORD_PTR arg2)
|
||||
{
|
||||
StringArray s;
|
||||
auto num = midiInGetNumDevs();
|
||||
return midiInMessage ((HMIDIIN) deviceID, msg, arg1, arg2);
|
||||
}
|
||||
|
||||
for (UINT i = 0; i < num; ++i)
|
||||
static Array<MIDIINCAPS> getDeviceCaps()
|
||||
{
|
||||
Array<MIDIINCAPS> devices;
|
||||
|
||||
for (UINT i = 0; i < midiInGetNumDevs(); ++i)
|
||||
{
|
||||
MIDIINCAPS mc = { 0 };
|
||||
|
||||
if (midiInGetDevCaps (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR)
|
||||
s.add (String (mc.szPname, (size_t) numElementsInArray (mc.szPname)));
|
||||
devices.add (mc);
|
||||
}
|
||||
|
||||
s.appendNumbersToDuplicates (false, false, CharPointer_UTF8 ("-"), CharPointer_UTF8 (""));
|
||||
return s;
|
||||
return devices;
|
||||
}
|
||||
|
||||
static int getDefaultDeviceIndex() { return 0; }
|
||||
static MidiDeviceInfo getDefaultDevice() { return getAvailableDevices().getFirst(); }
|
||||
|
||||
void start() override { started = true; concatenator.reset(); collector->startOrStop(); }
|
||||
void stop() override { started = false; collector->startOrStop(); concatenator.reset(); }
|
||||
|
||||
String getDeviceName() override { return collector->deviceName; }
|
||||
String getDeviceIdentifier() override { return collector->deviceInfo.identifier; }
|
||||
String getDeviceName() override { return collector->deviceInfo.name; }
|
||||
|
||||
void pushMidiData (const void* inputData, int numBytes, double time)
|
||||
{
|
||||
|
|
@ -411,8 +480,8 @@ private:
|
|||
{
|
||||
using Ptr = ReferenceCountedObjectPtr<MidiOutHandle>;
|
||||
|
||||
MidiOutHandle (Win32MidiService& parent, const String& name, HMIDIOUT h)
|
||||
: owner (parent), deviceName (name), handle (h)
|
||||
MidiOutHandle (Win32MidiService& parent, MidiDeviceInfo d, HMIDIOUT h)
|
||||
: owner (parent), deviceInfo (d), handle (h)
|
||||
{
|
||||
owner.activeOutputHandles.add (this);
|
||||
}
|
||||
|
|
@ -426,32 +495,41 @@ private:
|
|||
}
|
||||
|
||||
Win32MidiService& owner;
|
||||
String deviceName;
|
||||
MidiDeviceInfo deviceInfo;
|
||||
HMIDIOUT handle;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiOutHandle)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
struct Win32OutputWrapper : public OutputWrapper
|
||||
struct Win32OutputWrapper : public OutputWrapper,
|
||||
public Win32MidiDeviceQuery<Win32OutputWrapper>
|
||||
{
|
||||
Win32OutputWrapper (Win32MidiService& p, int index) : parent (p)
|
||||
Win32OutputWrapper (Win32MidiService& p, const String& deviceIdentifier)
|
||||
: parent (p)
|
||||
{
|
||||
auto names = getDevices();
|
||||
auto devices = getAvailableDevices();
|
||||
UINT deviceID = MIDI_MAPPER;
|
||||
String deviceName;
|
||||
|
||||
if (isPositiveAndBelow (index, names.size()))
|
||||
for (int i = 0; i < devices.size(); ++i)
|
||||
{
|
||||
deviceName = names[index];
|
||||
deviceID = index;
|
||||
auto d = devices.getUnchecked (i);
|
||||
|
||||
if (d.identifier == deviceIdentifier)
|
||||
{
|
||||
deviceID = i;
|
||||
deviceName = d.name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (deviceID == MIDI_MAPPER)
|
||||
{
|
||||
// use the microsoft sw synth as a default - best not to allow deviceID
|
||||
// to be MIDI_MAPPER, or else device sharing breaks
|
||||
for (int i = 0; i < names.size(); ++i)
|
||||
if (names[i].containsIgnoreCase ("microsoft"))
|
||||
for (int i = 0; i < devices.size(); ++i)
|
||||
if (devices[i].name.containsIgnoreCase ("microsoft"))
|
||||
deviceID = (UINT) i;
|
||||
}
|
||||
|
||||
|
|
@ -459,7 +537,7 @@ private:
|
|||
{
|
||||
auto* activeHandle = parent.activeOutputHandles.getUnchecked (i);
|
||||
|
||||
if (activeHandle->deviceName == deviceName)
|
||||
if (activeHandle->deviceInfo.identifier == deviceIdentifier)
|
||||
{
|
||||
han = activeHandle;
|
||||
return;
|
||||
|
|
@ -473,7 +551,7 @@ private:
|
|||
|
||||
if (res == MMSYSERR_NOERROR)
|
||||
{
|
||||
han = new MidiOutHandle (parent, deviceName, h);
|
||||
han = new MidiOutHandle (parent, { deviceName, deviceIdentifier }, h);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -530,12 +608,16 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
static DWORD sendMidiMessage (UINT_PTR deviceID, UINT msg, DWORD_PTR arg1, DWORD_PTR arg2)
|
||||
{
|
||||
return midiOutMessage ((HMIDIOUT) deviceID, msg, arg1, arg2);
|
||||
}
|
||||
|
||||
static Array<MIDIOUTCAPS> getDeviceCaps()
|
||||
{
|
||||
Array<MIDIOUTCAPS> devices;
|
||||
auto num = midiOutGetNumDevs();
|
||||
|
||||
for (UINT i = 0; i < num; ++i)
|
||||
for (UINT i = 0; i < midiOutGetNumDevs(); ++i)
|
||||
{
|
||||
MIDIOUTCAPS mc = { 0 };
|
||||
|
||||
|
|
@ -546,36 +628,26 @@ private:
|
|||
return devices;
|
||||
}
|
||||
|
||||
static StringArray getDevices()
|
||||
static MidiDeviceInfo getDefaultDevice()
|
||||
{
|
||||
StringArray s;
|
||||
|
||||
for (auto& mc : getDeviceCaps())
|
||||
s.add (String (mc.szPname, (size_t) numElementsInArray (mc.szPname)));
|
||||
|
||||
s.appendNumbersToDuplicates (false, false, CharPointer_UTF8 ("-"), CharPointer_UTF8 (""));
|
||||
return s;
|
||||
}
|
||||
|
||||
static int getDefaultDeviceIndex()
|
||||
{
|
||||
int n = 0;
|
||||
|
||||
for (auto& mc : getDeviceCaps())
|
||||
auto defaultIndex = []()
|
||||
{
|
||||
if ((mc.wTechnology & MOD_MAPPER) != 0)
|
||||
return n;
|
||||
auto deviceCaps = getDeviceCaps();
|
||||
|
||||
++n;
|
||||
}
|
||||
for (int i = 0; i < deviceCaps.size(); ++i)
|
||||
if ((deviceCaps[i].wTechnology & MOD_MAPPER) != 0)
|
||||
return i;
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}();
|
||||
|
||||
return getAvailableDevices()[defaultIndex];
|
||||
}
|
||||
|
||||
String getDeviceName() override { return deviceName; }
|
||||
String getDeviceIdentifier() override { return han->deviceInfo.identifier; }
|
||||
String getDeviceName() override { return han->deviceInfo.name; }
|
||||
|
||||
Win32MidiService& parent;
|
||||
String deviceName;
|
||||
MidiOutHandle::Ptr han;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Win32OutputWrapper)
|
||||
|
|
@ -671,26 +743,26 @@ public:
|
|||
throw std::runtime_error ("Failed to start the midi output device watcher");
|
||||
}
|
||||
|
||||
StringArray getDevices (bool isInput) override
|
||||
Array<MidiDeviceInfo> getAvailableDevices (bool isInput) override
|
||||
{
|
||||
return isInput ? inputDeviceWatcher ->getDevices()
|
||||
: outputDeviceWatcher->getDevices();
|
||||
return isInput ? inputDeviceWatcher ->getAvailableDevices()
|
||||
: outputDeviceWatcher->getAvailableDevices();
|
||||
}
|
||||
|
||||
int getDefaultDeviceIndex (bool isInput) override
|
||||
MidiDeviceInfo getDefaultDevice (bool isInput) override
|
||||
{
|
||||
return isInput ? inputDeviceWatcher ->getDefaultDeviceIndex()
|
||||
: outputDeviceWatcher->getDefaultDeviceIndex();
|
||||
return isInput ? inputDeviceWatcher ->getDefaultDevice()
|
||||
: outputDeviceWatcher->getDefaultDevice();
|
||||
}
|
||||
|
||||
InputWrapper* createInputWrapper (MidiInput& input, int index, MidiInputCallback& callback) override
|
||||
InputWrapper* createInputWrapper (MidiInput& input, const String& deviceIdentifier, MidiInputCallback& callback) override
|
||||
{
|
||||
return new WinRTInputWrapper (*this, input, index, callback);
|
||||
return new WinRTInputWrapper (*this, input, deviceIdentifier, callback);
|
||||
}
|
||||
|
||||
OutputWrapper* createOutputWrapper (int index) override
|
||||
OutputWrapper* createOutputWrapper (const String& deviceIdentifier) override
|
||||
{
|
||||
return new WinRTOutputWrapper (*this, index);
|
||||
return new WinRTOutputWrapper (*this, deviceIdentifier);
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
@ -1098,7 +1170,7 @@ private:
|
|||
};
|
||||
|
||||
//==============================================================================
|
||||
struct MIDIDeviceInfo
|
||||
struct WinRTMIDIDeviceInfo
|
||||
{
|
||||
String deviceID, containerID, name;
|
||||
bool isDefault = false;
|
||||
|
|
@ -1120,7 +1192,7 @@ private:
|
|||
|
||||
HRESULT addDevice (IDeviceInformation* addedDeviceInfo) override
|
||||
{
|
||||
MIDIDeviceInfo info;
|
||||
WinRTMIDIDeviceInfo info;
|
||||
|
||||
HSTRING deviceID;
|
||||
auto hr = addedDeviceInfo->get_Id (&deviceID);
|
||||
|
|
@ -1229,56 +1301,59 @@ private:
|
|||
return attach (deviceSelector, DeviceInformationKind::DeviceInformationKind_DeviceInterface);
|
||||
}
|
||||
|
||||
StringArray getDevices()
|
||||
Array<MidiDeviceInfo> getAvailableDevices()
|
||||
{
|
||||
{
|
||||
const ScopedLock lock (deviceChanges);
|
||||
lastQueriedConnectedDevices = connectedDevices;
|
||||
}
|
||||
|
||||
StringArray result;
|
||||
StringArray deviceNames, deviceIDs;
|
||||
|
||||
for (auto info : lastQueriedConnectedDevices.get())
|
||||
result.add (info.name);
|
||||
{
|
||||
deviceNames.add (info.name);
|
||||
deviceIDs .add (info.containerID);
|
||||
}
|
||||
|
||||
return result;
|
||||
deviceNames.appendNumbersToDuplicates (false, false, CharPointer_UTF8 ("-"), CharPointer_UTF8 (""));
|
||||
deviceIDs .appendNumbersToDuplicates (false, false, CharPointer_UTF8 ("-"), CharPointer_UTF8 (""));
|
||||
|
||||
Array<MidiDeviceInfo> devices;
|
||||
|
||||
for (int i = 0; i < deviceNames.size(); ++i)
|
||||
devices.add ({ deviceNames[i], deviceIDs[i] });
|
||||
|
||||
return devices;
|
||||
}
|
||||
|
||||
int getDefaultDeviceIndex()
|
||||
MidiDeviceInfo getDefaultDevice()
|
||||
{
|
||||
auto& lastDevices = lastQueriedConnectedDevices.get();
|
||||
|
||||
for (int i = 0; i < lastDevices.size(); ++i)
|
||||
if (lastDevices[i].isDefault)
|
||||
return i;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
MIDIDeviceInfo getDeviceInfoFromIndex (int index)
|
||||
{
|
||||
if (isPositiveAndBelow (index, lastQueriedConnectedDevices.get().size()))
|
||||
return lastQueriedConnectedDevices.get()[index];
|
||||
for (auto& d : lastDevices)
|
||||
if (d.isDefault)
|
||||
return { d.name, d.containerID };
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
String getDeviceID (const String& name)
|
||||
WinRTMIDIDeviceInfo getWinRTDeviceInfoForDevice (const String& deviceIdentifier)
|
||||
{
|
||||
const ScopedLock lock (deviceChanges);
|
||||
auto devices = getAvailableDevices();
|
||||
|
||||
for (auto info : connectedDevices)
|
||||
if (info.name == name)
|
||||
return info.deviceID;
|
||||
for (int i = 0; i < devices.size(); ++i)
|
||||
if (devices.getUnchecked (i).identifier == deviceIdentifier)
|
||||
return lastQueriedConnectedDevices.get()[i];
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
WinRTWrapper::ComPtr<COMFactoryType>& factory;
|
||||
|
||||
Array<MIDIDeviceInfo> connectedDevices;
|
||||
Array<WinRTMIDIDeviceInfo> connectedDevices;
|
||||
CriticalSection deviceChanges;
|
||||
ThreadLocalValue<Array<MIDIDeviceInfo>> lastQueriedConnectedDevices;
|
||||
ThreadLocalValue<Array<WinRTMIDIDeviceInfo>> lastQueriedConnectedDevices;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiIODeviceWatcher);
|
||||
};
|
||||
|
|
@ -1345,12 +1420,12 @@ private:
|
|||
public:
|
||||
WinRTIOWrapper (BLEDeviceWatcher& bleWatcher,
|
||||
MidiIODeviceWatcher<MIDIIOStaticsType>& midiDeviceWatcher,
|
||||
int index)
|
||||
const String& deviceIdentifier)
|
||||
: bleDeviceWatcher (bleWatcher)
|
||||
{
|
||||
{
|
||||
const ScopedLock lock (midiDeviceWatcher.deviceChanges);
|
||||
deviceInfo = midiDeviceWatcher.getDeviceInfoFromIndex (index);
|
||||
deviceInfo = midiDeviceWatcher.getWinRTDeviceInfoForDevice (deviceIdentifier);
|
||||
}
|
||||
|
||||
if (deviceInfo.deviceID.isEmpty())
|
||||
|
|
@ -1417,7 +1492,7 @@ private:
|
|||
protected:
|
||||
//==============================================================================
|
||||
BLEDeviceWatcher& bleDeviceWatcher;
|
||||
MIDIDeviceInfo deviceInfo;
|
||||
WinRTMIDIDeviceInfo deviceInfo;
|
||||
bool isBLEDevice = false;
|
||||
WinRTWrapper::ComPtr<MIDIPort> midiPort;
|
||||
};
|
||||
|
|
@ -1427,8 +1502,8 @@ private:
|
|||
private WinRTIOWrapper<IMidiInPortStatics, IMidiInPort>
|
||||
|
||||
{
|
||||
WinRTInputWrapper (WinRTMidiService& service, MidiInput& input, int index, MidiInputCallback& cb)
|
||||
: WinRTIOWrapper <IMidiInPortStatics, IMidiInPort> (*service.bleDeviceWatcher, *service.inputDeviceWatcher, index),
|
||||
WinRTInputWrapper (WinRTMidiService& service, MidiInput& input, const String& deviceIdentifier, MidiInputCallback& cb)
|
||||
: WinRTIOWrapper <IMidiInPortStatics, IMidiInPort> (*service.bleDeviceWatcher, *service.inputDeviceWatcher, deviceIdentifier),
|
||||
inputDevice (input),
|
||||
callback (cb)
|
||||
{
|
||||
|
|
@ -1484,7 +1559,8 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
String getDeviceName() override { return deviceInfo.name; }
|
||||
String getDeviceIdentifier() override { return deviceInfo.containerID; }
|
||||
String getDeviceName() override { return deviceInfo.name; }
|
||||
|
||||
//==============================================================================
|
||||
void disconnect() override
|
||||
|
|
@ -1579,8 +1655,8 @@ private:
|
|||
struct WinRTOutputWrapper final : public OutputWrapper,
|
||||
private WinRTIOWrapper <IMidiOutPortStatics, IMidiOutPort>
|
||||
{
|
||||
WinRTOutputWrapper (WinRTMidiService& service, int index)
|
||||
: WinRTIOWrapper <IMidiOutPortStatics, IMidiOutPort> (*service.bleDeviceWatcher, *service.outputDeviceWatcher, index)
|
||||
WinRTOutputWrapper (WinRTMidiService& service, const String& deviceIdentifier)
|
||||
: WinRTIOWrapper <IMidiOutPortStatics, IMidiOutPort> (*service.bleDeviceWatcher, *service.outputDeviceWatcher, deviceIdentifier)
|
||||
{
|
||||
OpenMidiPortThread<IMidiOutPortStatics, IMidiOutPort, IMidiOutPort> portThread ("Open WinRT MIDI output port",
|
||||
deviceInfo.deviceID,
|
||||
|
|
@ -1632,7 +1708,8 @@ private:
|
|||
midiPort->SendBuffer (buffer);
|
||||
}
|
||||
|
||||
String getDeviceName() override { return deviceInfo.name; }
|
||||
String getDeviceIdentifier() override { return deviceInfo.containerID; }
|
||||
String getDeviceName() override { return deviceInfo.name; }
|
||||
|
||||
//==============================================================================
|
||||
WinRTWrapper::ComPtr<IBuffer> buffer;
|
||||
|
|
@ -1718,42 +1795,74 @@ private:
|
|||
JUCE_IMPLEMENT_SINGLETON (MidiService)
|
||||
|
||||
//==============================================================================
|
||||
StringArray MidiInput::getDevices()
|
||||
static int findDefaultDeviceIndex (const Array<MidiDeviceInfo>& available, const MidiDeviceInfo& defaultDevice)
|
||||
{
|
||||
return MidiService::getService().getDevices (true);
|
||||
for (int i = 0; i < available.size(); ++i)
|
||||
if (available.getUnchecked (i) == defaultDevice)
|
||||
return i;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int MidiInput::getDefaultDeviceIndex()
|
||||
Array<MidiDeviceInfo> MidiInput::getAvailableDevices()
|
||||
{
|
||||
return MidiService::getService().getDefaultDeviceIndex (true);
|
||||
return MidiService::getService().getAvailableDevices (true);
|
||||
}
|
||||
|
||||
MidiInput::MidiInput (const String& deviceName) : name (deviceName)
|
||||
MidiDeviceInfo MidiInput::getDefaultDevice()
|
||||
{
|
||||
return MidiService::getService().getDefaultDevice (true);
|
||||
}
|
||||
|
||||
MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback)
|
||||
MidiInput* MidiInput::openDevice (const String& deviceIdentifier, MidiInputCallback* callback)
|
||||
{
|
||||
if (callback == nullptr)
|
||||
if (deviceIdentifier.isEmpty() || callback == nullptr)
|
||||
return nullptr;
|
||||
|
||||
std::unique_ptr<MidiInput> in (new MidiInput (String()));
|
||||
MidiInput input ({}, {});
|
||||
std::unique_ptr<MidiServiceType::InputWrapper> wrapper;
|
||||
|
||||
try
|
||||
{
|
||||
wrapper.reset (MidiService::getService().createInputWrapper (*in, index, *callback));
|
||||
wrapper.reset (MidiService::getService().createInputWrapper (input, deviceIdentifier, *callback));
|
||||
}
|
||||
catch (std::runtime_error&)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
in->setName (wrapper->getDeviceName());
|
||||
std::unique_ptr<MidiInput> in;
|
||||
in.reset (new MidiInput (wrapper->getDeviceName(), deviceIdentifier));
|
||||
in->internal = wrapper.release();
|
||||
|
||||
return in.release();
|
||||
}
|
||||
|
||||
StringArray MidiInput::getDevices()
|
||||
{
|
||||
StringArray deviceNames;
|
||||
|
||||
for (auto& d : getAvailableDevices())
|
||||
deviceNames.add (d.name);
|
||||
|
||||
return deviceNames;
|
||||
}
|
||||
|
||||
int MidiInput::getDefaultDeviceIndex()
|
||||
{
|
||||
return findDefaultDeviceIndex (getAvailableDevices(), getDefaultDevice());
|
||||
}
|
||||
|
||||
MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback)
|
||||
{
|
||||
return openDevice (getAvailableDevices()[index].identifier, callback);
|
||||
}
|
||||
|
||||
MidiInput::MidiInput (const String& deviceName, const String& deviceIdentifier)
|
||||
: deviceInfo (deviceName, deviceIdentifier)
|
||||
{
|
||||
}
|
||||
|
||||
MidiInput::~MidiInput()
|
||||
{
|
||||
delete static_cast<MidiServiceType::InputWrapper*> (internal);
|
||||
|
|
@ -1763,34 +1872,60 @@ void MidiInput::start() { static_cast<MidiServiceType::InputWrapper*> (interna
|
|||
void MidiInput::stop() { static_cast<MidiServiceType::InputWrapper*> (internal)->stop(); }
|
||||
|
||||
//==============================================================================
|
||||
StringArray MidiOutput::getDevices()
|
||||
Array<MidiDeviceInfo> MidiOutput::getAvailableDevices()
|
||||
{
|
||||
return MidiService::getService().getDevices (false);
|
||||
return MidiService::getService().getAvailableDevices (false);
|
||||
}
|
||||
|
||||
int MidiOutput::getDefaultDeviceIndex()
|
||||
MidiDeviceInfo MidiOutput::getDefaultDevice()
|
||||
{
|
||||
return MidiService::getService().getDefaultDeviceIndex (false);
|
||||
return MidiService::getService().getDefaultDevice (false);
|
||||
}
|
||||
|
||||
MidiOutput* MidiOutput::openDevice (int index)
|
||||
MidiOutput* MidiOutput::openDevice (const String& deviceIdentifier)
|
||||
{
|
||||
if (deviceIdentifier.isEmpty())
|
||||
return nullptr;
|
||||
|
||||
std::unique_ptr<MidiServiceType::OutputWrapper> wrapper;
|
||||
|
||||
try
|
||||
{
|
||||
wrapper.reset (MidiService::getService().createOutputWrapper (index));
|
||||
wrapper.reset (MidiService::getService().createOutputWrapper (deviceIdentifier));
|
||||
}
|
||||
catch (std::runtime_error&)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::unique_ptr<MidiOutput> out (new MidiOutput (wrapper->getDeviceName()));
|
||||
std::unique_ptr<MidiOutput> out;
|
||||
out.reset (new MidiOutput (wrapper->getDeviceName(), deviceIdentifier));
|
||||
|
||||
out->internal = wrapper.release();
|
||||
|
||||
return out.release();
|
||||
}
|
||||
|
||||
StringArray MidiOutput::getDevices()
|
||||
{
|
||||
StringArray deviceNames;
|
||||
|
||||
for (auto& d : getAvailableDevices())
|
||||
deviceNames.add (d.name);
|
||||
|
||||
return deviceNames;
|
||||
}
|
||||
|
||||
int MidiOutput::getDefaultDeviceIndex()
|
||||
{
|
||||
return findDefaultDeviceIndex (getAvailableDevices(), getDefaultDevice());
|
||||
}
|
||||
|
||||
MidiOutput* MidiOutput::openDevice (int index)
|
||||
{
|
||||
return openDevice (getAvailableDevices()[index].identifier);
|
||||
}
|
||||
|
||||
MidiOutput::~MidiOutput()
|
||||
{
|
||||
stopBackgroundThread();
|
||||
|
|
|
|||
|
|
@ -543,7 +543,12 @@ private:
|
|||
|
||||
const Identifier valueType { "PARAM" }, valuePropertyID { "value" }, idPropertyID { "id" };
|
||||
|
||||
std::map<String, std::unique_ptr<ParameterAdapter>> adapterTable;
|
||||
struct StringRefLessThan final
|
||||
{
|
||||
bool operator() (StringRef a, StringRef b) const noexcept { return a.text.compare (b.text) < 0; }
|
||||
};
|
||||
|
||||
std::map<StringRef, std::unique_ptr<ParameterAdapter>, StringRefLessThan> adapterTable;
|
||||
|
||||
CriticalSection valueTreeChanging;
|
||||
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ public:
|
|||
int toInt (const ValueUnion& data) const noexcept override { return (int) data.doubleValue; }
|
||||
int64 toInt64 (const ValueUnion& data) const noexcept override { return (int64) data.doubleValue; }
|
||||
double toDouble (const ValueUnion& data) const noexcept override { return data.doubleValue; }
|
||||
String toString (const ValueUnion& data) const override { return minimiseLengthOfFloatString (String (data.doubleValue, 15, true)); }
|
||||
String toString (const ValueUnion& data) const override { return serialiseDouble (data.doubleValue); }
|
||||
bool toBool (const ValueUnion& data) const noexcept override { return data.doubleValue != 0.0; }
|
||||
bool isDouble() const noexcept override { return true; }
|
||||
bool isComparable() const noexcept override { return true; }
|
||||
|
|
|
|||
|
|
@ -352,8 +352,7 @@ struct JSONFormatter
|
|||
|
||||
if (juce_isfinite (d))
|
||||
{
|
||||
String doubleString (d, maximumDecimalPlaces, true);
|
||||
out << minimiseLengthOfFloatString (doubleString);
|
||||
out << serialiseDouble (d);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -664,12 +663,17 @@ public:
|
|||
tests[1] = "1";
|
||||
tests[1.1] = "1.1";
|
||||
tests[1.01] = "1.01";
|
||||
tests[0.76378] = "7.6378e-1";
|
||||
tests[-10] = "-1e1";
|
||||
tests[10.01] = "1.001e1";
|
||||
tests[0.0123] = "1.23e-2";
|
||||
tests[0.76378] = "0.76378";
|
||||
tests[-10] = "-10";
|
||||
tests[10.01] = "10.01";
|
||||
tests[0.0123] = "0.0123";
|
||||
tests[-3.7e-27] = "-3.7e-27";
|
||||
tests[1e+40] = "1e40";
|
||||
tests[-12345678901234567.0] = "-1.234567890123457e16";
|
||||
tests[192000] = "192000";
|
||||
tests[1234567] = "1.234567e6";
|
||||
tests[0.00006] = "0.00006";
|
||||
tests[0.000006] = "6e-6";
|
||||
|
||||
for (auto& test : tests)
|
||||
expectEquals (JSON::toString (test.first), test.second);
|
||||
|
|
|
|||
|
|
@ -26,8 +26,8 @@ Remove any classes that you are not interested in (typically you'll find
|
|||
Java.class, JuceApp.class and JuceSharingContentProvider.class which you will
|
||||
probably want to remove).
|
||||
|
||||
6. Inside of app/build/intermediates/classes/release_/release execute the
|
||||
following dx command:
|
||||
6. Inside of build/intermediates/javac/release_Release/compileRelease_ReleaseJavaWithJavac/classes
|
||||
execute the following dx command:
|
||||
|
||||
<path-to-your-android-sdk>/build-tools/<latest-build-tool-version>/dx --dex --verbose --min-sdk-version=<your-min-sdk-of-your-classes> --output /tmp/JavaDexByteCode.dex .
|
||||
|
||||
|
|
|
|||
|
|
@ -2258,6 +2258,48 @@ static String minimiseLengthOfFloatString (const String& input)
|
|||
return input;
|
||||
}
|
||||
|
||||
static String serialiseDouble (double input)
|
||||
{
|
||||
auto absInput = std::abs (input);
|
||||
|
||||
if (absInput >= 1.0e6 || absInput <= 1.0e-5)
|
||||
return minimiseLengthOfFloatString ({ input, 15, true });
|
||||
|
||||
int intInput = (int) input;
|
||||
|
||||
if ((double) intInput == input)
|
||||
return minimiseLengthOfFloatString ({ input, 1 });
|
||||
|
||||
auto numberOfDecimalPlaces = [absInput]
|
||||
{
|
||||
if (absInput < 1.0)
|
||||
{
|
||||
if (absInput >= 1.0e-3)
|
||||
{
|
||||
if (absInput >= 1.0e-1) return 16;
|
||||
if (absInput >= 1.0e-2) return 17;
|
||||
return 18;
|
||||
}
|
||||
|
||||
if (absInput >= 1.0e-4) return 19;
|
||||
return 20;
|
||||
}
|
||||
|
||||
if (absInput < 1.0e3)
|
||||
{
|
||||
if (absInput < 1.0e1) return 15;
|
||||
if (absInput < 1.0e2) return 14;
|
||||
return 13;
|
||||
}
|
||||
|
||||
if (absInput < 1.0e4) return 12;
|
||||
if (absInput < 1.0e5) return 11;
|
||||
return 10;
|
||||
}();
|
||||
|
||||
return minimiseLengthOfFloatString (String (input, numberOfDecimalPlaces));
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
//==============================================================================
|
||||
#if JUCE_UNIT_TESTS
|
||||
|
|
@ -2851,6 +2893,34 @@ public:
|
|||
expectEquals (minimiseLengthOfFloatString (String (test.first, 15, true)), test.second);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
beginTest ("Serialisation");
|
||||
|
||||
std::map <double, String> tests;
|
||||
tests[1234567890123456.7] = "1.234567890123457e15";
|
||||
tests[12345678.901234567] = "1.234567890123457e7";
|
||||
tests[1234567.8901234567] = "1.234567890123457e6";
|
||||
tests[123456.78901234567] = "123456.7890123457";
|
||||
tests[12345.678901234567] = "12345.67890123457";
|
||||
tests[1234.5678901234567] = "1234.567890123457";
|
||||
tests[123.45678901234567] = "123.4567890123457";
|
||||
tests[12.345678901234567] = "12.34567890123457";
|
||||
tests[1.2345678901234567] = "1.234567890123457";
|
||||
tests[0.12345678901234567] = "0.1234567890123457";
|
||||
tests[0.012345678901234567] = "0.01234567890123457";
|
||||
tests[0.0012345678901234567] = "0.001234567890123457";
|
||||
tests[0.00012345678901234567] = "0.0001234567890123457";
|
||||
tests[0.000012345678901234567] = "0.00001234567890123457";
|
||||
tests[0.0000012345678901234567] = "1.234567890123457e-6";
|
||||
tests[0.00000012345678901234567] = "1.234567890123457e-7";
|
||||
|
||||
for (auto& test : tests)
|
||||
{
|
||||
expectEquals (serialiseDouble (test.first), test.second);
|
||||
expectEquals (serialiseDouble (-test.first), "-" + test.second);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -580,8 +580,7 @@ void XmlElement::setAttribute (const Identifier& attributeName, const int number
|
|||
|
||||
void XmlElement::setAttribute (const Identifier& attributeName, const double number)
|
||||
{
|
||||
String doubleString (number, 15, true);
|
||||
setAttribute (attributeName, minimiseLengthOfFloatString (doubleString));
|
||||
setAttribute (attributeName, serialiseDouble (number));
|
||||
}
|
||||
|
||||
void XmlElement::removeAttribute (const Identifier& attributeName) noexcept
|
||||
|
|
@ -946,12 +945,17 @@ public:
|
|||
tests[1] = "1";
|
||||
tests[1.1] = "1.1";
|
||||
tests[1.01] = "1.01";
|
||||
tests[0.76378] = "7.6378e-1";
|
||||
tests[-10] = "-1e1";
|
||||
tests[10.01] = "1.001e1";
|
||||
tests[0.0123] = "1.23e-2";
|
||||
tests[0.76378] = "0.76378";
|
||||
tests[-10] = "-10";
|
||||
tests[10.01] = "10.01";
|
||||
tests[0.0123] = "0.0123";
|
||||
tests[-3.7e-27] = "-3.7e-27";
|
||||
tests[1e+40] = "1e40";
|
||||
tests[-12345678901234567.0] = "-1.234567890123457e16";
|
||||
tests[192000] = "192000";
|
||||
tests[1234567] = "1.234567e6";
|
||||
tests[0.00006] = "0.00006";
|
||||
tests[0.000006] = "6e-6";
|
||||
|
||||
for (auto& test : tests)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1198,12 +1198,17 @@ public:
|
|||
tests[1] = "1";
|
||||
tests[1.1] = "1.1";
|
||||
tests[1.01] = "1.01";
|
||||
tests[0.76378] = "7.6378e-1";
|
||||
tests[-10] = "-1e1";
|
||||
tests[10.01] = "1.001e1";
|
||||
tests[0.0123] = "1.23e-2";
|
||||
tests[0.76378] = "0.76378";
|
||||
tests[-10] = "-10";
|
||||
tests[10.01] = "10.01";
|
||||
tests[0.0123] = "0.0123";
|
||||
tests[-3.7e-27] = "-3.7e-27";
|
||||
tests[1e+40] = "1e40";
|
||||
tests[-12345678901234567.0] = "-1.234567890123457e16";
|
||||
tests[192000] = "192000";
|
||||
tests[1234567] = "1.234567e6";
|
||||
tests[0.00006] = "0.00006";
|
||||
tests[0.000006] = "6e-6";
|
||||
|
||||
for (auto& test : tests)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -240,7 +240,7 @@ public final class ComponentPeerView extends ViewGroup
|
|||
return super.onKeyDown (keyCode, event);
|
||||
case KeyEvent.KEYCODE_BACK:
|
||||
{
|
||||
((Activity) getContext ()).onBackPressed ();
|
||||
backButtonPressed();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,170 +29,161 @@ namespace juce
|
|||
// This byte-code is generated from native/java/com/roli/juce/ComponentPeerView.java with min sdk version 16
|
||||
// See juce_core/native/java/README.txt on how to generate this byte-code.
|
||||
static const uint8 javaComponentPeerView[] =
|
||||
{31,139,8,8,248,105,229,91,0,3,67,111,109,112,111,110,101,110,116,80,101,101,114,86,105,101,119,46,100,101,120,0,165,154,
|
||||
11,124,92,85,157,199,255,231,220,59,51,201,100,50,153,76,210,164,73,38,233,228,217,105,155,38,83,160,208,146,180,244,13,
|
||||
105,147,182,52,105,160,73,129,222,76,110,146,105,39,247,78,103,38,143,10,46,225,177,148,69,228,225,118,1,5,93,68,100,171,
|
||||
162,219,34,178,5,92,101,149,197,174,162,91,124,176,85,235,10,10,31,145,45,136,221,186,174,136,178,191,115,238,153,100,
|
||||
250,2,117,39,159,239,252,255,231,127,254,247,188,207,255,156,153,204,160,57,233,141,158,191,152,158,156,245,224,205,149,
|
||||
149,85,69,59,14,196,31,217,241,202,99,15,124,242,195,239,188,245,102,211,239,146,201,249,68,73,34,154,236,189,32,72,234,
|
||||
245,232,60,162,227,228,216,23,129,176,78,116,17,228,43,144,165,194,215,67,52,4,57,59,143,72,131,188,172,128,232,112,13,
|
||||
209,126,200,19,229,68,39,193,59,160,116,54,81,57,168,2,53,160,14,52,130,121,96,21,88,11,58,64,23,216,2,118,130,7,193,211,
|
||||
224,69,240,107,80,92,129,54,128,237,96,28,220,9,30,6,79,129,239,129,95,129,202,74,162,86,208,1,110,0,15,129,239,130,223,
|
||||
129,198,42,162,30,240,0,248,15,240,54,168,9,17,45,7,6,184,22,220,1,30,3,71,193,27,32,80,77,212,0,86,131,43,192,45,224,33,
|
||||
176,31,60,1,158,4,255,12,158,5,135,193,17,240,34,56,6,94,6,175,130,215,193,175,192,73,240,54,248,35,112,99,140,242,129,
|
||||
31,148,130,10,80,13,234,64,19,152,15,150,131,110,112,13,216,5,38,192,77,224,78,240,0,120,24,28,4,79,131,23,193,15,193,
|
||||
113,112,18,188,3,244,57,68,133,160,20,212,130,22,176,28,116,129,94,112,21,136,129,33,48,10,174,5,183,128,143,131,71,193,
|
||||
19,224,107,224,8,248,49,120,11,252,30,248,194,24,103,80,15,154,193,82,176,1,244,131,36,184,30,220,9,62,15,190,8,158,4,95,
|
||||
6,223,6,63,5,191,6,84,139,182,129,122,112,1,88,11,122,128,1,118,129,155,193,29,96,31,184,23,124,10,236,7,79,130,195,224,
|
||||
135,224,21,112,2,188,13,220,117,152,43,80,5,26,192,50,208,9,186,193,0,24,1,73,48,9,174,5,55,128,219,192,93,224,30,240,25,
|
||||
240,21,112,4,252,28,80,61,81,9,104,2,139,193,70,208,11,76,48,6,166,192,157,224,62,240,16,56,8,190,10,190,1,142,128,31,
|
||||
129,151,193,27,224,36,248,45,168,106,192,88,129,21,96,45,216,10,98,224,58,112,59,248,24,120,28,124,11,188,6,126,3,244,70,
|
||||
244,11,132,65,11,88,6,186,192,118,48,14,174,3,55,131,219,193,71,192,189,224,227,224,31,192,103,193,65,240,20,120,6,188,0,
|
||||
142,129,55,193,219,224,15,128,154,80,7,200,107,114,246,175,11,96,75,147,31,20,129,0,40,6,34,32,148,144,179,231,103,129,
|
||||
50,80,46,246,61,192,182,35,108,47,194,118,34,108,25,194,242,38,44,63,154,35,226,133,51,213,164,134,148,208,37,82,213,210,
|
||||
92,16,1,8,49,132,208,67,11,64,51,88,8,90,64,43,136,170,184,115,30,56,31,92,0,22,131,37,224,82,208,5,54,130,77,96,51,57,
|
||||
125,200,190,116,37,31,44,115,250,197,84,218,173,116,97,23,125,229,202,158,167,244,253,176,123,149,159,120,249,84,222,1,
|
||||
101,247,43,187,87,141,75,86,159,149,227,47,198,229,80,153,163,139,49,121,70,61,91,171,124,10,212,88,136,54,20,170,241,56,
|
||||
172,252,133,126,68,249,71,148,127,161,26,163,163,101,78,223,23,40,251,82,165,139,114,46,86,250,75,208,219,148,126,28,122,
|
||||
187,210,79,66,95,166,116,29,147,183,92,233,1,232,151,40,61,4,125,133,210,27,160,175,202,206,75,142,253,130,28,189,29,250,
|
||||
26,165,175,201,177,111,206,209,175,204,209,119,228,148,57,146,99,79,66,95,173,244,201,28,251,93,101,51,186,24,195,149,74,
|
||||
159,202,41,231,214,28,127,49,110,107,179,207,194,190,78,233,247,229,248,236,207,209,15,148,59,235,168,89,141,231,101,74,
|
||||
63,4,123,135,210,159,129,190,94,233,207,67,239,84,250,247,161,111,80,250,177,28,251,43,57,246,227,229,98,78,25,93,69,142,
|
||||
60,70,98,223,132,233,74,37,239,148,146,209,71,148,220,167,228,223,41,121,143,146,247,42,255,7,73,236,181,102,250,123,41,
|
||||
171,232,71,36,246,93,136,126,168,228,207,164,172,164,87,197,92,98,53,223,37,101,21,125,66,202,102,250,178,148,5,244,85,
|
||||
185,254,106,233,66,18,123,166,132,14,146,216,35,213,244,117,18,235,222,77,163,82,6,232,3,144,249,200,103,82,46,164,231,
|
||||
72,172,203,90,153,46,80,246,2,236,162,111,200,254,57,233,34,212,155,144,178,152,44,149,190,86,172,51,101,15,96,103,238,
|
||||
86,233,49,41,53,26,39,39,214,76,40,57,41,37,163,41,37,111,32,177,215,56,165,164,172,163,235,73,196,163,26,89,95,9,162,
|
||||
195,19,82,46,162,127,146,114,22,61,69,98,63,54,81,159,146,207,146,136,89,141,210,191,2,145,228,14,41,235,233,155,82,46,
|
||||
166,239,203,241,156,43,243,43,81,194,151,228,56,206,147,233,42,216,47,87,114,139,148,62,234,150,178,132,126,160,228,139,
|
||||
114,92,231,72,255,16,70,178,71,202,8,109,149,178,132,182,43,105,72,25,37,83,202,74,218,37,165,91,222,175,66,170,127,33,
|
||||
68,191,180,148,249,180,71,74,47,93,167,242,63,40,101,30,253,149,148,206,56,132,208,179,155,148,188,89,201,191,150,114,54,
|
||||
221,162,228,94,101,191,85,202,114,250,27,37,111,83,242,67,82,86,208,237,82,182,210,253,74,62,32,101,136,62,171,214,209,
|
||||
231,148,124,84,201,207,171,252,47,168,244,63,42,121,64,173,179,199,164,12,211,23,165,108,164,199,165,116,230,43,164,230,
|
||||
75,164,15,169,245,249,164,148,206,252,133,16,237,159,150,114,1,29,86,242,223,164,108,160,231,165,44,165,239,72,57,159,
|
||||
254,93,165,143,40,191,23,148,252,174,202,255,158,234,255,207,73,196,224,32,101,164,188,144,62,38,247,129,159,94,38,17,
|
||||
119,157,245,219,132,104,107,147,136,189,26,13,72,201,233,83,36,226,111,17,125,148,156,179,142,200,137,211,34,62,137,51,
|
||||
99,7,228,87,84,176,174,82,107,184,73,249,137,252,36,242,95,80,249,226,60,40,38,231,60,189,79,61,63,5,249,187,200,140,255,
|
||||
109,208,239,142,56,231,217,253,144,15,129,71,35,206,185,245,37,105,231,206,222,107,18,251,18,119,175,96,1,37,3,6,108,65,
|
||||
218,30,240,202,51,42,15,41,241,124,41,124,250,69,125,238,82,170,227,62,248,229,227,233,158,116,1,245,156,239,35,43,112,
|
||||
62,188,124,44,72,75,89,251,140,53,124,17,118,199,140,207,34,248,120,181,45,56,178,182,52,50,58,216,115,55,105,250,226,29,
|
||||
149,180,53,237,165,37,90,25,5,181,237,208,178,254,61,153,2,218,29,104,194,62,247,233,187,3,243,33,11,244,221,209,5,180,
|
||||
218,37,252,151,106,30,186,104,135,139,130,37,226,25,63,234,42,195,92,88,129,89,104,239,233,117,68,190,35,206,113,77,142,
|
||||
201,210,38,231,78,210,31,244,169,190,214,97,46,146,225,90,140,118,127,192,79,253,37,133,178,223,76,254,33,126,55,57,119,
|
||||
128,100,64,220,52,252,211,246,203,167,237,17,105,231,234,102,176,77,221,129,122,2,133,114,126,52,216,69,189,70,147,115,
|
||||
46,247,132,11,209,74,113,3,65,15,107,69,187,171,80,179,127,218,111,228,156,126,33,233,231,71,92,16,61,177,225,39,214,127,
|
||||
208,29,156,149,12,151,211,103,168,78,23,179,231,65,171,250,247,33,186,233,85,148,140,214,211,190,252,254,125,1,10,233,46,
|
||||
148,112,13,61,76,94,125,137,126,21,205,241,138,52,195,202,237,123,160,8,90,63,197,105,251,253,136,180,225,30,218,134,247,
|
||||
173,242,189,23,43,181,14,43,35,25,16,61,45,209,75,169,126,229,66,106,98,34,142,89,97,23,218,211,35,106,114,121,49,126,
|
||||
110,18,37,230,33,102,5,53,43,48,128,167,124,122,165,235,91,20,108,170,31,106,165,160,103,32,175,132,186,242,220,158,96,
|
||||
121,40,175,64,106,86,244,106,234,113,251,180,37,90,41,5,121,176,161,126,77,148,130,174,221,129,29,232,157,207,221,229,
|
||||
214,93,193,89,65,41,173,168,73,127,171,99,12,2,28,81,204,167,207,209,157,214,239,163,200,39,11,245,200,73,112,2,188,5,
|
||||
126,4,142,98,202,229,29,115,230,53,117,9,253,89,233,211,95,78,190,56,191,203,16,143,76,114,206,19,174,213,223,204,234,
|
||||
110,100,243,166,24,159,123,43,107,188,133,57,243,45,94,63,80,235,160,59,92,36,247,177,88,127,34,125,44,187,110,162,203,
|
||||
168,86,19,179,233,236,175,87,213,186,236,94,81,68,101,92,222,87,249,82,228,248,165,37,25,189,152,116,22,121,123,166,252,
|
||||
55,154,156,251,168,184,67,247,161,14,191,170,67,188,254,187,201,217,255,193,64,209,244,186,252,131,106,207,214,64,177,
|
||||
172,135,171,117,204,231,58,119,68,43,176,88,236,28,220,5,117,249,92,144,34,127,212,84,121,121,115,157,152,225,151,207,57,
|
||||
55,221,64,142,205,13,155,240,44,159,251,222,125,88,162,250,144,245,15,191,143,255,210,233,62,59,237,152,119,150,118,44,
|
||||
58,139,109,73,142,77,87,117,93,50,215,185,55,7,153,136,188,253,81,78,142,212,104,219,34,68,145,183,182,69,61,180,45,234,
|
||||
86,214,124,172,31,220,220,3,219,162,58,242,243,176,11,202,208,158,106,10,179,98,213,95,49,246,27,231,58,49,248,236,237,
|
||||
239,89,21,164,228,150,149,164,95,30,249,95,241,25,65,147,243,222,123,206,103,206,95,251,238,187,178,223,43,90,73,55,196,
|
||||
51,249,176,139,122,98,115,157,251,122,176,184,123,0,79,233,226,41,174,203,153,194,248,53,123,196,103,36,145,99,5,124,136,
|
||||
215,216,141,155,219,168,41,205,2,145,19,118,116,54,141,231,121,41,242,134,21,136,162,221,62,220,46,52,248,137,81,66,190,
|
||||
184,232,113,167,93,217,207,96,37,106,220,4,94,228,136,250,175,159,235,124,158,10,178,233,250,57,234,199,147,69,108,169,
|
||||
39,31,229,121,209,86,47,15,214,159,119,158,135,236,21,21,52,126,159,151,69,78,88,129,2,17,7,248,18,254,198,187,89,221,10,
|
||||
199,208,106,175,108,175,108,167,22,44,142,252,196,25,31,81,215,71,231,58,159,129,78,29,31,167,167,194,38,250,232,70,93,
|
||||
201,45,237,24,217,96,32,242,27,231,174,41,94,143,228,204,123,62,74,19,229,61,174,198,219,190,178,146,122,198,115,75,93,
|
||||
130,58,157,117,118,21,214,153,243,89,149,203,207,104,255,138,103,66,40,168,251,5,120,99,241,44,98,76,91,202,208,6,86,196,
|
||||
172,128,56,31,188,249,86,64,196,226,2,207,15,238,126,151,22,176,255,145,163,19,249,117,247,119,177,115,152,21,14,224,86,
|
||||
233,213,45,236,53,248,186,172,64,80,72,183,231,133,241,188,229,226,116,45,142,28,123,127,207,21,142,231,55,222,223,243,
|
||||
18,120,90,1,17,3,188,5,193,226,139,170,230,83,176,182,62,212,130,24,121,30,125,155,130,149,139,159,170,37,81,138,40,227,
|
||||
11,162,140,112,137,144,44,232,90,227,242,185,110,220,250,220,44,43,92,234,88,202,214,184,125,238,27,135,158,43,203,150,
|
||||
123,212,139,153,124,9,237,184,169,148,209,187,184,55,220,253,178,151,229,45,245,206,166,63,181,7,243,104,232,221,220,246,
|
||||
252,37,45,17,37,69,126,252,231,183,96,185,106,65,227,255,187,5,203,101,11,196,182,241,200,181,38,214,150,136,21,173,74,
|
||||
138,24,35,238,165,105,185,246,184,60,163,47,142,56,223,65,160,141,56,17,61,88,253,149,26,230,163,180,126,13,78,68,215,
|
||||
128,27,39,162,60,221,174,166,243,116,31,91,138,146,253,184,53,70,254,8,222,9,6,235,235,112,30,106,226,60,204,195,153,215,
|
||||
165,115,77,156,131,187,121,228,205,66,30,57,14,94,7,175,137,245,94,140,182,137,251,162,216,25,156,207,45,107,156,173,213,
|
||||
71,234,154,231,205,207,137,137,131,145,153,189,161,41,107,34,226,220,251,150,112,15,246,151,21,222,6,15,63,5,87,68,126,
|
||||
47,250,231,196,205,177,136,243,157,137,136,31,226,134,87,201,239,131,167,134,88,42,98,73,5,226,210,108,228,13,98,135,122,
|
||||
217,50,86,130,209,182,162,97,138,162,199,23,74,127,43,58,135,2,122,207,162,0,238,114,13,178,252,108,78,144,91,209,26,10,
|
||||
112,39,79,124,170,138,156,112,190,243,205,125,61,126,90,250,217,211,210,162,79,165,228,156,119,197,104,5,83,54,231,51,
|
||||
148,35,243,148,44,87,178,74,249,55,225,51,148,72,71,84,58,130,217,212,41,123,247,83,231,163,154,235,236,57,202,213,92,
|
||||
103,207,79,71,247,200,239,98,184,164,57,199,46,100,161,76,235,170,110,183,202,115,195,143,43,155,71,201,124,37,125,234,
|
||||
89,63,90,228,204,175,58,207,213,51,33,53,127,226,51,147,200,111,86,109,108,206,105,183,96,161,146,45,234,121,166,238,26,
|
||||
66,22,77,219,138,84,93,206,115,129,233,186,152,250,28,131,182,182,199,173,120,102,57,149,173,182,71,147,182,101,90,153,
|
||||
205,166,153,234,141,155,19,45,59,141,113,220,161,215,17,95,215,65,172,131,120,7,196,122,226,235,59,169,124,131,185,103,
|
||||
192,54,82,131,107,226,233,209,120,58,221,25,79,103,76,203,76,17,235,36,222,9,215,206,78,210,58,241,86,214,105,88,131,41,
|
||||
59,62,216,106,36,147,173,43,99,153,248,120,60,179,167,141,46,56,213,158,76,38,226,49,35,19,183,173,134,172,79,103,124,
|
||||
200,140,237,137,37,204,213,70,34,49,96,196,118,165,219,168,226,92,79,229,102,197,108,11,109,201,180,174,22,114,50,147,
|
||||
155,53,156,50,146,35,241,88,186,117,181,97,141,27,40,176,230,44,89,118,194,78,173,139,39,50,102,234,220,249,93,70,38,21,
|
||||
159,108,163,121,239,153,127,74,81,179,207,116,221,108,196,45,180,175,252,204,156,45,102,12,25,37,211,25,118,186,117,213,
|
||||
152,53,152,48,219,168,52,215,216,177,42,110,13,138,210,103,202,24,199,204,181,98,122,214,142,155,162,240,202,83,51,186,
|
||||
108,49,92,42,111,222,169,121,98,206,27,54,89,235,236,216,88,122,245,136,97,13,155,217,105,205,109,202,180,107,110,151,
|
||||
166,141,151,166,236,177,100,27,93,120,102,78,79,202,52,55,13,164,205,212,184,153,66,45,151,38,236,1,35,209,105,236,177,
|
||||
199,50,51,213,204,121,239,231,218,168,229,84,135,184,149,28,203,140,154,153,17,123,176,117,149,145,54,59,68,26,19,111,97,
|
||||
252,228,178,104,60,183,255,218,193,120,198,78,117,88,67,118,27,205,63,183,219,25,69,46,124,31,223,46,169,119,25,150,49,
|
||||
44,90,188,174,51,102,143,182,166,236,68,188,117,231,88,204,108,61,99,155,53,156,99,47,53,156,218,243,165,127,105,57,109,
|
||||
84,251,126,143,182,81,93,231,160,145,24,143,239,106,53,44,203,206,200,61,213,186,214,138,37,236,116,220,26,94,157,48,210,
|
||||
114,179,156,233,211,129,113,73,169,252,218,179,228,119,153,163,3,202,193,76,139,21,35,98,74,107,2,139,171,21,75,44,213,
|
||||
109,238,30,51,173,24,150,117,113,110,142,83,94,93,142,169,35,145,48,135,141,196,202,88,204,76,167,215,78,198,204,164,51,
|
||||
25,13,103,241,73,13,143,141,162,115,57,94,37,185,94,136,10,195,206,168,204,24,55,218,221,99,177,17,103,230,114,158,11,
|
||||
230,184,108,26,216,41,55,101,117,142,173,219,140,141,165,16,171,206,241,72,55,130,128,53,44,86,204,140,45,101,14,37,80,
|
||||
14,154,49,110,59,177,171,199,72,13,155,185,173,173,60,139,187,211,180,54,210,123,182,109,94,75,190,220,165,65,172,151,
|
||||
120,111,7,185,122,59,240,130,186,158,220,189,235,59,214,173,91,79,58,100,135,120,23,225,184,119,125,31,50,133,210,185,94,
|
||||
188,73,173,15,185,157,125,8,234,189,125,120,170,79,150,192,250,72,235,19,207,225,173,83,168,136,233,125,66,17,129,189,31,
|
||||
199,65,127,7,5,251,207,156,175,146,254,179,12,151,215,144,83,214,16,141,70,167,245,69,57,250,121,57,250,249,57,250,5,208,
|
||||
11,28,125,93,194,24,78,147,219,144,251,79,24,133,236,52,6,204,4,229,25,234,180,160,10,99,112,240,236,81,133,216,0,21,139,
|
||||
3,100,213,88,38,99,91,155,83,40,210,28,36,247,128,141,228,40,164,12,172,228,142,201,51,129,60,49,25,250,6,201,133,179,
|
||||
199,72,81,65,204,30,52,55,219,136,212,43,51,34,49,29,221,201,47,19,61,41,195,74,15,217,169,81,42,20,39,15,66,122,90,122,
|
||||
163,32,231,0,66,65,246,24,210,250,96,124,104,136,152,73,46,83,132,95,242,13,205,4,218,65,202,199,26,88,233,244,112,150,
|
||||
80,103,206,54,117,142,81,33,204,98,207,160,203,102,42,77,121,34,41,6,158,188,66,83,78,62,177,148,68,241,61,241,81,83,22,
|
||||
122,153,25,31,30,201,80,9,212,78,181,226,54,89,221,49,44,32,75,230,59,43,139,138,160,202,118,99,183,202,230,250,102,12,
|
||||
29,131,228,65,106,139,49,113,101,86,217,70,5,66,177,237,140,136,31,20,64,162,123,15,198,123,180,27,107,50,30,51,201,15,
|
||||
203,86,43,46,6,79,52,90,214,127,122,56,151,93,234,141,167,227,3,241,132,152,67,241,204,21,56,208,236,137,30,123,23,154,
|
||||
23,154,78,75,167,132,137,200,150,76,24,123,214,165,12,116,78,71,238,149,242,29,87,219,17,42,194,64,98,30,49,112,155,141,
|
||||
49,49,193,129,105,195,22,51,141,136,48,109,89,53,189,22,168,208,177,32,114,174,177,39,176,182,166,147,91,147,84,58,157,
|
||||
144,81,245,178,248,224,32,218,164,170,233,178,81,135,124,230,20,67,202,24,206,150,41,13,40,70,149,41,207,122,202,27,49,
|
||||
210,242,124,165,242,145,248,160,217,109,15,101,228,153,177,46,101,143,58,61,133,11,28,123,196,92,234,35,118,58,67,44,78,
|
||||
94,204,229,38,25,28,210,164,197,71,71,169,72,92,217,226,70,98,181,145,76,119,97,132,169,80,25,186,205,196,90,107,112,58,
|
||||
31,201,238,140,145,202,80,190,60,165,122,246,36,77,242,73,245,26,231,196,34,119,28,113,104,151,137,42,210,29,86,58,99,32,
|
||||
22,83,94,60,189,41,105,32,48,227,177,180,26,121,242,236,50,247,172,22,85,149,239,58,199,213,175,48,155,209,61,34,198,197,
|
||||
149,144,59,180,16,243,101,166,68,205,27,113,228,144,158,48,135,50,228,78,152,214,112,102,132,220,170,21,204,34,221,18,
|
||||
115,234,177,204,137,141,114,114,237,196,224,136,124,159,160,98,219,202,94,10,87,167,76,35,131,153,44,153,49,173,49,211,
|
||||
153,148,189,71,76,239,140,81,45,129,156,39,179,107,160,106,198,212,109,140,155,217,78,99,152,50,102,174,191,28,183,83,
|
||||
139,232,206,216,201,36,76,133,182,37,150,80,54,144,148,99,139,202,102,157,118,83,32,183,109,97,65,76,8,255,156,59,21,249,
|
||||
237,83,194,20,229,219,86,118,253,21,74,181,107,44,145,137,39,197,152,203,36,214,80,158,136,119,210,25,30,221,241,15,152,
|
||||
217,168,225,195,241,97,227,228,146,91,30,21,58,211,230,113,228,53,120,110,12,81,43,131,104,225,74,202,245,231,77,26,41,
|
||||
120,202,61,235,74,202,48,197,82,84,151,50,135,197,44,166,206,125,247,166,80,202,28,181,199,77,167,229,155,172,211,66,172,
|
||||
43,37,131,140,150,54,51,228,79,139,112,52,125,243,37,31,210,178,255,134,88,71,229,185,169,14,167,245,114,9,139,199,114,
|
||||
238,79,242,177,206,236,218,161,217,72,157,245,106,74,179,210,217,208,179,53,158,19,75,170,206,106,22,55,31,3,97,60,237,4,
|
||||
35,185,212,10,211,167,4,33,111,54,153,112,218,116,69,60,145,216,104,103,228,76,250,210,88,218,217,128,128,7,145,154,222,
|
||||
194,112,22,75,198,105,23,142,125,100,99,189,204,36,103,167,157,214,116,204,212,165,122,170,103,70,226,56,223,196,123,67,
|
||||
84,201,69,176,138,8,174,161,12,168,98,8,242,198,50,67,75,100,44,101,227,228,26,55,18,98,166,165,216,52,68,186,184,139,82,
|
||||
145,120,207,93,31,249,194,208,99,111,77,155,20,24,63,61,250,122,199,103,122,205,38,136,77,18,159,140,130,69,196,246,208,
|
||||
65,206,200,227,239,107,167,67,248,0,220,220,175,241,175,179,194,189,26,251,23,86,50,71,163,56,111,153,252,237,206,118,86,
|
||||
92,28,111,231,233,234,118,122,144,115,122,149,121,252,252,226,109,252,210,137,133,244,113,206,94,71,242,12,249,8,10,243,
|
||||
63,78,159,115,68,141,54,252,21,118,55,243,52,243,23,168,141,191,201,38,248,215,63,56,113,43,227,46,239,202,133,237,45,
|
||||
237,237,203,251,53,26,244,94,167,49,179,165,253,145,90,77,251,52,91,192,202,103,69,107,52,254,16,227,172,184,220,197,249,
|
||||
229,213,46,114,49,151,230,246,242,5,15,187,188,110,114,51,55,119,107,243,231,243,241,102,23,159,207,211,205,84,225,84,93,
|
||||
193,95,103,255,37,148,151,68,199,110,11,17,206,50,255,6,122,66,227,191,100,199,133,125,39,210,244,168,38,222,143,105,188,
|
||||
239,26,200,23,53,214,7,241,140,20,120,228,23,82,249,80,136,142,40,135,159,57,14,223,116,196,207,57,251,42,243,84,111,216,
|
||||
176,176,111,67,95,11,25,108,135,124,234,70,141,191,196,238,64,21,31,170,90,72,191,100,252,19,108,151,167,122,47,15,86,
|
||||
243,100,53,47,106,251,52,207,84,111,255,52,159,172,166,219,185,246,9,54,130,76,94,120,11,31,175,190,167,127,231,94,141,
|
||||
126,202,120,31,221,200,229,83,254,189,225,208,61,244,123,238,50,62,197,126,194,158,99,87,163,210,19,92,127,141,221,196,
|
||||
62,203,62,131,26,150,237,237,163,61,210,145,31,166,106,254,212,245,213,27,180,252,43,121,167,230,57,198,48,133,180,141,
|
||||
175,104,102,37,69,81,135,64,167,86,240,8,227,203,218,53,223,215,88,235,50,198,52,239,71,24,95,200,66,133,151,184,188,46,
|
||||
223,34,87,193,78,183,183,133,149,148,241,107,219,218,221,190,101,172,122,150,176,159,106,228,235,88,181,159,238,214,216,
|
||||
47,80,127,88,99,71,49,73,193,50,238,107,230,163,213,88,42,59,35,53,46,18,178,169,222,69,47,71,231,211,135,53,182,95,12,
|
||||
247,65,141,109,247,248,227,33,250,54,99,255,9,195,179,26,237,99,149,45,59,55,76,238,168,216,75,188,154,189,196,102,87,
|
||||
241,26,222,171,243,71,88,249,69,142,33,36,13,65,24,242,249,28,24,66,108,118,101,86,169,34,206,152,151,179,187,194,181,83,
|
||||
83,250,243,229,117,236,173,114,210,220,228,187,43,140,213,194,235,111,152,210,15,85,176,91,195,175,137,183,169,74,188,
|
||||
221,87,201,248,1,112,180,146,244,162,138,34,206,228,223,60,56,78,85,33,251,193,26,188,29,170,209,111,228,148,15,216,159,
|
||||
64,8,52,179,35,53,140,77,205,97,236,129,57,165,236,0,228,97,112,28,76,133,25,219,7,158,5,39,193,173,181,240,1,7,192,205,
|
||||
117,140,29,2,199,5,245,140,29,109,96,250,190,70,166,239,111,100,236,88,163,206,30,158,15,191,5,156,61,11,94,91,160,190,
|
||||
203,201,126,71,150,149,217,223,97,138,239,120,178,191,197,20,223,9,101,127,143,169,211,204,111,50,197,119,74,217,223,101,
|
||||
102,191,183,18,191,205,212,2,142,46,190,171,99,97,231,55,72,207,67,119,135,29,187,248,63,54,11,56,223,171,201,255,109,
|
||||
135,157,122,197,111,57,53,229,47,254,231,172,135,157,114,197,255,169,73,61,43,255,255,29,112,218,42,126,55,250,127,111,
|
||||
26,247,20,112,42,0,0};
|
||||
{31,139,8,8,1,253,119,92,0,3,74,97,118,97,68,101,120,66,121,116,101,67,111,100,101,46,100,101,120,0,165,154,11,124,92,85,157,
|
||||
199,255,231,220,121,36,147,201,100,50,73,147,54,153,180,147,164,73,167,109,154,76,120,53,37,41,244,25,72,155,210,71,166,149,38,
|
||||
69,184,153,185,73,166,157,220,59,157,153,36,141,226,82,144,109,171,86,165,110,69,150,151,168,149,15,98,87,237,46,32,91,193,237,
|
||||
242,80,116,81,1,69,235,10,88,93,92,1,31,31,100,203,218,207,234,210,253,157,115,207,36,183,47,81,55,253,124,231,255,63,255,243,
|
||||
63,239,115,254,231,76,154,164,177,203,23,187,248,82,170,47,249,108,247,151,235,94,184,235,163,155,215,44,254,82,229,169,135,223,
|
||||
24,25,51,30,92,117,226,206,101,11,136,50,68,180,107,203,37,33,82,63,55,206,39,250,21,217,246,118,16,118,17,45,134,60,1,89,
|
||||
9,153,247,18,25,144,149,69,68,26,100,87,9,209,161,217,68,119,67,254,176,154,232,56,56,1,78,129,63,128,211,128,207,36,242,128,
|
||||
98,80,10,154,193,124,176,8,180,131,203,192,53,224,86,240,105,112,20,188,8,222,6,51,102,17,45,3,253,32,7,246,129,123,193,87,193,
|
||||
247,193,59,160,162,6,117,1,3,236,1,143,128,151,65,113,45,81,7,216,13,190,6,94,1,60,76,212,0,86,131,235,65,22,220,14,30,3,207,
|
||||
131,147,160,168,142,104,30,232,4,219,193,30,176,31,220,9,238,1,159,1,15,128,195,224,33,112,20,28,3,79,131,111,129,239,130,239,
|
||||
131,227,224,21,240,115,240,6,248,13,120,11,156,2,255,11,24,230,205,3,124,32,0,26,192,98,176,18,172,7,3,96,24,228,192,110,176,
|
||||
15,124,18,124,26,28,5,143,131,231,192,113,112,2,188,6,126,7,78,1,247,28,162,16,104,0,237,224,114,176,28,92,5,214,128,141,224,
|
||||
122,176,29,220,12,110,3,119,130,251,193,67,224,95,192,15,192,79,193,155,224,29,224,141,16,5,65,29,104,3,87,130,56,72,128,28,56,
|
||||
0,62,5,238,1,247,129,35,224,73,240,34,120,21,252,14,120,235,137,102,130,249,160,3,172,6,235,193,8,200,130,93,224,253,96,47,
|
||||
216,15,238,1,135,193,227,224,25,240,67,240,10,120,3,156,4,167,65,81,3,81,61,136,129,197,160,27,244,130,56,216,6,174,7,6,48,65,
|
||||
30,188,15,124,20,124,22,60,4,190,9,94,5,191,7,190,70,162,70,176,16,92,14,214,128,205,32,9,70,193,4,216,3,14,130,187,193,231,
|
||||
193,151,193,35,224,9,240,45,240,44,120,19,4,230,98,255,130,26,176,0,116,128,141,64,7,22,248,16,184,15,60,14,190,13,126,12,126,
|
||||
1,222,6,90,19,214,15,52,128,118,176,22,108,4,91,129,14,134,65,26,100,193,141,224,38,176,7,124,28,124,18,220,15,142,128,39,193,
|
||||
247,192,11,224,69,240,99,240,114,147,125,118,221,0,199,153,2,160,12,4,65,57,16,193,160,130,236,243,62,3,84,1,28,99,194,113,36,
|
||||
28,55,194,209,162,90,17,27,0,182,49,97,187,17,182,7,97,121,9,203,65,152,70,194,240,9,195,32,52,69,205,96,30,136,2,132,23,66,
|
||||
216,161,133,160,5,44,2,173,160,13,196,84,204,185,8,92,12,46,1,151,130,14,112,21,88,7,174,1,235,193,6,178,199,80,248,113,41,121,
|
||||
107,149,61,46,166,210,30,165,11,187,24,43,87,246,34,165,239,135,221,167,252,196,143,95,229,29,84,246,128,178,251,212,188,20,
|
||||
244,25,14,127,49,47,119,87,217,186,152,147,67,170,108,189,242,41,81,115,33,250,80,170,230,227,176,242,23,250,67,202,63,170,252,
|
||||
75,213,28,61,86,101,143,125,161,178,47,81,186,168,231,114,165,63,5,189,83,233,207,65,239,82,250,113,232,75,149,254,26,244,43,
|
||||
148,126,18,250,149,133,58,177,168,203,148,94,4,125,133,210,131,14,251,76,135,30,129,190,74,233,81,135,253,18,135,222,229,208,
|
||||
87,57,234,236,117,216,227,208,87,42,125,155,195,158,175,154,214,197,28,46,87,122,210,81,79,218,225,47,230,109,117,161,44,236,
|
||||
221,74,191,209,225,179,223,161,31,172,182,247,81,139,154,207,171,149,126,55,236,61,74,63,4,125,141,210,191,2,189,87,233,143,66,
|
||||
95,171,244,99,14,251,51,14,251,115,213,98,77,25,93,71,182,252,137,156,226,8,93,171,228,199,165,100,244,9,37,15,42,249,73,37,
|
||||
111,87,242,83,202,255,62,18,103,173,133,62,45,101,45,253,152,196,185,11,211,113,37,127,38,101,13,189,74,98,223,113,186,77,202,
|
||||
90,186,87,202,22,250,154,148,37,244,117,185,255,234,233,50,18,103,163,142,158,32,177,223,61,52,42,101,144,222,7,89,140,19,207,
|
||||
164,92,68,79,147,216,143,245,50,93,162,236,37,56,61,223,144,227,178,211,101,104,47,45,101,57,153,42,253,126,177,119,148,61,136,
|
||||
19,185,83,165,199,164,212,104,156,236,24,51,161,228,46,41,25,237,86,242,102,18,103,140,83,86,202,6,186,137,68,28,154,45,219,
|
||||
171,64,84,120,88,202,118,122,68,202,25,244,207,36,206,97,51,245,43,249,36,137,88,213,36,253,103,33,130,124,76,202,70,250,150,
|
||||
148,151,210,247,229,60,206,147,249,53,168,225,33,57,127,243,101,186,22,246,141,74,110,146,210,79,125,82,86,208,15,148,124,81,
|
||||
206,231,28,233,31,198,76,198,165,140,210,102,41,43,104,155,146,186,148,49,249,78,10,163,165,29,82,122,228,155,42,172,198,23,70,
|
||||
212,203,73,89,76,147,82,250,232,70,149,255,1,41,139,232,111,164,180,231,33,140,145,125,80,201,91,149,252,91,41,103,210,30,37,
|
||||
247,42,251,62,41,171,233,67,74,126,88,201,143,72,57,139,246,75,217,70,119,41,121,183,148,97,122,80,237,159,47,42,121,88,201,127,
|
||||
80,249,95,82,233,47,43,249,21,181,191,142,72,25,161,127,148,178,137,254,73,74,123,189,194,106,189,68,250,171,106,95,62,42,
|
||||
165,189,126,97,68,249,163,82,46,164,111,42,249,140,148,115,233,223,164,172,164,239,72,185,128,190,171,210,223,83,126,207,41,249,
|
||||
188,202,127,65,141,255,231,36,98,111,136,242,82,94,70,119,202,253,31,160,19,36,226,173,189,127,155,17,101,45,18,49,87,163,
|
||||
65,41,57,125,142,68,220,45,163,191,39,251,142,35,178,227,179,136,75,226,174,88,5,121,64,5,233,90,181,135,155,149,159,200,143,
|
||||
35,255,144,202,23,247,64,57,217,247,232,141,170,124,18,242,217,232,180,255,117,208,147,81,251,30,51,33,199,192,77,81,251,190,
|
||||
218,39,237,92,234,39,154,196,185,196,123,48,84,66,153,224,13,176,133,104,91,208,39,239,166,34,164,68,249,215,225,51,32,218,243,
|
||||
84,82,3,247,195,175,8,165,227,185,18,138,95,236,39,51,120,17,188,252,44,68,75,88,215,180,53,114,25,78,199,180,79,12,62,62,109,
|
||||
19,174,170,77,77,140,142,196,15,144,230,186,244,134,26,218,156,243,81,135,86,69,33,109,27,180,130,127,60,95,66,59,131,77,56,231,
|
||||
126,215,206,224,124,200,18,215,206,216,2,90,233,22,254,75,52,47,45,190,193,77,161,10,81,38,128,182,102,96,45,204,96,37,250,
|
||||
123,118,27,209,239,138,251,91,147,115,18,104,182,223,34,3,33,191,26,107,3,214,34,19,137,96,182,7,130,1,26,168,40,149,227,102,
|
||||
242,31,222,30,205,246,221,159,9,138,149,8,76,217,155,167,236,243,164,157,171,23,65,107,179,61,223,241,96,169,92,31,13,118,209,
|
||||
238,101,205,246,125,28,143,148,162,151,226,245,129,17,214,139,126,215,160,229,192,148,223,210,11,250,213,74,191,0,226,130,24,
|
||||
201,42,248,137,125,31,242,132,102,100,34,85,244,5,106,112,137,213,243,160,87,3,7,17,221,92,181,148,193,131,245,96,241,192,193,
|
||||
32,190,101,185,81,195,123,233,16,249,92,29,174,235,104,142,79,164,241,34,167,254,187,203,160,245,83,138,182,221,133,72,27,233,
|
||||
163,173,248,140,203,207,205,216,169,13,216,25,153,160,24,81,133,171,146,26,151,47,162,102,38,226,152,25,113,161,63,113,209,146,
|
||||
219,135,249,115,147,168,209,139,152,21,210,204,160,142,82,126,87,141,251,219,20,106,110,28,106,163,144,119,176,168,130,214,21,
|
||||
121,188,161,234,112,81,137,212,204,216,117,20,247,248,181,14,173,146,66,60,52,183,113,85,140,66,238,157,193,235,49,58,191,103,
|
||||
157,199,229,14,205,8,73,105,198,146,244,119,46,204,65,16,107,139,122,231,184,236,222,31,164,232,103,74,93,209,147,224,45,240,
|
||||
38,248,119,112,28,75,46,223,150,211,63,187,175,164,191,40,125,246,143,157,47,238,237,42,196,35,131,236,251,132,107,141,183,178,
|
||||
134,91,216,252,221,140,207,219,199,154,246,48,123,189,197,207,131,106,31,244,69,202,228,57,22,251,79,164,143,20,246,77,172,139,
|
||||
234,53,177,154,246,249,58,170,246,101,223,178,50,170,226,242,157,202,151,32,39,32,45,153,216,18,114,177,232,255,76,215,255,
|
||||
68,179,253,14,21,111,231,126,180,17,80,109,136,159,103,154,237,243,31,10,150,77,237,203,23,84,127,54,7,203,101,59,92,237,227,
|
||||
31,53,219,111,67,51,120,137,56,57,120,3,186,100,185,16,69,223,209,84,125,47,55,219,49,35,32,203,217,47,220,95,56,108,30,216,132,
|
||||
231,175,223,101,12,139,213,24,10,254,111,191,139,127,199,212,152,237,126,188,115,158,126,120,230,157,107,43,117,216,92,170,173,
|
||||
202,121,246,123,57,196,68,228,29,136,113,178,165,70,91,219,17,69,222,220,26,243,210,214,152,71,89,139,177,127,240,98,15,110,
|
||||
141,185,144,95,132,83,80,133,254,224,14,98,229,106,188,98,238,27,231,217,49,248,252,253,143,175,8,81,102,211,50,114,109,140,158,
|
||||
18,223,13,52,185,238,11,47,88,230,226,213,167,79,203,113,47,107,37,151,46,202,20,195,46,218,233,152,103,127,119,9,5,251,6,
|
||||
81,10,213,180,51,238,90,194,176,82,152,191,22,175,248,238,36,114,204,96,9,226,181,143,101,54,94,78,205,185,232,127,89,177,106,
|
||||
26,47,242,81,244,183,102,112,33,122,29,125,67,76,146,221,143,194,119,45,241,157,163,84,225,67,142,104,111,211,60,251,123,83,
|
||||
136,77,181,199,209,30,74,150,177,37,222,98,180,83,140,190,249,120,168,241,162,139,188,100,45,155,73,227,119,248,88,244,45,19,
|
||||
119,6,206,61,239,224,191,57,93,208,205,200,32,218,240,201,254,101,54,160,95,90,168,60,250,178,61,31,162,173,244,60,251,187,206,
|
||||
153,243,97,143,76,216,196,152,60,104,43,179,169,19,51,25,10,70,223,182,223,150,226,103,210,177,206,197,228,150,245,237,85,243,
|
||||
107,93,59,139,226,227,206,90,59,208,166,189,175,182,97,95,217,223,73,185,252,46,118,7,202,132,81,81,223,243,240,214,196,236,
|
||||
50,77,206,46,43,99,102,208,143,250,125,197,102,80,220,11,37,222,23,15,156,166,133,236,191,229,236,68,127,215,247,2,78,10,51,113,
|
||||
254,102,35,178,154,65,17,161,125,110,19,103,12,210,227,125,126,188,104,169,184,77,203,163,47,189,187,231,149,182,231,55,223,
|
||||
221,243,10,120,154,65,113,23,248,74,66,229,139,107,23,80,168,190,49,220,138,152,216,142,183,76,168,230,210,163,245,36,106,17,
|
||||
117,124,73,212,17,9,9,201,66,238,85,110,191,251,150,205,223,152,97,70,42,108,75,213,42,143,223,115,203,208,55,170,10,245,30,247,
|
||||
97,37,79,160,31,31,172,100,116,154,232,225,3,63,243,177,162,37,190,153,244,231,142,96,62,13,157,118,246,231,175,233,137,168,41,
|
||||
250,147,191,188,7,75,85,15,154,254,223,61,88,42,123,128,101,102,94,185,215,196,222,18,177,161,77,73,17,83,196,251,62,39,247,
|
||||
30,151,119,114,105,212,254,93,3,250,136,27,208,139,221,95,163,61,75,161,202,198,85,184,1,221,131,30,220,128,242,54,187,142,46,
|
||||
114,249,217,18,212,28,192,185,139,190,3,254,24,10,53,54,224,254,211,196,253,87,132,59,110,157,139,107,226,222,219,201,163,191,
|
||||
45,229,209,95,131,55,192,107,98,191,151,163,111,226,125,232,23,145,136,207,171,106,154,169,53,70,27,90,230,47,112,196,192,197,
|
||||
209,233,179,161,41,235,149,81,251,157,215,193,189,56,95,102,228,90,120,4,40,180,44,250,7,49,62,59,78,94,29,181,127,55,98,6,219,
|
||||
228,139,174,134,223,1,79,142,216,233,199,55,147,89,212,129,200,97,6,19,56,161,62,182,148,85,96,182,205,216,28,138,97,196,151,
|
||||
74,127,51,54,155,130,174,120,123,16,111,183,70,89,127,33,39,196,205,88,29,5,185,157,55,87,204,239,91,246,239,117,157,63,15,156,
|
||||
149,126,244,172,180,24,83,37,217,247,91,57,122,193,148,205,254,206,100,203,34,37,171,149,172,85,254,205,136,162,34,29,85,233,
|
||||
40,86,211,69,133,183,158,125,31,114,181,214,133,123,147,171,181,46,220,151,182,238,149,191,115,225,146,22,135,93,200,82,153,118,
|
||||
169,182,61,42,207,3,63,174,108,94,37,139,149,244,171,178,1,244,200,94,95,117,127,171,50,97,181,126,226,59,146,200,111,81,125,
|
||||
108,113,244,91,176,72,201,86,85,158,169,183,133,144,101,83,182,50,213,150,93,46,56,213,150,122,215,138,190,118,165,204,84,254,
|
||||
10,170,90,105,141,102,44,211,48,243,27,12,35,187,37,101,76,180,110,215,199,117,98,221,196,187,123,136,245,16,239,129,88,67,124,
|
||||
77,47,85,175,53,38,7,45,61,155,92,149,202,141,166,114,185,222,84,46,111,152,70,150,88,47,241,94,184,246,246,146,214,139,143,
|
||||
170,94,221,76,102,173,84,178,77,207,100,218,150,39,242,169,241,84,126,178,147,46,57,211,158,201,164,83,9,61,159,178,204,185,5,
|
||||
159,222,212,144,145,152,76,164,141,149,122,58,61,168,39,118,228,58,105,214,133,74,57,179,18,150,137,190,228,219,86,10,185,43,
|
||||
239,204,26,206,234,153,145,84,34,215,182,82,55,199,117,84,56,251,60,89,86,218,202,118,167,210,121,35,123,225,252,117,122,62,155,
|
||||
218,213,73,243,255,100,254,25,85,205,60,215,117,131,158,50,209,191,234,115,115,54,25,9,100,84,76,101,88,185,182,21,99,102,
|
||||
50,109,116,82,165,211,216,179,34,101,38,69,237,211,117,140,99,229,218,176,60,171,199,13,81,121,205,153,25,235,44,49,93,42,111,
|
||||
254,153,121,98,205,231,174,55,187,173,196,88,110,229,136,110,14,27,133,101,117,118,101,202,213,57,164,41,227,85,89,107,44,211,
|
||||
73,151,157,155,19,207,26,198,250,193,156,145,29,55,178,104,229,170,180,53,168,167,123,245,73,107,44,63,221,204,156,63,93,174,
|
||||
147,90,207,116,72,153,153,177,252,168,145,31,177,146,109,43,244,156,209,35,210,88,120,19,243,39,183,69,211,133,253,87,39,83,121,
|
||||
43,219,99,14,89,157,180,224,194,110,231,84,185,232,93,124,215,73,125,157,110,234,195,162,199,221,189,9,107,180,45,107,165,83,
|
||||
109,219,199,18,70,219,57,199,108,238,5,206,210,220,51,71,190,228,175,173,167,147,234,223,173,104,39,53,244,38,245,244,120,106,
|
||||
71,155,110,154,86,94,158,169,182,213,102,34,109,229,82,230,240,202,180,158,147,135,229,92,159,30,204,75,86,229,215,159,39,127,
|
||||
157,49,58,168,28,140,156,216,49,34,166,180,165,177,185,218,176,197,178,125,198,206,49,195,76,96,91,151,59,115,236,250,26,28,
|
||||
166,158,116,218,24,214,211,203,19,9,35,151,91,189,43,97,100,236,197,152,123,30,159,236,240,216,40,6,231,240,170,112,122,33,42,
|
||||
12,219,179,50,109,188,198,234,27,75,140,216,43,231,40,23,114,184,172,31,220,46,15,101,157,195,214,103,36,198,178,136,85,23,40,
|
||||
210,135,32,96,14,139,29,51,109,203,26,67,105,212,131,110,140,91,118,236,138,235,217,97,195,217,219,154,243,184,219,93,195,171,
|
||||
56,190,117,195,106,242,59,183,6,177,45,196,183,244,144,123,75,15,126,160,174,33,207,150,53,61,221,221,107,200,5,217,35,62,69,
|
||||
56,222,178,166,31,153,66,233,93,35,62,164,214,143,220,222,126,4,245,45,253,40,213,47,107,96,253,164,245,139,114,248,232,21,42,
|
||||
98,122,191,80,68,96,31,192,117,48,208,67,161,129,115,215,171,98,224,60,211,229,211,229,146,205,141,197,98,83,122,187,67,191,
|
||||
200,161,95,236,208,47,129,94,98,235,221,105,125,56,71,30,93,158,63,97,20,178,87,31,52,210,84,164,171,219,130,102,233,201,228,
|
||||
249,163,10,177,65,42,23,23,200,138,177,124,222,50,55,100,81,165,145,36,207,160,133,228,40,164,12,172,228,73,200,59,129,188,9,
|
||||
25,250,146,228,198,221,163,103,169,36,97,37,141,13,22,34,245,242,188,72,76,69,119,10,200,68,60,171,155,185,33,43,59,74,165,226,
|
||||
230,65,72,207,73,111,84,100,95,64,168,200,26,67,218,149,76,13,13,17,51,200,109,136,240,75,254,161,233,64,155,164,98,236,129,
|
||||
229,246,8,103,8,117,250,110,83,247,24,149,194,44,206,12,134,108,100,115,84,36,146,98,226,201,39,52,229,228,23,91,73,84,31,79,
|
||||
141,26,178,210,171,141,212,240,72,158,42,160,246,170,29,183,222,236,75,96,3,153,50,223,222,89,84,6,85,246,27,167,85,118,215,63,
|
||||
109,232,73,146,23,169,77,250,196,181,5,101,43,149,8,197,178,242,34,126,80,16,137,190,73,204,247,104,31,246,100,42,97,80,0,150,
|
||||
205,102,74,76,158,232,180,108,255,236,112,46,135,180,37,149,75,13,166,210,98,13,69,153,247,224,66,179,38,226,214,14,116,47,60,
|
||||
149,150,78,105,3,145,45,147,214,39,187,179,58,6,231,66,238,181,242,115,43,177,17,42,195,68,98,29,49,113,27,244,49,177,192,193,
|
||||
41,195,38,35,135,136,48,101,89,49,181,23,168,212,182,32,114,174,178,38,176,183,166,146,155,51,84,57,149,144,81,245,234,84,50,
|
||||
137,62,169,102,214,89,104,67,150,57,195,144,213,135,11,117,74,3,170,81,117,202,187,158,138,70,244,156,188,95,169,122,36,149,52,
|
||||
250,172,161,188,188,51,186,179,214,168,61,82,184,192,49,46,214,210,53,98,229,242,196,82,228,195,90,174,151,193,33,71,90,106,
|
||||
116,148,202,196,147,45,165,167,87,234,153,220,58,204,48,149,42,67,159,145,94,109,38,167,242,145,236,203,235,217,60,21,203,91,
|
||||
42,62,153,49,200,47,213,235,237,27,139,60,41,196,161,29,6,154,200,245,152,185,188,142,88,76,69,169,220,250,140,142,192,140,98,
|
||||
57,53,243,228,221,97,76,174,20,77,85,239,184,192,211,175,180,144,209,55,34,230,197,157,150,39,180,20,235,101,100,69,203,215,224,
|
||||
202,33,87,218,24,202,147,39,109,152,195,249,17,242,168,94,48,147,92,166,88,83,175,105,76,92,35,23,215,74,39,71,228,231,4,149,
|
||||
91,102,225,81,184,50,107,232,121,172,100,197,180,105,149,145,203,103,173,73,177,188,211,70,181,5,28,37,11,123,160,118,218,212
|
||||
,167,143,27,133,65,99,154,242,134,211,95,206,219,153,85,244,229,173,76,6,166,106,156,73,217,143,179,158,6,228,177,76,236,128,
|
||||
9,42,181,156,143,40,10,88,103,196,37,42,182,204,194,134,43,149,234,186,177,116,62,149,17,147,44,147,216,52,69,34,192,73,103,120,
|
||||
244,165,222,103,20,194,132,31,247,133,133,171,74,158,113,52,104,175,147,215,150,248,50,137,34,203,243,121,132,7,119,70,110,
|
||||
56,95,70,207,194,83,30,82,119,70,198,37,150,165,134,172,49,44,150,45,123,225,199,54,133,179,198,168,53,110,216,61,95,111,158,
|
||||
21,83,221,89,25,85,180,156,145,167,64,78,196,159,169,167,46,249,145,150,227,215,197,198,169,118,166,122,236,222,203,61,43,138,
|
||||
57,30,76,178,88,111,97,179,208,76,164,206,251,22,165,25,185,66,172,217,156,114,4,143,218,243,154,197,83,71,71,220,206,217,209,
|
||||
71,238,173,210,220,25,81,199,87,72,166,237,62,189,39,149,78,95,99,229,229,74,250,115,216,203,133,8,128,130,72,77,157,89,56,139,
|
||||
61,98,247,11,247,60,178,177,65,166,147,51,115,118,111,122,166,219,82,35,117,229,71,82,184,208,196,231,220,152,146,237,176,138,
|
||||
144,173,161,14,168,98,10,138,198,242,67,29,50,120,178,113,114,143,235,105,177,210,82,172,31,34,151,120,124,82,153,248,116,238,
|
||||
143,98,97,136,91,155,115,6,5,199,207,14,183,190,241,233,81,179,9,98,187,136,239,138,129,118,98,147,116,132,51,242,6,250,187,232,
|
||||
81,124,227,109,25,208,248,19,172,116,175,198,142,177,138,57,26,165,120,235,174,223,111,239,98,229,229,169,46,158,171,235,162,
|
||||
251,56,167,87,153,55,192,47,223,202,175,154,88,68,247,112,246,58,146,231,200,251,81,89,224,33,250,162,45,102,107,195,143,179,
|
||||
3,204,219,194,159,167,78,254,91,54,193,159,252,192,196,62,198,221,190,229,139,186,90,187,186,174,24,208,40,233,187,81,99,70,107,
|
||||
215,253,245,154,246,121,182,144,85,207,136,205,214,248,103,25,103,229,213,110,206,55,214,185,201,205,220,154,199,199,23,30,114,
|
||||
251,60,228,97,30,238,209,22,44,224,227,45,110,190,128,231,90,104,150,221,244,44,254,58,123,67,40,39,196,192,62,28,38,92,94,
|
||||
129,181,244,136,198,95,99,191,18,246,237,72,211,97,77,124,190,164,241,254,235,33,127,168,177,126,136,99,82,160,200,47,165,242,
|
||||
145,48,61,167,28,126,110,59,124,219,22,255,193,217,215,153,183,110,237,218,69,253,107,251,91,73,103,55,200,82,183,104,252,167,
|
||||
236,99,104,226,35,181,139,232,117,198,239,101,59,188,117,123,121,168,142,103,234,120,89,39,31,59,180,141,79,174,161,253,92,187,
|
||||
151,141,32,139,151,238,225,227,117,183,15,108,223,171,209,43,140,247,211,45,92,150,9,236,141,132,111,167,63,112,183,254,57,
|
||||
246,18,123,154,189,23,77,190,197,93,191,100,31,100,15,178,47,160,254,165,123,251,105,82,58,242,103,168,142,31,189,169,110,173,
|
||||
86,124,45,239,213,188,63,97,26,127,146,182,242,101,45,172,162,44,102,19,236,213,74,238,103,124,105,151,230,255,87,214,182,148,
|
||||
49,205,247,9,198,23,177,112,233,149,110,159,219,223,238,46,217,238,241,181,178,138,42,254,254,206,46,143,127,41,171,155,33,236,
|
||||
103,26,121,55,171,11,208,1,141,253,39,218,143,104,236,71,88,162,80,21,247,183,240,209,58,108,148,237,209,217,110,18,178,185,
|
||||
209,77,63,139,45,160,143,106,236,1,49,217,71,52,182,205,27,72,133,233,59,140,189,12,195,83,26,29,100,53,173,219,215,238,186,97,
|
||||
214,94,226,117,236,167,108,102,45,159,205,183,184,248,253,172,122,177,109,8,75,67,8,134,98,62,7,134,48,155,89,83,80,106,137,
|
||||
51,230,227,236,182,72,100,247,110,215,177,234,122,246,106,53,105,30,242,223,22,193,94,225,13,55,239,118,29,158,197,246,69,94,
|
||||
18,31,39,197,199,254,26,198,15,129,103,107,200,85,54,171,140,51,249,47,10,199,147,53,200,62,56,27,31,135,103,187,110,225,84,12,
|
||||
216,159,65,24,44,100,79,205,102,236,36,184,109,78,37,59,52,135,177,199,192,9,112,18,236,139,48,246,40,120,13,252,17,220,86,207,
|
||||
216,33,112,10,28,110,128,31,120,174,17,101,230,50,215,41,176,191,137,177,99,77,46,182,111,1,99,7,23,114,246,0,120,118,97,208,
|
||||
241,251,176,130,44,252,93,165,248,125,78,225,111,43,197,239,127,10,127,95,233,162,233,191,177,20,191,63,42,252,157,101,225,119,
|
||||
84,226,111,45,181,160,173,139,223,203,177,136,253,119,69,199,160,123,34,182,93,252,31,53,11,218,191,67,147,255,111,29,177,219,
|
||||
21,127,155,169,41,127,241,255,201,174,136,93,175,248,63,104,82,101,229,255,109,7,237,190,138,191,3,253,63,65,69,100,73,64,42,0,0,0,0};
|
||||
|
||||
//==============================================================================
|
||||
#if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra
|
||||
|
|
@ -905,7 +896,7 @@ private:
|
|||
CALLBACK (handleAppPausedJni, "handleAppPaused", "(J)V") \
|
||||
CALLBACK (handleAppResumedJni, "handleAppResumed", "(J)V") \
|
||||
|
||||
DECLARE_JNI_CLASS_WITH_BYTECODE (ComponentPeerView, "com/roli/juce/ComponentPeerView", 16, javaComponentPeerView, sizeof(javaComponentPeerView))
|
||||
DECLARE_JNI_CLASS_WITH_BYTECODE (ComponentPeerView, "com/roli/juce/ComponentPeerView", 16, javaComponentPeerView, sizeof (javaComponentPeerView))
|
||||
#undef JNI_CLASS_MEMBERS
|
||||
|
||||
static void JNICALL handlePaintJni (JNIEnv*, jobject /*view*/, jlong host, jobject canvas, jobject paint) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handlePaintCallback (canvas, paint); }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue