Skip to content

Commit 09d7397

Browse files
committed
Add support for multiple devices
1 parent f058359 commit 09d7397

File tree

2 files changed

+36
-19
lines changed

2 files changed

+36
-19
lines changed

src/sound/asio/sound.cpp

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,34 +1239,49 @@ int64_t CSound::Flip64Bits ( const int64_t iIn )
12391239
// Windows Native MIDI support
12401240
void CSound::MidiStart()
12411241
{
1242-
midiPort = 0; // might want to make this settable, Windows allocates device numbers in order
1243-
1244-
MMRESULT result = midiInOpen ( &hMidiIn, midiPort, (DWORD_PTR) MidiCallback, 0, CALLBACK_FUNCTION );
1245-
1246-
if ( result != MMSYSERR_NOERROR )
1242+
/* Get the number of MIDI In devices in this computer */
1243+
iMidiDevs = midiInGetNumDevs();
1244+
if ( iMidiDevs > MAX_MIDI_DEVS )
12471245
{
1248-
qWarning() << "! Failed to open MIDI input device. Error code: " << result;
1249-
hMidiIn = 0;
1250-
return;
1246+
iMidiDevs = MAX_MIDI_DEVS;
12511247
}
12521248

1253-
result = midiInStart ( hMidiIn );
1254-
if ( result != MMSYSERR_NOERROR )
1249+
// printf("Found %d MIDI device%s\n", iMidiDevs, iMidiDevs == 1 ? "" : "s");
1250+
1251+
// open all connected MIDI devices and set the callback function to handle incoming messages
1252+
for ( int i = 0; i < iMidiDevs; i++ )
12551253
{
1256-
qWarning() << "! Failed to start MIDI input. Error code: " << result;
1257-
midiInClose ( hMidiIn );
1258-
hMidiIn = 0;
1259-
return;
1254+
MMRESULT result = midiInOpen ( &hMidiIn[i], i, (DWORD_PTR) MidiCallback, 0, CALLBACK_FUNCTION );
1255+
1256+
if ( result != MMSYSERR_NOERROR )
1257+
{
1258+
qWarning() << "! Failed to open MIDI input device. Error code: " << result;
1259+
hMidiIn[i] = 0;
1260+
return;
1261+
}
1262+
1263+
result = midiInStart ( hMidiIn[i] );
1264+
1265+
if ( result != MMSYSERR_NOERROR )
1266+
{
1267+
qWarning() << "! Failed to start MIDI input. Error code: " << result;
1268+
midiInClose ( hMidiIn[i] );
1269+
hMidiIn[i] = 0;
1270+
return;
1271+
}
12601272
}
12611273
}
12621274

12631275
void CSound::MidiStop()
12641276
{
12651277
// stop MIDI if running
1266-
if ( hMidiIn != 0 )
1278+
for ( int i = 0; i < iMidiDevs; i++ )
12671279
{
1268-
midiInStop ( hMidiIn );
1269-
midiInClose ( hMidiIn );
1280+
if ( hMidiIn[i] != 0 )
1281+
{
1282+
midiInStop ( hMidiIn[i] );
1283+
midiInClose ( hMidiIn[i] );
1284+
}
12701285
}
12711286
}
12721287

src/sound/asio/sound.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,10 @@ class CSound : public CSoundBase
136136
char* cDriverNames[MAX_NUMBER_SOUND_CARDS];
137137

138138
// Windows native MIDI
139-
HMIDIIN hMidiIn; // windows handle
140-
UINT midiPort;
139+
#define MAX_MIDI_DEVS 4
140+
141+
int iMidiDevs;
142+
HMIDIIN hMidiIn[MAX_MIDI_DEVS]; // windows handles
141143

142144
void MidiStart();
143145
void MidiStop();

0 commit comments

Comments
 (0)