64 lines
1.7 KiB
C++
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
|