ALSA MIDI fixes

This commit is contained in:
Jack Andersen
2018-08-18 14:28:00 -10:00
parent 5e58e989a8
commit 168fb3f516
4 changed files with 91 additions and 27 deletions

View File

@@ -76,6 +76,9 @@ struct IAudioVoiceEngine
/** Get list of MIDI input devices found on system */
virtual std::vector<std::pair<std::string, std::string>> enumerateMIDIInputs() const=0;
/** Query if system supports creating a virtual MIDI input */
virtual bool supportsVirtualMIDIIn() const=0;
/** Create ad-hoc MIDI in port and register with system */
virtual std::unique_ptr<IMIDIIn> newVirtualMIDIIn(ReceiveFunctor&& receiver)=0;

View File

@@ -8,18 +8,20 @@
namespace boo
{
struct IAudioVoiceEngine;
using ReceiveFunctor = std::function<void(std::vector<uint8_t>&&, double time)>;
class IMIDIPort
{
bool m_virtual;
protected:
IMIDIPort(bool virt) : m_virtual(virt) {}
IAudioVoiceEngine* m_parent;
IMIDIPort(IAudioVoiceEngine* parent, bool virt) : m_virtual(virt), m_parent(parent) {}
public:
virtual ~IMIDIPort();
bool isVirtual() const {return m_virtual;}
virtual std::string description() const=0;
void _disown() { m_parent = nullptr; }
};
class IMIDIReceiver
@@ -32,8 +34,8 @@ public:
class IMIDIIn : public IMIDIPort, public IMIDIReceiver
{
protected:
IMIDIIn(bool virt, ReceiveFunctor&& receiver)
: IMIDIPort(virt), IMIDIReceiver(std::move(receiver)) {}
IMIDIIn(IAudioVoiceEngine* parent, bool virt, ReceiveFunctor&& receiver)
: IMIDIPort(parent, virt), IMIDIReceiver(std::move(receiver)) {}
public:
virtual ~IMIDIIn();
};
@@ -41,7 +43,7 @@ public:
class IMIDIOut : public IMIDIPort
{
protected:
IMIDIOut(bool virt) : IMIDIPort(virt) {}
IMIDIOut(IAudioVoiceEngine* parent, bool virt) : IMIDIPort(parent, virt) {}
public:
virtual ~IMIDIOut();
virtual size_t send(const void* buf, size_t len) const=0;
@@ -50,8 +52,8 @@ public:
class IMIDIInOut : public IMIDIPort, public IMIDIReceiver
{
protected:
IMIDIInOut(bool virt, ReceiveFunctor&& receiver)
: IMIDIPort(virt), IMIDIReceiver(std::move(receiver)) {}
IMIDIInOut(IAudioVoiceEngine* parent, bool virt, ReceiveFunctor&& receiver)
: IMIDIPort(parent, virt), IMIDIReceiver(std::move(receiver)) {}
public:
virtual ~IMIDIInOut();
virtual size_t send(const void* buf, size_t len) const=0;