Skip to content

Commit

Permalink
[net] Network implementation starts to look ok
Browse files Browse the repository at this point in the history
  • Loading branch information
jcelerier committed Oct 26, 2024
1 parent a811d05 commit b8a7b36
Show file tree
Hide file tree
Showing 21 changed files with 1,050 additions and 132 deletions.
6 changes: 6 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ cmake_dependent_option(LIBREMIDI_NO_ALSA "Disable ALSA back-end" OFF "UNIX; NOT
cmake_dependent_option(LIBREMIDI_NO_UDEV "Disable udev support for ALSA" OFF "UNIX; NOT APPLE" OFF)
option(LIBREMIDI_NO_JACK "Disable JACK back-end" OFF)
option(LIBREMIDI_NO_PIPEWIRE "Disable PipeWire back-end" OFF)
option(LIBREMIDI_NO_NETWORK "Disable Network back-end" OFF)
option(LIBREMIDI_NO_KEYBOARD "Disable Computer keyboard back-end" OFF)

option(LIBREMIDI_NO_EXPORTS "Disable dynamic symbol exporting" OFF)
option(LIBREMIDI_NO_BOOST "Do not use Boost if available" OFF)
Expand Down Expand Up @@ -159,6 +161,10 @@ if(NOT LIBREMIDI_NO_PIPEWIRE)
include(libremidi.pipewire)
endif()

if(NOT LIBREMIDI_NO_NETWORK)
include(libremidi.net)
endif()

### Install ###
include(libremidi.install)

Expand Down
1 change: 0 additions & 1 deletion cmake/libremidi.deps.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ if(LIBREMIDI_FIND_BOOST)
endif()

# readerwriterqueue

if(NOT LIBREMIDI_NO_PIPEWIRE AND NOT TARGET readerwriterqueue)
FetchContent_Declare(
readerwriterqueue
Expand Down
5 changes: 4 additions & 1 deletion cmake/libremidi.examples.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,15 @@ if(LIBREMIDI_HAS_WINMIDI)
add_backend_example(midi2_in_winmidi)
endif()

if(LIBREMIDI_HAS_NETWORK)
add_example(network)
endif()

if(Boost_cobalt_FOUND)
add_example(coroutines)
target_link_libraries(coroutines PRIVATE Boost::cobalt)
endif()


add_executable(libremidi_c_api examples/c_api.c)
target_link_libraries(libremidi_c_api PRIVATE libremidi)
if(LIBREMIDI_HEADER_ONLY)
Expand Down
22 changes: 11 additions & 11 deletions cmake/libremidi.net.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ if(NOT TARGET Boost::boost)
return()
endif()

message(STATUS "libremidi: using Boost.ASIO")
set(LIBREMIDI_HAS_BOOST_ASIO 1)
message(STATUS "libremidi: Network support using Boost.ASIO")
set(LIBREMIDI_HAS_BOOST_ASIO 1)
set(LIBREMIDI_HAS_NETWORK 1)

target_compile_definitions(libremidi
${_public}
LIBREMIDI_NET
)
target_link_libraries(libremidi
${_public}
$<BUILD_INTERFACE:Boost::boost>
)
endif()
target_compile_definitions(libremidi
${_public}
LIBREMIDI_NETWORK
)
target_link_libraries(libremidi
${_public}
$<BUILD_INTERFACE:Boost::boost>
)
55 changes: 32 additions & 23 deletions cmake/libremidi.sources.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -34,42 +34,51 @@ target_sources(libremidi PRIVATE
include/libremidi/backends/coremidi_ump/midi_out.hpp
include/libremidi/backends/coremidi_ump/observer.hpp

include/libremidi/backends/emscripten/config.hpp
include/libremidi/backends/emscripten/helpers.hpp
include/libremidi/backends/emscripten/midi_access.cpp
include/libremidi/backends/emscripten/midi_access.hpp
include/libremidi/backends/emscripten/midi_in.cpp
include/libremidi/backends/emscripten/midi_in.hpp
include/libremidi/backends/emscripten/midi_out.cpp
include/libremidi/backends/emscripten/midi_out.hpp
include/libremidi/backends/emscripten/observer.cpp
include/libremidi/backends/emscripten/observer.hpp

include/libremidi/backends/jack/config.hpp
include/libremidi/backends/jack/helpers.hpp
include/libremidi/backends/jack/midi_out.hpp
include/libremidi/backends/jack/midi_in.hpp
include/libremidi/backends/jack/midi_out.hpp
include/libremidi/backends/jack/observer.hpp
include/libremidi/backends/jack/shared_handler.hpp

include/libremidi/backends/pipewire/config.hpp
include/libremidi/backends/pipewire/context.hpp
include/libremidi/backends/pipewire/helpers.hpp
include/libremidi/backends/pipewire/midi_out.hpp
include/libremidi/backends/pipewire/midi_in.hpp
include/libremidi/backends/pipewire/observer.hpp
include/libremidi/backends/pipewire/shared_handler.hpp
include/libremidi/backends/keyboard/config.hpp
include/libremidi/backends/keyboard/midi_in.hpp

include/libremidi/backends/linux/alsa.hpp
include/libremidi/backends/linux/dylib_loader.hpp
include/libremidi/backends/linux/helpers.hpp
include/libremidi/backends/linux/pipewire.hpp
include/libremidi/backends/linux/udev.hpp

include/libremidi/backends/emscripten/config.hpp
include/libremidi/backends/emscripten/helpers.hpp
include/libremidi/backends/emscripten/midi_access.hpp
include/libremidi/backends/emscripten/midi_access.cpp
include/libremidi/backends/emscripten/midi_in.hpp
include/libremidi/backends/emscripten/midi_in.cpp
include/libremidi/backends/emscripten/midi_out.hpp
include/libremidi/backends/emscripten/midi_out.cpp
include/libremidi/backends/emscripten/observer.hpp
include/libremidi/backends/emscripten/observer.cpp
include/libremidi/backends/net/config.hpp
include/libremidi/backends/net/helpers.hpp
include/libremidi/backends/net/midi_in.hpp
include/libremidi/backends/net/midi_out.hpp
include/libremidi/backends/net/observer.hpp

include/libremidi/backends/pipewire/config.hpp
include/libremidi/backends/pipewire/context.hpp
include/libremidi/backends/pipewire/helpers.hpp
include/libremidi/backends/pipewire/midi_in.hpp
include/libremidi/backends/pipewire/midi_out.hpp
include/libremidi/backends/pipewire/observer.hpp
include/libremidi/backends/pipewire/shared_handler.hpp

include/libremidi/backends/winmidi/config.hpp
include/libremidi/backends/winmidi/helpers.hpp
include/libremidi/backends/winmidi/midi_out.hpp
include/libremidi/backends/winmidi/midi_in.hpp
include/libremidi/backends/winmidi/midi_out.hpp
include/libremidi/backends/winmidi/observer.hpp

include/libremidi/backends/winmm/config.hpp
Expand All @@ -80,14 +89,14 @@ target_sources(libremidi PRIVATE

include/libremidi/backends/winuwp/config.hpp
include/libremidi/backends/winuwp/helpers.hpp
include/libremidi/backends/winuwp/midi_out.hpp
include/libremidi/backends/winuwp/midi_in.hpp
include/libremidi/backends/winuwp/midi_out.hpp
include/libremidi/backends/winuwp/observer.hpp

include/libremidi/backends/alsa_seq.hpp
include/libremidi/backends/alsa_seq_ump.hpp
include/libremidi/backends/alsa_raw.hpp
include/libremidi/backends/alsa_raw_ump.hpp
include/libremidi/backends/alsa_seq.hpp
include/libremidi/backends/alsa_seq_ump.hpp
include/libremidi/backends/coremidi.hpp
include/libremidi/backends/coremidi_ump.hpp
include/libremidi/backends/dummy.hpp
Expand All @@ -106,8 +115,8 @@ target_sources(libremidi PRIVATE
include/libremidi/detail/ump_stream.hpp

include/libremidi/api.hpp
include/libremidi/client.hpp
include/libremidi/client.cpp
include/libremidi/client.hpp
include/libremidi/config.hpp
include/libremidi/configurations.hpp
include/libremidi/error.hpp
Expand Down
82 changes: 82 additions & 0 deletions examples/network.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#include "utils.hpp"

#include <libremidi/configurations.hpp>
#include <libremidi/libremidi.hpp>

#include <boost/asio.hpp>

int main(int argc, const char** argv)
{
using namespace std::literals;
libremidi::examples::arguments args{argc, argv};

boost::asio::io_context ctx;

// MIDI 1
{
libremidi::net::dgram_input_configuration in_apiconf{
.client_name = "libremidi",
.protocol = libremidi::net::protocol::OSC_MIDI,
.accept = "0.0.0.0",
.port = 5677,
.io_context = &ctx};

libremidi::midi_in midiin{
{.on_message = [](const libremidi::message& m) { std::cerr << m << std::endl; }},
in_apiconf};
midiin.open_virtual_port("/midi");

libremidi::net::dgram_output_configuration out_apiconf{
.client_name = "libremidi",
.protocol = libremidi::net::protocol::OSC_MIDI,
.host = "127.0.0.1",
.port = 5677,
.broadcast = false,
.io_context = &ctx};

libremidi::midi_out midiout{{}, out_apiconf};

if (auto err = midiout.open_virtual_port("/midi"); err != stdx::error{})
err.throw_exception();

if (auto err = midiout.send_message(144, 127, 64); err != stdx::error{})
err.throw_exception();

ctx.run_one();
}

ctx.restart();

// MIDI 2
{
libremidi::net_ump::dgram_input_configuration in_apiconf{
.client_name = "libremidi",
.protocol = libremidi::net_ump::protocol::OSC_MIDI2,
.accept = "0.0.0.0",
.port = 5688,
.io_context = &ctx};

libremidi::midi_in midiin{
{.on_message = [](const libremidi::ump& m) { std::cerr << m << std::endl; }}, in_apiconf};
midiin.open_virtual_port("/ump");

libremidi::net_ump::dgram_output_configuration out_apiconf{
.client_name = "libremidi",
.protocol = libremidi::net_ump::protocol::OSC_MIDI2,
.host = "127.0.0.1",
.port = 5688,
.broadcast = false,
.io_context = &ctx};

libremidi::midi_out midiout{{}, out_apiconf};

if (auto err = midiout.open_virtual_port("/ump"); err != stdx::error{})
err.throw_exception();

int64_t ump = cmidi2_ump_midi2_cc(1, 1, 34, 53404);
if (auto err = midiout.send_ump(ump); err != stdx::error{})
err.throw_exception();

ctx.run();
}
}
2 changes: 2 additions & 0 deletions include/libremidi/api-c.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,15 @@ typedef enum libremidi_api
WEBMIDI, /*!< Web MIDI API through Emscripten */
PIPEWIRE, /*!< PipeWire */
KEYBOARD, /*!< Computer keyboard input */
NETWORK, /*!< MIDI over IP */

// MIDI 2.0 APIs
ALSA_RAW_UMP = 0x1000, /*!< Raw ALSA API for MIDI 2.0 */
ALSA_SEQ_UMP, /*!< Linux ALSA Sequencer API for MIDI 2.0 */
COREMIDI_UMP, /*!< macOS CoreMidi API for MIDI 2.0. Requires macOS 11+ */
WINDOWS_MIDI_SERVICES, /*!< Windows API for MIDI 2.0. Requires Windows 11 */
KEYBOARD_UMP, /*!< Computer keyboard input */
NETWORK_UMP, /*!< MIDI2 over IP */

DUMMY = 0xFFFF /*!< A compilable but non-functional API. */
} libremidi_api;
Expand Down
24 changes: 22 additions & 2 deletions include/libremidi/backends.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,15 @@
#endif

#include <libremidi/backends/dummy.hpp>
#include <libremidi/backends/keyboard.hpp>

#if defined(LIBREMIDI_KEYBOARD)
#include <libremidi/backends/keyboard.hpp>
#endif

#if defined(LIBREMIDI_NETWORK)
#include <libremidi/backends/network.hpp>
#include <libremidi/backends/network_ump.hpp>
#endif

namespace libremidi
{
Expand Down Expand Up @@ -106,8 +114,16 @@ static constexpr auto available_backends = make_tl(
,
pipewire::backend{}
#endif
#if defined(LIBREMIDI_KEYBOARD)
,
kbd_backend{}
#endif
#if defined(LIBREMIDI_NETWORK)
,
kbd_backend{}, dummy_backend{});
net::backend{}
#endif
,
dummy_backend{});

// There should always be at least one back-end.
static_assert(std::tuple_size_v<decltype(available_backends)> >= 1);
Expand Down Expand Up @@ -143,6 +159,10 @@ static constexpr auto available_backends = make_tl(
#if defined(LIBREMIDI_WINMIDI)
,
winmidi::backend{}
#endif
#if defined(LIBREMIDI_NETWORK)
,
net_ump::backend{}
#endif
,
dummy_backend{});
Expand Down
3 changes: 0 additions & 3 deletions include/libremidi/backends/alsa_seq_ump/midi_out.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,5 @@ class midi_out_impl final
snd.seq.drain_output(this->seq);
return stdx::error{};
}

private:
unsigned int bufferSize{32};
};
}
Loading

0 comments on commit b8a7b36

Please sign in to comment.