libremidi update to v5.4.3 and added virtual midi out as default

This commit is contained in:
Sebastian
2026-06-23 00:05:41 +02:00
parent dc0003232a
commit 51cd271b6f
166 changed files with 8135 additions and 2009 deletions
+1 -1
View File
@@ -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";
}
+3 -3
View File
@@ -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);
}
}
+8 -13
View File
@@ -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);
}
}
+15 -10
View File
@@ -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>(