Skip to content

Commit aa7005b

Browse files
committed
More work on midi 2
1 parent d651ac3 commit aa7005b

File tree

5 files changed

+87
-15
lines changed

5 files changed

+87
-15
lines changed

modules/yup_audio_devices/midi_io/yup_MidiDevices.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ class YUP_API MidiInput final
246246
@param callback the object that will receive the midi messages from this device
247247
*/
248248
static std::unique_ptr<MidiInput> createNewDevice (const String& deviceName, MidiInputCallback* callback);
249+
250+
/** This will try to create a new midi input device with the requested protocol. */
251+
static std::unique_ptr<MidiInput> createNewDevice (const String& deviceName,
252+
ump::PacketProtocol protocol,
253+
ump::Receiver* receiver);
249254
#endif
250255

251256
//==============================================================================
@@ -399,6 +404,10 @@ class YUP_API MidiOutput final : private Thread
399404
@param deviceName the name of the device to create
400405
*/
401406
static std::unique_ptr<MidiOutput> createNewDevice (const String& deviceName);
407+
408+
/** This will try to create a new midi output device with the requested protocol. */
409+
static std::unique_ptr<MidiOutput> createNewDevice (const String& deviceName,
410+
ump::PacketProtocol protocol);
402411
#endif
403412

404413
//==============================================================================

modules/yup_audio_devices/native/yup_Bela_linux.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,14 @@ std::unique_ptr<MidiInput> MidiInput::createNewDevice (const String&, MidiInputC
633633
return {};
634634
}
635635

636+
std::unique_ptr<MidiInput> MidiInput::createNewDevice (const String&,
637+
ump::PacketProtocol,
638+
ump::Receiver*)
639+
{
640+
jassertfalse;
641+
return {};
642+
}
643+
636644
//==============================================================================
637645
// TODO: Add Bela MidiOutput support
638646
class MidiOutput::Pimpl
@@ -657,4 +665,6 @@ std::unique_ptr<MidiOutput> MidiOutput::openDevice (const String&, ump::PacketPr
657665

658666
std::unique_ptr<MidiOutput> MidiOutput::createNewDevice (const String&) { return {}; }
659667

668+
std::unique_ptr<MidiOutput> MidiOutput::createNewDevice (const String&, ump::PacketProtocol) { return {}; }
669+
660670
} // namespace yup

modules/yup_audio_devices/native/yup_CoreMidi_apple.mm

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ static void updateProtocolInfo(MIDIObjectRef entity, MidiDeviceInfo& info)
474474
#if YUP_HAS_NEW_COREMIDI_API
475475
SInt32 protocol = 0;
476476

477-
if (CHECK_ERROR(MIDIObjectGetIntegerProperty(entity, kMIDIPropertyProtocolID, &protocol)))
477+
if (MIDIObjectGetIntegerProperty(entity, kMIDIPropertyProtocolID, &protocol) == noErr)
478478
{
479479
if (protocol == kMIDIProtocol_2_0)
480480
{
@@ -1272,6 +1272,18 @@ static CreatorFunctionPointers getCreatorFunctionPointers()
12721272
callback);
12731273
}
12741274

1275+
std::unique_ptr<MidiInput> MidiInput::createNewDevice(const String& deviceName,
1276+
ump::PacketProtocol protocol,
1277+
ump::Receiver* receiver)
1278+
{
1279+
if (receiver == nullptr)
1280+
return {};
1281+
1282+
return Pimpl::createDevice(protocol,
1283+
deviceName,
1284+
*receiver);
1285+
}
1286+
12751287
MidiInput::MidiInput(const String& deviceName,
12761288
const String& deviceIdentifier,
12771289
ump::PacketProtocol protocol)
@@ -1356,18 +1368,24 @@ static CreatorFunctionPointers getCreatorFunctionPointers()
13561368
return {};
13571369
}
13581370

