cs-midi/MIDI_Interfaces/AppleMIDI_Interface.hpp

64 lines
1.7 KiB
C++

#pragma once
#include "MIDI_Interface.hpp"
#include <MIDI_Parsers/SerialMIDI_Parser.hpp>
#include "AppleMIDI/LwIPUDP.hpp"
#include "AppleMIDI/vendor/AppleMIDI.h"
BEGIN_CS_NAMESPACE
using AppleMIDISession_t = APPLEMIDI_NAMESPACE::AppleMIDISession<LwIPUDP>;
struct AppleMIDIBytePuller {
AppleMIDISession_t &session;
bool pull(uint8_t &byte) {
if (session.available() == 0)
return false;
byte = session.read();
return true;
}
};
class AppleMIDI_Interface : public MIDI_Interface {
public:
/// @param name Session name visible in macOS Audio MIDI Setup
/// @param port AppleMIDI control port (data port = port + 1)
AppleMIDI_Interface(const char *name = "PicoW", uint16_t port = 5004);
void begin() override;
void update() override;
MIDIReadEvent read();
ChannelMessage getChannelMessage() const;
SysCommonMessage getSysCommonMessage() const;
RealTimeMessage getRealTimeMessage() const;
SysExMessage getSysExMessage() const;
/// Must be called after WiFi is connected but before begin()
void setName(const char *name) { sessionName_ = name; }
protected:
void sendChannelMessageImpl(ChannelMessage msg) override;
void sendSysCommonImpl(SysCommonMessage msg) override;
void sendSysExImpl(SysExMessage msg) override;
void sendRealTimeImpl(RealTimeMessage msg) override;
void sendNowImpl() override {}
private:
#if !DISABLE_PIPES
void handleStall() override { MIDI_Interface::handleStall(this); }
#ifdef DEBUG_OUT
const char *getName() const override { return "applemidi"; }
#endif
#endif
void initMDNS();
AppleMIDISession_t session_;
SerialMIDI_Parser parser_;
const char *sessionName_;
uint16_t port_;
};
END_CS_NAMESPACE