register MIDI packet handlers as TMIDIPacketHandlerEx (#769)

There is a new RegisterPacketHandler function that can save a pointer, eliminating the need to write multiple packet handler functions.
pull/775/head
soyer 2 months ago committed by GitHub
parent 45529b5d44
commit 0ae7b26b97
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 46
      src/midikeyboard.cpp
  2. 16
      src/midikeyboard.h

@ -25,25 +25,12 @@
#include <cstring> #include <cstring>
#include <assert.h> #include <assert.h>
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) CMIDIKeyboard::CMIDIKeyboard (CMiniDexed *pSynthesizer, CConfig *pConfig, CUserInterface *pUI, unsigned nInstance)
: CMIDIDevice (pSynthesizer, pConfig, pUI), : CMIDIDevice (pSynthesizer, pConfig, pUI),
m_nSysExIdx (0), m_nSysExIdx (0),
m_nInstance (nInstance), m_nInstance (nInstance),
m_pMIDIDevice (0) m_pMIDIDevice (0)
{ {
assert (m_nInstance < MaxInstances);
s_pThis[m_nInstance] = this;
m_DeviceName.Format ("umidi%u", nInstance+1); m_DeviceName.Format ("umidi%u", nInstance+1);
AddDevice (m_DeviceName); AddDevice (m_DeviceName);
@ -51,8 +38,6 @@ CMIDIKeyboard::CMIDIKeyboard (CMiniDexed *pSynthesizer, CConfig *pConfig, CUserI
CMIDIKeyboard::~CMIDIKeyboard (void) CMIDIKeyboard::~CMIDIKeyboard (void)
{ {
assert (m_nInstance < MaxInstances);
s_pThis[m_nInstance] = 0;
} }
void CMIDIKeyboard::Process (boolean bPlugAndPlayUpdated) void CMIDIKeyboard::Process (boolean bPlugAndPlayUpdated)
@ -81,8 +66,7 @@ void CMIDIKeyboard::Process (boolean bPlugAndPlayUpdated)
(CUSBMIDIDevice *) CDeviceNameService::Get ()->GetDevice (m_DeviceName, FALSE); (CUSBMIDIDevice *) CDeviceNameService::Get ()->GetDevice (m_DeviceName, FALSE);
if (m_pMIDIDevice != 0) if (m_pMIDIDevice != 0)
{ {
assert (m_nInstance < MaxInstances); m_pMIDIDevice->RegisterPacketHandler (MIDIPacketHandler, this);
m_pMIDIDevice->RegisterPacketHandler (s_pMIDIPacketHandler[m_nInstance]);
m_pMIDIDevice->RegisterRemovedHandler (DeviceRemovedHandler, 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 // 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 // but SysEx messages are multiple USB packets and so will need building up
// before parsing. // 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)) if ((pPacket[0] == 0xF0) && (m_nSysExIdx == 0))
{ {
// Start of SysEx message // 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) void CMIDIKeyboard::MIDIPacketHandler (unsigned nCable, u8 *pPacket, unsigned nLength, unsigned nDevice, void *pParam)
{
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)
{ {
assert (s_pThis[2] != 0); CMIDIKeyboard *pThis = static_cast<CMIDIKeyboard *> (pParam);
s_pThis[2]->USBMIDIMessageHandler (pPacket, nLength, nCable); assert (pThis != 0);
}
void CMIDIKeyboard::MIDIPacketHandler3 (unsigned nCable, u8 *pPacket, unsigned nLength) pThis->USBMIDIMessageHandler (pPacket, nLength, nCable, nDevice);
{
assert (s_pThis[3] != 0);
s_pThis[3]->USBMIDIMessageHandler (pPacket, nLength, nCable);
} }
void CMIDIKeyboard::DeviceRemovedHandler (CDevice *pDevice, void *pContext) void CMIDIKeyboard::DeviceRemovedHandler (CDevice *pDevice, void *pContext)

@ -37,9 +37,6 @@ class CMiniDexed;
class CMIDIKeyboard : public CMIDIDevice class CMIDIKeyboard : public CMIDIDevice
{ {
public:
static const unsigned MaxInstances = 4;
public: public:
CMIDIKeyboard (CMiniDexed *pSynthesizer, CConfig *pConfig, CUserInterface *pUI, unsigned nInstance = 0); CMIDIKeyboard (CMiniDexed *pSynthesizer, CConfig *pConfig, CUserInterface *pUI, unsigned nInstance = 0);
~CMIDIKeyboard (void); ~CMIDIKeyboard (void);
@ -49,14 +46,10 @@ public:
void Send (const u8 *pMessage, size_t nLength, unsigned nCable = 0) override; void Send (const u8 *pMessage, size_t nLength, unsigned nCable = 0) override;
private: private:
static void MIDIPacketHandler0 (unsigned nCable, u8 *pPacket, unsigned nLength); static void MIDIPacketHandler (unsigned nCable, u8 *pPacket, unsigned nLength, unsigned nDevice, void *pParam);
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 DeviceRemovedHandler (CDevice *pDevice, void *pContext); 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: private:
struct TSendQueueEntry struct TSendQueueEntry
@ -75,11 +68,6 @@ private:
CUSBMIDIDevice * volatile m_pMIDIDevice; CUSBMIDIDevice * volatile m_pMIDIDevice;
std::queue<TSendQueueEntry> m_SendQueue; std::queue<TSendQueueEntry> m_SendQueue;
static CMIDIKeyboard *s_pThis[MaxInstances];
static TMIDIPacketHandler * const s_pMIDIPacketHandler[MaxInstances];
}; };
#endif #endif

Loading…
Cancel
Save