1359-
std::unique_ptr<MidiOutput> MidiOutput::createNewDevice(const String& deviceName)
1360-
{
1361-
using namespace CoreMidiHelpers;
1362-
1363-
if (auto client = getGlobalMidiClient())
1364-
{
1365-
MIDIEndpointRef endpoint;
1366-
1367-
CFUniquePtr<CFStringRef> name(deviceName.toCFString());
1368-
1369-
auto err = CreatorFunctionsToUse::createSource(ump::PacketProtocol::MIDI_1_0, client, name.get(), &endpoint);
1370-
ScopedEndpointRef scopedEndpoint{endpoint};
1371+
std::unique_ptr<MidiOutput> MidiOutput::createNewDevice(const String& deviceName)
1372+
{
1373+
return createNewDevice(deviceName, ump::PacketProtocol::MIDI_1_0);
1374+
}
1375+
1376+
std::unique_ptr<MidiOutput> MidiOutput::createNewDevice(const String& deviceName,
1377+
ump::PacketProtocol protocol)
1378+
{
1379+
using namespace CoreMidiHelpers;
1380+
1381+
if (auto client = getGlobalMidiClient())
1382+
{
1383+
MIDIEndpointRef endpoint;
1384+
1385+
CFUniquePtr<CFStringRef> name(deviceName.toCFString());
1386+
1387+
auto err = CreatorFunctionsToUse::createSource(protocol, client, name.get(), &endpoint);
1388+
ScopedEndpointRef scopedEndpoint{endpoint};
13711389

13721390
#if YUP_IOS
13731391
if (err == kMIDINotPermitted)
@@ -1387,10 +1405,10 @@ static CreatorFunctionPointers getCreatorFunctionPointers()
13871405
if (!CHECK_ERROR(MIDIObjectSetIntegerProperty(*scopedEndpoint, kMIDIPropertyUniqueID, (SInt32)deviceIdentifier)))
13881406
return {};
13891407

1390-
auto midiOutput = rawToUniquePtr(new MidiOutput(deviceName, String(deviceIdentifier), ump::PacketProtocol::MIDI_1_0));
1408+
auto midiOutput = rawToUniquePtr(new MidiOutput(deviceName, String(deviceIdentifier), protocol));
13911409
midiOutput->internal = std::make_unique<Pimpl>(ScopedPortRef{},
13921410
std::move(scopedEndpoint),
1393-
ump::PacketProtocol::MIDI_1_0);
1411+
protocol);
13941412

13951413
return midiOutput;
13961414
}

modules/yup_audio_devices/native/yup_Midi_linux.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,14 @@ std::unique_ptr<MidiInput> MidiInput::createNewDevice (const String& deviceName,
629629
return midiInput;
630630
}
631631

632+
std::unique_ptr<MidiInput> MidiInput::createNewDevice (const String&,
633+
ump::PacketProtocol,
634+
ump::Receiver*)
635+
{
636+
jassertfalse;
637+
return {};
638+
}
639+
632640
MidiInput::MidiInput (const String& deviceName,
633641
const String& deviceIdentifier,
634642
ump::PacketProtocol protocol)
@@ -719,6 +727,15 @@ std::unique_ptr<MidiOutput> MidiOutput::createNewDevice (const String& deviceNam
719727
return midiOutput;
720728
}
721729

730+
std::unique_ptr<MidiOutput> MidiOutput::createNewDevice (const String& deviceName,
731+
ump::PacketProtocol protocol)
732+
{
733+
if (protocol != ump::PacketProtocol::MIDI_1_0)
734+
return {};
735+
736+
return createNewDevice (deviceName);
737+
}
738+
722739
MidiOutput::~MidiOutput()
723740
{
724741
stopBackgroundThread();
@@ -792,6 +809,13 @@ std::unique_ptr<MidiInput> MidiInput::openDevice (const String&,
792809

793810
std::unique_ptr<MidiInput> MidiInput::createNewDevice (const String&, MidiInputCallback*) { return {}; }
794811

812+
std::unique_ptr<MidiInput> MidiInput::createNewDevice (const String&,
813+
ump::PacketProtocol,
814+
ump::Receiver*)
815+
{
816+
return {};
817+
}
818+
795819
class MidiOutput::Pimpl
796820
{
797821
};
@@ -814,6 +838,8 @@ std::unique_ptr<MidiOutput> MidiOutput::openDevice (const String&, ump::PacketPr
814838

815839
std::unique_ptr<MidiOutput> MidiOutput::createNewDevice (const String&) { return {}; }
816840

841+
std::unique_ptr<MidiOutput> MidiOutput::createNewDevice (const String&, ump::PacketProtocol) { return {}; }
842+
817843
MidiDeviceListConnection MidiDeviceListConnection::make (std::function<void()> cb)
818844
{
819845
auto& broadcaster = MidiDeviceListConnectionBroadcaster::get();

modules/yup_audio_devices/native/yup_Midi_wasm.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ std::unique_ptr<MidiInput> MidiInput::openDevice (const String&,
5454

5555
std::unique_ptr<MidiInput> MidiInput::createNewDevice (const String&, MidiInputCallback*) { return {}; }
5656

57+
std::unique_ptr<MidiInput> MidiInput::createNewDevice (const String&,
58+
ump::PacketProtocol,
59+
ump::Receiver*)
60+
{
61+
return {};
62+
}
63+
5764
class MidiOutput::Pimpl
5865
{
5966
};
@@ -76,6 +83,8 @@ std::unique_ptr<MidiOutput> MidiOutput::openDevice (const String&, ump::PacketPr
7683

7784
std::unique_ptr<MidiOutput> MidiOutput::createNewDevice (const String&) { return {}; }
7885

86+
std::unique_ptr<MidiOutput> MidiOutput::createNewDevice (const String&, ump::PacketProtocol) { return {}; }
87+
7988
MidiDeviceListConnection MidiDeviceListConnection::make (std::function<void()> cb)
8089
{
8190
// MIDI is not implemented for WASM, so we return a no-op connection

0 commit comments

Comments
 (0)