Skip to content

Commit

Permalink
register MIDI packet handlers as TMIDIPacketHandlerEx (#769)
Browse files Browse the repository at this point in the history
There is a new RegisterPacketHandler function that can save a pointer, eliminating the need to write multiple packet handler functions.
  • Loading branch information
soyersoyer authored Dec 3, 2024
1 parent 45529b5 commit 0ae7b26
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 52 deletions.
46 changes: 8 additions & 38 deletions src/midikeyboard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,34 +25,19 @@
#include <cstring>
#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)
: 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);
}

CMIDIKeyboard::~CMIDIKeyboard (void)
{
assert (m_nInstance < MaxInstances);
s_pThis[m_nInstance] = 0;
}

void CMIDIKeyboard::Process (boolean bPlugAndPlayUpdated)
Expand Down Expand Up @@ -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);
}
Expand All @@ -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
Expand Down Expand Up @@ -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<CMIDIKeyboard *> (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)
Expand Down
16 changes: 2 additions & 14 deletions src/midikeyboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -49,14 +46,10 @@ class CMIDIKeyboard : public CMIDIDevice
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
Expand All @@ -75,11 +68,6 @@ class CMIDIKeyboard : public CMIDIDevice
CUSBMIDIDevice * volatile m_pMIDIDevice;

std::queue<TSendQueueEntry> m_SendQueue;

static CMIDIKeyboard *s_pThis[MaxInstances];

static TMIDIPacketHandler * const s_pMIDIPacketHandler[MaxInstances];

};

#endif

0 comments on commit 0ae7b26

Please sign in to comment.