libremidi update to v5.4.3 and added virtual midi out as default
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
#include <chrono>
|
||||
#include <functional>
|
||||
|
||||
namespace libremidi
|
||||
NAMESPACE_LIBREMIDI
|
||||
{
|
||||
|
||||
struct winmm_input_configuration
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
#include <libremidi/error.hpp>
|
||||
|
||||
namespace libremidi
|
||||
NAMESPACE_LIBREMIDI
|
||||
{
|
||||
|
||||
struct winmm_error_domain : public stdx::error_domain
|
||||
@@ -34,28 +34,50 @@ public:
|
||||
{
|
||||
switch (error_cast<int>(e))
|
||||
{
|
||||
case MMSYSERR_NOERROR: return "No error";
|
||||
case MMSYSERR_ERROR: return "Error";
|
||||
case MMSYSERR_BADDEVICEID: return "Bad device ID";
|
||||
case MMSYSERR_NOTENABLED: return "Not enabled";
|
||||
case MMSYSERR_ALLOCATED: return "Allocated";
|
||||
case MMSYSERR_INVALHANDLE: return "Invalid handle";
|
||||
case MMSYSERR_NODRIVER: return "No driver";
|
||||
case MMSYSERR_NOMEM: return "No memory";
|
||||
case MMSYSERR_NOTSUPPORTED: return "Not supported";
|
||||
case MMSYSERR_BADERRNUM: return "Bad errnum";
|
||||
case MMSYSERR_INVALFLAG: return "Invalid flag";
|
||||
case MMSYSERR_INVALPARAM: return "Invalid parameter";
|
||||
case MMSYSERR_HANDLEBUSY: return "Handle busy";
|
||||
case MMSYSERR_INVALIDALIAS: return "Invalid alias";
|
||||
case MMSYSERR_BADDB: return "Bad database";
|
||||
case MMSYSERR_KEYNOTFOUND: return "Key not found";
|
||||
case MMSYSERR_READERROR: return "Read error";
|
||||
case MMSYSERR_WRITEERROR: return "Write error";
|
||||
case MMSYSERR_DELETEERROR: return "Delete error";
|
||||
case MMSYSERR_VALNOTFOUND: return "Value not found";
|
||||
case MMSYSERR_NODRIVERCB: return "No driver callback";
|
||||
case MMSYSERR_MOREDATA: return "More data";
|
||||
case MMSYSERR_NOERROR:
|
||||
return "No error";
|
||||
case MMSYSERR_ERROR:
|
||||
return "Error";
|
||||
case MMSYSERR_BADDEVICEID:
|
||||
return "Bad device ID";
|
||||
case MMSYSERR_NOTENABLED:
|
||||
return "Not enabled";
|
||||
case MMSYSERR_ALLOCATED:
|
||||
return "Allocated";
|
||||
case MMSYSERR_INVALHANDLE:
|
||||
return "Invalid handle";
|
||||
case MMSYSERR_NODRIVER:
|
||||
return "No driver";
|
||||
case MMSYSERR_NOMEM:
|
||||
return "No memory";
|
||||
case MMSYSERR_NOTSUPPORTED:
|
||||
return "Not supported";
|
||||
case MMSYSERR_BADERRNUM:
|
||||
return "Bad errnum";
|
||||
case MMSYSERR_INVALFLAG:
|
||||
return "Invalid flag";
|
||||
case MMSYSERR_INVALPARAM:
|
||||
return "Invalid parameter";
|
||||
case MMSYSERR_HANDLEBUSY:
|
||||
return "Handle busy";
|
||||
case MMSYSERR_INVALIDALIAS:
|
||||
return "Invalid alias";
|
||||
case MMSYSERR_BADDB:
|
||||
return "Bad database";
|
||||
case MMSYSERR_KEYNOTFOUND:
|
||||
return "Key not found";
|
||||
case MMSYSERR_READERROR:
|
||||
return "Read error";
|
||||
case MMSYSERR_WRITEERROR:
|
||||
return "Write error";
|
||||
case MMSYSERR_DELETEERROR:
|
||||
return "Delete error";
|
||||
case MMSYSERR_VALNOTFOUND:
|
||||
return "Value not found";
|
||||
case MMSYSERR_NODRIVERCB:
|
||||
return "No driver callback";
|
||||
case MMSYSERR_MOREDATA:
|
||||
return "More data";
|
||||
}
|
||||
return "Unknown error code";
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
#pragma once
|
||||
#include <libremidi/backends/winmm/error_domain.hpp>
|
||||
#include <libremidi/detail/midi_api.hpp>
|
||||
#include <algorithm>
|
||||
|
||||
namespace libremidi
|
||||
#include <string>
|
||||
|
||||
NAMESPACE_LIBREMIDI
|
||||
{
|
||||
|
||||
// Convert a nullptr-terminated wide string or ANSI-encoded string to UTF-8.
|
||||
@@ -70,5 +71,4 @@ inline void MakeUniqueOutPortName(std::string& deviceName, std::size_t portNumbe
|
||||
deviceName += " ";
|
||||
deviceName += std::to_string(x);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <libremidi/detail/midi_in.hpp>
|
||||
#include <libremidi/detail/midi_stream_decoder.hpp>
|
||||
|
||||
namespace libremidi
|
||||
NAMESPACE_LIBREMIDI
|
||||
{
|
||||
|
||||
class midi_in_winmm final
|
||||
@@ -24,9 +24,7 @@ public:
|
||||
{
|
||||
if (!InitializeCriticalSectionAndSpinCount(&(this->_mutex), 0x00000400))
|
||||
{
|
||||
libremidi_handle_error(
|
||||
configuration,
|
||||
"InitializeCriticalSectionAndSpinCount failed.");
|
||||
libremidi_handle_error(configuration, "InitializeCriticalSectionAndSpinCount failed.");
|
||||
|
||||
this->client_open_ = std::errc::too_many_files_open;
|
||||
return;
|
||||
@@ -40,7 +38,7 @@ public:
|
||||
// Close a connection if it exists.
|
||||
midi_in_winmm::close_port();
|
||||
|
||||
if(this->client_open_ == stdx::error{})
|
||||
if (this->client_open_ == stdx::error{})
|
||||
DeleteCriticalSection(&(this->_mutex));
|
||||
}
|
||||
|
||||
@@ -53,8 +51,7 @@ public:
|
||||
std::bit_cast<DWORD_PTR>(this), CALLBACK_FUNCTION);
|
||||
if (result != MMSYSERR_NOERROR)
|
||||
{
|
||||
libremidi_handle_error(
|
||||
configuration, "error creating Windows MM MIDI input port.");
|
||||
libremidi_handle_error(configuration, "error creating Windows MM MIDI input port.");
|
||||
return from_mmerr(result);
|
||||
}
|
||||
|
||||
@@ -101,8 +98,7 @@ public:
|
||||
{
|
||||
midiInClose(this->inHandle);
|
||||
this->inHandle = nullptr;
|
||||
libremidi_handle_error(
|
||||
configuration, "error starting Windows MM MIDI input port.");
|
||||
libremidi_handle_error(configuration, "error starting Windows MM MIDI input port.");
|
||||
return from_mmerr(result);
|
||||
}
|
||||
|
||||
@@ -126,8 +122,7 @@ public:
|
||||
if (p.port_name == port.port_name)
|
||||
return do_open(port.port);
|
||||
}
|
||||
libremidi_handle_error(
|
||||
configuration, "port not found: " + p.port_name);
|
||||
libremidi_handle_error(configuration, "port not found: " + p.port_name);
|
||||
return std::errc::invalid_argument;
|
||||
}
|
||||
|
||||
@@ -238,13 +233,13 @@ private:
|
||||
{
|
||||
// Sysex message ( MIM_LONGDATA or MIM_LONGERROR )
|
||||
const auto* sysex = reinterpret_cast<MIDIHDR*>(midiMessage);
|
||||
if(inputStatus == MIM_LONGERROR)
|
||||
if (inputStatus == MIM_LONGERROR)
|
||||
{
|
||||
self.m_processing.reset();
|
||||
}
|
||||
else if (!self.configuration.ignore_sysex)
|
||||
{
|
||||
if(sysex->dwBytesRecorded > 0)
|
||||
if (sysex->dwBytesRecorded > 0)
|
||||
{
|
||||
const auto sysex_bytes = reinterpret_cast<uint8_t*>(sysex->lpData);
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <libremidi/backends/winmm/observer.hpp>
|
||||
#include <libremidi/detail/midi_out.hpp>
|
||||
|
||||
namespace libremidi
|
||||
NAMESPACE_LIBREMIDI
|
||||
{
|
||||
|
||||
class midi_out_winmm final
|
||||
@@ -65,8 +65,7 @@ public:
|
||||
if (p.port_name == port.port_name)
|
||||
return do_open(port.port);
|
||||
}
|
||||
libremidi_handle_error(
|
||||
configuration, "port not found: " + p.port_name);
|
||||
libremidi_handle_error(configuration, "port not found: " + p.port_name);
|
||||
return std::errc::invalid_argument;
|
||||
}
|
||||
|
||||
@@ -107,8 +106,7 @@ public:
|
||||
auto result = midiOutPrepareHeader(this->outHandle, &sysex, sizeof(MIDIHDR));
|
||||
if (result != MMSYSERR_NOERROR)
|
||||
{
|
||||
libremidi_handle_error(
|
||||
configuration, "error preparing sysex header.");
|
||||
libremidi_handle_error(configuration, "error preparing sysex header.");
|
||||
return from_mmerr(result);
|
||||
}
|
||||
|
||||
@@ -116,8 +114,7 @@ public:
|
||||
result = midiOutLongMsg(this->outHandle, &sysex, sizeof(MIDIHDR));
|
||||
if (result != MMSYSERR_NOERROR)
|
||||
{
|
||||
libremidi_handle_error(
|
||||
configuration, "error sending sysex message.");
|
||||
libremidi_handle_error(configuration, "error sending sysex message.");
|
||||
return from_mmerr(result);
|
||||
}
|
||||
|
||||
@@ -148,8 +145,7 @@ public:
|
||||
auto result = midiOutShortMsg(this->outHandle, packet);
|
||||
if (result != MMSYSERR_NOERROR)
|
||||
{
|
||||
libremidi_handle_error(
|
||||
configuration, "error sending MIDI message.");
|
||||
libremidi_handle_error(configuration, "error sending MIDI message.");
|
||||
return from_mmerr(result);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,12 +3,9 @@
|
||||
#include <libremidi/backends/winmm/helpers.hpp>
|
||||
#include <libremidi/detail/observer.hpp>
|
||||
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
#include <ranges>
|
||||
#include <thread>
|
||||
|
||||
namespace libremidi
|
||||
NAMESPACE_LIBREMIDI
|
||||
{
|
||||
|
||||
class observer_winmm : public observer_api
|
||||
@@ -106,8 +103,12 @@ protected:
|
||||
auto rawName = ConvertToUTF8(deviceCaps.szPname);
|
||||
auto portName = rawName;
|
||||
MakeUniqueInPortName(portName, index);
|
||||
|
||||
return {
|
||||
{.client = 0,
|
||||
{.api = libremidi::API::WINDOWS_MM,
|
||||
.client = 0,
|
||||
.device
|
||||
= usb_device_identifier{.vendor_id = deviceCaps.wMid, .product_id = deviceCaps.wPid},
|
||||
.port = index,
|
||||
.manufacturer = "",
|
||||
.device_name = "",
|
||||
@@ -123,8 +124,12 @@ protected:
|
||||
auto rawName = ConvertToUTF8(deviceCaps.szPname);
|
||||
auto portName = rawName;
|
||||
MakeUniqueOutPortName(portName, index);
|
||||
|
||||
return {
|
||||
{.client = 0,
|
||||
{.api = libremidi::API::WINDOWS_MM,
|
||||
.client = 0,
|
||||
.device
|
||||
= usb_device_identifier{.vendor_id = deviceCaps.wMid, .product_id = deviceCaps.wPid},
|
||||
.port = index,
|
||||
.manufacturer = "",
|
||||
.device_name = "",
|
||||
@@ -167,7 +172,7 @@ protected:
|
||||
|
||||
#if __has_include(<stop_token>) && __cpp_lib_jthread >= 201911L
|
||||
#include <stop_token>
|
||||
namespace libremidi::winmm
|
||||
NAMESPACE_LIBREMIDI::winmm
|
||||
{
|
||||
class observer_threaded final : public observer_winmm
|
||||
{
|
||||
@@ -197,7 +202,7 @@ private:
|
||||
#else
|
||||
#include <atomic>
|
||||
#include <semaphore>
|
||||
namespace libremidi::winmm
|
||||
NAMESPACE_LIBREMIDI::winmm
|
||||
{
|
||||
class observer_threaded final : public observer_winmm
|
||||
{
|
||||
@@ -237,7 +242,7 @@ private:
|
||||
}
|
||||
#endif
|
||||
|
||||
namespace libremidi::winmm
|
||||
NAMESPACE_LIBREMIDI::winmm
|
||||
{
|
||||
class observer_manual final : public observer_winmm
|
||||
{
|
||||
@@ -257,7 +262,7 @@ public:
|
||||
~observer_manual() { }
|
||||
};
|
||||
}
|
||||
namespace libremidi
|
||||
NAMESPACE_LIBREMIDI
|
||||
{
|
||||
template <>
|
||||
inline std::unique_ptr<observer_api> make<observer_winmm>(
|
||||
|
||||
Reference in New Issue
Block a user