You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-22 15:06:45 +00:00
Move MIDI parsing up from ALSA driver to platform independent driver.
Aims for more consistent MIDI support across Windows, MacOS, Linux and to provide a base for adding MIDI drivers for other platforms. Reworks the MIDIDriverALSAMidi MIDI parsing implementation as a platform independent version in MIDIDriver::Parser. Uses MIDIDriver::Parser to provide running status support in MacOS MIDIDriverCoreMidi. Collects connected input names at open, ensuring devices indices reported in events match names in array returned from get_connected_inputs. Fixes #77035. Fixes #79811. With code review changes by: A Thousand Ships (she/her) <96648715+AThousandShips@users.noreply.github.com>
This commit is contained in:
@@ -36,26 +36,42 @@
|
||||
|
||||
void MIDIDriverWinMidi::read(HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
|
||||
if (wMsg == MIM_DATA) {
|
||||
receive_input_packet((int)dwInstance, (uint64_t)dwParam2, (uint8_t *)&dwParam1, 3);
|
||||
// For MIM_DATA: dwParam1 = wMidiMessage, dwParam2 = dwTimestamp.
|
||||
// Windows implementation has already unpacked running status and dropped any SysEx,
|
||||
// so we can just forward straight to the event.
|
||||
const uint8_t *midi_msg = (uint8_t *)&dwParam1;
|
||||
send_event((int)dwInstance, midi_msg[0], &midi_msg[1], 2);
|
||||
}
|
||||
}
|
||||
|
||||
Error MIDIDriverWinMidi::open() {
|
||||
int device_index = 0;
|
||||
for (UINT i = 0; i < midiInGetNumDevs(); i++) {
|
||||
HMIDIIN midi_in;
|
||||
MIDIINCAPS caps;
|
||||
|
||||
MMRESULT res = midiInOpen(&midi_in, i, (DWORD_PTR)read, (DWORD_PTR)i, CALLBACK_FUNCTION);
|
||||
if (res == MMSYSERR_NOERROR) {
|
||||
MMRESULT open_res = midiInOpen(&midi_in, i, (DWORD_PTR)read,
|
||||
(DWORD_PTR)device_index, CALLBACK_FUNCTION);
|
||||
MMRESULT caps_res = midiInGetDevCaps(i, &caps, sizeof(MIDIINCAPS));
|
||||
|
||||
if (open_res == MMSYSERR_NOERROR) {
|
||||
midiInStart(midi_in);
|
||||
connected_sources.insert(i, midi_in);
|
||||
connected_sources.push_back(midi_in);
|
||||
if (caps_res == MMSYSERR_NOERROR) {
|
||||
connected_input_names.push_back(caps.szPname);
|
||||
} else {
|
||||
// Should push something even if we don't get a name,
|
||||
// so that the IDs line up correctly on the script side.
|
||||
connected_input_names.push_back("ERROR");
|
||||
}
|
||||
// Only increment device index for successfully connected devices.
|
||||
device_index++;
|
||||
} else {
|
||||
char err[256];
|
||||
midiInGetErrorText(res, err, 256);
|
||||
midiInGetErrorText(open_res, err, 256);
|
||||
ERR_PRINT("midiInOpen error: " + String(err));
|
||||
|
||||
MIDIINCAPS caps;
|
||||
res = midiInGetDevCaps(i, &caps, sizeof(MIDIINCAPS));
|
||||
if (res == MMSYSERR_NOERROR) {
|
||||
if (caps_res == MMSYSERR_NOERROR) {
|
||||
ERR_PRINT("Can't open MIDI device \"" + String(caps.szPname) + "\", is it being used by another application?");
|
||||
}
|
||||
}
|
||||
@@ -64,25 +80,6 @@ Error MIDIDriverWinMidi::open() {
|
||||
return OK;
|
||||
}
|
||||
|
||||
PackedStringArray MIDIDriverWinMidi::get_connected_inputs() {
|
||||
PackedStringArray list;
|
||||
|
||||
for (int i = 0; i < connected_sources.size(); i++) {
|
||||
HMIDIIN midi_in = connected_sources[i];
|
||||
UINT id = 0;
|
||||
MMRESULT res = midiInGetID(midi_in, &id);
|
||||
if (res == MMSYSERR_NOERROR) {
|
||||
MIDIINCAPS caps;
|
||||
res = midiInGetDevCaps(i, &caps, sizeof(MIDIINCAPS));
|
||||
if (res == MMSYSERR_NOERROR) {
|
||||
list.push_back(caps.szPname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
void MIDIDriverWinMidi::close() {
|
||||
for (int i = 0; i < connected_sources.size(); i++) {
|
||||
HMIDIIN midi_in = connected_sources[i];
|
||||
@@ -90,9 +87,7 @@ void MIDIDriverWinMidi::close() {
|
||||
midiInClose(midi_in);
|
||||
}
|
||||
connected_sources.clear();
|
||||
}
|
||||
|
||||
MIDIDriverWinMidi::MIDIDriverWinMidi() {
|
||||
connected_input_names.clear();
|
||||
}
|
||||
|
||||
MIDIDriverWinMidi::~MIDIDriverWinMidi() {
|
||||
|
||||
Reference in New Issue
Block a user