Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion examples/lookup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ void lookup_api(libremidi::API api, const libremidi::input_port& searched)
{
// Check inputs.
auto ports = midi.get_input_ports();
auto res = libremidi::find_closest_port(searched, ports);
auto res
= libremidi::find_closest_port(searched, std::span<const libremidi::input_port>(ports));
if (res.found) {
std::cout << "Found: " << *res.port << "\n";
}
Expand Down
8 changes: 4 additions & 4 deletions examples/utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ inline std::ostream& operator<<(std::ostream& s, const libremidi::container_iden
void operator()(libremidi::uuid u) { s << "uuid"; }
void operator()(std::string u) { s << u; }
void operator()(uint64_t u) { s << u; }
void operator()(std::monostate) { }
void operator()(libremidi::monostate) { }
} vis{s};
std::visit(vis, id);
visit(vis, id);
return s;
}

Expand All @@ -73,9 +73,9 @@ inline std::ostream& operator<<(std::ostream& s, const libremidi::device_identif
<< std::setfill('0') << std::setw(4) << (res & 0x0000FFFF);
s.flags(f);
}
void operator()(std::monostate) { }
void operator()(libremidi::monostate) { }
} vis{s};
std::visit(vis, id);
visit(vis, id);
return s;
}

Expand Down
6 changes: 3 additions & 3 deletions include/libremidi/backends.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ auto for_backend(libremidi::API api, F&& f)
void for_input_configuration(auto f, libremidi::input_api_configuration& api_conf)
{
auto from_api = [&]<typename T>(T& /*backend*/) mutable {
if (auto conf = std::get_if<typename T::midi_in_configuration>(&api_conf))
if (auto conf = get_if<typename T::midi_in_configuration>(&api_conf))
{
f(*conf);
return true;
Expand All @@ -249,7 +249,7 @@ void for_input_configuration(auto f, libremidi::input_api_configuration& api_con
void for_output_configuration(auto f, libremidi::output_api_configuration& api_conf)
{
auto from_api = [&]<typename T>(T& /*backend*/) mutable {
if (auto conf = std::get_if<typename T::midi_out_configuration>(&api_conf))
if (auto conf = get_if<typename T::midi_out_configuration>(&api_conf))
{
f(*conf);
return true;
Expand All @@ -264,7 +264,7 @@ void for_output_configuration(auto f, libremidi::output_api_configuration& api_c
void for_observer_configuration(auto f, libremidi::observer_api_configuration& api_conf)
{
auto from_api = [&]<typename T>(T& /*backend*/) mutable {
if (auto conf = std::get_if<typename T::midi_observer_configuration>(&api_conf))
if (auto conf = get_if<typename T::midi_observer_configuration>(&api_conf))
{
f(*conf);
return true;
Expand Down
6 changes: 3 additions & 3 deletions include/libremidi/backends/alsa_seq/shared_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,13 +127,13 @@ struct shared_handler : public libremidi::shared_context
{
case callback_added: {
auto [addr, cb]
= std::move(*std::get_if<libremidi::alsa_seq::poll_parameters>(&ev.payload));
= std::move(*get_if<libremidi::alsa_seq::poll_parameters>(&ev.payload));
addresses.push_back(addr);
callbacks.push_back(std::move(cb));
break;
}
case callback_removed:
auto addr = *std::get_if<snd_seq_addr_t>(&ev.payload);
auto addr = *get_if<snd_seq_addr_t>(&ev.payload);
if (auto index = index_of_address(addr); index >= 0)
{
addresses.erase(addresses.begin() + index);
Expand Down Expand Up @@ -179,7 +179,7 @@ struct shared_handler : public libremidi::shared_context
struct event
{
event_type type;
std::variant<libremidi::alsa_seq::poll_parameters, snd_seq_addr_t> payload;
libremidi_variant_alias::variant<libremidi::alsa_seq::poll_parameters, snd_seq_addr_t> payload;
};

snd_seq_t* client{};
Expand Down
12 changes: 5 additions & 7 deletions include/libremidi/backends/jack/shared_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,11 +70,10 @@ struct shared_handler : public libremidi::shared_context
switch (ev.type)
{
case in_callback_added:
midiin_callbacks.push_back(
std::move(*std::get_if<libremidi::jack_callback>(&ev.payload)));
midiin_callbacks.push_back(std::move(*get_if<libremidi::jack_callback>(&ev.payload)));
break;
case in_callback_removed: {
auto idx = *std::get_if<int64_t>(&ev.payload);
auto idx = *get_if<int64_t>(&ev.payload);
for (auto it = midiin_callbacks.begin(); it != midiin_callbacks.end();)
{
if (it->token == idx)
Expand All @@ -90,11 +89,10 @@ struct shared_handler : public libremidi::shared_context
break;
}
case out_callback_added:
midiout_callbacks.push_back(
std::move(*std::get_if<libremidi::jack_callback>(&ev.payload)));
midiout_callbacks.push_back(std::move(*get_if<libremidi::jack_callback>(&ev.payload)));
break;
case out_callback_removed:
auto idx = *std::get_if<int64_t>(&ev.payload);
auto idx = *get_if<int64_t>(&ev.payload);
for (auto it = midiout_callbacks.begin(); it != midiout_callbacks.end();)
{
if (it->token == idx)
Expand Down Expand Up @@ -138,7 +136,7 @@ struct shared_handler : public libremidi::shared_context
struct event
{
event_type type;
std::variant<libremidi::jack_callback, int64_t> payload;
libremidi_variant_alias::variant<libremidi::jack_callback, int64_t> payload;
};

boost::lockfree::spsc_queue<event> events{16};
Expand Down
10 changes: 5 additions & 5 deletions include/libremidi/backends/pipewire/shared_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,10 @@ struct shared_handler : public libremidi::shared_context
{
case in_callback_added:
midiin_callbacks.push_back(
std::move(*std::get_if<libremidi::pipewire_callback>(&ev.payload)));
std::move(*get_if<libremidi::pipewire_callback>(&ev.payload)));
break;
case in_callback_removed: {
auto idx = *std::get_if<int64_t>(&ev.payload);
auto idx = *get_if<int64_t>(&ev.payload);
for (auto it = midiin_callbacks.begin(); it != midiin_callbacks.end();)
{
if (it->token == idx)
Expand All @@ -91,10 +91,10 @@ struct shared_handler : public libremidi::shared_context
}
case out_callback_added:
midiout_callbacks.push_back(
std::move(*std::get_if<libremidi::pipewire_callback>(&ev.payload)));
std::move(*get_if<libremidi::pipewire_callback>(&ev.payload)));
break;
case out_callback_removed:
auto idx = *std::get_if<int64_t>(&ev.payload);
auto idx = *get_if<int64_t>(&ev.payload);
for (auto it = midiout_callbacks.begin(); it != midiout_callbacks.end();)
{
if (it->token == idx)
Expand Down Expand Up @@ -138,7 +138,7 @@ struct shared_handler : public libremidi::shared_context
struct event
{
event_type type;
std::variant<libremidi::pipewire_callback, int64_t> payload;
libremidi_variant_alias::variant<libremidi::pipewire_callback, int64_t> payload;
};

boost::lockfree::spsc_queue<event> events{16};
Expand Down
2 changes: 1 addition & 1 deletion include/libremidi/backends/winmidi/midi_in.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class midi_in_impl final

stdx::error open_port(const input_port& port, std::string_view) override
{
auto device_id = std::get_if<std::string>(&port.device);
auto device_id = get_if<std::string>(&port.device);
if (!device_id)
return std::errc::invalid_argument;

Expand Down
2 changes: 1 addition & 1 deletion include/libremidi/backends/winmidi/midi_out.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class midi_out_impl final

stdx::error open_port(const output_port& port, std::string_view) override
{
auto device_id = std::get_if<std::string>(&port.device);
auto device_id = get_if<std::string>(&port.device);
if (!device_id)
return std::errc::invalid_argument;

Expand Down
2 changes: 2 additions & 0 deletions include/libremidi/cmidi2.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include <stdbool.h>
#include <stdint.h>

#include <libremidi/config.hpp>

#if !defined(_MSC_VER)
#pragma GCC system_header
#pragma clang system_header
Expand Down
59 changes: 53 additions & 6 deletions include/libremidi/config.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once
#ifndef LIBREMIDI_CONFIG_HPP
#define LIBREMIDI_CONFIG_HPP

#define LIBREMIDI_VERSION "5.4.1"

// clang-format off
#if !defined(LIBREMIDI_BASE_NAMESPACE)
Expand Down Expand Up @@ -44,6 +44,7 @@
#define WIN32_LEAN_AND_MEAN
#endif

// Dynamic exports
#if defined(LIBREMIDI_EXPORTS) || defined(LIBREMIDI_MODULE_BUILD)
#if defined(_MSC_VER)
#define LIBREMIDI_EXPORT __declspec(dllexport)
Expand All @@ -54,8 +55,7 @@
#define LIBREMIDI_EXPORT
#endif

#define LIBREMIDI_VERSION "5.4.1"

// Boost check to prevent ABI issues
#if defined(LIBREMIDI_USE_BOOST)
#if !__has_include(<boost/container/small_vector.hpp>)
#error \
Expand All @@ -67,8 +67,8 @@
#endif
#endif

// Use boost::small_vector if available
#if __has_include(<boost/container/small_vector.hpp>) && !defined(LIBREMIDI_NO_BOOST)

#if LIBREMIDI_SLIM_MESSAGE > 0
#include <boost/container/static_vector.hpp>
NAMESPACE_LIBREMIDI
Expand All @@ -92,6 +92,54 @@ using midi_bytes = std::vector<unsigned char>;
}
#endif

// Use boost::variant2 if available
#define LIBREMIDI_NO_BOOST_VARIANT2 1
#if __has_include(<boost/variant2.hpp>) && !defined(LIBREMIDI_NO_BOOST_VARIANT2)
#if __has_include(<boost/variant2.hpp>)
#include <boost/variant2.hpp>
#define LIBREMIDI_VARIANT_IS_BOOST_VARIANT2
namespace libremidi_variant_alias = boost::variant2;
#endif
#endif

#if !defined(LIBREMIDI_VARIANT_IS_BOOST_VARIANT2)
#include <variant>
namespace libremidi_variant_alias = std;
#endif

namespace libremidi
{
using monostate = libremidi_variant_alias::monostate;
template <typename T>
concept nothrow_move_constructible = std::is_nothrow_move_constructible_v<T>;

template <nothrow_move_constructible... Args>
using variant = libremidi_variant_alias::variant<Args...>;

template <typename... Args>
using slow_variant = libremidi_variant_alias::variant<Args...>;

template <std::size_t N, typename T>
using variant_element = libremidi_variant_alias::variant_alternative<N, T>;
template <std::size_t N, typename T>
using variant_element_t = libremidi_variant_alias::variant_alternative_t<N, T>;

using libremidi_variant_alias::operator==;
using libremidi_variant_alias::operator!=;
using libremidi_variant_alias::operator<;
using libremidi_variant_alias::operator>;
using libremidi_variant_alias::operator<=;
using libremidi_variant_alias::operator>=;

// using boost::variant2::in_place;
// using libremidi_variant_alias::in_place;
using libremidi_variant_alias::get;
using libremidi_variant_alias::get_if;
using libremidi_variant_alias::in_place_index;
using libremidi_variant_alias::in_place_type;
using libremidi_variant_alias::visit;
}

#if __has_include(<midi/universal_packet.h>) && defined(LIBREMIDI_USE_NI_MIDI2)
#define LIBREMIDI_NI_MIDI2_COMPAT 1
#endif
Expand All @@ -107,4 +155,3 @@ using midi_bytes = std::vector<unsigned char>;
#else
#define LIBREMIDI_PRECONDITION(...)
#endif
#endif
16 changes: 8 additions & 8 deletions include/libremidi/configurations.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,18 @@ struct dummy_configuration
{
};

using input_api_configuration = std::variant<
using input_api_configuration = libremidi_variant_alias::variant<
unspecified_configuration, dummy_configuration, alsa_raw_input_configuration,
alsa_raw_ump::input_configuration, alsa_seq::input_configuration,
alsa_seq_ump::input_configuration, coremidi_input_configuration,
coremidi_ump::input_configuration, emscripten_input_configuration, jack_input_configuration,
kbd_input_configuration, kdmapi::input_configuration, libremidi::net::dgram_input_configuration,
libremidi::net_ump::dgram_input_configuration, pipewire_input_configuration,
winmidi::input_configuration, winmm_input_configuration, winuwp_input_configuration,
jack_ump::input_configuration, pipewire_ump::input_configuration, android::input_configuration,
libremidi::API>;
kbd_input_configuration, kdmapi::input_configuration,
libremidi::net::dgram_input_configuration, libremidi::net_ump::dgram_input_configuration,
pipewire_input_configuration, winmidi::input_configuration, winmm_input_configuration,
winuwp_input_configuration, jack_ump::input_configuration, pipewire_ump::input_configuration,
android::input_configuration, libremidi::API>;

using output_api_configuration = std::variant<
using output_api_configuration = libremidi_variant_alias::variant<
unspecified_configuration, dummy_configuration, alsa_raw_output_configuration,
alsa_raw_ump::output_configuration, alsa_seq::output_configuration,
alsa_seq_ump::output_configuration, coremidi_output_configuration,
Expand All @@ -53,7 +53,7 @@ using output_api_configuration = std::variant<
jack_ump::output_configuration, pipewire_ump::output_configuration,
android::output_configuration, libremidi::API>;

using observer_api_configuration = std::variant<
using observer_api_configuration = libremidi_variant_alias::variant<
unspecified_configuration, dummy_configuration, alsa_raw_observer_configuration,
alsa_raw_ump::observer_configuration, alsa_seq::observer_configuration,
alsa_seq_ump::observer_configuration, coremidi_observer_configuration,
Expand Down
2 changes: 2 additions & 0 deletions include/libremidi/detail/memory.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#pragma once

#include <libremidi/config.hpp>

#include <memory>
#include <mutex>

Expand Down
6 changes: 3 additions & 3 deletions include/libremidi/libremidi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ libremidi::API midi_api(const input_api_configuration& conf)
{
libremidi::API ret = libremidi::API::UNSPECIFIED;
midi_any::for_all_backends([&]<typename T>(T) {
if (std::get_if<typename T::midi_in_configuration>(&conf))
if (get_if<typename T::midi_in_configuration>(&conf))
{
ret = T::API;
}
Expand All @@ -71,7 +71,7 @@ libremidi::API midi_api(const output_api_configuration& conf)
{
libremidi::API ret = libremidi::API::UNSPECIFIED;
midi_any::for_all_backends([&]<typename T>(T) {
if (std::get_if<typename T::midi_out_configuration>(&conf))
if (get_if<typename T::midi_out_configuration>(&conf))
{
ret = T::API;
}
Expand All @@ -83,7 +83,7 @@ libremidi::API midi_api(const observer_api_configuration& conf)
{
libremidi::API ret = libremidi::API::UNSPECIFIED;
midi_any::for_all_backends([&]<typename T>(T) {
if (std::get_if<typename T::midi_observer_configuration>(&conf))
if (get_if<typename T::midi_observer_configuration>(&conf))
{
ret = T::API;
}
Expand Down
10 changes: 5 additions & 5 deletions include/libremidi/midi_in.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ make_midi_in(auto base_conf, input_api_configuration api_conf, auto backends)
assert(base_conf.on_message || base_conf.on_raw_data);

auto from_api = [&]<typename T>(T& /*backend*/) mutable {
if (auto conf = std::get_if<typename T::midi_in_configuration>(&api_conf))
if (auto conf = get_if<typename T::midi_in_configuration>(&api_conf))
{
ptr = libremidi::make<typename T::midi_in>(std::move(base_conf), std::move(*conf));
return true;
Expand Down Expand Up @@ -135,11 +135,11 @@ LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr<midi_in_api> make_midi1_i
LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr<midi_in_api>
make_midi1_in(const input_configuration& base_conf, const input_api_configuration& api_conf)
{
if (std::get_if<unspecified_configuration>(&api_conf))
if (get_if<unspecified_configuration>(&api_conf))
{
return make_midi1_in(base_conf);
}
else if (auto api_p = std::get_if<libremidi::API>(&api_conf))
else if (auto api_p = get_if<libremidi::API>(&api_conf))
{
if (*api_p == libremidi::API::UNSPECIFIED)
{
Expand Down Expand Up @@ -233,11 +233,11 @@ LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr<midi_in_api> make_midi2_i
LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr<midi_in_api>
make_midi2_in(const ump_input_configuration& base_conf, const input_api_configuration& api_conf)
{
if (std::get_if<unspecified_configuration>(&api_conf))
if (get_if<unspecified_configuration>(&api_conf))
{
return make_midi2_in(base_conf);
}
else if (auto api_p = std::get_if<libremidi::API>(&api_conf))
else if (auto api_p = get_if<libremidi::API>(&api_conf))
{
if (*api_p == libremidi::API::UNSPECIFIED)
{
Expand Down
Loading
Loading