diff --git a/src/midikeyboard.cpp b/src/midikeyboard.cpp index 2eae9d8..db71168 100644 --- a/src/midikeyboard.cpp +++ b/src/midikeyboard.cpp @@ -25,25 +25,12 @@ #include #include -CMIDIKeyboard *CMIDIKeyboard::s_pThis[MaxInstances] = {0}; - -TMIDIPacketHandler * const CMIDIKeyboard::s_pMIDIPacketHandler[MaxInstances] = -{ - MIDIPacketHandler0, - MIDIPacketHandler1, - MIDIPacketHandler2, - MIDIPacketHandler3 -}; - CMIDIKeyboard::CMIDIKeyboard (CMiniDexed *pSynthesizer, CConfig *pConfig, CUserInterface *pUI, unsigned nInstance) : CMIDIDevice (pSynthesizer, pConfig, pUI), m_nSysExIdx (0), m_nInstance (nInstance), m_pMIDIDevice (0) { - assert (m_nInstance < MaxInstances); - s_pThis[m_nInstance] = this; - m_DeviceName.Format ("umidi%u", nInstance+1); AddDevice (m_DeviceName); @@ -51,8 +38,6 @@ CMIDIKeyboard::CMIDIKeyboard (CMiniDexed *pSynthesizer, CConfig *pConfig, CUserI CMIDIKeyboard::~CMIDIKeyboard (void) { - assert (m_nInstance < MaxInstances); - s_pThis[m_nInstance] = 0; } void CMIDIKeyboard::Process (boolean bPlugAndPlayUpdated) @@ -81,8 +66,7 @@ void CMIDIKeyboard::Process (boolean bPlugAndPlayUpdated) (CUSBMIDIDevice *) CDeviceNameService::Get ()->GetDevice (m_DeviceName, FALSE); if (m_pMIDIDevice != 0) { - assert (m_nInstance < MaxInstances); - m_pMIDIDevice->RegisterPacketHandler (s_pMIDIPacketHandler[m_nInstance]); + m_pMIDIDevice->RegisterPacketHandler (MIDIPacketHandler, this); m_pMIDIDevice->RegisterRemovedHandler (DeviceRemovedHandler, this); } @@ -104,8 +88,10 @@ void CMIDIKeyboard::Send (const u8 *pMessage, size_t nLength, unsigned nCable) // Most packets will be passed straight onto the main MIDI message handler // but SysEx messages are multiple USB packets and so will need building up // before parsing. -void CMIDIKeyboard::USBMIDIMessageHandler (u8 *pPacket, unsigned nLength, unsigned nCable) +void CMIDIKeyboard::USBMIDIMessageHandler (u8 *pPacket, unsigned nLength, unsigned nCable, unsigned nDevice) { + assert (nDevice == m_nInstance + 1); + if ((pPacket[0] == 0xF0) && (m_nSysExIdx == 0)) { // Start of SysEx message @@ -159,28 +145,12 @@ void CMIDIKeyboard::USBMIDIMessageHandler (u8 *pPacket, unsigned nLength, unsign } } -void CMIDIKeyboard::MIDIPacketHandler0 (unsigned nCable, u8 *pPacket, unsigned nLength) -{ - assert (s_pThis[0] != 0); - s_pThis[0]->USBMIDIMessageHandler (pPacket, nLength, nCable); -} - -void CMIDIKeyboard::MIDIPacketHandler1 (unsigned nCable, u8 *pPacket, unsigned nLength) -{ - assert (s_pThis[1] != 0); - s_pThis[1]->USBMIDIMessageHandler (pPacket, nLength, nCable); -} - -void CMIDIKeyboard::MIDIPacketHandler2 (unsigned nCable, u8 *pPacket, unsigned nLength) +void CMIDIKeyboard::MIDIPacketHandler (unsigned nCable, u8 *pPacket, unsigned nLength, unsigned nDevice, void *pParam) { - assert (s_pThis[2] != 0); - s_pThis[2]->USBMIDIMessageHandler (pPacket, nLength, nCable); -} + CMIDIKeyboard *pThis = static_cast (pParam); + assert (pThis != 0); -void CMIDIKeyboard::MIDIPacketHandler3 (unsigned nCable, u8 *pPacket, unsigned nLength) -{ - assert (s_pThis[3] != 0); - s_pThis[3]->USBMIDIMessageHandler (pPacket, nLength, nCable); + pThis->USBMIDIMessageHandler (pPacket, nLength, nCable, nDevice); } void CMIDIKeyboard::DeviceRemovedHandler (CDevice *pDevice, void *pContext) diff --git a/src/midikeyboard.h b/src/midikeyboard.h index 047fa52..bf62689 100644 --- a/src/midikeyboard.h +++ b/src/midikeyboard.h @@ -37,9 +37,6 @@ class CMiniDexed; class CMIDIKeyboard : public CMIDIDevice { -public: - static const unsigned MaxInstances = 4; - public: CMIDIKeyboard (CMiniDexed *pSynthesizer, CConfig *pConfig, CUserInterface *pUI, unsigned nInstance = 0); ~CMIDIKeyboard (void); @@ -49,14 +46,10 @@ public: void Send (const u8 *pMessage, size_t nLength, unsigned nCable = 0) override; private: - static void MIDIPacketHandler0 (unsigned nCable, u8 *pPacket, unsigned nLength); - static void MIDIPacketHandler1 (unsigned nCable, u8 *pPacket, unsigned nLength); - static void MIDIPacketHandler2 (unsigned nCable, u8 *pPacket, unsigned nLength); - static void MIDIPacketHandler3 (unsigned nCable, u8 *pPacket, unsigned nLength); - + static void MIDIPacketHandler (unsigned nCable, u8 *pPacket, unsigned nLength, unsigned nDevice, void *pParam); static void DeviceRemovedHandler (CDevice *pDevice, void *pContext); - void USBMIDIMessageHandler (u8 *pPacket, unsigned nLength, unsigned nCable); + void USBMIDIMessageHandler (u8 *pPacket, unsigned nLength, unsigned nCable, unsigned nDevice); private: struct TSendQueueEntry @@ -75,11 +68,6 @@ private: CUSBMIDIDevice * volatile m_pMIDIDevice; std::queue m_SendQueue; - - static CMIDIKeyboard *s_pThis[MaxInstances]; - - static TMIDIPacketHandler * const s_pMIDIPacketHandler[MaxInstances]; - }; #endif