diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 8e2c19ff..cb4f3106 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -2,6 +2,10 @@ name: Android Build on: push: + branches: + - master + tags: + - v* paths-ignore: - 'docs/**' - '**.md' @@ -10,6 +14,11 @@ on: - '**.md' - 'docs/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index e1775f88..7841e067 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -4,8 +4,14 @@ on: push: branches: - master + tags: + - v* pull_request: +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: deploy: runs-on: ubuntu-latest @@ -30,4 +36,4 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./output - \ No newline at end of file + diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index d0a310c0..b26c346f 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -2,6 +2,10 @@ name: Build on: push: + branches: + - master + tags: + - v* paths-ignore: - 'docs/**' - '**.md' @@ -10,36 +14,40 @@ on: - '**.md' - 'docs/**' +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: build: - name: ${{ matrix.config.name }} + name: ${{ matrix.config.name }} ${{ matrix.library_mode }} ${{ matrix.boost && 'Boost' }} runs-on: ${{ matrix.config.os }} strategy: fail-fast: false matrix: boost: [0, 1] - header_only: [0, 1] + library_mode: [LIBRARY, HEADER_ONLY, MODULE] config: - { - name: "Windows (MSVC)", + name: "MSVC x86_64", os: windows-latest, generator: "", - cmakeflags: "-DLIBREMIDI_NO_WINUWP=0 -DBOOST_ROOT=$PWD/boost_1_86_0", + cmakeflags: "-DBOOST_ROOT=$PWD/boost_1_90_0", test_target: "RUN_TESTS", tests: 1, examples: 1 } - { - name: "Windows (MSVC, arm64)", + name: "MSVC arm64", os: windows-11-arm, generator: "", - cmakeflags: "-DLIBREMIDI_NO_WINUWP=0 -DBOOST_ROOT=$PWD/boost_1_86_0", + cmakeflags: "-DBOOST_ROOT=$PWD/boost_1_90_0", test_target: "RUN_TESTS", tests: 1, examples: 1 } - { - name: "Ubuntu (gcc)", + name: "Ubuntu gcc-13", os: ubuntu-latest, generator: "", cmakeflags: "-DCMAKE_CXX_FLAGS='-Werror=return-type -fsanitize=address -fsanitize=undefined -D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1 -D_GLIBCXX_ASSERTIONS=1 -D_GLIBCXX_SANITIZE_VECTOR=1'", @@ -48,19 +56,28 @@ jobs: examples: 1 } - { - name: "Ubuntu (clang-18, libstdc++)", + name: "Ubuntu gcc-14", + os: ubuntu-latest, + generator: "", + cmakeflags: "-DCMAKE_CXX_COMPILER=g++-14 -DCMAKE_CXX_FLAGS='-Werror=return-type -fsanitize=address -fsanitize=undefined -D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1 -D_GLIBCXX_ASSERTIONS=1 -D_GLIBCXX_SANITIZE_VECTOR=1' -DBOOST_ROOT=$PWD/boost_1_90_0", + test_target: "test", + tests: 1, + examples: 1 + } + - { + name: "Ubuntu clang-20 libstdc++", os: ubuntu-latest, generator: "", - cmakeflags: "-DCMAKE_CXX_COMPILER=clang++-18 -DCMAKE_CXX_FLAGS='-Werror=return-type -fsanitize=address -fsanitize=undefined'", + cmakeflags: "-DCMAKE_CXX_COMPILER=clang++-20 -DCMAKE_CXX_FLAGS='-Werror=return-type -fsanitize=address -fsanitize=undefined' -DBOOST_ROOT=$PWD/boost_1_90_0", test_target: "test", tests: 1, examples: 1 } - { - name: "Ubuntu (clang, libc++)", + name: "Ubuntu clang libc++", os: ubuntu-latest, generator: "", - cmakeflags: "-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_FLAGS='-stdlib=libc++ -Werror=return-type'", + cmakeflags: "-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_FLAGS='-stdlib=libc++ -Werror=return-type' -DBOOST_ROOT=$PWD/boost_1_90_0", test_target: "test", tests: 1, examples: 1 @@ -76,18 +93,18 @@ jobs: } - { name: "macOS", - os: macos-14, + os: macos-latest, generator: "", - cmakeflags: "-DCMAKE_CXX_FLAGS=-Werror=return-type -DBOOST_ROOT=$PWD/boost_1_86_0", + cmakeflags: "-DCMAKE_CXX_FLAGS=-Werror=return-type -DBOOST_ROOT=$PWD/boost_1_90_0", test_target: "test", tests: 1, examples: 1 } - { name: "iOS", - os: macos-14, + os: macos-latest, generator: "-GXcode", - cmakeflags: "-DCMAKE_CXX_FLAGS=-Werror=return-type -DBOOST_ROOT=$PWD/boost_1_86_0 -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_XCODE_EFFECTIVE_PLATFORMS=-iphoneos", + cmakeflags: "-DCMAKE_CXX_FLAGS=-Werror=return-type -DBOOST_ROOT=$PWD/boost_1_90_0 -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_XCODE_EFFECTIVE_PLATFORMS=-iphoneos", test_target: "test", tests: 0, examples: 0 @@ -97,6 +114,31 @@ jobs: - config: { name: "iOS" } boost: 1 + # Modules not yet working on VS2022 + - config: { name: "MSVC x86_64" } + library_mode: MODULE + - config: { name: "MSVC arm64" } + library_mode: MODULE + + # Modules not supported at all on gcc 13 + - config: { name: "Ubuntu gcc-13" } + library_mode: MODULE + + # ICE + - config: { name: "Ubuntu gcc-14" } + library_mode: MODULE + + # Modules not yet supported by ubuntu 24.04 default clang version + - config: { name: "Ubuntu clang libc++" } + library_mode: MODULE + + # Modules not supported at all by AppleClang as of Xcode 26 + - config: { name: "macOS" } + library_mode: MODULE + + - config: { name: "iOS" } + library_mode: MODULE + steps: - uses: actions/checkout@v4 @@ -111,27 +153,40 @@ jobs: - name: Install dependencies if: matrix.config.name != 'Tarball' + shell: bash run: | if [ "$RUNNER_OS" == "Linux" ]; then sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" sudo apt update - sudo apt install cmake libboost-dev libasound-dev libjack-jackd2-dev clang libc++-dev - else - curl -L https://github.com/ossia/sdk/releases/download/sdk31/boost_1_86_0.tar.gz > boost.tar.gz - tar -xzf boost.tar.gz - rm boost.tar.gz + sudo apt install cmake ninja-build curl libboost-dev libasound-dev libjack-jackd2-dev clang libc++-dev gcc gcc-14 + elif [ "$RUNNER_OS" == "macOS" ]; then + brew install ninja fi - shell: bash + + curl -L https://github.com/ossia/sdk/releases/download/sdk31/boost_1_90_0.tar.gz > boost.tar.gz + tar -xzf boost.tar.gz + rm boost.tar.gz - name: Configure if: matrix.config.name != 'Tarball' shell: bash run: | + CMAKE_GENERATOR=${{ matrix.config.generator }} + if [[ -z "$CMAKE_GENERATOR" ]]; then + if [[ "${{ matrix.library_mode }}" == "MODULE" ]]; then + if [[ "$RUNNER_OS" == "Linux" ]]; then + CMAKE_GENERATOR=-GNinja + elif [[ "$RUNNER_OS" == "macOS" ]]; then + CMAKE_GENERATOR=-GNinja + fi + fi + fi + cmake -S . -B build \ - ${{ matrix.config.generator }} \ + $CMAKE_GENERATOR \ ${{ matrix.config.cmakeflags }} \ -DLIBREMIDI_FIND_BOOST=${{ matrix.boost }} \ - -DLIBREMIDI_HEADER_ONLY=${{ matrix.header_only }} \ + -DLIBREMIDI_LIBRARY_MODE=${{ matrix.library_mode }} \ -DLIBREMIDI_EXAMPLES=${{ matrix.config.examples }} \ -DLIBREMIDI_TESTS=${{ matrix.config.tests }} \ -DLIBREMIDI_CI=1 \ @@ -145,7 +200,7 @@ jobs: cmake --build build --config Debug --target install - name: Test - if: matrix.config.name != 'Tarball' && matrix.config.name != 'iOS' + if: matrix.config.name != 'Tarball' && matrix.config.name != 'iOS' && matrix.library_mode != 'MODULE' run: | # Not available on GH actions... # if [ "$RUNNER_OS" == "Linux" ]; then @@ -163,15 +218,16 @@ jobs: fail-fast: false matrix: boost: [0, 1] - header_only: [0, 1] + library_mode: [LIBRARY, HEADER_ONLY, MODULE] steps: - uses: actions/checkout@v4 - uses: vmactions/freebsd-vm@v1 with: usesh: true + prepare: | - pkg install -y jackit boost-libs cmake git + pkg install -y jackit boost-libs cmake git ninja run: | pwd @@ -179,10 +235,15 @@ jobs: whoami env freebsd-version + CMAKE_GENERATOR= + if [ "${{ matrix.library_mode }}" = "MODULE" ]; then + CMAKE_GENERATOR=-GNinja + fi cmake -S . -B build \ + $CMAKE_GENERATOR \ -DLIBREMIDI_FIND_BOOST=${{ matrix.boost }} \ - -DLIBREMIDI_HEADER_ONLY=${{ matrix.header_only }} \ + -DLIBREMIDI_LIBRARY_MODE=${{ matrix.library_mode }} \ -DLIBREMIDI_EXAMPLES=1 \ -DLIBREMIDI_TESTS=1 \ -DLIBREMIDI_CI=1 \ @@ -190,11 +251,13 @@ jobs: -DCMAKE_INSTALL_PREFIX=install cmake --build build - cmake --build build --target install - cmake --build build --target test + if [ "${{ matrix.library_mode }}" != "MODULE" ]; then + cmake --build build --target install + cmake --build build --target test + fi build_debian: - name: Debian ${{ matrix.distro }} + name: Debian ${{ matrix.distro }} ${{ matrix.library_mode }} ${{ matrix.cxx }} ${{ matrix.boost && 'Boost' }} runs-on: ubuntu-latest container: image: debian:${{ matrix.distro }} @@ -202,15 +265,20 @@ jobs: fail-fast: false matrix: boost: [0, 1] - header_only: [0, 1] - distro: [bookworm, trixie] + library_mode: [LIBRARY, HEADER_ONLY, MODULE] + distro: [bookworm, trixie, testing] + cxx: [c++, clang++] - steps: - - name: Add backports repo if necessary - if: matrix.distro == 'bullseye' - run: | - echo "deb http://ftp.debian.org/debian/ ${{ matrix.distro }}-backports main non-free contrib" > /etc/apt/sources.list.d/${{ matrix.distro }}-backports.list + exclude: + - distro: bookworm + library_mode: MODULE + - distro: trixie + library_mode: MODULE + - distro: testing + library_mode: MODULE + cxx: c++ + steps: - name: Install git run: | apt-get update -qq @@ -230,24 +298,31 @@ jobs: libasound-dev \ libjack-jackd2-dev \ libudev-dev \ - libpipewire-0.3-dev - - if [[ "${{matrix.distro}}" == 'bullseye' ]]; then - apt-get install -qq --force-yes cmake/bullseye-backports - else - apt-get install -qq --force-yes cmake - fi + libpipewire-0.3-dev \ + cmake ninja-build curl + + curl -L https://github.com/ossia/sdk/releases/download/sdk31/boost_1_90_0.tar.gz > boost.tar.gz + tar -xzf boost.tar.gz + rm boost.tar.gz - name: Configure + shell: bash run: | + CMAKE_GENERATOR= + if [[ "${{ matrix.library_mode }}" == "MODULE" ]]; then + CMAKE_GENERATOR=-GNinja + fi cmake -S . -B build \ + $CMAKE_GENERATOR \ + -DCMAKE_CXX_COMPILER=${{ matrix.cxx }} \ -DLIBREMIDI_FIND_BOOST=${{ matrix.boost }} \ - -DLIBREMIDI_HEADER_ONLY=${{ matrix.header_only }} \ + -DLIBREMIDI_LIBRARY_MODE=${{ matrix.library_mode }} \ -DLIBREMIDI_EXAMPLES=1 \ -DLIBREMIDI_TESTS=1 \ -DLIBREMIDI_CI=1 \ -DCMAKE_CTEST_ARGUMENTS="--rerun-failed;--output-on-failure" \ - -DCMAKE_INSTALL_PREFIX=install + -DCMAKE_INSTALL_PREFIX=install \ + -DBOOST_ROOT=$PWD/boost_1_90_0 - name: Build run: | @@ -255,6 +330,7 @@ jobs: cmake --build build --config Debug --target install - name: Test + if: matrix.library_mode != 'MODULE' run: | cmake --build build --config Debug --target test diff --git a/.github/workflows/build_python.yml b/.github/workflows/build_python.yml index 3d00b227..d756115f 100644 --- a/.github/workflows/build_python.yml +++ b/.github/workflows/build_python.yml @@ -2,6 +2,10 @@ name: Python on: push: + branches: + - master + tags: + - v* paths-ignore: - 'docs/**' - '**.md' @@ -10,6 +14,10 @@ on: - '**.md' - 'docs/**' +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: build: name: ${{ matrix.config.name }} diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml index 91a17922..d80e6306 100644 --- a/.github/workflows/mingw.yml +++ b/.github/workflows/mingw.yml @@ -2,6 +2,10 @@ name: MSYS2 build on: push: + branches: + - master + tags: + - v* paths-ignore: - 'docs/**' - '**.md' @@ -10,6 +14,10 @@ on: - '**.md' - 'docs/**' +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: mingw: runs-on: windows-latest diff --git a/CMakeLists.txt b/CMakeLists.txt index 58dacd0c..7b25bd2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.22 FATAL_ERROR) +cmake_minimum_required(VERSION 3.22..4.2.0 FATAL_ERROR) project(libremidi VERSION 5.3.1 DESCRIPTION "A cross-platform MIDI library" @@ -6,6 +6,11 @@ project(libremidi HOMEPAGE_URL "https://github.com/jcelerier/libremidi" ) +# Still support BOOST_ROOT +if(POLICY CMP0167) + cmake_policy(SET CMP0167 OLD) +endif() + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") include(CMakeDependentOption) @@ -17,7 +22,21 @@ include(FetchContent) include(GNUInstallDirs) ### Options ### +option(LIBREMIDI_MODULE_BUILD "C++ module mode" OFF) option(LIBREMIDI_HEADER_ONLY "Header-only mode" OFF) +option(LIBREMIDI_LIBRARY_MODE "Library mode: LIBRARY,HEADER_ONLY,MODULE" "") +if("${LIBREMIDI_LIBRARY_MODE}" MATCHES "HEADER_ONLY") + set(LIBREMIDI_HEADER_ONLY ON) + set(LIBREMIDI_MODULE_BUILD OFF) +elseif("${LIBREMIDI_LIBRARY_MODE}" MATCHES "MODULE") + set(CMAKE_CXX_SCAN_FOR_MODULES ON) + set(LIBREMIDI_HEADER_ONLY OFF) + set(LIBREMIDI_MODULE_BUILD ON) + set(LIBREMIDI_TESTS OFF) +elseif("${LIBREMIDI_LIBRARY_MODE}" MATCHES "LIBRARY") + set(LIBREMIDI_HEADER_ONLY OFF) + set(LIBREMIDI_MODULE_BUILD OFF) +endif() cmake_dependent_option(LIBREMIDI_NO_COREMIDI "Disable CoreMidi back-end" OFF "APPLE" OFF) cmake_dependent_option(LIBREMIDI_NO_WINMM "Disable WinMM back-end" OFF "WIN32" OFF) diff --git a/cmake/libremidi.cppwinrt.cmake b/cmake/libremidi.cppwinrt.cmake index d12c5c05..69387f50 100644 --- a/cmake/libremidi.cppwinrt.cmake +++ b/cmake/libremidi.cppwinrt.cmake @@ -93,7 +93,6 @@ if(CPPWINRT_TOOL) COMMAND "${CPPWINRT_TOOL}" "@${CMAKE_BINARY_DIR}/cppwinrt-src/cppwinrt.rsp" -output "${CMAKE_BINARY_DIR}/cppwinrt" - -verbose ) endif() diff --git a/cmake/libremidi.examples.cmake b/cmake/libremidi.examples.cmake index 7181551b..26fb0458 100644 --- a/cmake/libremidi.examples.cmake +++ b/cmake/libremidi.examples.cmake @@ -1,3 +1,4 @@ +if(NOT LIBREMIDI_MODULE_BUILD) macro(setup_example _example) target_link_libraries("${_example}" PRIVATE libremidi) endmacro() @@ -115,3 +116,11 @@ target_link_libraries(libremidi_c_api PRIVATE libremidi) if(LIBREMIDI_HEADER_ONLY) target_sources(libremidi_c_api PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include/libremidi/libremidi-c.cpp") endif() +endif() + +if(LIBREMIDI_MODULE_BUILD) + add_executable(libremidi_modules + examples/modules.cpp + ) + target_link_libraries(libremidi_modules PRIVATE libremidi) +endif() diff --git a/cmake/libremidi.install.cmake b/cmake/libremidi.install.cmake index 4e7d0eea..cd177d86 100644 --- a/cmake/libremidi.install.cmake +++ b/cmake/libremidi.install.cmake @@ -1,17 +1,22 @@ -if(NOT LIBREMIDI_HEADER_ONLY) +if(LIBREMIDI_MODULE_BUILD) + message("Install not supported yet as of CMake 4.2") + return() +elseif(NOT LIBREMIDI_HEADER_ONLY) install(TARGETS libremidi EXPORT libremidi-targets ARCHIVE RUNTIME LIBRARY ) + install(EXPORT libremidi-targets + DESTINATION lib/cmake/libremidi) else() install(TARGETS libremidi EXPORT libremidi-targets ) + install(EXPORT libremidi-targets + DESTINATION lib/cmake/libremidi) endif() -install(EXPORT libremidi-targets - DESTINATION lib/cmake/libremidi) install(DIRECTORY include DESTINATION .) diff --git a/cmake/libremidi.library.cmake b/cmake/libremidi.library.cmake index 40531347..7735f705 100644 --- a/cmake/libremidi.library.cmake +++ b/cmake/libremidi.library.cmake @@ -1,5 +1,19 @@ ### Create the library ### -if(LIBREMIDI_HEADER_ONLY) +if(LIBREMIDI_MODULE_BUILD) + add_library(libremidi) + set(_public PUBLIC) + set(_private PRIVATE) + target_sources(libremidi + PUBLIC + FILE_SET CXX_MODULES + FILES + "src/libremidi.ixx" + ) + target_compile_options(libremidi PRIVATE + $<$:-Wno-include-angled-in-module-purview> + $<$:-Wno-include-angled-in-module-purview> + ) +elseif(LIBREMIDI_HEADER_ONLY) add_library(libremidi INTERFACE) set(_public INTERFACE) set(_private INTERFACE) diff --git a/cmake/libremidi.sources.cmake b/cmake/libremidi.sources.cmake index f7c0c392..90d8da21 100644 --- a/cmake/libremidi.sources.cmake +++ b/cmake/libremidi.sources.cmake @@ -44,13 +44,9 @@ target_sources(libremidi PRIVATE 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/emscripten.hpp @@ -150,6 +146,12 @@ target_sources(libremidi PRIVATE include/libremidi/reader.hpp include/libremidi/writer.hpp + include/libremidi/api-c.h + include/libremidi/libremidi-c.h +) + +if(NOT LIBREMIDI_HEADER_ONLY AND NOT LIBREMIDI_MODULE_BUILD) + target_sources(libremidi PRIVATE include/libremidi/libremidi.cpp include/libremidi/midi_in.cpp include/libremidi/midi_out.cpp @@ -157,7 +159,11 @@ target_sources(libremidi PRIVATE include/libremidi/reader.cpp include/libremidi/writer.cpp - include/libremidi/api-c.h - include/libremidi/libremidi-c.h + include/libremidi/backends/emscripten/midi_access.cpp + include/libremidi/backends/emscripten/midi_in.cpp + include/libremidi/backends/emscripten/midi_out.cpp + include/libremidi/backends/emscripten/observer.cpp + include/libremidi/libremidi-c.cpp -) + ) +endif() diff --git a/cmake/libremidi.winmidi.cmake b/cmake/libremidi.winmidi.cmake index abd90129..d8575fe5 100644 --- a/cmake/libremidi.winmidi.cmake +++ b/cmake/libremidi.winmidi.cmake @@ -46,7 +46,6 @@ if(CPPWINRT_TOOL) COMMAND "${CPPWINRT_TOOL}" "@${CMAKE_BINARY_DIR}/cppwinrt-src/cppwinrt-winmidi.rsp" -output "${CMAKE_BINARY_DIR}/cppwinrt-winmidi" - -verbose ) file( diff --git a/examples/modules.cpp b/examples/modules.cpp new file mode 100644 index 00000000..1a908082 --- /dev/null +++ b/examples/modules.cpp @@ -0,0 +1,43 @@ +import libremidi; + +#include +#include + +inline std::ostream& operator<<(std::ostream& s, const libremidi::message& message) +{ + auto nBytes = message.size(); + s << "[ "; + for (auto i = 0U; i < nBytes; i++) + s << std::hex << (int)message[i] << std::dec << " "; + s << "]"; + if (nBytes > 0) + s << " ; stamp = " << message.timestamp; + return s; +} + +int main() +{ + libremidi::observer observer; + if (observer.get_input_ports().empty()) + return 1; + if (observer.get_output_ports().empty()) + return 1; + + libremidi::midi_in midi_in{{.on_message = [](const libremidi::message& message) { + std::cout << message << std::endl; + }}}; + + if (auto err = midi_in.open_port(observer.get_input_ports()[0]); err != stdx::error{}) + err.throw_exception(); + + libremidi::midi_out midi_out; + if (auto err = midi_out.open_port(observer.get_output_ports()[0]); err != stdx::error{}) + err.throw_exception(); + + midi_out.send_message(176, 7, 100); + + int c; + while ((c = getchar()) != '\n' && c != EOF) + ; + return 0; +} diff --git a/examples/utils.hpp b/examples/utils.hpp index 8bce2a8e..2476933c 100644 --- a/examples/utils.hpp +++ b/examples/utils.hpp @@ -1,8 +1,10 @@ #pragma once +#if !defined(LIBREMIDI_USE_MODULES) #include // Credits to https://raw.githubusercontent.com/atsushieno/cmidi2 #include +#endif #if LIBREMIDI_USE_NI_MIDI2 #include #endif @@ -12,29 +14,29 @@ #include #include #include +#include inline std::ostream& operator<<(std::ostream& s, libremidi::port_information::port_type t) { - using enum libremidi::port_information::port_type; - if (t & software) + if (t & libremidi::transport_type::software) { s << "software"; - if (t & loopback) + if (t & libremidi::transport_type::loopback) s << ", loopback"; } - if (t & hardware) + if (t & libremidi::transport_type::hardware) { s << "hardware"; - if (t & usb) + if (t & libremidi::transport_type::usb) s << ", usb"; - if (t & bluetooth) + if (t & libremidi::transport_type::bluetooth) s << ", bt"; - if (t & pci) + if (t & libremidi::transport_type::pci) s << ", pci"; } - if (t & network) + if (t & libremidi::transport_type::network) s << "network"; return s; } diff --git a/include/libremidi/api-c.h b/include/libremidi/api-c.h index ab2a4ee8..510cd793 100644 --- a/include/libremidi/api-c.h +++ b/include/libremidi/api-c.h @@ -1,13 +1,15 @@ #pragma once +#ifndef LIBREMIDI_API_C_H +#define LIBREMIDI_API_C_H -#if __cplusplus +#if __cplusplus && !defined(LIBREMIDI_MODULE_BUILD) extern "C" { #endif //! MIDI API specifier arguments. //! To get information on which feature is supported by each back-end, check their backend file //! in e.g. backends/winmm.hpp, etc. -typedef enum libremidi_api +enum libremidi_api { UNSPECIFIED = 0x0, /*!< Search for a working compiled API. */ @@ -36,8 +38,11 @@ typedef enum libremidi_api PIPEWIRE_UMP, /*!< MIDI2 over PipeWire. Requires v1.4+. */ DUMMY = 0xFFFF /*!< A compilable but non-functional API. */ -} libremidi_api; +}; -#if __cplusplus +typedef enum libremidi_api libremidi_api; + +#if __cplusplus && !defined(LIBREMIDI_MODULE_BUILD) } #endif +#endif diff --git a/include/libremidi/api.hpp b/include/libremidi/api.hpp index 2f1e7df1..2a957fcf 100644 --- a/include/libremidi/api.hpp +++ b/include/libremidi/api.hpp @@ -5,7 +5,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { //! MIDI API specifier arguments. //! To get information on which feature is supported by each back-end, check their backend file diff --git a/include/libremidi/backends.hpp b/include/libremidi/backends.hpp index a3a218f2..9d06f646 100644 --- a/include/libremidi/backends.hpp +++ b/include/libremidi/backends.hpp @@ -81,7 +81,7 @@ #include #endif -namespace libremidi +NAMESPACE_LIBREMIDI { // The order here will control the order of the API search in // the constructor. @@ -93,7 +93,7 @@ constexpr auto make_tl(unused, Args...) namespace midi1 { -static constexpr auto available_backends = make_tl( +LIBREMIDI_STATIC constexpr auto available_backends = make_tl( 0 #if defined(LIBREMIDI_ALSA) , @@ -167,7 +167,7 @@ auto for_backend(libremidi::API api, F&& f) namespace midi2 { -static constexpr auto available_backends = make_tl( +LIBREMIDI_STATIC constexpr auto available_backends = make_tl( 0 #if defined(LIBREMIDI_ALSA) && LIBREMIDI_ALSA_HAS_UMP , diff --git a/include/libremidi/backends/alsa_raw.hpp b/include/libremidi/backends/alsa_raw.hpp index e80b3d28..275bb061 100644 --- a/include/libremidi/backends/alsa_raw.hpp +++ b/include/libremidi/backends/alsa_raw.hpp @@ -9,7 +9,7 @@ // https://ccrma.stanford.edu/~craig/articles/linuxmidi/alsa-1.0/alsarawportlist.c // Thanks Craig Stuart Sapp -namespace libremidi::alsa_raw +NAMESPACE_LIBREMIDI::alsa_raw { struct backend { diff --git a/include/libremidi/backends/alsa_raw/config.hpp b/include/libremidi/backends/alsa_raw/config.hpp index ace83431..b94e1e2d 100644 --- a/include/libremidi/backends/alsa_raw/config.hpp +++ b/include/libremidi/backends/alsa_raw/config.hpp @@ -10,12 +10,12 @@ #if __has_include() #include -namespace libremidi +NAMESPACE_LIBREMIDI { using poll_descriptors = pollfd; } #else -namespace libremidi +NAMESPACE_LIBREMIDI { struct poll_descriptors { @@ -26,7 +26,7 @@ struct poll_descriptors } #endif -namespace libremidi +NAMESPACE_LIBREMIDI { /** diff --git a/include/libremidi/backends/alsa_raw/helpers.hpp b/include/libremidi/backends/alsa_raw/helpers.hpp index 95412893..c5483f52 100644 --- a/include/libremidi/backends/alsa_raw/helpers.hpp +++ b/include/libremidi/backends/alsa_raw/helpers.hpp @@ -20,9 +20,7 @@ // https://ccrma.stanford.edu/~craig/articles/linuxmidi/alsa-1.0/alsarawportlist.c // Thanks Craig Stuart Sapp -namespace libremidi -{ -namespace +NAMESPACE_LIBREMIDI { struct alsa_raw_port_id { @@ -47,7 +45,6 @@ inline constexpr alsa_raw_port_id raw_from_port_handle(port_handle p) noexcept static_assert(raw_from_port_handle(raw_to_port_handle({102, 7, 3})).card == 102); static_assert(raw_from_port_handle(raw_to_port_handle({12, 7, 3})).dev == 7); static_assert(raw_from_port_handle(raw_to_port_handle({12, 7, 3})).port == 3); -} namespace alsa_raw { @@ -121,8 +118,9 @@ struct enumerator else if (status < 0 && status != -ENXIO) { handler.libremidi_handle_error( - configuration, "Cannot get rawmidi information: " + device_identifier(card, device, sub) - + " : " + snd.strerror(status)); + configuration, + "Cannot get rawmidi information: " + device_identifier(card, device, sub) + " : " + + snd.strerror(status)); return status; } else @@ -208,7 +206,8 @@ inline snd_ctl_wrapper::snd_ctl_wrapper(enumerator& self, const char* name) if (status < 0) { self.handler.libremidi_handle_error( - self.configuration, "cannot open control for card"s + name + " : " + snd.strerror(status)); + self.configuration, + "cannot open control for card"s + name + " : " + snd.strerror(status)); } } diff --git a/include/libremidi/backends/alsa_raw/midi_in.hpp b/include/libremidi/backends/alsa_raw/midi_in.hpp index 1fc53722..3ae09728 100644 --- a/include/libremidi/backends/alsa_raw/midi_in.hpp +++ b/include/libremidi/backends/alsa_raw/midi_in.hpp @@ -10,7 +10,7 @@ #include #include -namespace libremidi::alsa_raw +NAMESPACE_LIBREMIDI::alsa_raw { class midi_in_impl : public midi1::in_api @@ -343,7 +343,7 @@ class midi_in_alsa_raw_manual : public midi_in_impl }; } -namespace libremidi +NAMESPACE_LIBREMIDI { template <> inline std::unique_ptr make( diff --git a/include/libremidi/backends/alsa_raw/midi_out.hpp b/include/libremidi/backends/alsa_raw/midi_out.hpp index ad7f49c3..77467183 100644 --- a/include/libremidi/backends/alsa_raw/midi_out.hpp +++ b/include/libremidi/backends/alsa_raw/midi_out.hpp @@ -8,7 +8,7 @@ #include #include -namespace libremidi::alsa_raw +NAMESPACE_LIBREMIDI::alsa_raw { class midi_out_impl final : public midi1::out_api diff --git a/include/libremidi/backends/alsa_raw/observer.hpp b/include/libremidi/backends/alsa_raw/observer.hpp index 22876304..d52fe8c3 100644 --- a/include/libremidi/backends/alsa_raw/observer.hpp +++ b/include/libremidi/backends/alsa_raw/observer.hpp @@ -9,7 +9,7 @@ #endif #include -namespace libremidi::alsa_raw +NAMESPACE_LIBREMIDI::alsa_raw { template class observer_impl_base @@ -256,7 +256,7 @@ class observer_impl_base }; } -namespace libremidi::alsa_raw +NAMESPACE_LIBREMIDI::alsa_raw { struct observer_impl : observer_impl_base { diff --git a/include/libremidi/backends/alsa_raw_ump.hpp b/include/libremidi/backends/alsa_raw_ump.hpp index a6316e77..fc1c4da5 100644 --- a/include/libremidi/backends/alsa_raw_ump.hpp +++ b/include/libremidi/backends/alsa_raw_ump.hpp @@ -7,7 +7,7 @@ #include -namespace libremidi::alsa_raw_ump +NAMESPACE_LIBREMIDI::alsa_raw_ump { struct backend { diff --git a/include/libremidi/backends/alsa_raw_ump/config.hpp b/include/libremidi/backends/alsa_raw_ump/config.hpp index 39c71b69..d9e82f2b 100644 --- a/include/libremidi/backends/alsa_raw_ump/config.hpp +++ b/include/libremidi/backends/alsa_raw_ump/config.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi::alsa_raw_ump +NAMESPACE_LIBREMIDI::alsa_raw_ump { struct input_configuration { diff --git a/include/libremidi/backends/alsa_raw_ump/helpers.hpp b/include/libremidi/backends/alsa_raw_ump/helpers.hpp index 6c22ed52..a4c2e5b5 100644 --- a/include/libremidi/backends/alsa_raw_ump/helpers.hpp +++ b/include/libremidi/backends/alsa_raw_ump/helpers.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi::alsa_raw_ump +NAMESPACE_LIBREMIDI::alsa_raw_ump { struct midi2_enumerator : alsa_raw::enumerator { diff --git a/include/libremidi/backends/alsa_raw_ump/midi_in.hpp b/include/libremidi/backends/alsa_raw_ump/midi_in.hpp index 0146f971..67482861 100644 --- a/include/libremidi/backends/alsa_raw_ump/midi_in.hpp +++ b/include/libremidi/backends/alsa_raw_ump/midi_in.hpp @@ -10,7 +10,7 @@ #include #include -namespace libremidi::alsa_raw_ump +NAMESPACE_LIBREMIDI::alsa_raw_ump { class midi_in_impl : public midi2::in_api @@ -339,7 +339,7 @@ class midi_in_impl_manual : public midi_in_impl }; } -namespace libremidi +NAMESPACE_LIBREMIDI { template <> inline std::unique_ptr make( diff --git a/include/libremidi/backends/alsa_raw_ump/midi_out.hpp b/include/libremidi/backends/alsa_raw_ump/midi_out.hpp index 26c71559..0ca5b878 100644 --- a/include/libremidi/backends/alsa_raw_ump/midi_out.hpp +++ b/include/libremidi/backends/alsa_raw_ump/midi_out.hpp @@ -13,7 +13,7 @@ #include #include -namespace libremidi::alsa_raw_ump +NAMESPACE_LIBREMIDI::alsa_raw_ump { class midi_out_impl final : public midi2::out_api diff --git a/include/libremidi/backends/alsa_raw_ump/observer.hpp b/include/libremidi/backends/alsa_raw_ump/observer.hpp index d43fc835..0c448056 100644 --- a/include/libremidi/backends/alsa_raw_ump/observer.hpp +++ b/include/libremidi/backends/alsa_raw_ump/observer.hpp @@ -2,7 +2,7 @@ #include #include -namespace libremidi::alsa_raw_ump +NAMESPACE_LIBREMIDI::alsa_raw_ump { class observer_impl : public alsa_raw::observer_impl_base { diff --git a/include/libremidi/backends/alsa_seq.hpp b/include/libremidi/backends/alsa_seq.hpp index bf59b3cb..bac33c3e 100644 --- a/include/libremidi/backends/alsa_seq.hpp +++ b/include/libremidi/backends/alsa_seq.hpp @@ -20,7 +20,7 @@ #include -namespace libremidi::alsa_seq +NAMESPACE_LIBREMIDI::alsa_seq { struct backend diff --git a/include/libremidi/backends/alsa_seq/config.hpp b/include/libremidi/backends/alsa_seq/config.hpp index 8153fb3f..26ff5d5a 100644 --- a/include/libremidi/backends/alsa_seq/config.hpp +++ b/include/libremidi/backends/alsa_seq/config.hpp @@ -15,7 +15,7 @@ typedef struct snd_seq_addr } #endif -namespace libremidi::alsa_seq +NAMESPACE_LIBREMIDI::alsa_seq { // Possible parameters: diff --git a/include/libremidi/backends/alsa_seq/helpers.hpp b/include/libremidi/backends/alsa_seq/helpers.hpp index 80bcb5b5..8f5a72c2 100644 --- a/include/libremidi/backends/alsa_seq/helpers.hpp +++ b/include/libremidi/backends/alsa_seq/helpers.hpp @@ -9,7 +9,7 @@ #include #include -namespace libremidi::alsa_seq +NAMESPACE_LIBREMIDI::alsa_seq { struct event_handle { @@ -42,8 +42,6 @@ struct event_handle ~event_handle() { snd.seq.free_event(ev); } }; -namespace -{ inline constexpr port_handle seq_to_port_handle(uint64_t client, uint64_t port) noexcept { return (port << 32) + client; @@ -158,7 +156,6 @@ inline unsigned int iterate_port_info( return count; return 0; } -} // A structure to hold variables related to the ALSA API // implementation. diff --git a/include/libremidi/backends/alsa_seq/midi_in.hpp b/include/libremidi/backends/alsa_seq/midi_in.hpp index fad7da98..8d0be5d8 100644 --- a/include/libremidi/backends/alsa_seq/midi_in.hpp +++ b/include/libremidi/backends/alsa_seq/midi_in.hpp @@ -5,7 +5,7 @@ #include #include -namespace libremidi::alsa_seq +NAMESPACE_LIBREMIDI::alsa_seq { struct dummy_processing { @@ -525,7 +525,7 @@ class midi_in_alsa_manual : public midi_in_impl inline std::unique_ptr diff --git a/include/libremidi/backends/alsa_seq/midi_out.hpp b/include/libremidi/backends/alsa_seq/midi_out.hpp index 85212290..0865c5e6 100644 --- a/include/libremidi/backends/alsa_seq/midi_out.hpp +++ b/include/libremidi/backends/alsa_seq/midi_out.hpp @@ -3,7 +3,7 @@ #include #include -namespace libremidi::alsa_seq +NAMESPACE_LIBREMIDI::alsa_seq { class midi_out_impl final diff --git a/include/libremidi/backends/alsa_seq/observer.hpp b/include/libremidi/backends/alsa_seq/observer.hpp index 5296dd53..77a331f0 100644 --- a/include/libremidi/backends/alsa_seq/observer.hpp +++ b/include/libremidi/backends/alsa_seq/observer.hpp @@ -13,7 +13,7 @@ #include -namespace libremidi::alsa_seq +NAMESPACE_LIBREMIDI::alsa_seq { struct client_info @@ -487,7 +487,7 @@ class observer_manual : public observer_impl }; } -namespace libremidi +NAMESPACE_LIBREMIDI { template <> inline std::unique_ptr diff --git a/include/libremidi/backends/alsa_seq/shared_handler.hpp b/include/libremidi/backends/alsa_seq/shared_handler.hpp index 580344c8..3e9dd668 100644 --- a/include/libremidi/backends/alsa_seq/shared_handler.hpp +++ b/include/libremidi/backends/alsa_seq/shared_handler.hpp @@ -9,7 +9,7 @@ #include -namespace libremidi::alsa_seq +NAMESPACE_LIBREMIDI::alsa_seq { struct shared_handler : public libremidi::shared_context diff --git a/include/libremidi/backends/alsa_seq_ump.hpp b/include/libremidi/backends/alsa_seq_ump.hpp index 43555007..56b0f867 100644 --- a/include/libremidi/backends/alsa_seq_ump.hpp +++ b/include/libremidi/backends/alsa_seq_ump.hpp @@ -9,7 +9,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { template <> inline std::unique_ptr @@ -42,7 +42,7 @@ inline std::unique_ptr make< } -namespace libremidi::alsa_seq_ump +NAMESPACE_LIBREMIDI::alsa_seq_ump { struct backend { diff --git a/include/libremidi/backends/alsa_seq_ump/config.hpp b/include/libremidi/backends/alsa_seq_ump/config.hpp index f57a3061..661de4ab 100644 --- a/include/libremidi/backends/alsa_seq_ump/config.hpp +++ b/include/libremidi/backends/alsa_seq_ump/config.hpp @@ -11,7 +11,7 @@ extern "C" { typedef struct snd_seq_ump_event snd_seq_ump_event_t; } -namespace libremidi::alsa_seq_ump +NAMESPACE_LIBREMIDI::alsa_seq_ump { struct poll_parameters diff --git a/include/libremidi/backends/alsa_seq_ump/midi_out.hpp b/include/libremidi/backends/alsa_seq_ump/midi_out.hpp index e3e13853..bb9be5c4 100644 --- a/include/libremidi/backends/alsa_seq_ump/midi_out.hpp +++ b/include/libremidi/backends/alsa_seq_ump/midi_out.hpp @@ -5,7 +5,7 @@ #include #include -namespace libremidi::alsa_seq_ump +NAMESPACE_LIBREMIDI::alsa_seq_ump { class midi_out_impl final diff --git a/include/libremidi/backends/android/android.hpp b/include/libremidi/backends/android/android.hpp index 53b16e05..9dc3a7c3 100644 --- a/include/libremidi/backends/android/android.hpp +++ b/include/libremidi/backends/android/android.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { namespace android { diff --git a/include/libremidi/backends/android/config.hpp b/include/libremidi/backends/android/config.hpp index 1f805edf..55d8ae0d 100644 --- a/include/libremidi/backends/android/config.hpp +++ b/include/libremidi/backends/android/config.hpp @@ -1,7 +1,7 @@ #pragma once #include -namespace libremidi +NAMESPACE_LIBREMIDI { namespace android { diff --git a/include/libremidi/backends/android/helpers.cpp b/include/libremidi/backends/android/helpers.cpp index f41bedbb..da90bf3e 100644 --- a/include/libremidi/backends/android/helpers.cpp +++ b/include/libremidi/backends/android/helpers.cpp @@ -2,7 +2,7 @@ #include #include -namespace libremidi::android +NAMESPACE_LIBREMIDI::android { // Main source of knowledge is RtMidi implementation // which was done by Yellow Labrador diff --git a/include/libremidi/backends/android/helpers.hpp b/include/libremidi/backends/android/helpers.hpp index 881639be..7f4ce41c 100644 --- a/include/libremidi/backends/android/helpers.hpp +++ b/include/libremidi/backends/android/helpers.hpp @@ -16,7 +16,7 @@ #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) -namespace libremidi +NAMESPACE_LIBREMIDI { namespace android { diff --git a/include/libremidi/backends/android/midi_in.hpp b/include/libremidi/backends/android/midi_in.hpp index 0aea6c43..78fca938 100644 --- a/include/libremidi/backends/android/midi_in.hpp +++ b/include/libremidi/backends/android/midi_in.hpp @@ -8,7 +8,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { namespace android { diff --git a/include/libremidi/backends/android/midi_out.hpp b/include/libremidi/backends/android/midi_out.hpp index 58bf273c..fb129863 100644 --- a/include/libremidi/backends/android/midi_out.hpp +++ b/include/libremidi/backends/android/midi_out.hpp @@ -3,7 +3,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { namespace android { diff --git a/include/libremidi/backends/android/observer.hpp b/include/libremidi/backends/android/observer.hpp index 654004a7..f3200021 100644 --- a/include/libremidi/backends/android/observer.hpp +++ b/include/libremidi/backends/android/observer.hpp @@ -3,7 +3,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { namespace android { diff --git a/include/libremidi/backends/coremidi.hpp b/include/libremidi/backends/coremidi.hpp index 86fd4857..eab24e84 100644 --- a/include/libremidi/backends/coremidi.hpp +++ b/include/libremidi/backends/coremidi.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct core_backend { diff --git a/include/libremidi/backends/coremidi/config.hpp b/include/libremidi/backends/coremidi/config.hpp index 359dece3..db319565 100644 --- a/include/libremidi/backends/coremidi/config.hpp +++ b/include/libremidi/backends/coremidi/config.hpp @@ -18,7 +18,7 @@ typedef MIDIObjectRef MIDIClientRef; using MIDIClientRef = uint32_t; using MIDIObjectRef = uint32_t; #endif -namespace libremidi +NAMESPACE_LIBREMIDI { struct coremidi_input_configuration diff --git a/include/libremidi/backends/coremidi/error_domain.hpp b/include/libremidi/backends/coremidi/error_domain.hpp index fb33d39f..ff82cccc 100644 --- a/include/libremidi/backends/coremidi/error_domain.hpp +++ b/include/libremidi/backends/coremidi/error_domain.hpp @@ -3,7 +3,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct coremidi_error_domain : public stdx::error_domain { diff --git a/include/libremidi/backends/coremidi/helpers.hpp b/include/libremidi/backends/coremidi/helpers.hpp index a3e3e211..2d851341 100644 --- a/include/libremidi/backends/coremidi/helpers.hpp +++ b/include/libremidi/backends/coremidi/helpers.hpp @@ -21,13 +21,12 @@ #define LIBREMIDI_AUDIO_GET_CURRENT_HOST_TIME AudioGetCurrentHostTime #endif -namespace libremidi +NAMESPACE_LIBREMIDI { using CFString_handle = unique_handle; using CFStringMutable_handle = unique_handle<__CFString, CFRelease>; -namespace -{ -static inline std::string get_string_property(MIDIObjectRef object, CFStringRef property) noexcept + +LIBREMIDI_STATIC std::string get_string_property(MIDIObjectRef object, CFStringRef property) noexcept { CFStringRef res; if (MIDIObjectGetStringProperty(object, property, &res) || !res) @@ -39,14 +38,14 @@ static inline std::string get_string_property(MIDIObjectRef object, CFStringRef return name; } -static inline int32_t get_int_property(MIDIObjectRef object, CFStringRef property) noexcept +LIBREMIDI_STATIC int32_t get_int_property(MIDIObjectRef object, CFStringRef property) noexcept { SInt32 res; MIDIObjectGetIntegerProperty(object, property, &res); return res; } -static inline CFString_handle toCFString(std::string_view str) noexcept +LIBREMIDI_STATIC CFString_handle toCFString(std::string_view str) noexcept { return CFString_handle{CFStringCreateWithCString(nullptr, str.data(), kCFStringEncodingASCII)}; } @@ -72,12 +71,12 @@ inline uint64_t AudioConvertHostTimeToNanos(uint64_t hostTime) } #endif -static inline auto get_cfstring_property(MIDIObjectRef prop, CFStringRef name) +LIBREMIDI_STATIC auto get_cfstring_property(MIDIObjectRef prop, CFStringRef name) { CFStringRef str = nullptr; MIDIObjectGetStringProperty(prop, name, &str); return CFString_handle{str}; -}; +} // This function was submitted by Douglas Casey Tucker and apparently // derived largely from PortMidi. @@ -233,7 +232,6 @@ locate_object(auto& self, const port_information& info, MIDIObjectType requested return object; } -} // A structure to hold variables related to the CoreMIDI API // implementation. diff --git a/include/libremidi/backends/coremidi/midi_in.hpp b/include/libremidi/backends/coremidi/midi_in.hpp index bd11b5d5..0f842466 100644 --- a/include/libremidi/backends/coremidi/midi_in.hpp +++ b/include/libremidi/backends/coremidi/midi_in.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_in_core final : public midi1::in_api diff --git a/include/libremidi/backends/coremidi/midi_out.hpp b/include/libremidi/backends/coremidi/midi_out.hpp index 3b60a855..39c76acf 100644 --- a/include/libremidi/backends/coremidi/midi_out.hpp +++ b/include/libremidi/backends/coremidi/midi_out.hpp @@ -3,7 +3,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_out_core final : public midi1::out_api @@ -111,8 +111,8 @@ class midi_out_core final const MIDITimeStamp timestamp = LIBREMIDI_AUDIO_GET_CURRENT_HOST_TIME(); const ByteCount bufsize = nBytes > 65535 ? 65535 : nBytes; - Byte buffer[bufsize + 16]; // pad for other struct members - ByteCount listSize = sizeof(buffer); + Byte* buffer = (Byte*)alloca(bufsize + 16); // pad for other struct members + ByteCount listSize = bufsize + 16; MIDIPacketList* packetList = (MIDIPacketList*)buffer; ByteCount remainingBytes = nBytes; diff --git a/include/libremidi/backends/coremidi/observer.hpp b/include/libremidi/backends/coremidi/observer.hpp index bcd2d2a1..1a3a93eb 100644 --- a/include/libremidi/backends/coremidi/observer.hpp +++ b/include/libremidi/backends/coremidi/observer.hpp @@ -7,7 +7,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { class observer_core : public observer_api @@ -219,7 +219,7 @@ class observer_core }; } -namespace libremidi::coremidi +NAMESPACE_LIBREMIDI::coremidi { struct observer_impl : observer_core { diff --git a/include/libremidi/backends/coremidi_ump.hpp b/include/libremidi/backends/coremidi_ump.hpp index 49b5da97..3aa84571 100644 --- a/include/libremidi/backends/coremidi_ump.hpp +++ b/include/libremidi/backends/coremidi_ump.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi::coremidi_ump +NAMESPACE_LIBREMIDI::coremidi_ump { struct backend { diff --git a/include/libremidi/backends/coremidi_ump/config.hpp b/include/libremidi/backends/coremidi_ump/config.hpp index dee80f9e..7d5f9274 100644 --- a/include/libremidi/backends/coremidi_ump/config.hpp +++ b/include/libremidi/backends/coremidi_ump/config.hpp @@ -1,7 +1,7 @@ #pragma once #include -namespace libremidi::coremidi_ump +NAMESPACE_LIBREMIDI::coremidi_ump { struct input_configuration { diff --git a/include/libremidi/backends/coremidi_ump/midi_in.hpp b/include/libremidi/backends/coremidi_ump/midi_in.hpp index dcbbe4bd..019612c3 100644 --- a/include/libremidi/backends/coremidi_ump/midi_in.hpp +++ b/include/libremidi/backends/coremidi_ump/midi_in.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi::coremidi_ump +NAMESPACE_LIBREMIDI::coremidi_ump { class midi_in_impl final diff --git a/include/libremidi/backends/coremidi_ump/midi_out.hpp b/include/libremidi/backends/coremidi_ump/midi_out.hpp index 2211fcf1..e71d9563 100644 --- a/include/libremidi/backends/coremidi_ump/midi_out.hpp +++ b/include/libremidi/backends/coremidi_ump/midi_out.hpp @@ -5,7 +5,7 @@ #include #include -namespace libremidi::coremidi_ump +NAMESPACE_LIBREMIDI::coremidi_ump { class midi_out_impl final : public midi2::out_api diff --git a/include/libremidi/backends/coremidi_ump/observer.hpp b/include/libremidi/backends/coremidi_ump/observer.hpp index 835fc1c4..18dad5f5 100644 --- a/include/libremidi/backends/coremidi_ump/observer.hpp +++ b/include/libremidi/backends/coremidi_ump/observer.hpp @@ -2,7 +2,7 @@ #include #include -namespace libremidi::coremidi_ump +NAMESPACE_LIBREMIDI::coremidi_ump { class observer_impl final : public libremidi::observer_core diff --git a/include/libremidi/backends/dummy.hpp b/include/libremidi/backends/dummy.hpp index 896fa0cf..02449974 100644 --- a/include/libremidi/backends/dummy.hpp +++ b/include/libremidi/backends/dummy.hpp @@ -7,7 +7,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { class observer_dummy : public observer_api { diff --git a/include/libremidi/backends/emscripten.hpp b/include/libremidi/backends/emscripten.hpp index ccd7dd2a..d948fef4 100644 --- a/include/libremidi/backends/emscripten.hpp +++ b/include/libremidi/backends/emscripten.hpp @@ -9,7 +9,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct emscripten_backend diff --git a/include/libremidi/backends/emscripten/config.hpp b/include/libremidi/backends/emscripten/config.hpp index 6a1d7354..869ea96b 100644 --- a/include/libremidi/backends/emscripten/config.hpp +++ b/include/libremidi/backends/emscripten/config.hpp @@ -1,7 +1,7 @@ #pragma once #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct emscripten_input_configuration diff --git a/include/libremidi/backends/emscripten/helpers.hpp b/include/libremidi/backends/emscripten/helpers.hpp index 3064ae10..9a30fa6c 100644 --- a/include/libremidi/backends/emscripten/helpers.hpp +++ b/include/libremidi/backends/emscripten/helpers.hpp @@ -3,7 +3,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { namespace webmidi_helpers { diff --git a/include/libremidi/backends/emscripten/midi_access.hpp b/include/libremidi/backends/emscripten/midi_access.hpp index e00e3761..fc5f1711 100644 --- a/include/libremidi/backends/emscripten/midi_access.hpp +++ b/include/libremidi/backends/emscripten/midi_access.hpp @@ -16,7 +16,7 @@ EMSCRIPTEN_KEEPALIVE void libremidi_devices_input(int port, double timestamp, int len, char* bytes); } -namespace libremidi +NAMESPACE_LIBREMIDI { namespace webmidi_helpers { diff --git a/include/libremidi/backends/emscripten/midi_in.cpp b/include/libremidi/backends/emscripten/midi_in.cpp index 60cf3547..3ca74765 100644 --- a/include/libremidi/backends/emscripten/midi_in.cpp +++ b/include/libremidi/backends/emscripten/midi_in.cpp @@ -5,7 +5,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { LIBREMIDI_INLINE midi_in_emscripten::midi_in_emscripten( input_configuration&& conf, emscripten_input_configuration&& apiconf) diff --git a/include/libremidi/backends/emscripten/midi_in.hpp b/include/libremidi/backends/emscripten/midi_in.hpp index feacd375..294c61f8 100644 --- a/include/libremidi/backends/emscripten/midi_in.hpp +++ b/include/libremidi/backends/emscripten/midi_in.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_in_emscripten final : public midi1::in_api diff --git a/include/libremidi/backends/emscripten/midi_out.cpp b/include/libremidi/backends/emscripten/midi_out.cpp index 3d5b375b..e08d2adb 100644 --- a/include/libremidi/backends/emscripten/midi_out.cpp +++ b/include/libremidi/backends/emscripten/midi_out.cpp @@ -2,7 +2,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { LIBREMIDI_INLINE midi_out_emscripten::midi_out_emscripten( output_configuration&& conf, emscripten_output_configuration&& apiconf) diff --git a/include/libremidi/backends/emscripten/midi_out.hpp b/include/libremidi/backends/emscripten/midi_out.hpp index a62849da..62f3b55f 100644 --- a/include/libremidi/backends/emscripten/midi_out.hpp +++ b/include/libremidi/backends/emscripten/midi_out.hpp @@ -3,7 +3,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_out_emscripten final : public midi1::out_api diff --git a/include/libremidi/backends/emscripten/observer.cpp b/include/libremidi/backends/emscripten/observer.cpp index 31ef49e3..b67a38bc 100644 --- a/include/libremidi/backends/emscripten/observer.cpp +++ b/include/libremidi/backends/emscripten/observer.cpp @@ -4,7 +4,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { LIBREMIDI_INLINE observer_emscripten::observer_emscripten( observer_configuration&& conf, emscripten_observer_configuration&& apiconf) diff --git a/include/libremidi/backends/emscripten/observer.hpp b/include/libremidi/backends/emscripten/observer.hpp index 017785df..81fb7308 100644 --- a/include/libremidi/backends/emscripten/observer.hpp +++ b/include/libremidi/backends/emscripten/observer.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { class observer_emscripten final : public observer_api { diff --git a/include/libremidi/backends/jack.hpp b/include/libremidi/backends/jack.hpp index 7b523686..c703ecbd 100644 --- a/include/libremidi/backends/jack.hpp +++ b/include/libremidi/backends/jack.hpp @@ -13,7 +13,7 @@ // // *********************************************************************// -namespace libremidi +NAMESPACE_LIBREMIDI { struct jack_backend { diff --git a/include/libremidi/backends/jack/config.hpp b/include/libremidi/backends/jack/config.hpp index d99ed924..6feabcbf 100644 --- a/include/libremidi/backends/jack/config.hpp +++ b/include/libremidi/backends/jack/config.hpp @@ -11,7 +11,7 @@ typedef uint32_t jack_nframes_t; typedef int (*JackProcessCallback)(jack_nframes_t nframes, void* arg); } -namespace libremidi +NAMESPACE_LIBREMIDI { using jack_callback_function = std::function; struct jack_callback diff --git a/include/libremidi/backends/jack/error_domain.hpp b/include/libremidi/backends/jack/error_domain.hpp index 68c7364e..bc82ef8f 100644 --- a/include/libremidi/backends/jack/error_domain.hpp +++ b/include/libremidi/backends/jack/error_domain.hpp @@ -11,7 +11,7 @@ #include #endif -namespace libremidi +NAMESPACE_LIBREMIDI { struct jack_error_domain : public stdx::error_domain { diff --git a/include/libremidi/backends/jack/helpers.hpp b/include/libremidi/backends/jack/helpers.hpp index afee8296..1bf5f276 100644 --- a/include/libremidi/backends/jack/helpers.hpp +++ b/include/libremidi/backends/jack/helpers.hpp @@ -9,7 +9,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct jack_client { diff --git a/include/libremidi/backends/jack/midi_in.hpp b/include/libremidi/backends/jack/midi_in.hpp index bc4432c3..2f7467b1 100644 --- a/include/libremidi/backends/jack/midi_in.hpp +++ b/include/libremidi/backends/jack/midi_in.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_in_jack final : public midi1::in_api diff --git a/include/libremidi/backends/jack/midi_out.hpp b/include/libremidi/backends/jack/midi_out.hpp index 714a0cbc..fcac4f9d 100644 --- a/include/libremidi/backends/jack/midi_out.hpp +++ b/include/libremidi/backends/jack/midi_out.hpp @@ -3,7 +3,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_out_jack : public midi1::out_api @@ -166,7 +166,7 @@ class midi_out_jack_direct final : public midi_out_jack }; } -namespace libremidi +NAMESPACE_LIBREMIDI { template <> inline std::unique_ptr make( diff --git a/include/libremidi/backends/jack/observer.hpp b/include/libremidi/backends/jack/observer.hpp index b8059bcd..87e6651f 100644 --- a/include/libremidi/backends/jack/observer.hpp +++ b/include/libremidi/backends/jack/observer.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { class observer_jack final : public observer_api diff --git a/include/libremidi/backends/jack/shared_handler.hpp b/include/libremidi/backends/jack/shared_handler.hpp index 022c6ef6..f1563fc6 100644 --- a/include/libremidi/backends/jack/shared_handler.hpp +++ b/include/libremidi/backends/jack/shared_handler.hpp @@ -8,7 +8,7 @@ #include -namespace libremidi::jack +NAMESPACE_LIBREMIDI::jack { // Create a JACK client which will be shared across objects diff --git a/include/libremidi/backends/jack_ump.hpp b/include/libremidi/backends/jack_ump.hpp index 2246c240..89b6a9e4 100644 --- a/include/libremidi/backends/jack_ump.hpp +++ b/include/libremidi/backends/jack_ump.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi::jack_ump +NAMESPACE_LIBREMIDI::jack_ump { struct backend { diff --git a/include/libremidi/backends/jack_ump/config.hpp b/include/libremidi/backends/jack_ump/config.hpp index e828e252..ab5fe8b3 100644 --- a/include/libremidi/backends/jack_ump/config.hpp +++ b/include/libremidi/backends/jack_ump/config.hpp @@ -1,7 +1,7 @@ #pragma once #include -namespace libremidi::jack_ump +NAMESPACE_LIBREMIDI::jack_ump { struct input_configuration { diff --git a/include/libremidi/backends/jack_ump/midi_in.hpp b/include/libremidi/backends/jack_ump/midi_in.hpp index 7aa60879..6b185b31 100644 --- a/include/libremidi/backends/jack_ump/midi_in.hpp +++ b/include/libremidi/backends/jack_ump/midi_in.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi::jack_ump +NAMESPACE_LIBREMIDI::jack_ump { class midi_in_jack final : public midi2::in_api diff --git a/include/libremidi/backends/jack_ump/midi_out.hpp b/include/libremidi/backends/jack_ump/midi_out.hpp index 643070ba..a6ebaa70 100644 --- a/include/libremidi/backends/jack_ump/midi_out.hpp +++ b/include/libremidi/backends/jack_ump/midi_out.hpp @@ -3,7 +3,7 @@ #include #include -namespace libremidi::jack_ump +NAMESPACE_LIBREMIDI::jack_ump { class midi_out_jack : public midi2::out_api @@ -170,7 +170,7 @@ class midi_out_jack_direct final : public midi_out_jack }; } -namespace libremidi +NAMESPACE_LIBREMIDI { template <> inline std::unique_ptr diff --git a/include/libremidi/backends/jack_ump/observer.hpp b/include/libremidi/backends/jack_ump/observer.hpp index 4fb8a887..0db41608 100644 --- a/include/libremidi/backends/jack_ump/observer.hpp +++ b/include/libremidi/backends/jack_ump/observer.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi::jack_ump +NAMESPACE_LIBREMIDI::jack_ump { class observer_jack final : public observer_api diff --git a/include/libremidi/backends/keyboard.hpp b/include/libremidi/backends/keyboard.hpp index 6d18a312..650b5101 100644 --- a/include/libremidi/backends/keyboard.hpp +++ b/include/libremidi/backends/keyboard.hpp @@ -4,7 +4,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct kbd_backend { diff --git a/include/libremidi/backends/keyboard/config.hpp b/include/libremidi/backends/keyboard/config.hpp index 401728e8..c469abfa 100644 --- a/include/libremidi/backends/keyboard/config.hpp +++ b/include/libremidi/backends/keyboard/config.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { enum kbd_event { @@ -36,7 +36,7 @@ enum kbd_event // actually based on macOS virtual codes as it seems // impossible to get raw scan codes. // https://eastmanreference.com/complete-list-of-applescript-key-codes -static inline const std::map& scancode_map_macos(){ +LIBREMIDI_STATIC const std::map& scancode_map_macos(){ static const std::map ret{ { 0, NOTE_0}, // C0 { 13, NOTE_0 + 1}, @@ -83,7 +83,7 @@ static inline const std::map& scancode_map_macos(){ // Use: https://kbdlayout.info/KBDUSX/scancodes // Also valid for windows -static inline const std::map& scancode_map_linux() { +LIBREMIDI_STATIC const std::map& scancode_map_linux() { static const std::map ret{ { 0x1E, NOTE_0}, // C0 { 0x11, NOTE_0 + 1}, diff --git a/include/libremidi/backends/keyboard/midi_in.hpp b/include/libremidi/backends/keyboard/midi_in.hpp index 185b2f90..674ff388 100644 --- a/include/libremidi/backends/keyboard/midi_in.hpp +++ b/include/libremidi/backends/keyboard/midi_in.hpp @@ -5,7 +5,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_in_kbd final : public midi1::in_api diff --git a/include/libremidi/backends/linux/alsa.hpp b/include/libremidi/backends/linux/alsa.hpp index d68060c1..2846ea8c 100644 --- a/include/libremidi/backends/linux/alsa.hpp +++ b/include/libremidi/backends/linux/alsa.hpp @@ -19,7 +19,7 @@ #endif #endif -namespace libremidi +NAMESPACE_LIBREMIDI { struct libasound diff --git a/include/libremidi/backends/linux/dylib_loader.hpp b/include/libremidi/backends/linux/dylib_loader.hpp index 808e1975..80c24908 100644 --- a/include/libremidi/backends/linux/dylib_loader.hpp +++ b/include/libremidi/backends/linux/dylib_loader.hpp @@ -1,10 +1,11 @@ #pragma once +#include #if __has_include() #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class dylib_loader { diff --git a/include/libremidi/backends/linux/helpers.hpp b/include/libremidi/backends/linux/helpers.hpp index b86b461a..ccce4c97 100644 --- a/include/libremidi/backends/linux/helpers.hpp +++ b/include/libremidi/backends/linux/helpers.hpp @@ -7,7 +7,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct eventfd_notifier { diff --git a/include/libremidi/backends/linux/pipewire.hpp b/include/libremidi/backends/linux/pipewire.hpp index 4553cec5..171e20ce 100644 --- a/include/libremidi/backends/linux/pipewire.hpp +++ b/include/libremidi/backends/linux/pipewire.hpp @@ -4,7 +4,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { #pragma GCC diagnostic push diff --git a/include/libremidi/backends/linux/udev.hpp b/include/libremidi/backends/linux/udev.hpp index 4ea52e25..ff33e8d8 100644 --- a/include/libremidi/backends/linux/udev.hpp +++ b/include/libremidi/backends/linux/udev.hpp @@ -8,7 +8,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct libudev diff --git a/include/libremidi/backends/net/config.hpp b/include/libremidi/backends/net/config.hpp index 8365b505..6817c598 100644 --- a/include/libremidi/backends/net/config.hpp +++ b/include/libremidi/backends/net/config.hpp @@ -7,7 +7,7 @@ namespace boost::asio struct io_context; } -namespace libremidi::net +NAMESPACE_LIBREMIDI::net { enum class protocol { @@ -46,7 +46,7 @@ struct dgram_observer_configuration } -namespace libremidi::net_ump +NAMESPACE_LIBREMIDI::net_ump { enum class protocol { diff --git a/include/libremidi/backends/net/helpers.hpp b/include/libremidi/backends/net/helpers.hpp index 11847fc1..ca1251b1 100644 --- a/include/libremidi/backends/net/helpers.hpp +++ b/include/libremidi/backends/net/helpers.hpp @@ -23,7 +23,7 @@ class boost_system_error_domain : public error_domain string_ref message(const error& e) const noexcept override { auto err = e.m_value; - + } [[noreturn]] void throw_exception(const error& e) const override @@ -35,7 +35,7 @@ class boost_system_error_domain : public error_domain */ } -namespace libremidi +NAMESPACE_LIBREMIDI { template struct optionally_owned diff --git a/include/libremidi/backends/net/midi_in.hpp b/include/libremidi/backends/net/midi_in.hpp index 605d73d4..fb1b03a1 100644 --- a/include/libremidi/backends/net/midi_in.hpp +++ b/include/libremidi/backends/net/midi_in.hpp @@ -5,7 +5,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { template struct osc_parser @@ -115,7 +115,7 @@ struct osc_parser } -namespace libremidi::net +NAMESPACE_LIBREMIDI::net { struct osc_parser_midi1 @@ -264,7 +264,7 @@ class midi_in final }; } -namespace libremidi::net_ump +NAMESPACE_LIBREMIDI::net_ump { struct osc_parser_midi2 { diff --git a/include/libremidi/backends/net/midi_out.hpp b/include/libremidi/backends/net/midi_out.hpp index c77f2f15..ccb4e1e8 100644 --- a/include/libremidi/backends/net/midi_out.hpp +++ b/include/libremidi/backends/net/midi_out.hpp @@ -8,7 +8,7 @@ #include #include -namespace libremidi::net +NAMESPACE_LIBREMIDI::net { struct osc_midi1_packet @@ -146,7 +146,7 @@ class midi_out final } -namespace libremidi::net_ump +NAMESPACE_LIBREMIDI::net_ump { struct osc_midi2_packet { diff --git a/include/libremidi/backends/net/observer.hpp b/include/libremidi/backends/net/observer.hpp index d2b5516f..30320b5f 100644 --- a/include/libremidi/backends/net/observer.hpp +++ b/include/libremidi/backends/net/observer.hpp @@ -1,13 +1,13 @@ #pragma once #include -namespace libremidi::net +NAMESPACE_LIBREMIDI::net { using net_observer_configuration = libremidi::dummy_configuration; using observer = libremidi::observer_dummy; } -namespace libremidi::net_ump +NAMESPACE_LIBREMIDI::net_ump { using net_observer_configuration = libremidi::dummy_configuration; using observer = libremidi::observer_dummy; diff --git a/include/libremidi/backends/network.hpp b/include/libremidi/backends/network.hpp index 9ebc122b..f393a99e 100644 --- a/include/libremidi/backends/network.hpp +++ b/include/libremidi/backends/network.hpp @@ -7,7 +7,7 @@ #include -namespace libremidi::net +NAMESPACE_LIBREMIDI::net { struct backend { diff --git a/include/libremidi/backends/network_ump.hpp b/include/libremidi/backends/network_ump.hpp index 00c48076..90842bab 100644 --- a/include/libremidi/backends/network_ump.hpp +++ b/include/libremidi/backends/network_ump.hpp @@ -6,7 +6,7 @@ #include -namespace libremidi::net_ump +NAMESPACE_LIBREMIDI::net_ump { struct backend { diff --git a/include/libremidi/backends/pipewire.hpp b/include/libremidi/backends/pipewire.hpp index e66760ab..914a44d4 100644 --- a/include/libremidi/backends/pipewire.hpp +++ b/include/libremidi/backends/pipewire.hpp @@ -9,7 +9,7 @@ #include -namespace libremidi::pipewire +NAMESPACE_LIBREMIDI::pipewire { struct backend { diff --git a/include/libremidi/backends/pipewire/config.hpp b/include/libremidi/backends/pipewire/config.hpp index efb5c25e..69efb054 100644 --- a/include/libremidi/backends/pipewire/config.hpp +++ b/include/libremidi/backends/pipewire/config.hpp @@ -12,7 +12,7 @@ struct pw_filter; struct spa_io_position; } -namespace libremidi +NAMESPACE_LIBREMIDI { using pipewire_callback_function = std::function; struct pipewire_callback diff --git a/include/libremidi/backends/pipewire/context.hpp b/include/libremidi/backends/pipewire/context.hpp index f1b67a58..d13b7af1 100644 --- a/include/libremidi/backends/pipewire/context.hpp +++ b/include/libremidi/backends/pipewire/context.hpp @@ -25,7 +25,7 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-field-initializers" -namespace libremidi +NAMESPACE_LIBREMIDI { template using hash_map = std::unordered_map; diff --git a/include/libremidi/backends/pipewire/helpers.hpp b/include/libremidi/backends/pipewire/helpers.hpp index 56484d32..a8dc2be0 100644 --- a/include/libremidi/backends/pipewire/helpers.hpp +++ b/include/libremidi/backends/pipewire/helpers.hpp @@ -11,7 +11,12 @@ #include #include -namespace libremidi +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wsign-compare" +#endif + +NAMESPACE_LIBREMIDI { struct pipewire_helpers { @@ -476,3 +481,7 @@ struct pipewire_helpers } }; } + +#if defined(__clang__) + #pragma clang diagnostic pop +#endif diff --git a/include/libremidi/backends/pipewire/midi_in.hpp b/include/libremidi/backends/pipewire/midi_in.hpp index cca0ca85..6d0ae97c 100644 --- a/include/libremidi/backends/pipewire/midi_in.hpp +++ b/include/libremidi/backends/pipewire/midi_in.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_in_pipewire final : public midi1::in_api diff --git a/include/libremidi/backends/pipewire/midi_out.hpp b/include/libremidi/backends/pipewire/midi_out.hpp index 745e0de6..38bf1c2c 100644 --- a/include/libremidi/backends/pipewire/midi_out.hpp +++ b/include/libremidi/backends/pipewire/midi_out.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_out_pipewire : public midi1::out_api diff --git a/include/libremidi/backends/pipewire/observer.hpp b/include/libremidi/backends/pipewire/observer.hpp index 4e065da8..acc87a3d 100644 --- a/include/libremidi/backends/pipewire/observer.hpp +++ b/include/libremidi/backends/pipewire/observer.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { class observer_pipewire final : public observer_api diff --git a/include/libremidi/backends/pipewire/shared_handler.hpp b/include/libremidi/backends/pipewire/shared_handler.hpp index a0498641..36122cbb 100644 --- a/include/libremidi/backends/pipewire/shared_handler.hpp +++ b/include/libremidi/backends/pipewire/shared_handler.hpp @@ -8,7 +8,7 @@ #include -namespace libremidi::pipewire +NAMESPACE_LIBREMIDI::pipewire { // Create a PipeWire client which will be shared across objects diff --git a/include/libremidi/backends/pipewire_ump.hpp b/include/libremidi/backends/pipewire_ump.hpp index 3b1cb0fd..eed0a7ec 100644 --- a/include/libremidi/backends/pipewire_ump.hpp +++ b/include/libremidi/backends/pipewire_ump.hpp @@ -8,7 +8,7 @@ #include -namespace libremidi::pipewire_ump +NAMESPACE_LIBREMIDI::pipewire_ump { struct backend { diff --git a/include/libremidi/backends/pipewire_ump/config.hpp b/include/libremidi/backends/pipewire_ump/config.hpp index a9dcb58b..ab596840 100644 --- a/include/libremidi/backends/pipewire_ump/config.hpp +++ b/include/libremidi/backends/pipewire_ump/config.hpp @@ -2,7 +2,7 @@ #include #include -namespace libremidi::pipewire_ump +NAMESPACE_LIBREMIDI::pipewire_ump { struct input_configuration { diff --git a/include/libremidi/backends/pipewire_ump/midi_in.hpp b/include/libremidi/backends/pipewire_ump/midi_in.hpp index 14b090a7..05b112b3 100644 --- a/include/libremidi/backends/pipewire_ump/midi_in.hpp +++ b/include/libremidi/backends/pipewire_ump/midi_in.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi::pipewire_ump +NAMESPACE_LIBREMIDI::pipewire_ump { class midi_in_pipewire final : public midi2::in_api diff --git a/include/libremidi/backends/pipewire_ump/midi_out.hpp b/include/libremidi/backends/pipewire_ump/midi_out.hpp index e748996d..1c2bbffa 100644 --- a/include/libremidi/backends/pipewire_ump/midi_out.hpp +++ b/include/libremidi/backends/pipewire_ump/midi_out.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi::pipewire_ump +NAMESPACE_LIBREMIDI::pipewire_ump { class midi_out_pipewire : public midi2::out_api diff --git a/include/libremidi/backends/pipewire_ump/observer.hpp b/include/libremidi/backends/pipewire_ump/observer.hpp index c5249e95..e3b1bd87 100644 --- a/include/libremidi/backends/pipewire_ump/observer.hpp +++ b/include/libremidi/backends/pipewire_ump/observer.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi::pipewire_ump +NAMESPACE_LIBREMIDI::pipewire_ump { class observer_pipewire final : public observer_api diff --git a/include/libremidi/backends/winmidi.hpp b/include/libremidi/backends/winmidi.hpp index 9839d4c7..a641ab22 100644 --- a/include/libremidi/backends/winmidi.hpp +++ b/include/libremidi/backends/winmidi.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi::winmidi +NAMESPACE_LIBREMIDI::winmidi { struct backend { @@ -19,6 +19,8 @@ struct backend static const constexpr std::string_view name = "winmidi"; static const constexpr std::string_view display_name = "Windows MIDI Services"; - static constexpr inline bool available() noexcept { return true; } + static inline bool available() noexcept { + return libremidi::instance()->ready; + } }; -} // namespace libremidi +} // NAMESPACE_LIBREMIDI diff --git a/include/libremidi/backends/winmidi/config.hpp b/include/libremidi/backends/winmidi/config.hpp index a8d1b987..c1ef02f1 100644 --- a/include/libremidi/backends/winmidi/config.hpp +++ b/include/libremidi/backends/winmidi/config.hpp @@ -3,15 +3,17 @@ #include +#if !defined(LIBREMIDI_MODULE_BUILD) || !defined(_WIN32) namespace winrt::Microsoft::Windows::Devices::Midi2 { -class MidiSession; -class MidiEndpointDeviceInformation; -class MidiEndpointConnection; +struct MidiSession; +struct MidiEndpointDeviceInformation; +struct MidiEndpointConnection; } +#endif // TODO allow to share midi session and endpoints -namespace libremidi::winmidi +NAMESPACE_LIBREMIDI::winmidi { struct input_configuration diff --git a/include/libremidi/backends/winmidi/helpers.hpp b/include/libremidi/backends/winmidi/helpers.hpp index f2150baa..0a586bd7 100644 --- a/include/libremidi/backends/winmidi/helpers.hpp +++ b/include/libremidi/backends/winmidi/helpers.hpp @@ -21,42 +21,29 @@ #define LIBREMIDI_WINMIDI_HAS_COM_EXTENSIONS 1 #define LIBREMIDI_DEFINE_GUID_CONSTEXPR(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ - static constexpr const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} + LIBREMIDI_STATIC constexpr const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} -namespace libremidi { - LIBREMIDI_DEFINE_GUID_CONSTEXPR(IID, IID_IMidiEndpointConnectionMessagesReceivedCallback,0x8087b303,0x0519,0x31d1,0x31,0xd1,0x00,0x00,0x00,0x00,0x00,0x10); - LIBREMIDI_DEFINE_GUID_CONSTEXPR(IID, IID_IMidiEndpointConnectionRaw,0x8087b303,0x0519,0x31d1,0x31,0xd1,0x00,0x00,0x00,0x00,0x00,0x20); +NAMESPACE_LIBREMIDI { + LIBREMIDI_DEFINE_GUID_CONSTEXPR(IID, IID_IMidiEndpointConnectionMessagesReceivedCallback, 0x8087b303, 0x0519, 0x31d1, 0x31, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10); + LIBREMIDI_DEFINE_GUID_CONSTEXPR(IID, IID_IMidiEndpointConnectionRaw, 0x8087b303, 0x0519, 0x31d1, 0x31, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20); + LIBREMIDI_DEFINE_GUID_CONSTEXPR(IID, IID_IMidiClientInitializer, 0x8087b303, 0xd551, 0xbce2, 0x1e, 0xad, 0xa2, 0x50, 0x0d, 0x50, 0xc5, 0x80); + LIBREMIDI_DEFINE_GUID_CONSTEXPR(IID, IID_MidiClientInitializerUuid, 0xc3263827, 0xc3b0, 0xbdbd, 0x25, 0x00, 0xce, 0x63, 0xa3, 0xf3, 0xf2, 0xc3); + LIBREMIDI_DEFINE_GUID_CONSTEXPR(IID, IID_MidiSrvTransportUuid, 0x2ba15e4e, 0x5417, 0x4a66, 0x85, 0xb8, 0x2b, 0x22, 0x60, 0xef, 0xbc, 0x84); } #endif -// MinGW support -#if !defined(_MSC_VER) -namespace Microsoft::Windows::Devices::Midi2::Initialization -{ -struct IMidiClientInitializer; -struct MidiClientInitializerUuid; -} - -__CRT_UUID_DECL(Microsoft::Windows::Devices::Midi2::Initialization::IMidiClientInitializer, - 0x8087b303, 0xd551, 0xbce2, 0x1e, 0xad, 0xa2, 0x50, 0x0d, 0x50, 0xc5, 0x80); -__CRT_UUID_DECL(Microsoft::Windows::Devices::Midi2::Initialization::MidiClientInitializerUuid, - 0xc3263827, 0xc3b0, 0xbdbd, 0x25, 0x00, 0xce, 0x63, 0xa3, 0xf3, 0xf2, 0xc3); -#endif - -#include // clang-format on namespace midi2 = winrt::Microsoft::Windows::Devices::Midi2; namespace foundation = winrt::Windows::Foundation; -namespace libremidi::winmidi +NAMESPACE_LIBREMIDI::winmidi { using namespace winrt; using namespace winrt::Windows::Foundation; using namespace winrt::Windows::Devices::Enumeration; using namespace winrt::Windows::Storage::Streams; using namespace winrt::Microsoft::Windows::Devices::Midi2; -using namespace ::Microsoft::Windows::Devices::Midi2::Initialization; inline bool ichar_equals(char a, char b) { @@ -94,16 +81,138 @@ get_port(const std::string& device_name, int group_terminal_block) } return {nullptr, nullptr}; } + +// From Microsoft.Windows.Devices.Midi2.Initialization.hpp +typedef enum +{ + Platform_x64 = 1, + // Platform_Arm64 = 2, + // Platform_Arm64EC = 3, + Platform_Arm64X = 4, +} MidiAppSDKPlatform; + +struct IMidiClientInitializer : ::IUnknown +{ + // returns the SDK version info. Supply nullptr for arguments you don't care about + STDMETHOD(GetInstalledWindowsMidiServicesSdkVersion)( + MidiAppSDKPlatform* buildPlatform, + USHORT* versionMajor, + USHORT* versionMinor, + USHORT* versionPatch, + + LPWSTR* buildSource, + LPWSTR* versionName, + LPWSTR* versionFullString + ) = 0; + + // demand-starts the service if present + STDMETHOD(EnsureServiceAvailable)() = 0; +}; +struct winmidi_shared_data_instance +{ + IMidiClientInitializer* initializer{nullptr}; + bool ready{false}; + winmidi_shared_data_instance() + { + // 1. Check if MIDI Services are available + { + ::IUnknown* servicePointer{ nullptr }; + auto hr = CoCreateInstance( + libremidi::IID_MidiSrvTransportUuid, + NULL, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&servicePointer) + ); + + if (SUCCEEDED(hr)) + { + if (servicePointer == nullptr) + { + ready = false; + return; + } + + // Here is the good case: + servicePointer->Release(); + servicePointer = nullptr; + ready = true; + } + else if (hr == REGDB_E_CLASSNOTREG) + { + servicePointer = nullptr; + ready = false; + return; + } + else + { + servicePointer = nullptr; + ready = false; + return; + } + } + + // 2. Check if MIDI services can be created + { + if (SUCCEEDED(CoCreateInstance( + libremidi::IID_MidiClientInitializerUuid, + NULL, + CLSCTX::CLSCTX_INPROC_SERVER | CLSCTX::CLSCTX_FROM_DEFAULT_CONTEXT, + libremidi::IID_IMidiClientInitializer, + reinterpret_cast(&initializer) + ))) + { + if (initializer != nullptr) + { + ready = true; + } + else + { + ready = false; + return; + } + } + else + { + ready = false; + return; + } + } + + // 3. Check if MIDI services can be used + if (SUCCEEDED(initializer->EnsureServiceAvailable())) + { + ready = true; + } + else + { + ready = false; + initializer->Release(); + initializer = nullptr; + return; + } + } + + ~winmidi_shared_data_instance() + { + if (initializer != nullptr) + { + initializer->Release(); + initializer = nullptr; + } + } +}; + struct winmidi_shared_data { - std::shared_ptr initializer; - bool m_ready{false}; + std::shared_ptr self = libremidi::instance(); + winmidi_shared_data() - : initializer{libremidi::instance()} - , m_ready{ - initializer && initializer->InitializeSdkRuntime() - && initializer->EnsureServiceAvailable()} + { + } + + ~winmidi_shared_data() { } }; + } diff --git a/include/libremidi/backends/winmidi/midi_in.hpp b/include/libremidi/backends/winmidi/midi_in.hpp index 8b9a137f..c537f029 100644 --- a/include/libremidi/backends/winmidi/midi_in.hpp +++ b/include/libremidi/backends/winmidi/midi_in.hpp @@ -5,7 +5,7 @@ #include #include -namespace libremidi::winmidi +NAMESPACE_LIBREMIDI::winmidi { class midi_in_impl final : public midi2::in_api diff --git a/include/libremidi/backends/winmidi/midi_out.hpp b/include/libremidi/backends/winmidi/midi_out.hpp index 19adb12e..6b12f8cb 100644 --- a/include/libremidi/backends/winmidi/midi_out.hpp +++ b/include/libremidi/backends/winmidi/midi_out.hpp @@ -5,7 +5,7 @@ #include #include -namespace libremidi::winmidi +NAMESPACE_LIBREMIDI::winmidi { class midi_out_impl final diff --git a/include/libremidi/backends/winmidi/observer.hpp b/include/libremidi/backends/winmidi/observer.hpp index a4696895..b26f1802 100644 --- a/include/libremidi/backends/winmidi/observer.hpp +++ b/include/libremidi/backends/winmidi/observer.hpp @@ -3,12 +3,12 @@ #include #include -namespace libremidi::winmidi +NAMESPACE_LIBREMIDI::winmidi { struct port_info { - hstring id; - hstring name; + winrt::hstring id; + winrt::hstring name; }; class observer_impl final @@ -26,8 +26,8 @@ class observer_impl final MidiEndpointDeviceWatcher::Added_revoker m_addHandler; MidiEndpointDeviceWatcher::Updated_revoker m_updHandler; MidiEndpointDeviceWatcher::Removed_revoker m_delHandler; - std::map> m_known_input_devices; - std::map> m_known_output_devices; + std::map> m_known_input_devices; + std::map> m_known_output_devices; std::mutex m_devices_mtx; std::atomic_bool m_in_constructor{true}; @@ -245,7 +245,7 @@ class observer_impl final } } - void remove_device(hstring eid) + void remove_device(winrt::hstring eid) { std::vector to_remove_in; std::vector to_remove_out; diff --git a/include/libremidi/backends/winmm.hpp b/include/libremidi/backends/winmm.hpp index 6a64d139..04b5baf9 100644 --- a/include/libremidi/backends/winmm.hpp +++ b/include/libremidi/backends/winmm.hpp @@ -18,7 +18,7 @@ // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_midi_reference.asp // Thanks to Jean-Baptiste Berruchon for the sysex code. -namespace libremidi +NAMESPACE_LIBREMIDI { struct winmm_backend diff --git a/include/libremidi/backends/winmm/config.hpp b/include/libremidi/backends/winmm/config.hpp index 61863e03..f681e459 100644 --- a/include/libremidi/backends/winmm/config.hpp +++ b/include/libremidi/backends/winmm/config.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct winmm_input_configuration diff --git a/include/libremidi/backends/winmm/error_domain.hpp b/include/libremidi/backends/winmm/error_domain.hpp index 0fc85d17..fb4d04c3 100644 --- a/include/libremidi/backends/winmm/error_domain.hpp +++ b/include/libremidi/backends/winmm/error_domain.hpp @@ -9,7 +9,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct winmm_error_domain : public stdx::error_domain diff --git a/include/libremidi/backends/winmm/helpers.hpp b/include/libremidi/backends/winmm/helpers.hpp index ef5182aa..c116c75a 100644 --- a/include/libremidi/backends/winmm/helpers.hpp +++ b/include/libremidi/backends/winmm/helpers.hpp @@ -4,7 +4,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { // Convert a nullptr-terminated wide string or ANSI-encoded string to UTF-8. diff --git a/include/libremidi/backends/winmm/midi_in.hpp b/include/libremidi/backends/winmm/midi_in.hpp index 178a20fa..2ada6605 100644 --- a/include/libremidi/backends/winmm/midi_in.hpp +++ b/include/libremidi/backends/winmm/midi_in.hpp @@ -5,7 +5,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_in_winmm final diff --git a/include/libremidi/backends/winmm/midi_out.hpp b/include/libremidi/backends/winmm/midi_out.hpp index 4b07a4a0..3a854f71 100644 --- a/include/libremidi/backends/winmm/midi_out.hpp +++ b/include/libremidi/backends/winmm/midi_out.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_out_winmm final diff --git a/include/libremidi/backends/winmm/observer.hpp b/include/libremidi/backends/winmm/observer.hpp index 11d30b05..57948ede 100644 --- a/include/libremidi/backends/winmm/observer.hpp +++ b/include/libremidi/backends/winmm/observer.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { class observer_winmm : public observer_api @@ -172,7 +172,7 @@ class observer_winmm : public observer_api #if __has_include() && __cpp_lib_jthread >= 201911L #include -namespace libremidi::winmm +NAMESPACE_LIBREMIDI::winmm { class observer_threaded final : public observer_winmm { @@ -202,7 +202,7 @@ class observer_threaded final : public observer_winmm #else #include #include -namespace libremidi::winmm +NAMESPACE_LIBREMIDI::winmm { class observer_threaded final : public observer_winmm { @@ -242,7 +242,7 @@ class observer_threaded final : public observer_winmm } #endif -namespace libremidi::winmm +NAMESPACE_LIBREMIDI::winmm { class observer_manual final : public observer_winmm { @@ -262,7 +262,7 @@ class observer_manual final : public observer_winmm ~observer_manual() { } }; } -namespace libremidi +NAMESPACE_LIBREMIDI { template <> inline std::unique_ptr make( diff --git a/include/libremidi/backends/winuwp.hpp b/include/libremidi/backends/winuwp.hpp index 18a3ecf7..898344df 100644 --- a/include/libremidi/backends/winuwp.hpp +++ b/include/libremidi/backends/winuwp.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct winuwp_backend { @@ -21,4 +21,4 @@ struct winuwp_backend static constexpr inline bool available() noexcept { return true; } }; -} // namespace libremidi +} // NAMESPACE_LIBREMIDI diff --git a/include/libremidi/backends/winuwp/config.hpp b/include/libremidi/backends/winuwp/config.hpp index 27bb1a14..a123b577 100644 --- a/include/libremidi/backends/winuwp/config.hpp +++ b/include/libremidi/backends/winuwp/config.hpp @@ -1,7 +1,7 @@ #pragma once #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct winuwp_input_configuration diff --git a/include/libremidi/backends/winuwp/helpers.hpp b/include/libremidi/backends/winuwp/helpers.hpp index e8e6253a..7b876f4e 100644 --- a/include/libremidi/backends/winuwp/helpers.hpp +++ b/include/libremidi/backends/winuwp/helpers.hpp @@ -14,7 +14,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { inline void winrt_init() { @@ -24,8 +24,6 @@ inline void winrt_init() // winrt::init_apartment(); } -namespace -{ using namespace winrt; using namespace winrt::Windows::Foundation; using namespace winrt::Windows::Devices::Midi; @@ -37,7 +35,7 @@ using namespace winrt::Windows::Storage::Streams; // get() function from winrt is that we avoid an assertion if waiting // from the STA thread. template -auto get(T const& async) +LIBREMIDI_STATIC auto get(T const& async) { if (async.Status() != AsyncStatus::Completed) { @@ -61,4 +59,3 @@ auto get(T const& async) return async.GetResults(); } } -} diff --git a/include/libremidi/backends/winuwp/midi_in.hpp b/include/libremidi/backends/winuwp/midi_in.hpp index 2cd6eeda..3d70613c 100644 --- a/include/libremidi/backends/winuwp/midi_in.hpp +++ b/include/libremidi/backends/winuwp/midi_in.hpp @@ -5,7 +5,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_in_winuwp final diff --git a/include/libremidi/backends/winuwp/midi_out.hpp b/include/libremidi/backends/winuwp/midi_out.hpp index af7d2e75..48893f0c 100644 --- a/include/libremidi/backends/winuwp/midi_out.hpp +++ b/include/libremidi/backends/winuwp/midi_out.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_out_winuwp final diff --git a/include/libremidi/backends/winuwp/observer.hpp b/include/libremidi/backends/winuwp/observer.hpp index 0ae116c2..19217206 100644 --- a/include/libremidi/backends/winuwp/observer.hpp +++ b/include/libremidi/backends/winuwp/observer.hpp @@ -3,15 +3,15 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class observer_winuwp_internal { public: struct port_info { - hstring id; - hstring name; + winrt::hstring id; + winrt::hstring name; }; struct callback { @@ -43,7 +43,7 @@ class observer_winuwp_internal } }; - explicit observer_winuwp_internal(hstring deviceSelector) { initialize(deviceSelector); } + explicit observer_winuwp_internal(winrt::hstring deviceSelector) { initialize(deviceSelector); } ~observer_winuwp_internal() { terminate(); } std::vector get_ports() const @@ -67,10 +67,10 @@ class observer_winuwp_internal return true; } - hstring get_port_id(unsigned int portNumber) const + winrt::hstring get_port_id(unsigned int portNumber) const { std::lock_guard lock(portListMutex_); - return portNumber < portList_.size() ? portList_[portNumber].id : hstring{}; + return portNumber < portList_.size() ? portList_[portNumber].id : winrt::hstring{}; } std::string get_port_name(unsigned int portNumber) const @@ -98,7 +98,7 @@ class observer_winuwp_internal observer_winuwp_internal& operator=(const observer_winuwp_internal&) = delete; private: - void initialize(hstring deviceSelector) + void initialize(winrt::hstring deviceSelector) { deviceWatcher_ = DeviceInformation::CreateWatcher(deviceSelector); @@ -139,7 +139,7 @@ class observer_winuwp_internal const auto id = deviceUpdate.Id(); auto pred = [&id](const port_info& portInfo) { return portInfo.id == id; }; std::optional p; - hstring name; + winrt::hstring name; { std::lock_guard lock(portListMutex_); auto iter = std::find_if(portList_.begin(), portList_.end(), pred); diff --git a/include/libremidi/client.cpp b/include/libremidi/client.cpp index 4d2c2d2b..1e225097 100644 --- a/include/libremidi/client.cpp +++ b/include/libremidi/client.cpp @@ -10,7 +10,7 @@ #ifdef LIBREMIDI_JACK #include #endif -namespace libremidi +NAMESPACE_LIBREMIDI { LIBREMIDI_INLINE shared_configurations diff --git a/include/libremidi/client.hpp b/include/libremidi/client.hpp index 1d49fba2..1a913c20 100644 --- a/include/libremidi/client.hpp +++ b/include/libremidi/client.hpp @@ -6,7 +6,7 @@ #include #include -namespace libremidi::midi1 +NAMESPACE_LIBREMIDI::midi1 { struct client_configuration { diff --git a/include/libremidi/cmidi2.hpp b/include/libremidi/cmidi2.hpp index 42ad4636..87a40dbc 100644 --- a/include/libremidi/cmidi2.hpp +++ b/include/libremidi/cmidi2.hpp @@ -343,7 +343,7 @@ enum cmidi2_ump_chord_name_chord_type CMIDI2_UMP_CHORD_TYPE_7_SUSPENDED_4TH = 27, }; -static inline uint8_t cmidi2_ump_get_num_bytes(uint32_t data) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_num_bytes(uint32_t data) { switch (((data & 0xF0000000) >> 28) & 0xF) { @@ -410,7 +410,7 @@ enum cmidi2_ump_function_block_discovery_flags // 7.1 UMP Stream Messages -static inline cmidi2_ump128_t +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_endpoint_discovery(cmidi2_ump_version_t version, uint8_t filterBitmap) { cmidi2_ump128_t ret @@ -421,7 +421,7 @@ cmidi2_ump_endpoint_discovery(cmidi2_ump_version_t version, uint8_t filterBitmap return ret; } -static inline cmidi2_ump128_t cmidi2_ump_endpoint_info_notification( +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_endpoint_info_notification( cmidi2_ump_version_t version, bool isStaticFunctionBlock, uint8_t numFunctionBlocks, bool midi2Capable, bool midi1Capable, bool rxJR, bool txJR) { @@ -435,7 +435,7 @@ static inline cmidi2_ump128_t cmidi2_ump_endpoint_info_notification( return ret; } -static inline cmidi2_ump128_t cmidi2_ump_device_identity_notification( +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_device_identity_notification( uint32_t manufacturerIdIn7bitArray, uint8_t deviceFamilyLSB, uint8_t deviceFamilyMSB, uint8_t deviceFamilyModelLSB, uint8_t deviceFamilyModelMSB, uint32_t softwareRevisionIn7bitArray) @@ -451,7 +451,7 @@ static inline cmidi2_ump128_t cmidi2_ump_device_identity_notification( return ret; } -static inline cmidi2_ump128_t +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_internal_name_notification(uint8_t statusCode, const char name[14]) { cmidi2_ump128_t ret @@ -463,17 +463,17 @@ cmidi2_ump_internal_name_notification(uint8_t statusCode, const char name[14]) return ret; } -static inline cmidi2_ump128_t cmidi2_ump_endpoint_name_notification(const char name[14]) +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_endpoint_name_notification(const char name[14]) { return cmidi2_ump_internal_name_notification(CMIDI2_UMP_STREAM_STATUS_ENDPOINT_NAME, name); } -static inline cmidi2_ump128_t cmidi2_ump_product_instance_id_notification(const char id[14]) +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_product_instance_id_notification(const char id[14]) { return cmidi2_ump_internal_name_notification(CMIDI2_UMP_STREAM_STATUS_PRODUCT_INSTANCE_ID, id); } -static inline cmidi2_ump128_t +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_stream_configuration_request(uint8_t protocol, bool rxJR, bool txJR) { cmidi2_ump128_t ret @@ -484,7 +484,7 @@ cmidi2_ump_stream_configuration_request(uint8_t protocol, bool rxJR, bool txJR) return ret; } -static inline cmidi2_ump128_t +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_stream_configuration_notification(uint8_t protocol, bool rxJR, bool txJR) { cmidi2_ump128_t ret @@ -495,7 +495,7 @@ cmidi2_ump_stream_configuration_notification(uint8_t protocol, bool rxJR, bool t return ret; } -static inline cmidi2_ump128_t +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_function_block_discovery(uint8_t numFunctionBlocks, uint8_t filter) { cmidi2_ump128_t ret @@ -506,7 +506,7 @@ cmidi2_ump_function_block_discovery(uint8_t numFunctionBlocks, uint8_t filter) return ret; } -static inline cmidi2_ump128_t cmidi2_ump_function_block_info_notification( +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_function_block_info_notification( bool active, uint8_t numFunctionBlocks, uint8_t uiHint, uint8_t midi1, uint8_t direction, uint8_t firstGroup, uint8_t numSpannedGroup, uint8_t midiCIVersionFormat, uint8_t maxNumSysEx8Streams) @@ -521,12 +521,12 @@ static inline cmidi2_ump128_t cmidi2_ump_function_block_info_notification( return ret; } -static inline cmidi2_ump128_t cmidi2_ump_function_block_name_notification(const char name[14]) +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_function_block_name_notification(const char name[14]) { return cmidi2_ump_internal_name_notification(CMIDI2_UMP_STREAM_STATUS_FUNCTION_BLOCK_NAME, name); } -static inline cmidi2_ump128_t cmidi2_ump_start_of_clip() +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_start_of_clip() { cmidi2_ump128_t ret = {(uint32_t)(CMIDI2_MESSAGE_TYPE_UMP_STREAM << 28) @@ -535,7 +535,7 @@ static inline cmidi2_ump128_t cmidi2_ump_start_of_clip() return ret; } -static inline cmidi2_ump128_t cmidi2_ump_end_of_clip() +LIBREMIDI_STATIC cmidi2_ump128_t cmidi2_ump_end_of_clip() { cmidi2_ump128_t ret = {(uint32_t)(CMIDI2_MESSAGE_TYPE_UMP_STREAM << 28) @@ -545,46 +545,46 @@ static inline cmidi2_ump128_t cmidi2_ump_end_of_clip() } // 7.2 Utility Messages -static inline uint32_t cmidi2_ump_noop() +LIBREMIDI_STATIC uint32_t cmidi2_ump_noop() { return 0; } -static inline uint32_t cmidi2_ump_jr_clock_direct(uint16_t senderClockTime) +LIBREMIDI_STATIC uint32_t cmidi2_ump_jr_clock_direct(uint16_t senderClockTime) { return (CMIDI2_UTILITY_STATUS_JR_CLOCK << 16) + senderClockTime; } -static inline uint32_t cmidi2_ump_jr_clock(double senderClockTime) +LIBREMIDI_STATIC uint32_t cmidi2_ump_jr_clock(double senderClockTime) { uint16_t value = (uint16_t)(senderClockTime * JR_TIMESTAMP_TICKS_PER_SECOND); return (CMIDI2_UTILITY_STATUS_JR_CLOCK << 16) + value; } -static inline uint32_t cmidi2_ump_jr_timestamp_direct(uint16_t senderClockTimestamp) +LIBREMIDI_STATIC uint32_t cmidi2_ump_jr_timestamp_direct(uint16_t senderClockTimestamp) { return (CMIDI2_UTILITY_STATUS_JR_TIMESTAMP << 16) + senderClockTimestamp; } -static inline uint32_t cmidi2_ump_jr_timestamp(double senderClockTimestamp) +LIBREMIDI_STATIC uint32_t cmidi2_ump_jr_timestamp(double senderClockTimestamp) { uint16_t value = (uint16_t)(senderClockTimestamp * JR_TIMESTAMP_TICKS_PER_SECOND); return (CMIDI2_UTILITY_STATUS_JR_TIMESTAMP << 16) + value; } -static inline uint32_t cmidi2_ump_dctpq(uint32_t dctpq) +LIBREMIDI_STATIC uint32_t cmidi2_ump_dctpq(uint32_t dctpq) { return (CMIDI2_UTILITY_STATUS_DCTPQ << 16) + dctpq; } -static inline uint32_t cmidi2_ump_dcs(uint32_t ticks) +LIBREMIDI_STATIC uint32_t cmidi2_ump_dcs(uint32_t ticks) { // Note that unlike JR timestamp delta clockstamps accepts ticks up to 20 bits. return (CMIDI2_UTILITY_STATUS_DELTA_CLOCKSTAMP << 16) + (ticks & 0xFFFFF); } // 7.6 System Common and System Real Time Messages -static inline int32_t +LIBREMIDI_STATIC int32_t cmidi2_ump_system_message(uint8_t group, uint8_t status, uint8_t midi1Byte2, uint8_t midi1Byte3) { return (CMIDI2_MESSAGE_TYPE_SYSTEM << 28) + ((group & 0xF) << 24) + (status << 16) @@ -592,66 +592,66 @@ cmidi2_ump_system_message(uint8_t group, uint8_t status, uint8_t midi1Byte2, uin } // 7.3 MIDI 1.0 Channel Voice Messages -static inline int32_t cmidi2_ump_midi1_message( +LIBREMIDI_STATIC int32_t cmidi2_ump_midi1_message( uint8_t group, uint8_t code, uint8_t channel, uint8_t byte3, uint8_t byte4) { return (CMIDI2_MESSAGE_TYPE_MIDI_1_CHANNEL << 28) + ((group & 0xF) << 24) + (((code & 0xF0) + (channel & 0xF)) << 16) + ((byte3 & 0x7F) << 8) + (byte4 & 0x7F); } -static inline int32_t +LIBREMIDI_STATIC int32_t cmidi2_ump_midi1_note_off(uint8_t group, uint8_t channel, uint8_t note, uint8_t velocity) { return cmidi2_ump_midi1_message( group, CMIDI2_STATUS_NOTE_OFF, channel, note & 0x7F, velocity & 0x7F); } -static inline int32_t +LIBREMIDI_STATIC int32_t cmidi2_ump_midi1_note_on(uint8_t group, uint8_t channel, uint8_t note, uint8_t velocity) { return cmidi2_ump_midi1_message( group, CMIDI2_STATUS_NOTE_ON, channel, note & 0x7F, velocity & 0x7F); } -static inline int32_t +LIBREMIDI_STATIC int32_t cmidi2_ump_midi1_paf(uint8_t group, uint8_t channel, uint8_t note, uint8_t data) { return cmidi2_ump_midi1_message(group, CMIDI2_STATUS_PAF, channel, note & 0x7F, data & 0x7F); } -static inline int32_t +LIBREMIDI_STATIC int32_t cmidi2_ump_midi1_cc(uint8_t group, uint8_t channel, uint8_t index, uint8_t data) { return cmidi2_ump_midi1_message(group, CMIDI2_STATUS_CC, channel, index & 0x7F, data & 0x7F); } -static inline int32_t cmidi2_ump_midi1_program(uint8_t group, uint8_t channel, uint8_t program) +LIBREMIDI_STATIC int32_t cmidi2_ump_midi1_program(uint8_t group, uint8_t channel, uint8_t program) { return cmidi2_ump_midi1_message( group, CMIDI2_STATUS_PROGRAM, channel, program & 0x7F, MIDI_2_0_RESERVED); } -static inline int32_t cmidi2_ump_midi1_caf(uint8_t group, uint8_t channel, uint8_t data) +LIBREMIDI_STATIC int32_t cmidi2_ump_midi1_caf(uint8_t group, uint8_t channel, uint8_t data) { return cmidi2_ump_midi1_message( group, CMIDI2_STATUS_CAF, channel, data & 0x7F, MIDI_2_0_RESERVED); } -static inline int32_t +LIBREMIDI_STATIC int32_t cmidi2_ump_midi1_pitch_bend_direct(uint8_t group, uint8_t channel, uint16_t data) { return cmidi2_ump_midi1_message( group, CMIDI2_STATUS_PITCH_BEND, channel, data & 0x7F, (data >> 7) & 0x7F); } -static inline int32_t +LIBREMIDI_STATIC int32_t cmidi2_ump_midi1_pitch_bend_split(uint8_t group, uint8_t channel, uint8_t dataLSB, uint8_t dataMSB) { return cmidi2_ump_midi1_message( group, CMIDI2_STATUS_PITCH_BEND, channel, dataLSB & 0x7F, dataMSB & 0x7F); } -static inline int32_t cmidi2_ump_midi1_pitch_bend(uint8_t group, uint8_t channel, int16_t data) +LIBREMIDI_STATIC int32_t cmidi2_ump_midi1_pitch_bend(uint8_t group, uint8_t channel, int16_t data) { data += 8192; return cmidi2_ump_midi1_message( @@ -659,7 +659,7 @@ static inline int32_t cmidi2_ump_midi1_pitch_bend(uint8_t group, uint8_t channel } // 7.4 MIDI 2.0 Channel Voice Messages -static inline int64_t cmidi2_ump_midi2_channel_message_8_8_16_16( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_channel_message_8_8_16_16( uint8_t group, uint8_t code, uint8_t channel, uint8_t byte3, uint8_t byte4, uint16_t short1, uint16_t short2) { @@ -669,7 +669,7 @@ static inline int64_t cmidi2_ump_midi2_channel_message_8_8_16_16( + ((uint64_t)short1 << 16) + short2; } -static inline int64_t cmidi2_ump_midi2_channel_message_8_8_32( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_channel_message_8_8_32( uint8_t group, uint8_t code, uint8_t channel, uint8_t byte3, uint8_t byte4, uint32_t rest) { return (((uint64_t)(CMIDI2_MESSAGE_TYPE_MIDI_2_CHANNEL << 28) + ((group & 0xF) << 24) @@ -678,7 +678,7 @@ static inline int64_t cmidi2_ump_midi2_channel_message_8_8_32( + rest; } -static inline uint16_t cmidi2_ump_pitch_7_9(double semitone) +LIBREMIDI_STATIC uint16_t cmidi2_ump_pitch_7_9(double semitone) { double actual = semitone < 0.0 ? 0.0 : semitone >= 128.0 ? 128.0 : semitone; uint16_t dec = (uint16_t)actual; @@ -686,7 +686,7 @@ static inline uint16_t cmidi2_ump_pitch_7_9(double semitone) return (dec << 9) + (int)(microtone * 512.0); } -static inline uint16_t cmidi2_ump_pitch_7_9_split(uint8_t semitone, double microtone) +LIBREMIDI_STATIC uint16_t cmidi2_ump_pitch_7_9_split(uint8_t semitone, double microtone) { uint16_t ret = (uint16_t)(semitone & 0x7F) << 9; double actual = microtone < 0.0 ? 0.0 : microtone > 1.0 ? 1.0 : microtone; @@ -694,7 +694,7 @@ static inline uint16_t cmidi2_ump_pitch_7_9_split(uint8_t semitone, double micro return ret; } -static inline int64_t cmidi2_ump_midi2_note_off( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_note_off( uint8_t group, uint8_t channel, uint8_t note, uint8_t attributeType, uint16_t velocity, uint16_t attributeData) { @@ -702,7 +702,7 @@ static inline int64_t cmidi2_ump_midi2_note_off( group, CMIDI2_STATUS_NOTE_OFF, channel, note & 0x7F, attributeType, velocity, attributeData); } -static inline int64_t cmidi2_ump_midi2_note_on( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_note_on( uint8_t group, uint8_t channel, uint8_t note, uint8_t attributeType, uint16_t velocity, uint16_t attributeData) { @@ -710,56 +710,56 @@ static inline int64_t cmidi2_ump_midi2_note_on( group, CMIDI2_STATUS_NOTE_ON, channel, note & 0x7F, attributeType, velocity, attributeData); } -static inline int64_t +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_paf(uint8_t group, uint8_t channel, uint8_t note, uint32_t data) { return cmidi2_ump_midi2_channel_message_8_8_32( group, CMIDI2_STATUS_PAF, channel, note & 0x7F, MIDI_2_0_RESERVED, data); } -static inline int64_t cmidi2_ump_midi2_per_note_rcc( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_per_note_rcc( uint8_t group, uint8_t channel, uint8_t note, uint8_t index, uint32_t data) { return cmidi2_ump_midi2_channel_message_8_8_32( group, CMIDI2_STATUS_PER_NOTE_RCC, channel, note & 0x7F, index, data); } -static inline int64_t cmidi2_ump_midi2_per_note_acc( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_per_note_acc( uint8_t group, uint8_t channel, uint8_t note, uint8_t index, uint32_t data) { return cmidi2_ump_midi2_channel_message_8_8_32( group, CMIDI2_STATUS_PER_NOTE_ACC, channel, note & 0x7F, index, data); } -static inline int64_t cmidi2_ump_midi2_per_note_management( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_per_note_management( uint8_t group, uint8_t channel, uint8_t note, uint8_t optionFlags) { return cmidi2_ump_midi2_channel_message_8_8_32( group, CMIDI2_STATUS_PER_NOTE_MANAGEMENT, channel, note & 0x7F, optionFlags & 3, 0); } -static inline int64_t +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_cc(uint8_t group, uint8_t channel, uint8_t index, uint32_t data) { return cmidi2_ump_midi2_channel_message_8_8_32( group, CMIDI2_STATUS_CC, channel, index & 0x7F, MIDI_2_0_RESERVED, data); } -static inline int64_t cmidi2_ump_midi2_rpn( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_rpn( uint8_t group, uint8_t channel, uint8_t bankAkaMSB, uint8_t indexAkaLSB, uint32_t dataAkaDTE) { return cmidi2_ump_midi2_channel_message_8_8_32( group, CMIDI2_STATUS_RPN, channel, bankAkaMSB & 0x7F, indexAkaLSB & 0x7F, dataAkaDTE); } -static inline int64_t cmidi2_ump_midi2_nrpn( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_nrpn( uint8_t group, uint8_t channel, uint8_t bankAkaMSB, uint8_t indexAkaLSB, uint32_t dataAkaDTE) { return cmidi2_ump_midi2_channel_message_8_8_32( group, CMIDI2_STATUS_NRPN, channel, bankAkaMSB & 0x7F, indexAkaLSB & 0x7F, dataAkaDTE); } -static inline int64_t cmidi2_ump_midi2_relative_rpn( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_relative_rpn( uint8_t group, uint8_t channel, uint8_t bankAkaMSB, uint8_t indexAkaLSB, uint32_t dataAkaDTE) { return cmidi2_ump_midi2_channel_message_8_8_32( @@ -767,7 +767,7 @@ static inline int64_t cmidi2_ump_midi2_relative_rpn( dataAkaDTE); } -static inline int64_t cmidi2_ump_midi2_relative_nrpn( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_relative_nrpn( uint8_t group, uint8_t channel, uint8_t bankAkaMSB, uint8_t indexAkaLSB, uint32_t dataAkaDTE) { return cmidi2_ump_midi2_channel_message_8_8_32( @@ -775,7 +775,7 @@ static inline int64_t cmidi2_ump_midi2_relative_nrpn( dataAkaDTE); } -static inline int64_t cmidi2_ump_midi2_program( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_program( uint8_t group, uint8_t channel, uint8_t optionFlags, uint8_t program, uint8_t bankMSB, uint8_t bankLSB) { @@ -784,13 +784,13 @@ static inline int64_t cmidi2_ump_midi2_program( ((program & 0x7F) << 24) + (bankMSB << 8) + bankLSB); } -static inline int64_t cmidi2_ump_midi2_caf(uint8_t group, uint8_t channel, uint32_t data) +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_caf(uint8_t group, uint8_t channel, uint32_t data) { return cmidi2_ump_midi2_channel_message_8_8_32( group, CMIDI2_STATUS_CAF, channel, MIDI_2_0_RESERVED, MIDI_2_0_RESERVED, data); } -static inline int64_t +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_pitch_bend_direct(uint8_t group, uint8_t channel, uint32_t unsignedData) { return cmidi2_ump_midi2_channel_message_8_8_32( @@ -798,19 +798,19 @@ cmidi2_ump_midi2_pitch_bend_direct(uint8_t group, uint8_t channel, uint32_t unsi unsignedData); } -static inline int64_t cmidi2_ump_midi2_pitch_bend(uint8_t group, uint8_t channel, int32_t data) +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_pitch_bend(uint8_t group, uint8_t channel, int32_t data) { return cmidi2_ump_midi2_pitch_bend_direct(group, channel, 0x80000000 + data); } -static inline int64_t cmidi2_ump_midi2_per_note_pitch_bend_direct( +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_per_note_pitch_bend_direct( uint8_t group, uint8_t channel, uint8_t note, uint32_t data) { return cmidi2_ump_midi2_channel_message_8_8_32( group, CMIDI2_STATUS_PER_NOTE_PITCH_BEND, channel, note & 0x7F, MIDI_2_0_RESERVED, data); } -static inline int64_t +LIBREMIDI_STATIC int64_t cmidi2_ump_midi2_per_note_pitch_bend(uint8_t group, uint8_t channel, uint8_t note, uint32_t data) { return cmidi2_ump_midi2_per_note_pitch_bend_direct(group, channel, note, 0x80000000 + data); @@ -818,22 +818,22 @@ cmidi2_ump_midi2_per_note_pitch_bend(uint8_t group, uint8_t channel, uint8_t not // Common utility functions for sysex support -static inline uint8_t cmidi2_ump_get_byte_from_uint32(uint32_t src, uint8_t index) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_byte_from_uint32(uint32_t src, uint8_t index) { return (uint8_t)(src >> ((7 - index) * 8) & 0xFF); } -static inline uint8_t cmidi2_ump_get_byte_from_uint64(uint64_t src, uint8_t index) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_byte_from_uint64(uint64_t src, uint8_t index) { return (uint8_t)(src >> ((7 - index) * 8) & 0xFF); } -static inline size_t cmidi2_ump_sysex_get_num_packets(size_t numBytes, uint8_t radix) +LIBREMIDI_STATIC size_t cmidi2_ump_sysex_get_num_packets(size_t numBytes, uint8_t radix) { return numBytes <= radix ? 1 : (numBytes / radix + (numBytes % radix ? 1 : 0)); } -static inline uint32_t cmidi2_ump_read_uint32_bytes_le(const void* sequence) +LIBREMIDI_STATIC uint32_t cmidi2_ump_read_uint32_bytes_le(const void* sequence) { const uint8_t* bytes = (const uint8_t*)sequence; uint32_t ret = 0; @@ -842,7 +842,7 @@ static inline uint32_t cmidi2_ump_read_uint32_bytes_le(const void* sequence) return ret; } -static inline uint32_t cmidi2_ump_read_uint32_bytes_be(const void* sequence) +LIBREMIDI_STATIC uint32_t cmidi2_ump_read_uint32_bytes_be(const void* sequence) { const uint8_t* bytes = (const uint8_t*)sequence; uint32_t ret = 0; @@ -851,37 +851,37 @@ static inline uint32_t cmidi2_ump_read_uint32_bytes_be(const void* sequence) return ret; } -static inline bool cmidi2_util_is_platform_little_endian() +LIBREMIDI_STATIC bool cmidi2_util_is_platform_little_endian() { int i = 1; return *(char*)&i; } -static inline uint32_t cmidi2_ump_read_uint32_bytes(const void* sequence) +LIBREMIDI_STATIC uint32_t cmidi2_ump_read_uint32_bytes(const void* sequence) { return cmidi2_util_is_platform_little_endian() ? cmidi2_ump_read_uint32_bytes_le(sequence) : cmidi2_ump_read_uint32_bytes_be(sequence); } -static inline uint64_t cmidi2_ump_read_uint64_bytes_le(const void* sequence) +LIBREMIDI_STATIC uint64_t cmidi2_ump_read_uint64_bytes_le(const void* sequence) { return ((uint64_t)cmidi2_ump_read_uint32_bytes_le(sequence) << 32) + cmidi2_ump_read_uint32_bytes_le((const uint8_t*)sequence + 4); } -static inline uint64_t cmidi2_ump_read_uint64_bytes_be(const void* sequence) +LIBREMIDI_STATIC uint64_t cmidi2_ump_read_uint64_bytes_be(const void* sequence) { return ((uint64_t)cmidi2_ump_read_uint32_bytes_be(sequence) << 32) + cmidi2_ump_read_uint32_bytes_be((const uint8_t*)sequence + 4); } -static inline uint64_t cmidi2_ump_read_uint64_bytes(const void* sequence) +LIBREMIDI_STATIC uint64_t cmidi2_ump_read_uint64_bytes(const void* sequence) { return cmidi2_util_is_platform_little_endian() ? cmidi2_ump_read_uint64_bytes_le(sequence) : cmidi2_ump_read_uint64_bytes_be(sequence); } -static inline void cmidi2_ump_sysex_get_packet_of( +LIBREMIDI_STATIC void cmidi2_ump_sysex_get_packet_of( uint64_t* result1, uint64_t* result2, uint8_t group, size_t numBytes, const void* srcData, int32_t index, enum cmidi2_message_type messageType, int radix, bool hasStreamId, uint8_t streamId) @@ -933,7 +933,7 @@ static inline void cmidi2_ump_sysex_get_packet_of( } // 7.7 System Exclusive 7-Bit Messages -static inline uint64_t cmidi2_ump_sysex7_direct( +LIBREMIDI_STATIC uint64_t cmidi2_ump_sysex7_direct( uint8_t group, uint8_t status, uint8_t numBytes, uint8_t data1, uint8_t data2, uint8_t data3, uint8_t data4, uint8_t data5, uint8_t data6) { @@ -944,7 +944,7 @@ static inline uint64_t cmidi2_ump_sysex7_direct( + (data5 << 8) + data6; } -static inline uint32_t cmidi2_ump_sysex7_get_sysex_length(const void* srcData) +LIBREMIDI_STATIC uint32_t cmidi2_ump_sysex7_get_sysex_length(const void* srcData) { int i = 0; const uint8_t* csrc = (const uint8_t*)srcData; @@ -954,12 +954,12 @@ static inline uint32_t cmidi2_ump_sysex7_get_sysex_length(const void* srcData) return i - (csrc[0] == 0xF0 ? 1 : 0); } -static inline size_t cmidi2_ump_sysex7_get_num_packets(size_t numSysex7Bytes) +LIBREMIDI_STATIC size_t cmidi2_ump_sysex7_get_num_packets(size_t numSysex7Bytes) { return cmidi2_ump_sysex_get_num_packets(numSysex7Bytes, 6); } -static inline uint64_t +LIBREMIDI_STATIC uint64_t cmidi2_ump_sysex7_get_packet_of(uint8_t group, size_t numBytes, const void* srcData, int32_t index) { uint64_t result; @@ -977,7 +977,7 @@ typedef void* (*cmidi2_ump_handler_u64)(uint64_t data, void* context); // Processes sysex7 inputs where we do not always end at F7 and thus takes length as the argument. // This returns NULL for success, or anything else that `sendUMP` returns for failure. -static inline void* cmidi2_ump_sysex7_process_n( +LIBREMIDI_STATIC void* cmidi2_ump_sysex7_process_n( uint8_t group, void* sysex, uint32_t length, cmidi2_ump_handler_u64 sendUMP, void* context) { int32_t numPackets = cmidi2_ump_sysex7_get_num_packets(length); @@ -992,7 +992,7 @@ static inline void* cmidi2_ump_sysex7_process_n( } // This returns NULL for success, or anything else that `sendUMP` returns for failure. -static inline void* cmidi2_ump_sysex7_process( +LIBREMIDI_STATIC void* cmidi2_ump_sysex7_process( uint8_t group, void* sysex, cmidi2_ump_handler_u64 sendUMP, void* context) { uint32_t length = cmidi2_ump_sysex7_get_sysex_length(sysex); @@ -1001,12 +1001,12 @@ static inline void* cmidi2_ump_sysex7_process( // 7.8 System Exclusive 8-Bit Messages -static inline size_t cmidi2_ump_sysex8_get_num_packets(size_t numBytes) +LIBREMIDI_STATIC size_t cmidi2_ump_sysex8_get_num_packets(size_t numBytes) { return cmidi2_ump_sysex_get_num_packets(numBytes, 13); } -static inline void cmidi2_ump_sysex8_get_packet_of( +LIBREMIDI_STATIC void cmidi2_ump_sysex8_get_packet_of( uint8_t group, uint8_t streamId, size_t numBytes, const void* srcData, size_t index, uint64_t* result1, uint64_t* result2) { @@ -1022,7 +1022,7 @@ typedef void* (*cmidi2_ump_handler_u128)( uint64_t data1, uint64_t data2, size_t index, void* context); // This returns NULL for success, or anything else that `sendUMP` returns for failure. -static inline void* cmidi2_ump_sysex8_process( +LIBREMIDI_STATIC void* cmidi2_ump_sysex8_process( uint8_t group, void* sysex, uint32_t length, uint8_t streamId, cmidi2_ump_handler_u128 sendUMP, void* context) { @@ -1040,21 +1040,21 @@ static inline void* cmidi2_ump_sysex8_process( // 7.9 Mixed Data Set Message -static inline uint16_t cmidi2_ump_mds_get_num_chunks(uint32_t numTotalBytesInMDS) +LIBREMIDI_STATIC uint16_t cmidi2_ump_mds_get_num_chunks(uint32_t numTotalBytesInMDS) { uint32_t radix = 14 * 0x10000; return numTotalBytesInMDS / radix + (numTotalBytesInMDS % radix ? 1 : 0); } // Returns -1 if input is out of range -static inline int32_t cmidi2_ump_mds_get_num_payloads(uint32_t numTotalBytesinChunk) +LIBREMIDI_STATIC int32_t cmidi2_ump_mds_get_num_payloads(uint32_t numTotalBytesinChunk) { if (numTotalBytesinChunk > 14 * 65535) return -1; return numTotalBytesinChunk / 14 + (numTotalBytesinChunk % 14 ? 1 : 0); } -static inline void cmidi2_ump_mds_get_header( +LIBREMIDI_STATIC void cmidi2_ump_mds_get_header( uint8_t group, uint8_t mdsId, uint16_t numBytesInChunk, uint16_t numChunks, uint16_t chunkIndex, uint16_t manufacturerId, uint16_t deviceId, uint16_t subId, uint16_t subId2, uint64_t* result1, uint64_t* result2) @@ -1078,7 +1078,7 @@ static inline void cmidi2_ump_mds_get_header( } // srcData points to exact start of the source data. -static inline void cmidi2_ump_mds_get_payload_of( +LIBREMIDI_STATIC void cmidi2_ump_mds_get_payload_of( uint8_t group, uint8_t mdsId, uint16_t numBytes, const void* srcData, uint64_t* result1, uint64_t* result2) { @@ -1106,7 +1106,7 @@ typedef void* (*cmidi2_mds_handler)( uint64_t data1, uint64_t data2, size_t chunkId, size_t payloadId, void* context); // This returns NULL for success, or anything else that `sendUMP` returns for failure. -static inline void* cmidi2_ump_mds_process( +LIBREMIDI_STATIC void* cmidi2_ump_mds_process( uint8_t group, uint8_t mdsId, void* data, uint32_t length, cmidi2_mds_handler sendUMP, void* context) { @@ -1132,12 +1132,12 @@ static inline void* cmidi2_ump_mds_process( // 7.5 Flex Data Message -static inline uint16_t cmidi2_ump_flex_data_get_num_packets(uint32_t numTotalBytesInFlexData) +LIBREMIDI_STATIC uint16_t cmidi2_ump_flex_data_get_num_packets(uint32_t numTotalBytesInFlexData) { return numTotalBytesInFlexData / 12 + (numTotalBytesInFlexData % 12 ? 1 : 0); } -static inline void cmidi2_ump_flex_data_complete_packet( +LIBREMIDI_STATIC void cmidi2_ump_flex_data_complete_packet( uint8_t group, uint8_t addressing, uint8_t channel, uint8_t statusBank, uint8_t statusCode, uint32_t data1, uint32_t data2, uint32_t data3, uint64_t* result1, uint64_t* result2) { @@ -1152,7 +1152,7 @@ static inline void cmidi2_ump_flex_data_complete_packet( *result2 = ((uint64_t)data2 << 32) + data3; } -static inline void cmidi2_ump_flex_data_get_packet_of( +LIBREMIDI_STATIC void cmidi2_ump_flex_data_get_packet_of( uint8_t group, uint8_t addressing, uint8_t channel, uint8_t statusBank, uint8_t statusCode, uint16_t numBytes, const void* srcData, int32_t currentPacket, uint64_t* result1, uint64_t* result2) @@ -1207,7 +1207,7 @@ typedef void* (*cmidi2_flex_data_handler)(uint64_t data1, uint64_t data2, void* // This returns NULL for success, or anything else that `sendUMP` returns for failure. // `text` is usually a null-terminated text string, but it may contain `\0` as Melisma in lyricText. Hence we still need `length`. -static inline void* cmidi2_ump_flex_data_process( +LIBREMIDI_STATIC void* cmidi2_ump_flex_data_process( uint8_t group, uint8_t addressing, uint8_t channel, uint8_t statusBank, uint8_t statusCode, const char* text, uint32_t length, cmidi2_flex_data_handler sendUMP, void* context) { @@ -1226,7 +1226,7 @@ static inline void* cmidi2_ump_flex_data_process( // individual flex data message generators -static inline void cmidi2_ump_flex_data_set_tempo_direct( +LIBREMIDI_STATIC void cmidi2_ump_flex_data_set_tempo_direct( uint8_t group, uint8_t channel, uint32_t tempoIn10NanosecondsPerQN, uint64_t* result1, uint64_t* result2) { @@ -1235,7 +1235,7 @@ static inline void cmidi2_ump_flex_data_set_tempo_direct( CMIDI2_FLEX_DATA_STATUS_SET_TEMPO, tempoIn10NanosecondsPerQN, 0, 0, result1, result2); } -static inline void cmidi2_ump_flex_data_set_time_signature( +LIBREMIDI_STATIC void cmidi2_ump_flex_data_set_time_signature( uint8_t group, uint8_t channel, uint8_t numerator, uint8_t denominator, uint8_t numberOf32thNotes, uint64_t* result1, uint64_t* result2) { @@ -1245,7 +1245,7 @@ static inline void cmidi2_ump_flex_data_set_time_signature( (numerator << 24) + (denominator << 16) + (numberOf32thNotes << 8), 0, 0, result1, result2); } -static inline void cmidi2_ump_flex_data_set_metronome( +LIBREMIDI_STATIC void cmidi2_ump_flex_data_set_metronome( uint8_t group, uint8_t channel, uint8_t clocksPerPrimaryClick, uint8_t barAccent1, uint8_t barAccent2, uint8_t barAccent3, uint8_t subDivisionClicks1, uint8_t subDivisionClicks2, uint64_t* result1, uint64_t* result2) @@ -1257,7 +1257,7 @@ static inline void cmidi2_ump_flex_data_set_metronome( (subDivisionClicks1 << 24) + (subDivisionClicks2 << 16), 0, result1, result2); } -static inline void cmidi2_ump_flex_data_set_key_signature( +LIBREMIDI_STATIC void cmidi2_ump_flex_data_set_key_signature( uint8_t group, uint8_t addressing, uint8_t channel, uint8_t sharpsFlats, uint8_t tonicNote, uint64_t* result1, uint64_t* result2) { @@ -1267,7 +1267,7 @@ static inline void cmidi2_ump_flex_data_set_key_signature( result1, result2); } -static inline void cmidi2_ump_flex_data_set_chord_name( +LIBREMIDI_STATIC void cmidi2_ump_flex_data_set_chord_name( uint8_t group, uint8_t addressing, uint8_t channel, uint8_t sharpsFlats, uint8_t chordTonic, uint8_t chordType, uint8_t alter1Type, uint8_t alter1Degree, uint8_t alter2Type, uint8_t alter2Degree, uint8_t alter3Type, uint8_t alter3Degree, uint8_t alter4Type, @@ -1293,18 +1293,18 @@ static inline void cmidi2_ump_flex_data_set_chord_name( typedef uint32_t cmidi2_ump; -static inline void cmidi2_ump_write32(cmidi2_ump* dst, uint32_t value) +LIBREMIDI_STATIC void cmidi2_ump_write32(cmidi2_ump* dst, uint32_t value) { dst[0] = value; } -static inline void cmidi2_ump_write64(cmidi2_ump* dst, uint64_t value) +LIBREMIDI_STATIC void cmidi2_ump_write64(cmidi2_ump* dst, uint64_t value) { dst[0] = value >> 32; dst[1] = value & 0xFFFFFFFF; } -static inline void cmidi2_ump_write128(cmidi2_ump* dst, uint64_t value1, uint64_t value2) +LIBREMIDI_STATIC void cmidi2_ump_write128(cmidi2_ump* dst, uint64_t value1, uint64_t value2) { dst[0] = value1 >> 32; dst[1] = value1 & 0xFFFFFFFF; @@ -1312,7 +1312,7 @@ static inline void cmidi2_ump_write128(cmidi2_ump* dst, uint64_t value1, uint64_ dst[3] = value2 & 0xFFFFFFFF; } -static inline uint8_t cmidi2_ump_get_byte_at(const cmidi2_ump* ump, uint8_t at) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_byte_at(const cmidi2_ump* ump, uint8_t at) { ump += at / 4; switch (at % 4) @@ -1329,12 +1329,12 @@ static inline uint8_t cmidi2_ump_get_byte_at(const cmidi2_ump* ump, uint8_t at) return 0; // This is unexpected. } -static inline uint8_t cmidi2_ump_get_message_type(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_message_type(const cmidi2_ump* ump) { return *ump >> 28; } -static inline uint8_t cmidi2_ump_get_message_size_bytes(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_message_size_bytes(const cmidi2_ump* ump) { switch (cmidi2_ump_get_message_type(ump)) { @@ -1351,272 +1351,272 @@ static inline uint8_t cmidi2_ump_get_message_size_bytes(const cmidi2_ump* ump) return 0; // invalid } -static inline uint8_t cmidi2_ump_get_group(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_group(const cmidi2_ump* ump) { return (*ump >> 24) & 0xF; } -static inline uint8_t cmidi2_ump_get_status_byte(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_status_byte(const cmidi2_ump* ump) { return (*ump >> 16) & 0xFF; } -static inline uint8_t cmidi2_ump_get_status_code(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_status_code(const cmidi2_ump* ump) { return (*ump >> 16) & 0xF0; } -static inline uint8_t cmidi2_ump_get_channel(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_channel(const cmidi2_ump* ump) { return (*ump >> 16) & 0xF; } -static inline uint32_t cmidi2_ump_get_32_to_64(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint32_t cmidi2_ump_get_32_to_64(const cmidi2_ump* ump) { return *(ump + 1); } -static inline uint16_t cmidi2_ump_get_jr_clock_time(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_jr_clock_time(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 2) << 8) + cmidi2_ump_get_byte_at(ump, 3); } -static inline uint16_t cmidi2_ump_get_jr_timestamp_timestamp(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_jr_timestamp_timestamp(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 2) << 8) + cmidi2_ump_get_byte_at(ump, 3); } -static inline uint16_t cmidi2_ump_get_dctpq(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_dctpq(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 2) << 8) + cmidi2_ump_get_byte_at(ump, 3); } -static inline uint16_t cmidi2_ump_get_dcs(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_dcs(const cmidi2_ump* ump) { return ((cmidi2_ump_get_byte_at(ump, 1) & 0xF) << 16) + (cmidi2_ump_get_byte_at(ump, 2) << 8) + cmidi2_ump_get_byte_at(ump, 3); } -static inline uint8_t cmidi2_ump_get_system_message_byte2(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_system_message_byte2(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint8_t cmidi2_ump_get_system_message_byte3(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_system_message_byte3(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } -static inline uint8_t cmidi2_ump_get_midi1_byte2(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi1_byte2(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint8_t cmidi2_ump_get_midi1_byte3(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi1_byte3(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } -static inline uint8_t cmidi2_ump_get_midi1_note_note(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi1_note_note(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint8_t cmidi2_ump_get_midi1_note_velocity(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi1_note_velocity(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } -static inline uint8_t cmidi2_ump_get_midi1_paf_note(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi1_paf_note(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint8_t cmidi2_ump_get_midi1_paf_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi1_paf_data(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } -static inline uint8_t cmidi2_ump_get_midi1_cc_index(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi1_cc_index(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint8_t cmidi2_ump_get_midi1_cc_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi1_cc_data(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } -static inline uint8_t cmidi2_ump_get_midi1_program_program(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi1_program_program(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint8_t cmidi2_ump_get_midi1_caf_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi1_caf_data(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint16_t cmidi2_ump_get_midi1_pitch_bend_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_midi1_pitch_bend_data(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2) + cmidi2_ump_get_byte_at(ump, 3) * 0x80; } -static inline uint8_t cmidi2_ump_get_sysex7_num_bytes(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_sysex7_num_bytes(const cmidi2_ump* ump) { return cmidi2_ump_get_channel(ump); // same bits } -static inline uint8_t cmidi2_ump_get_midi2_note_note(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_note_note(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint8_t cmidi2_ump_get_midi2_note_attribute_type(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_note_attribute_type(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } -static inline uint16_t cmidi2_ump_get_midi2_note_velocity(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_midi2_note_velocity(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 4) << 8) + (cmidi2_ump_get_byte_at(ump, 5)); } -static inline uint16_t cmidi2_ump_get_midi2_note_attribute_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_midi2_note_attribute_data(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 6) << 8) + (cmidi2_ump_get_byte_at(ump, 7)); } -static inline uint8_t cmidi2_ump_get_midi2_paf_note(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_paf_note(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint32_t cmidi2_ump_get_midi2_paf_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint32_t cmidi2_ump_get_midi2_paf_data(const cmidi2_ump* ump) { return cmidi2_ump_get_32_to_64(ump); } -static inline uint8_t cmidi2_ump_get_midi2_pnrcc_note(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_pnrcc_note(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint8_t cmidi2_ump_get_midi2_pnrcc_index(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_pnrcc_index(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } -static inline uint32_t cmidi2_ump_get_midi2_pnrcc_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint32_t cmidi2_ump_get_midi2_pnrcc_data(const cmidi2_ump* ump) { return cmidi2_ump_get_32_to_64(ump); } -static inline uint8_t cmidi2_ump_get_midi2_pnacc_note(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_pnacc_note(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint8_t cmidi2_ump_get_midi2_pnacc_index(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_pnacc_index(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } -static inline uint32_t cmidi2_ump_get_midi2_pnacc_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint32_t cmidi2_ump_get_midi2_pnacc_data(const cmidi2_ump* ump) { return cmidi2_ump_get_32_to_64(ump); } -static inline uint8_t cmidi2_ump_get_midi2_pn_management_note(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_pn_management_note(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint32_t cmidi2_ump_get_midi2_pn_management_options(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint32_t cmidi2_ump_get_midi2_pn_management_options(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } -static inline uint8_t cmidi2_ump_get_midi2_cc_index(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_cc_index(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint32_t cmidi2_ump_get_midi2_cc_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint32_t cmidi2_ump_get_midi2_cc_data(const cmidi2_ump* ump) { return cmidi2_ump_get_32_to_64(ump); } // absolute RPN or relative RPN -static inline uint8_t cmidi2_ump_get_midi2_rpn_msb(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_rpn_msb(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } // absolute RPN or relative RPN -static inline uint8_t cmidi2_ump_get_midi2_rpn_lsb(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_rpn_lsb(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } // absolute RPN or relative RPN -static inline uint32_t cmidi2_ump_get_midi2_rpn_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint32_t cmidi2_ump_get_midi2_rpn_data(const cmidi2_ump* ump) { return cmidi2_ump_get_32_to_64(ump); } // absolute NRPN or relative NRPN -static inline uint8_t cmidi2_ump_get_midi2_nrpn_msb(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_nrpn_msb(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } // absolute NRPN or relative NRPN -static inline uint8_t cmidi2_ump_get_midi2_nrpn_lsb(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_nrpn_lsb(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } // absolute NRPN or relative NRPN -static inline uint32_t cmidi2_ump_get_midi2_nrpn_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint32_t cmidi2_ump_get_midi2_nrpn_data(const cmidi2_ump* ump) { return cmidi2_ump_get_32_to_64(ump); } -static inline uint8_t cmidi2_ump_get_midi2_program_options(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_program_options(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 3); } -static inline uint8_t cmidi2_ump_get_midi2_program_program(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_program_program(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 4); } -static inline uint8_t cmidi2_ump_get_midi2_program_bank_msb(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_program_bank_msb(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 6)); } -static inline uint8_t cmidi2_ump_get_midi2_program_bank_lsb(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_program_bank_lsb(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 7)); } -static inline uint32_t cmidi2_ump_get_midi2_caf_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint32_t cmidi2_ump_get_midi2_caf_data(const cmidi2_ump* ump) { return cmidi2_ump_get_32_to_64(ump); } // either per-note or channel -static inline uint32_t cmidi2_ump_get_midi2_pitch_bend_data(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint32_t cmidi2_ump_get_midi2_pitch_bend_data(const cmidi2_ump* ump) { return cmidi2_ump_get_32_to_64(ump); } -static inline uint8_t cmidi2_ump_get_midi2_pn_pitch_bend_note(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_midi2_pn_pitch_bend_note(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint8_t cmidi2_ump_get_sysex8_num_bytes(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_sysex8_num_bytes(const cmidi2_ump* ump) { return cmidi2_ump_get_channel(ump); // same bits } -static inline uint8_t cmidi2_ump_get_sysex8_stream_id(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_sysex8_stream_id(const cmidi2_ump* ump) { return cmidi2_ump_get_byte_at(ump, 2); } -static inline uint8_t cmidi2_ump_get_mds_mds_id(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint8_t cmidi2_ump_get_mds_mds_id(const cmidi2_ump* ump) { return cmidi2_ump_get_channel(ump); // same bits } -static inline uint16_t cmidi2_ump_get_mds_num_chunk_bytes(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_mds_num_chunk_bytes(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 2) << 8) + cmidi2_ump_get_byte_at(ump, 3); } -static inline uint16_t cmidi2_ump_get_mds_num_chunks(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_mds_num_chunks(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 4) << 8) + cmidi2_ump_get_byte_at(ump, 5); } -static inline uint16_t cmidi2_ump_get_mds_chunk_index(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_mds_chunk_index(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 6) << 8) + cmidi2_ump_get_byte_at(ump, 7); } -static inline uint16_t cmidi2_ump_get_mds_manufacturer_id(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_mds_manufacturer_id(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 8) << 8) + cmidi2_ump_get_byte_at(ump, 9); } -static inline uint16_t cmidi2_ump_get_mds_device_id(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_mds_device_id(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 10) << 8) + cmidi2_ump_get_byte_at(ump, 11); } -static inline uint16_t cmidi2_ump_get_mds_sub_id_1(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_mds_sub_id_1(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 12) << 8) + cmidi2_ump_get_byte_at(ump, 13); } -static inline uint16_t cmidi2_ump_get_mds_sub_id_2(const cmidi2_ump* ump) +LIBREMIDI_STATIC uint16_t cmidi2_ump_get_mds_sub_id_2(const cmidi2_ump* ump) { return (cmidi2_ump_get_byte_at(ump, 14) << 8) + cmidi2_ump_get_byte_at(ump, 15); } @@ -1672,13 +1672,13 @@ typedef struct cmidi2_ump_binary_read_state enum cmidi2_ump_binary_reader_result_code resultCode; } cmidi2_ump_binary_read_state; -static inline void cmidi2_ump_binary_read_state_reset(cmidi2_ump_binary_read_state* state) +LIBREMIDI_STATIC void cmidi2_ump_binary_read_state_reset(cmidi2_ump_binary_read_state* state) { state->dataSize = 0; state->resultCode = CMIDI2_BINARY_READER_RESULT_INCOMPLETE; } -static inline void cmidi2_ump_binary_read_state_init( +LIBREMIDI_STATIC void cmidi2_ump_binary_read_state_init( cmidi2_ump_binary_read_state* state, void* context, uint8_t* dataBuffer, size_t dataCapacity, bool continueOnCompletion) { @@ -1709,7 +1709,7 @@ typedef bool (*cmidi2_ump_binary_read_continuity_checker_func)( cmidi2_ump_binary_read_state* stream, cmidi2_ump* ump); // it is a special copy function that only works with sysex8 memory state at `src` that can access beyond `sizeInBytes`. -static inline void cmidi2_internal_sysex8_copy_data_byte_swapping( +LIBREMIDI_STATIC void cmidi2_internal_sysex8_copy_data_byte_swapping( uint8_t* dst, uint8_t srcHead, uint32_t* srcTail, size_t sizeInBytes) { if (sizeInBytes == 0) @@ -1738,7 +1738,7 @@ static inline void cmidi2_internal_sysex8_copy_data_byte_swapping( /// Parse and store sysex8 binary, using some fine-tuned behavioral functions. /// Return the number of 32-bit ints (number of `cmidi2_ump`s) -static inline size_t cmidi2_ump_get_sysex8_data( +LIBREMIDI_STATIC size_t cmidi2_ump_get_sysex8_data( cmidi2_ump_stream_selector_func streamSelector, void* streamSelectorContext, cmidi2_ump_binary_read_continuity_checker_func continuityChecker, const cmidi2_ump* ump, const size_t umpCapacityInInt) @@ -1808,7 +1808,7 @@ static inline size_t cmidi2_ump_get_sysex8_data( /* byte stream splitter */ -static inline void* cmidi2_ump_sequence_next(const void* ptr) +LIBREMIDI_STATIC void* cmidi2_ump_sequence_next(const void* ptr) { return (uint8_t*)ptr + cmidi2_ump_get_num_bytes(cmidi2_ump_read_uint32_bytes(ptr)); } @@ -1818,7 +1818,7 @@ static inline void* cmidi2_ump_sequence_next(const void* ptr) for (uint8_t*(iter) = (uint8_t*)ptr; (iter) < ((uint8_t*)ptr) + numBytes; \ (iter) = (uint8_t*)cmidi2_ump_sequence_next(iter)) -static inline void* cmidi2_ump_sequence_next_le(const void* ptr) +LIBREMIDI_STATIC void* cmidi2_ump_sequence_next_le(const void* ptr) { return (uint8_t*)ptr + cmidi2_ump_get_num_bytes(cmidi2_ump_read_uint32_bytes_le(ptr)); } @@ -1827,7 +1827,7 @@ static inline void* cmidi2_ump_sequence_next_le(const void* ptr) for (uint8_t*(iter) = (uint8_t*)ptr; (iter) < ((uint8_t*)ptr) + numBytes; \ (iter) = (uint8_t*)cmidi2_ump_sequence_next_le(iter)) -static inline void* cmidi2_ump_sequence_next_be(const void* ptr) +LIBREMIDI_STATIC void* cmidi2_ump_sequence_next_be(const void* ptr) { return (uint8_t*)ptr + cmidi2_ump_get_num_bytes(cmidi2_ump_read_uint32_bytes_be(ptr)); } @@ -1900,14 +1900,14 @@ typedef struct } cmidi2_profile_id; // Assumes the input value is already 7-bit encoded if required. -static inline void cmidi2_ci_direct_uint16_at(uint8_t* buf, uint16_t v) +LIBREMIDI_STATIC void cmidi2_ci_direct_uint16_at(uint8_t* buf, uint16_t v) { buf[0] = v & 0xFF; buf[1] = (v >> 8) & 0xFF; } // Assumes the input value is already 7-bit encoded if required. -static inline void cmidi2_ci_direct_uint32_at(uint8_t* buf, uint32_t v) +LIBREMIDI_STATIC void cmidi2_ci_direct_uint32_at(uint8_t* buf, uint32_t v) { buf[0] = v & 0xFF; buf[1] = (v >> 8) & 0xFF; @@ -1915,20 +1915,20 @@ static inline void cmidi2_ci_direct_uint32_at(uint8_t* buf, uint32_t v) buf[3] = (v >> 24) & 0xFF; } -static inline void cmidi2_ci_7bit_int14_at(uint8_t* buf, uint16_t v) +LIBREMIDI_STATIC void cmidi2_ci_7bit_int14_at(uint8_t* buf, uint16_t v) { buf[0] = v & 0x7F; buf[1] = (v >> 7) & 0x7F; } -static inline void cmidi2_ci_7bit_int21_at(uint8_t* buf, uint32_t v) +LIBREMIDI_STATIC void cmidi2_ci_7bit_int21_at(uint8_t* buf, uint32_t v) { buf[0] = v & 0x7F; buf[1] = (v >> 7) & 0x7F; buf[2] = (v >> 14) & 0x7F; } -static inline void cmidi2_ci_7bit_int28_at(uint8_t* buf, uint32_t v) +LIBREMIDI_STATIC void cmidi2_ci_7bit_int28_at(uint8_t* buf, uint32_t v) { buf[0] = v & 0x7F; buf[1] = (v >> 7) & 0x7F; @@ -1936,7 +1936,7 @@ static inline void cmidi2_ci_7bit_int28_at(uint8_t* buf, uint32_t v) buf[3] = (v >> 21) & 0x7F; } -static inline void cmidi2_ci_message_common( +LIBREMIDI_STATIC void cmidi2_ci_message_common( uint8_t* buf, uint8_t destination, uint8_t sysexSubId2, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID) { @@ -1951,7 +1951,7 @@ static inline void cmidi2_ci_message_common( // Discovery -static inline void cmidi2_ci_discovery_common( +LIBREMIDI_STATIC void cmidi2_ci_discovery_common( uint8_t* buf, uint8_t sysexSubId2, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint32_t deviceManufacturer3Bytes, uint16_t deviceFamily, uint16_t deviceFamilyModelNumber, uint32_t softwareRevisionLevel, uint8_t ciCategorySupported, @@ -1972,7 +1972,7 @@ static inline void cmidi2_ci_discovery_common( buf[29] = initiatorOutputPathId; } -static inline void cmidi2_ci_discovery( +LIBREMIDI_STATIC void cmidi2_ci_discovery( uint8_t* buf, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t deviceManufacturer, uint16_t deviceFamily, uint16_t deviceFamilyModelNumber, uint32_t softwareRevisionLevel, uint8_t ciCategorySupported, uint32_t receivableMaxSysExSize, uint8_t initiatorOutputPathId) @@ -1983,7 +1983,7 @@ static inline void cmidi2_ci_discovery( ciCategorySupported, receivableMaxSysExSize, initiatorOutputPathId); } -static inline void cmidi2_ci_discovery_reply( +LIBREMIDI_STATIC void cmidi2_ci_discovery_reply( uint8_t* buf, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint32_t deviceManufacturer, uint16_t deviceFamily, uint16_t deviceFamilyModelNumber, uint32_t softwareRevisionLevel, uint8_t ciCategorySupported, uint32_t receivableMaxSysExSize, @@ -1996,7 +1996,7 @@ static inline void cmidi2_ci_discovery_reply( buf[30] = functionBlockOr7Fh; } -static inline void cmidi2_ci_discovery_invalidate_muid( +LIBREMIDI_STATIC void cmidi2_ci_discovery_invalidate_muid( uint8_t* buf, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t targetMUID) { cmidi2_ci_message_common( @@ -2004,7 +2004,7 @@ static inline void cmidi2_ci_discovery_invalidate_muid( cmidi2_ci_direct_uint32_at(buf + 13, targetMUID); } -static inline void cmidi2_ci_ack_nak_common( +LIBREMIDI_STATIC void cmidi2_ci_ack_nak_common( uint8_t* buf, uint8_t deviceId, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t originalTransactionSubID2Class, uint8_t statusCode, uint8_t statusData, uint8_t* details5Bytes, uint16_t messageLength, const char* messageText) @@ -2019,7 +2019,7 @@ static inline void cmidi2_ci_ack_nak_common( memcpy(buf + 23, messageText, messageLength); } -static inline void cmidi2_ci_ack( +LIBREMIDI_STATIC void cmidi2_ci_ack( uint8_t* buf, uint8_t deviceId, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t originalTransactionSubID2Class, uint8_t ackStatusCode, uint8_t ackStatusData, uint8_t* ackDetails5Bytes, uint16_t messageLength, @@ -2030,7 +2030,7 @@ static inline void cmidi2_ci_ack( ackStatusCode, ackStatusData, ackDetails5Bytes, messageLength, messageText); } -static inline void cmidi2_ci_nak( +LIBREMIDI_STATIC void cmidi2_ci_nak( uint8_t* buf, uint8_t deviceId, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t originalTransactionSubID2Class, uint8_t nakStatusCode, uint8_t nakStatusData, uint8_t* nakDetails5Bytes, uint16_t messageLength, @@ -2044,7 +2044,7 @@ static inline void cmidi2_ci_nak( // Protocol Negotiation // Note that it was removed in MIDI 2.0 specification June 2023 Updates (MIDI-CI 1.2). -static inline void cmidi2_ci_protocol_info(uint8_t* buf, cmidi2_ci_protocol_type_info info) +LIBREMIDI_STATIC void cmidi2_ci_protocol_info(uint8_t* buf, cmidi2_ci_protocol_type_info info) { buf[0] = info.type; buf[1] = info.version; @@ -2053,7 +2053,7 @@ static inline void cmidi2_ci_protocol_info(uint8_t* buf, cmidi2_ci_protocol_type buf[4] = info.reserved2; } -static inline void cmidi2_ci_protocols( +LIBREMIDI_STATIC void cmidi2_ci_protocols( uint8_t* buf, uint8_t numSupportedProtocols, cmidi2_ci_protocol_type_info* protocolTypes) { buf[0] = numSupportedProtocols; @@ -2061,7 +2061,7 @@ static inline void cmidi2_ci_protocols( cmidi2_ci_protocol_info(buf + 1 + i * 5, protocolTypes[i]); } -static inline void cmidi2_ci_protocol_negotiation( +LIBREMIDI_STATIC void cmidi2_ci_protocol_negotiation( uint8_t* buf, bool isReply, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t authorityLevel, uint8_t numSupportedProtocols, cmidi2_ci_protocol_type_info* protocolTypes) @@ -2075,7 +2075,7 @@ static inline void cmidi2_ci_protocol_negotiation( cmidi2_ci_protocols(buf + 14, numSupportedProtocols, protocolTypes); } -static inline void cmidi2_ci_protocol_set( +LIBREMIDI_STATIC void cmidi2_ci_protocol_set( uint8_t* buf, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t authorityLevel, cmidi2_ci_protocol_type_info newProtocolType) { @@ -2085,7 +2085,7 @@ static inline void cmidi2_ci_protocol_set( cmidi2_ci_protocol_info(buf + 14, newProtocolType); } -static inline void cmidi2_ci_protocol_test( +LIBREMIDI_STATIC void cmidi2_ci_protocol_test( uint8_t* buf, bool isInitiatorToResponder, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t authorityLevel, uint8_t* testData48Bytes) { @@ -2098,7 +2098,7 @@ static inline void cmidi2_ci_protocol_test( memcpy(buf + 14, testData48Bytes, 48); } -static inline void cmidi2_ci_protocol_confirm_established( +LIBREMIDI_STATIC void cmidi2_ci_protocol_confirm_established( uint8_t* buf, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t authorityLevel) { cmidi2_ci_message_common( @@ -2107,7 +2107,7 @@ static inline void cmidi2_ci_protocol_confirm_established( buf[13] = authorityLevel; } -static inline int32_t cmidi2_ci_try_parse_new_protocol(uint8_t* buf, size_t length) +LIBREMIDI_STATIC int32_t cmidi2_ci_try_parse_new_protocol(uint8_t* buf, size_t length) { return (length != 19 || buf[0] != 0x7E || buf[1] != 0x7F || buf[2] != CMIDI2_CI_SUB_ID || buf[3] != CMIDI2_CI_SUB_ID_2_SET_NEW_PROTOCOL || buf[4] != 1) @@ -2117,7 +2117,7 @@ static inline int32_t cmidi2_ci_try_parse_new_protocol(uint8_t* buf, size_t leng // Profile Configuration -static inline void cmidi2_ci_profile(uint8_t* buf, cmidi2_profile_id info) +LIBREMIDI_STATIC void cmidi2_ci_profile(uint8_t* buf, cmidi2_profile_id info) { buf[0] = info.fixed_7e; buf[1] = info.bank; @@ -2126,14 +2126,14 @@ static inline void cmidi2_ci_profile(uint8_t* buf, cmidi2_profile_id info) buf[4] = info.level; } -static inline void cmidi2_ci_profile_inquiry( +LIBREMIDI_STATIC void cmidi2_ci_profile_inquiry( uint8_t* buf, uint8_t source, uint32_t sourceMUID, uint32_t destinationMUID) { cmidi2_ci_message_common( buf, source, CMIDI2_CI_SUB_ID_2_PROFILE_INQUIRY, 1, sourceMUID, destinationMUID); } -static inline void cmidi2_ci_profile_inquiry_reply( +LIBREMIDI_STATIC void cmidi2_ci_profile_inquiry_reply( uint8_t* buf, uint8_t source, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t numEnabledProfiles, cmidi2_profile_id* enabledProfiles, uint8_t numDisabledProfiles, cmidi2_profile_id* disabledProfiles) @@ -2149,7 +2149,7 @@ static inline void cmidi2_ci_profile_inquiry_reply( cmidi2_ci_profile(buf + pos + i * 5, disabledProfiles[i]); } -static inline void cmidi2_ci_profile_set( +LIBREMIDI_STATIC void cmidi2_ci_profile_set( uint8_t* buf, uint8_t destination, bool turnOn, uint32_t sourceMUID, uint32_t destinationMUID, cmidi2_profile_id profile) { @@ -2160,7 +2160,7 @@ static inline void cmidi2_ci_profile_set( cmidi2_ci_profile(buf + 13, profile); } -static inline void cmidi2_ci_profile_report( +LIBREMIDI_STATIC void cmidi2_ci_profile_report( uint8_t* buf, uint8_t source, bool isEnabledReport, uint32_t sourceMUID, cmidi2_profile_id profile) { @@ -2172,7 +2172,7 @@ static inline void cmidi2_ci_profile_report( cmidi2_ci_profile(buf + 13, profile); } -static inline void cmidi2_ci_profile_specific_data( +LIBREMIDI_STATIC void cmidi2_ci_profile_specific_data( uint8_t* buf, uint8_t source, uint32_t sourceMUID, uint32_t destinationMUID, cmidi2_profile_id profile, uint32_t dataSize, void* data) { @@ -2185,7 +2185,7 @@ static inline void cmidi2_ci_profile_specific_data( // Property Exchange -static inline void cmidi2_ci_property_get_capabilities( +LIBREMIDI_STATIC void cmidi2_ci_property_get_capabilities( uint8_t* buf, uint8_t destination, bool isReply, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t maxSupportedRequests) { @@ -2198,7 +2198,7 @@ static inline void cmidi2_ci_property_get_capabilities( } // common to all of: has data & reply, get data & reply, set data & reply, subscribe & reply, notify -static inline void cmidi2_ci_property_common( +LIBREMIDI_STATIC void cmidi2_ci_property_common( uint8_t* buf, uint8_t destination, uint8_t messageTypeSubId2, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t requestId, uint16_t headerSize, void* header, uint16_t numChunks, uint16_t chunkIndex, uint16_t dataSize, void* data) @@ -2213,7 +2213,7 @@ static inline void cmidi2_ci_property_common( memcpy(buf + 22 + headerSize, data, dataSize); } -static inline void cmidi2_ci_property_get_capabilities_reply( +LIBREMIDI_STATIC void cmidi2_ci_property_get_capabilities_reply( uint8_t* buf, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t maxSupportedRequests, uint8_t peMajorVersion, uint8_t peMinorVersion) { @@ -2226,7 +2226,7 @@ static inline void cmidi2_ci_property_get_capabilities_reply( buf[15] = peMinorVersion; } -static inline void cmidi2_ci_property_data_common( +LIBREMIDI_STATIC void cmidi2_ci_property_data_common( uint8_t* buf, uint8_t subId2, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t requestId, size_t headerSize, const uint8_t* headerData, uint16_t numChunksInMessage, uint16_t currentChunk, uint16_t propertyDataLength, @@ -2246,7 +2246,7 @@ static inline void cmidi2_ci_property_data_common( memcpy(buf + headerSize + 22, propertyData, propertyDataLength); } -static inline void cmidi2_ci_property_get_data( +LIBREMIDI_STATIC void cmidi2_ci_property_get_data( uint8_t* buf, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t requestId, size_t headerSize, const uint8_t* headerData) { @@ -2255,7 +2255,7 @@ static inline void cmidi2_ci_property_get_data( requestId, headerSize, headerData, 1, 1, 0, NULL); } -static inline void cmidi2_ci_property_get_data_reply( +LIBREMIDI_STATIC void cmidi2_ci_property_get_data_reply( uint8_t* buf, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t requestId, size_t headerSize, const uint8_t* headerData, uint16_t numChunksInMessage, uint16_t currentChunk, uint16_t propertyDataLength, const char* propertyData) @@ -2266,7 +2266,7 @@ static inline void cmidi2_ci_property_get_data_reply( propertyDataLength, propertyData); } -static inline void cmidi2_ci_property_set_data( +LIBREMIDI_STATIC void cmidi2_ci_property_set_data( uint8_t* buf, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t requestId, size_t headerSize, const uint8_t* headerData, uint16_t numChunksInMessage, uint16_t currentChunk, uint16_t propertyDataLength, const char* propertyData) @@ -2277,7 +2277,7 @@ static inline void cmidi2_ci_property_set_data( propertyData); } -static inline void cmidi2_ci_property_set_data_reply( +LIBREMIDI_STATIC void cmidi2_ci_property_set_data_reply( uint8_t* buf, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t requestId, size_t headerSize, const uint8_t* headerData) { @@ -2286,7 +2286,7 @@ static inline void cmidi2_ci_property_set_data_reply( destinationMUID, requestId, headerSize, headerData, 1, 1, 0, NULL); } -static inline void cmidi2_ci_property_subscribe( +LIBREMIDI_STATIC void cmidi2_ci_property_subscribe( uint8_t* buf, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t requestId, size_t headerSize, const uint8_t* headerData, uint16_t numChunksInMessage, uint16_t currentChunk, uint16_t propertyDataLength, const char* propertyData) @@ -2297,7 +2297,7 @@ static inline void cmidi2_ci_property_subscribe( propertyData); } -static inline void cmidi2_ci_property_subscribe_reply( +LIBREMIDI_STATIC void cmidi2_ci_property_subscribe_reply( uint8_t* buf, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t requestId, size_t headerSize, const uint8_t* headerData, uint16_t numChunksInMessage, uint16_t currentChunk, uint16_t propertyDataLength, const char* propertyData) @@ -2308,7 +2308,7 @@ static inline void cmidi2_ci_property_subscribe_reply( propertyDataLength, propertyData); } -static inline void cmidi2_ci_property_notify( +LIBREMIDI_STATIC void cmidi2_ci_property_notify( uint8_t* buf, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t requestId, size_t headerSize, const uint8_t* headerData, uint16_t numChunksInMessage, uint16_t currentChunk, uint16_t propertyDataLength, const char* propertyData) @@ -2321,7 +2321,7 @@ static inline void cmidi2_ci_property_notify( // Process Inquiry -static inline void cmidi2_ci_process_get_capabilities( +LIBREMIDI_STATIC void cmidi2_ci_process_get_capabilities( uint8_t* buf, uint8_t subId2, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID) { @@ -2331,7 +2331,7 @@ static inline void cmidi2_ci_process_get_capabilities( versionAndFormat, sourceMUID, destinationMUID); } -static inline void cmidi2_ci_process_get_capabilities_reply( +LIBREMIDI_STATIC void cmidi2_ci_process_get_capabilities_reply( uint8_t* buf, uint8_t subId2, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t processInquirySupportedFeatures) { @@ -2343,7 +2343,7 @@ static inline void cmidi2_ci_process_get_capabilities_reply( buf[13] = processInquirySupportedFeatures; } -static inline void cmidi2_ci_process_midi_report_common( +LIBREMIDI_STATIC void cmidi2_ci_process_midi_report_common( uint8_t* buf, uint8_t deviceId, uint8_t subId2, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t messageDataControl, uint8_t requestedSystemMessages, uint8_t requestedChannelControllerMessages, uint8_t requestedNoteDataMessages) @@ -2359,7 +2359,7 @@ static inline void cmidi2_ci_process_midi_report_common( buf[17] = requestedNoteDataMessages; } -static inline void cmidi2_ci_process_get_midi_report( +LIBREMIDI_STATIC void cmidi2_ci_process_get_midi_report( uint8_t* buf, uint8_t deviceId, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t messageDataControl, uint8_t requestedSystemMessages, uint8_t requestedChannelControllerMessages, uint8_t requestedNoteDataMessages) @@ -2370,7 +2370,7 @@ static inline void cmidi2_ci_process_get_midi_report( requestedChannelControllerMessages, requestedNoteDataMessages); } -static inline void cmidi2_ci_process_get_midi_report_reply( +LIBREMIDI_STATIC void cmidi2_ci_process_get_midi_report_reply( uint8_t* buf, uint8_t deviceId, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID, uint8_t messageDataControl, uint8_t requestedSystemMessages, uint8_t requestedChannelControllerMessages, uint8_t requestedNoteDataMessages) @@ -2381,7 +2381,7 @@ static inline void cmidi2_ci_process_get_midi_report_reply( requestedChannelControllerMessages, requestedNoteDataMessages); } -static inline void cmidi2_ci_process_get_midi_report_end( +LIBREMIDI_STATIC void cmidi2_ci_process_get_midi_report_end( uint8_t* buf, uint8_t deviceId, uint8_t versionAndFormat, uint32_t sourceMUID, uint32_t destinationMUID) { @@ -2393,7 +2393,7 @@ static inline void cmidi2_ci_process_get_midi_report_end( // Miscellaneous MIDI Utilities /** Encodes `value` into `bytes` stream. Returns the length of the encoded value in bytes. */ -static inline uint8_t cmidi2_midi1_write_7bit_encoded_int(uint8_t* bytes, uint32_t value) +LIBREMIDI_STATIC uint8_t cmidi2_midi1_write_7bit_encoded_int(uint8_t* bytes, uint32_t value) { uint8_t pos = 0; for (;; pos++) @@ -2410,7 +2410,7 @@ static inline uint8_t cmidi2_midi1_write_7bit_encoded_int(uint8_t* bytes, uint32 } /** Returns the length of `value` when it would be encoded into a byte stream. */ -static inline uint8_t cmidi2_midi1_get_7bit_encoded_int_length(uint32_t value) +LIBREMIDI_STATIC uint8_t cmidi2_midi1_get_7bit_encoded_int_length(uint32_t value) { for (uint8_t ret = 1;; ret++) { @@ -2423,7 +2423,7 @@ static inline uint8_t cmidi2_midi1_get_7bit_encoded_int_length(uint32_t value) } /** Returns the 7-bit encoded value in `bytes` stream of `length` bytes. */ -static inline uint32_t cmidi2_midi1_get_7bit_encoded_int(uint8_t* bytes, uint32_t length) +LIBREMIDI_STATIC uint32_t cmidi2_midi1_get_7bit_encoded_int(uint8_t* bytes, uint32_t length) { uint8_t* start = bytes; uint32_t value = 0; @@ -2440,7 +2440,7 @@ static inline uint32_t cmidi2_midi1_get_7bit_encoded_int(uint8_t* bytes, uint32_ return value; } -static inline uint32_t cmidi2_midi1_get_message_size(uint8_t* bytes, uint32_t length) +LIBREMIDI_STATIC uint32_t cmidi2_midi1_get_message_size(uint8_t* bytes, uint32_t length) { switch (bytes[0]) { @@ -2480,13 +2480,13 @@ static inline uint32_t cmidi2_midi1_get_message_size(uint8_t* bytes, uint32_t le return 0; } -static inline uint32_t cmidi2_midi1_get_message_size_live(uint8_t* bytes, uint32_t length) +LIBREMIDI_STATIC uint32_t cmidi2_midi1_get_message_size_live(uint8_t* bytes, uint32_t length) { // 0xFF in live MIDI stream indicates reset. We handle it there. return cmidi2_midi1_get_message_size(bytes, length); } -static inline uint32_t cmidi2_midi1_get_message_size_smf(uint8_t* bytes, uint32_t length) +LIBREMIDI_STATIC uint32_t cmidi2_midi1_get_message_size_smf(uint8_t* bytes, uint32_t length) { switch (bytes[0]) { @@ -2605,7 +2605,7 @@ enum cmidi2_midi_conversion_result CMIDI2_CONVERSION_RESULT_INVALID_INPUT = 0x40, }; -static inline void +LIBREMIDI_STATIC void cmidi2_midi_conversion_context_initialize(cmidi2_midi_conversion_context* context) { context->is_midi1_smf = false; @@ -2634,7 +2634,7 @@ typedef struct cmidi2_convert_sysex_context size_t dst_offset; } cmidi2_convert_sysex_context; -static inline void* +LIBREMIDI_STATIC void* cmidi2_internal_convert_add_midi1_sysex7_ump_to_list(uint64_t data, void* context) { cmidi2_convert_sysex_context* s7ctx = (cmidi2_convert_sysex_context*)context; @@ -2645,7 +2645,7 @@ cmidi2_internal_convert_add_midi1_sysex7_ump_to_list(uint64_t data, void* contex return NULL; } -static inline void* cmidi2_internal_convert_add_midi1_sysex8_ump_to_list( +LIBREMIDI_STATIC void* cmidi2_internal_convert_add_midi1_sysex8_ump_to_list( uint64_t data1, uint64_t data2, size_t index, void* context) { (void)index; @@ -2659,7 +2659,7 @@ static inline void* cmidi2_internal_convert_add_midi1_sysex8_ump_to_list( return NULL; } -static inline uint64_t +LIBREMIDI_STATIC uint64_t cmidi2_internal_convert_midi1_dte_to_ump(cmidi2_midi_conversion_context* context, uint8_t channel) { bool isRpn = (context->context_rpn & 0x8080) == 0; @@ -2674,7 +2674,7 @@ cmidi2_internal_convert_midi1_dte_to_ump(cmidi2_midi_conversion_context* context : cmidi2_ump_midi2_nrpn(context->group, channel, msb, lsb, data); } -static inline uint32_t cmidi2_internal_swap_endian(uint32_t v) +LIBREMIDI_STATIC uint32_t cmidi2_internal_swap_endian(uint32_t v) { return ((v & 0xFF) << 24) + (((v >> 8) & 0xFF) << 16) + (((v >> 16) & 0xFF) << 8) + ((v >> 24) & 0xFF); @@ -2959,7 +2959,7 @@ static size_t cmidi2_internal_add_midi1_delta_time( /// Convert one single UMP (without JR Timestamp) to MIDI 1.0 Message (without delta time) /// It is a lengthy function, so it is recommended to wrap it in another non-inline function. -static inline size_t cmidi2_convert_single_ump_to_timed_midi1( +LIBREMIDI_STATIC size_t cmidi2_convert_single_ump_to_timed_midi1( uint8_t* dst, size_t maxBytes, cmidi2_ump* ump, int32_t deltaTime, cmidi2_midi_conversion_context* context, uint8_t* sysex7Buffer, size_t* sysex7BufferIndex) { @@ -3168,7 +3168,7 @@ static inline size_t cmidi2_convert_single_ump_to_timed_midi1( } // Left for API backward compatibility. -static inline size_t +LIBREMIDI_STATIC size_t cmidi2_convert_single_ump_to_midi1(uint8_t* dst, size_t maxBytes, cmidi2_ump* ump) { return cmidi2_convert_single_ump_to_timed_midi1(dst, maxBytes, ump, 0, NULL, NULL, 0); @@ -3251,7 +3251,7 @@ typedef struct cmidi2_ump_forge size_t offset; } cmidi2_ump_forge; -static inline void +LIBREMIDI_STATIC void cmidi2_ump_forge_init(cmidi2_ump_forge* forge, cmidi2_ump* buffer, size_t capacityInBytes) { forge->ump = buffer; @@ -3259,7 +3259,7 @@ cmidi2_ump_forge_init(cmidi2_ump_forge* forge, cmidi2_ump* buffer, size_t capaci forge->offset = 0; } -static inline bool cmidi2_ump_forge_add_packet_32(cmidi2_ump_forge* forge, uint32_t ump) +LIBREMIDI_STATIC bool cmidi2_ump_forge_add_packet_32(cmidi2_ump_forge* forge, uint32_t ump) { int size = 4; if (forge->offset + size > forge->capacity) @@ -3270,7 +3270,7 @@ static inline bool cmidi2_ump_forge_add_packet_32(cmidi2_ump_forge* forge, uint3 return true; } -static inline bool cmidi2_ump_forge_add_packet_64(cmidi2_ump_forge* forge, uint64_t ump) +LIBREMIDI_STATIC bool cmidi2_ump_forge_add_packet_64(cmidi2_ump_forge* forge, uint64_t ump) { int size = 8; if (forge->offset + size > forge->capacity) @@ -3281,7 +3281,7 @@ static inline bool cmidi2_ump_forge_add_packet_64(cmidi2_ump_forge* forge, uint6 return true; } -static inline bool +LIBREMIDI_STATIC bool cmidi2_ump_forge_add_packet_128(cmidi2_ump_forge* forge, uint64_t ump1, uint64_t ump2) { int size = 16; @@ -3293,7 +3293,7 @@ cmidi2_ump_forge_add_packet_128(cmidi2_ump_forge* forge, uint64_t ump1, uint64_t return true; } -static inline bool cmidi2_ump_forge_add_single_packet(cmidi2_ump_forge* forge, cmidi2_ump* ump) +LIBREMIDI_STATIC bool cmidi2_ump_forge_add_single_packet(cmidi2_ump_forge* forge, cmidi2_ump* ump) { int size = cmidi2_ump_get_message_size_bytes(ump); if (forge->offset + size > forge->capacity) @@ -3303,7 +3303,7 @@ static inline bool cmidi2_ump_forge_add_single_packet(cmidi2_ump_forge* forge, c return true; } -static inline bool +LIBREMIDI_STATIC bool cmidi2_ump_forge_add_packets(cmidi2_ump_forge* forge, cmidi2_ump* ump, int32_t size) { if (forge->offset + size > forge->capacity) @@ -3315,7 +3315,7 @@ cmidi2_ump_forge_add_packets(cmidi2_ump_forge* forge, cmidi2_ump* ump, int32_t s // UMP sequence merger -static inline bool cmidi2_internal_ump_merge_sequence_write_delta_time( +LIBREMIDI_STATIC bool cmidi2_internal_ump_merge_sequence_write_delta_time( int32_t timestamp1, int32_t timestamp2, int32_t* lastTimestamp, void* dst, int32_t* dIdx, size_t dstSize) { @@ -3334,7 +3334,7 @@ static inline bool cmidi2_internal_ump_merge_sequence_write_delta_time( return true; } -static inline size_t cmidi2_ump_merge_sequences( +LIBREMIDI_STATIC size_t cmidi2_ump_merge_sequences( cmidi2_ump* dst, size_t dstCapacity, cmidi2_ump* seq1, size_t seq1Size, cmidi2_ump* seq2, size_t seq2Size) { diff --git a/include/libremidi/config.hpp b/include/libremidi/config.hpp index 1279bcf7..56f98402 100644 --- a/include/libremidi/config.hpp +++ b/include/libremidi/config.hpp @@ -1,11 +1,50 @@ #pragma once +#ifndef LIBREMIDI_CONFIG_HPP + #define LIBREMIDI_CONFIG_HPP + +// clang-format off +#if !defined(LIBREMIDI_BASE_NAMESPACE) + #define LIBREMIDI_BASE_NAMESPACE libremidi +#endif +#if defined(LIBREMIDI_MODULE_BUILD) + #define LIBREMIDI_MODULE_EXPORT export + #define LIBREMIDI_MODULE_BEGIN_EXPORT export { + #define LIBREMIDI_MODULE_END_EXPORT } + #define NAMESPACE_LIBREMIDI export namespace LIBREMIDI_BASE_NAMESPACE + #define NAMESPACE_STDX export namespace stdx + #define LIBREMIDI_STATIC inline + #define LIBREMIDI_STATIC_IMPLEMENTATION inline + #define LIBREMIDI_STATIC_INLINE_IMPLEMENTATION inline + #define LIBREMIDI_INLINE_IMPLEMENTATION + #define LIBREMIDI_ANONYMOUS_NAMESPACE detail +#else + #define LIBREMIDI_MODULE_EXPORT + #define LIBREMIDI_MODULE_BEGIN_EXPORT + #define LIBREMIDI_MODULE_END_EXPORT + #define NAMESPACE_LIBREMIDI namespace LIBREMIDI_BASE_NAMESPACE + #define NAMESPACE_STDX namespace stdx + #define LIBREMIDI_STATIC static inline + +#if defined(LIBREMIDI_HEADER_ONLY) + #define LIBREMIDI_STATIC_IMPLEMENTATION static + #define LIBREMIDI_STATIC_INLINE_IMPLEMENTATION static inline + #define LIBREMIDI_INLINE_IMPLEMENTATION inline +#else + #define LIBREMIDI_STATIC_IMPLEMENTATION static + #define LIBREMIDI_STATIC_INLINE_IMPLEMENTATION static + #define LIBREMIDI_INLINE_IMPLEMENTATION +#endif + + #define LIBREMIDI_ANONYMOUS_NAMESPACE +#endif +// clang-format on #if defined(_MSC_VER) #define NOMINMAX 1 #define WIN32_LEAN_AND_MEAN #endif -#if defined(LIBREMIDI_EXPORTS) +#if defined(LIBREMIDI_EXPORTS) || defined(LIBREMIDI_MODULE_BUILD) #if defined(_MSC_VER) #define LIBREMIDI_EXPORT __declspec(dllexport) #elif defined(__GNUC__) || defined(__clang__) @@ -32,22 +71,22 @@ #if LIBREMIDI_SLIM_MESSAGE > 0 #include -namespace libremidi +NAMESPACE_LIBREMIDI { using midi_bytes = boost::container::static_vector; } #else #include -namespace libremidi +NAMESPACE_LIBREMIDI { -static constexpr int small_vector_minimum_size +LIBREMIDI_STATIC constexpr int small_vector_minimum_size = sizeof(boost::container::small_vector); using midi_bytes = boost::container::small_vector; } #endif #else #include -namespace libremidi +NAMESPACE_LIBREMIDI { using midi_bytes = std::vector; } @@ -68,3 +107,4 @@ using midi_bytes = std::vector; #else #define LIBREMIDI_PRECONDITION(...) #endif +#endif diff --git a/include/libremidi/configurations.hpp b/include/libremidi/configurations.hpp index c6de2bfe..438052b7 100644 --- a/include/libremidi/configurations.hpp +++ b/include/libremidi/configurations.hpp @@ -22,7 +22,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct unspecified_configuration { diff --git a/include/libremidi/defaults.hpp b/include/libremidi/defaults.hpp index edbc888b..f50e267c 100644 --- a/include/libremidi/defaults.hpp +++ b/include/libremidi/defaults.hpp @@ -8,7 +8,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_in; class midi_out; diff --git a/include/libremidi/detail/conversion.hpp b/include/libremidi/detail/conversion.hpp index 1f1fd0b3..eab7f138 100644 --- a/include/libremidi/detail/conversion.hpp +++ b/include/libremidi/detail/conversion.hpp @@ -10,7 +10,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct cmidi2_error_domain : public stdx::error_domain { @@ -68,7 +68,7 @@ inline stdx::error from_cmidi2_result(cmidi2_midi_conversion_result ret) noexcep } } -static inline void cmidi2_reverse(int64_t v, cmidi2_ump* output) +LIBREMIDI_STATIC void cmidi2_reverse(int64_t v, cmidi2_ump* output) { union { @@ -81,26 +81,26 @@ static inline void cmidi2_reverse(int64_t v, cmidi2_ump* output) memcpy(output, &e1, 8); } -static inline auto u7_to_u16(uint8_t in) -> uint16_t +LIBREMIDI_STATIC auto u7_to_u16(uint8_t in) -> uint16_t { static constexpr auto ratio = float(std::numeric_limits::max()) / 127.f; return std::clamp(std::round(in * ratio), 0.f, float(std::numeric_limits::max())); }; -static inline auto u7_to_u32(uint8_t in) -> uint32_t +LIBREMIDI_STATIC auto u7_to_u32(uint8_t in) -> uint32_t { static constexpr auto ratio = double(std::numeric_limits::max()) / 127.; return std::clamp(std::round(in * ratio), 0., double(std::numeric_limits::max())); }; -static inline auto u16_to_u32(uint16_t in) -> uint32_t +LIBREMIDI_STATIC auto u16_to_u32(uint16_t in) -> uint32_t { static constexpr auto ratio = double(std::numeric_limits::max()) / double(std::numeric_limits::max()); return std::clamp(std::round(in * ratio), 0., double(std::numeric_limits::max())); }; -static inline bool +LIBREMIDI_STATIC bool cmidi2_midi1_channel_voice_to_midi2(const uint8_t* bytes, std::size_t sz, cmidi2_ump* output) { if (sz < 2) @@ -157,7 +157,7 @@ cmidi2_midi1_channel_voice_to_midi2(const uint8_t* bytes, std::size_t sz, cmidi2 return true; } -static inline bool +LIBREMIDI_STATIC bool cmidi2_ump_upgrade_midi1_channel_voice_to_midi2(const cmidi2_ump* input, cmidi2_ump* output) { if (cmidi2_ump_get_message_type(input) != CMIDI2_MESSAGE_TYPE_MIDI_1_CHANNEL) @@ -223,9 +223,9 @@ cmidi2_ump_upgrade_midi1_channel_voice_to_midi2(const cmidi2_ump* input, cmidi2_ return true; } -namespace libremidi +NAMESPACE_LIBREMIDI { -static inline libremidi::message midi1_from_ump(libremidi::ump u) +LIBREMIDI_STATIC libremidi::message midi1_from_ump(libremidi::ump u) { libremidi::message ret; ret.bytes.resize(4); @@ -241,7 +241,7 @@ static inline libremidi::message midi1_from_ump(libremidi::ump u) return ret; } -static inline libremidi::ump ump_from_midi1(libremidi::message u) +LIBREMIDI_STATIC libremidi::ump ump_from_midi1(libremidi::message u) { libremidi::ump ret; if (!u.bytes.empty()) diff --git a/include/libremidi/detail/memory.hpp b/include/libremidi/detail/memory.hpp index d398c42e..fdb12229 100644 --- a/include/libremidi/detail/memory.hpp +++ b/include/libremidi/detail/memory.hpp @@ -3,7 +3,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { template struct deleter diff --git a/include/libremidi/detail/midi_api.hpp b/include/libremidi/detail/midi_api.hpp index a51d6b4f..3225da40 100644 --- a/include/libremidi/detail/midi_api.hpp +++ b/include/libremidi/detail/midi_api.hpp @@ -5,7 +5,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_api { diff --git a/include/libremidi/detail/midi_in.hpp b/include/libremidi/detail/midi_in.hpp index 3834d630..7f88b871 100644 --- a/include/libremidi/detail/midi_in.hpp +++ b/include/libremidi/detail/midi_in.hpp @@ -4,7 +4,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_in_api : public midi_api { diff --git a/include/libremidi/detail/midi_out.hpp b/include/libremidi/detail/midi_out.hpp index 7966a14e..74a5b3d2 100644 --- a/include/libremidi/detail/midi_out.hpp +++ b/include/libremidi/detail/midi_out.hpp @@ -6,7 +6,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { class midi_out_api : public midi_api diff --git a/include/libremidi/detail/midi_stream_decoder.hpp b/include/libremidi/detail/midi_stream_decoder.hpp index ff53a9fd..cea46448 100644 --- a/include/libremidi/detail/midi_stream_decoder.hpp +++ b/include/libremidi/detail/midi_stream_decoder.hpp @@ -10,9 +10,9 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { -static inline int64_t system_ns() noexcept +LIBREMIDI_STATIC int64_t system_ns() noexcept { namespace clk = std::chrono; return clk::duration_cast(clk::steady_clock::now().time_since_epoch()).count(); diff --git a/include/libremidi/detail/observer.hpp b/include/libremidi/detail/observer.hpp index 760e2b60..f891e0d7 100644 --- a/include/libremidi/detail/observer.hpp +++ b/include/libremidi/detail/observer.hpp @@ -7,7 +7,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class observer_api { diff --git a/include/libremidi/detail/ump_stream.hpp b/include/libremidi/detail/ump_stream.hpp index 70aa5b61..fe58af2d 100644 --- a/include/libremidi/detail/ump_stream.hpp +++ b/include/libremidi/detail/ump_stream.hpp @@ -4,7 +4,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { enum class segmentation_error { diff --git a/include/libremidi/error.hpp b/include/libremidi/error.hpp index f8c30d96..fbc1061b 100644 --- a/include/libremidi/error.hpp +++ b/include/libremidi/error.hpp @@ -17,12 +17,12 @@ #if __has_include() && (__cpp_lib_source_location >= 201907L) #include -namespace libremidi +NAMESPACE_LIBREMIDI { using source_location = std::source_location; } #else -namespace libremidi +NAMESPACE_LIBREMIDI { struct source_location { @@ -35,7 +35,7 @@ struct source_location } #endif -namespace libremidi +NAMESPACE_LIBREMIDI { inline auto from_errc(int64_t ret) noexcept { diff --git a/include/libremidi/error_handler.hpp b/include/libremidi/error_handler.hpp index 071867fa..d3fc2a41 100644 --- a/include/libremidi/error_handler.hpp +++ b/include/libremidi/error_handler.hpp @@ -8,7 +8,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct error_handler { diff --git a/include/libremidi/input_configuration.hpp b/include/libremidi/input_configuration.hpp index 5b649745..64666e25 100644 --- a/include/libremidi/input_configuration.hpp +++ b/include/libremidi/input_configuration.hpp @@ -6,7 +6,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { //! Specify how timestamps are handled in the system enum timestamp_mode diff --git a/include/libremidi/libremidi-c.cpp b/include/libremidi/libremidi-c.cpp index 3ca67682..3062b4e0 100644 --- a/include/libremidi/libremidi-c.cpp +++ b/include/libremidi/libremidi-c.cpp @@ -24,10 +24,10 @@ struct libremidi_midi_out_handle libremidi::midi_out self; }; -namespace libremidi +NAMESPACE_LIBREMIDI { -static void assign_error_callback(const auto& src, auto& dst) +LIBREMIDI_STATIC void assign_error_callback(const auto& src, auto& dst) { if (src.callback) { diff --git a/include/libremidi/libremidi.cpp b/include/libremidi/libremidi.cpp index b1c9dc54..dcd8f949 100644 --- a/include/libremidi/libremidi.cpp +++ b/include/libremidi/libremidi.cpp @@ -7,7 +7,7 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { LIBREMIDI_INLINE diff --git a/include/libremidi/libremidi.hpp b/include/libremidi/libremidi.hpp index da95ba7c..c354efac 100644 --- a/include/libremidi/libremidi.hpp +++ b/include/libremidi/libremidi.hpp @@ -70,7 +70,7 @@ #include #endif -namespace libremidi +NAMESPACE_LIBREMIDI { //! Main class for observing hotplug of MIDI 1.0 and 2.0 devices. //! The callbacks will be called whenever a device is added or removed diff --git a/include/libremidi/message.hpp b/include/libremidi/message.hpp index cc35516c..182935d8 100644 --- a/include/libremidi/message.hpp +++ b/include/libremidi/message.hpp @@ -9,7 +9,7 @@ #include #endif -namespace libremidi +NAMESPACE_LIBREMIDI { enum class message_type : uint8_t { diff --git a/include/libremidi/midi_in.cpp b/include/libremidi/midi_in.cpp index 711e06ed..ecd4673e 100644 --- a/include/libremidi/midi_in.cpp +++ b/include/libremidi/midi_in.cpp @@ -7,10 +7,10 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { -static libremidi::ump_input_configuration +LIBREMIDI_STATIC_IMPLEMENTATION libremidi::ump_input_configuration convert_midi1_to_midi2_input_configuration(const input_configuration& base_conf) noexcept { libremidi::ump_input_configuration c2; @@ -32,7 +32,7 @@ convert_midi1_to_midi2_input_configuration(const input_configuration& base_conf) return c2; } -static libremidi::input_configuration +LIBREMIDI_STATIC_IMPLEMENTATION libremidi::input_configuration convert_midi2_to_midi1_input_configuration(const ump_input_configuration& base_conf) noexcept { libremidi::input_configuration c2; @@ -59,7 +59,7 @@ convert_midi2_to_midi1_input_configuration(const ump_input_configuration& base_c return c2; } -static LIBREMIDI_INLINE std::unique_ptr +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr make_midi_in(auto base_conf, input_api_configuration api_conf, auto backends) { std::unique_ptr ptr; @@ -79,7 +79,7 @@ make_midi_in(auto base_conf, input_api_configuration api_conf, auto backends) } /// MIDI 1 helpers -static LIBREMIDI_INLINE std::unique_ptr +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr make_midi1_in(const input_configuration& base_conf) { for (const auto& api : available_apis()) @@ -116,7 +116,7 @@ make_midi1_in(const input_configuration& base_conf) return std::make_unique(input_configuration{}, dummy_configuration{}); } -static LIBREMIDI_INLINE std::unique_ptr make_midi1_in( +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr make_midi1_in( const input_configuration& base_conf, const input_api_configuration& api_conf, libremidi::API api) { @@ -132,7 +132,7 @@ static LIBREMIDI_INLINE std::unique_ptr make_midi1_in( return {}; } -static LIBREMIDI_INLINE std::unique_ptr +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr make_midi1_in(const input_configuration& base_conf, const input_api_configuration& api_conf) { if (std::get_if(&api_conf)) @@ -178,7 +178,7 @@ midi_in::midi_in(const input_configuration& base_conf, const input_api_configura } /// MIDI 2 helpers -static LIBREMIDI_INLINE std::unique_ptr +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr make_midi2_in(const ump_input_configuration& base_conf) { for (const auto& api : available_ump_apis()) @@ -213,7 +213,7 @@ make_midi2_in(const ump_input_configuration& base_conf) return {}; } -static LIBREMIDI_INLINE std::unique_ptr make_midi2_in( +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr make_midi2_in( const ump_input_configuration& base_conf, const input_api_configuration& api_conf, libremidi::API api) { @@ -230,7 +230,7 @@ static LIBREMIDI_INLINE std::unique_ptr make_midi2_in( return {}; } -static LIBREMIDI_INLINE std::unique_ptr +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr make_midi2_in(const ump_input_configuration& base_conf, const input_api_configuration& api_conf) { if (std::get_if(&api_conf)) diff --git a/include/libremidi/midi_out.cpp b/include/libremidi/midi_out.cpp index 513b96e8..e7123539 100644 --- a/include/libremidi/midi_out.cpp +++ b/include/libremidi/midi_out.cpp @@ -8,9 +8,9 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { -static LIBREMIDI_INLINE std::unique_ptr +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr make_midi_out_impl(auto base_conf, output_api_configuration api_conf) { std::unique_ptr ptr; @@ -28,7 +28,7 @@ make_midi_out_impl(auto base_conf, output_api_configuration api_conf) return ptr; } -static LIBREMIDI_INLINE std::unique_ptr +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr make_midi_out(const output_configuration& base_conf) { for (const auto& api : available_apis()) @@ -58,7 +58,7 @@ make_midi_out(const output_configuration& base_conf) return std::make_unique(output_configuration{}, dummy_configuration{}); } -static LIBREMIDI_INLINE std::unique_ptr +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr make_midi_out(const output_configuration& base_conf, const output_api_configuration& api_conf) { if (std::get_if(&api_conf)) diff --git a/include/libremidi/observer.cpp b/include/libremidi/observer.cpp index 81abe3a3..0f5972fe 100644 --- a/include/libremidi/observer.cpp +++ b/include/libremidi/observer.cpp @@ -7,10 +7,10 @@ #include -namespace libremidi +NAMESPACE_LIBREMIDI { -static LIBREMIDI_INLINE std::unique_ptr make_observer(const auto& base_conf) +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::unique_ptr make_observer(const auto& base_conf) { for (const auto& api : available_apis()) { diff --git a/include/libremidi/observer_configuration.hpp b/include/libremidi/observer_configuration.hpp index 89669979..15722725 100644 --- a/include/libremidi/observer_configuration.hpp +++ b/include/libremidi/observer_configuration.hpp @@ -1,7 +1,7 @@ #pragma once #include -namespace libremidi +NAMESPACE_LIBREMIDI { using input_port_callback = std::function; using output_port_callback = std::function; diff --git a/include/libremidi/output_configuration.hpp b/include/libremidi/output_configuration.hpp index 44e33734..10e776c1 100644 --- a/include/libremidi/output_configuration.hpp +++ b/include/libremidi/output_configuration.hpp @@ -3,7 +3,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct output_configuration { diff --git a/include/libremidi/protocols/remote_control.hpp b/include/libremidi/protocols/remote_control.hpp index 9ce2a1df..8281509b 100644 --- a/include/libremidi/protocols/remote_control.hpp +++ b/include/libremidi/protocols/remote_control.hpp @@ -12,7 +12,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { static constexpr auto to_underlying(auto e) { diff --git a/include/libremidi/reader.cpp b/include/libremidi/reader.cpp index 81346e2c..cf59923d 100644 --- a/include/libremidi/reader.cpp +++ b/include/libremidi/reader.cpp @@ -55,18 +55,18 @@ std::ostream& operator<<(std::ostream& s, const libremidi::message& m) } #endif -namespace libremidi +NAMESPACE_LIBREMIDI { namespace util { struct no_validator { - static inline bool validate_track([[maybe_unused]] const midi_track& track) { return true; } + static bool validate_track([[maybe_unused]] const midi_track& track) { return true; } }; struct validator { - static inline bool validate_track(const midi_track& track) + static bool validate_track(const midi_track& track) { if (track.empty()) { @@ -108,13 +108,13 @@ struct read_unchecked { // Read a MIDI-style variable-length integer (big-endian value in groups of 7 bits, // with top bit set to signify that another byte follows). - static inline void ensure_size( + static void ensure_size( [[maybe_unused]] const uint8_t* begin, [[maybe_unused]] const uint8_t* end, [[maybe_unused]] int64_t needed) { } - static inline uint32_t + static uint32_t read_variable_length(uint8_t const*& data, [[maybe_unused]] uint8_t const* end) { uint32_t result = 0; @@ -133,7 +133,7 @@ struct read_unchecked } } - static inline void read_bytes( + static void read_bytes( midi_bytes& buffer, uint8_t const*& data, [[maybe_unused]] const uint8_t* end, const std::size_t num) { @@ -142,20 +142,20 @@ struct read_unchecked buffer.push_back(*data++); } - static inline void read_bytes( + static void read_bytes( midi_bytes& buffer, uint8_t const*& data, [[maybe_unused]] const uint8_t* end, const int num) { read_bytes(buffer, data, end, static_cast(num)); } - static inline uint16_t read_uint16_be(uint8_t const*& data, [[maybe_unused]] const uint8_t* end) + static uint16_t read_uint16_be(uint8_t const*& data, [[maybe_unused]] const uint8_t* end) { uint16_t result = *data++ << 8u; result += *data++; return result; } - static inline uint32_t read_uint24_be(uint8_t const*& data, [[maybe_unused]] const uint8_t* end) + static uint32_t read_uint24_be(uint8_t const*& data, [[maybe_unused]] const uint8_t* end) { uint32_t result = *data++ << 16u; result += static_cast(*data++ << 8u); @@ -163,7 +163,7 @@ struct read_unchecked return result; } - static inline uint32_t read_uint32_be(uint8_t const*& data, [[maybe_unused]] const uint8_t* end) + static uint32_t read_uint32_be(uint8_t const*& data, [[maybe_unused]] const uint8_t* end) { uint32_t result = *data++ << 24u; result += static_cast(*data++ << 16u); @@ -178,14 +178,14 @@ struct read_checked { // Read a MIDI-style variable-length integer (big-endian value in groups of 7 bits, // with top bit set to signify that another byte follows). - static inline void + static void ensure_size(const uint8_t* begin, const uint8_t* end, const std::size_t needed) { if (const auto available = static_cast(end - begin); available < needed) throw std::runtime_error("MIDI reader: not enough data to process"); } - static inline std::size_t read_variable_length(uint8_t const*& data, uint8_t const* end) + static std::size_t read_variable_length(uint8_t const*& data, uint8_t const* end) { std::size_t result = 0; while (true) @@ -204,26 +204,26 @@ struct read_checked } } - static inline void + static void read_bytes(midi_bytes& buffer, uint8_t const*& data, uint8_t const* end, const std::size_t num) { ensure_size(data, end, num); read_unchecked::read_bytes(buffer, data, end, num); } - static inline uint16_t read_uint16_be(uint8_t const*& data, uint8_t const* end) + static uint16_t read_uint16_be(uint8_t const*& data, uint8_t const* end) { ensure_size(data, end, 2); return read_unchecked::read_uint16_be(data, end); } - static inline uint32_t read_uint24_be(uint8_t const*& data, uint8_t const* end) + static uint32_t read_uint24_be(uint8_t const*& data, uint8_t const* end) { ensure_size(data, end, 3); return read_unchecked::read_uint24_be(data, end); } - static inline uint32_t read_uint32_be(uint8_t const*& data, uint8_t const* end) + static uint32_t read_uint32_be(uint8_t const*& data, uint8_t const* end) { ensure_size(data, end, 4); return read_unchecked::read_uint32_be(data, end); @@ -537,7 +537,7 @@ LIBREMIDI_INLINE auto reader::parse(const uint8_t* dataPtr, std::size_t size) noexcept -> parse_result try { - using namespace libremidi::util; + using namespace util; tracks.clear(); diff --git a/include/libremidi/reader.hpp b/include/libremidi/reader.hpp index 4fda384a..2cb8d342 100644 --- a/include/libremidi/reader.hpp +++ b/include/libremidi/reader.hpp @@ -27,7 +27,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -namespace libremidi +NAMESPACE_LIBREMIDI { /** * @brief reads Standard MIDI files (SMF). diff --git a/include/libremidi/shared_context.hpp b/include/libremidi/shared_context.hpp index ad9d9a4b..5d9e68e3 100644 --- a/include/libremidi/shared_context.hpp +++ b/include/libremidi/shared_context.hpp @@ -2,7 +2,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { class shared_context diff --git a/include/libremidi/system_error2.hpp b/include/libremidi/system_error2.hpp index 82dd5413..cee4fe28 100644 --- a/include/libremidi/system_error2.hpp +++ b/include/libremidi/system_error2.hpp @@ -1,3 +1,4 @@ +#pragma once #ifndef STDX_COMPILER_HPP #define STDX_COMPILER_HPP @@ -77,7 +78,7 @@ #include -namespace stdx { +NAMESPACE_STDX { // Implementation of std::void_t for use with pre-C++17 compilers. // @@ -224,7 +225,7 @@ struct is_trivially_relocatable : is_trivially_copyable { }; #include -namespace stdx { +NAMESPACE_STDX { namespace detail { @@ -384,7 +385,7 @@ struct is_bit_castable #include #include -namespace stdx { +NAMESPACE_STDX { struct default_intrusive_reference_count; class default_intrusive_reference_control; @@ -1161,7 +1162,7 @@ struct is_trivially_relocatable> : std::true_type #include #include -namespace stdx { +NAMESPACE_STDX { class string_ref; @@ -1606,7 +1607,7 @@ class shared_string_ref : public string_ref #include -namespace stdx { +NAMESPACE_STDX { #if __cplusplus >= 201703L #if defined(__cpp_lib_launder) @@ -1648,7 +1649,7 @@ constexpr T* launder(T* p) noexcept #include -namespace stdx { +NAMESPACE_STDX { class error; @@ -1695,7 +1696,7 @@ constexpr auto construct_error_from_adl(Args&&... args) noexcept( } // end namespace stdx_adl -namespace stdx { +NAMESPACE_STDX { enum class dynamic_exception_errc { @@ -2854,9 +2855,9 @@ struct is_error_code_enum : std::true_type #include -namespace stdx { +NAMESPACE_STDX { -namespace { +// namespace { inline const char* dynamic_exception_errc_str(unsigned ev) noexcept { @@ -2934,7 +2935,7 @@ inline const std::error_category& dynamic_exception_category() noexcept return dynamic_exception_error_category_instance; } -} // end anonymous namespace +//} // end anonymous namespace inline std::error_code make_error_code(dynamic_exception_errc code) noexcept { @@ -3153,9 +3154,9 @@ inline bool generic_error_domain::equivalent(const error& lhs, const error& rhs) return false; } -namespace { +// namespace { -string_ref generic_error_code_message(std::errc code) noexcept +inline string_ref generic_error_code_message(std::errc code) noexcept { switch (code) { @@ -3322,7 +3323,7 @@ string_ref generic_error_code_message(std::errc code) noexcept } } -} // end anonymous namespace +// } // end anonymous namespace inline string_ref generic_error_domain::message(const error& e) const noexcept { @@ -3416,9 +3417,9 @@ inline string_ref dynamic_exception_error_domain::message(const error& e) const return string_ref{"Unknown dynamic exception"}; } -namespace { +// namespace { -std::errc dynamic_exception_code_to_generic_code(dynamic_exception_errc code) noexcept +inline std::errc dynamic_exception_code_to_generic_code(dynamic_exception_errc code) noexcept { switch (code) { @@ -3442,7 +3443,7 @@ std::errc dynamic_exception_code_to_generic_code(dynamic_exception_errc code) no return std::errc{}; } -} // end anonymous namespace +// } // end anonymous namespace inline bool dynamic_exception_error_domain::equivalent(const error& lhs, const error& rhs) const noexcept { diff --git a/include/libremidi/types.hpp b/include/libremidi/types.hpp index b4ef74bb..4e679402 100644 --- a/include/libremidi/types.hpp +++ b/include/libremidi/types.hpp @@ -5,7 +5,7 @@ #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { /// MIDI protocol supported by an endpoint or function block enum class midi_protocol : uint8_t diff --git a/include/libremidi/ump.hpp b/include/libremidi/ump.hpp index 073a272a..2efd89fe 100644 --- a/include/libremidi/ump.hpp +++ b/include/libremidi/ump.hpp @@ -5,7 +5,7 @@ #include #endif -namespace libremidi +NAMESPACE_LIBREMIDI { namespace midi2 { diff --git a/include/libremidi/ump_events.hpp b/include/libremidi/ump_events.hpp index 4d8a52b9..24e201eb 100644 --- a/include/libremidi/ump_events.hpp +++ b/include/libremidi/ump_events.hpp @@ -4,7 +4,7 @@ #include // FIXME! we need to review them all to check the channels -namespace libremidi::ump_events +NAMESPACE_LIBREMIDI::ump_events { inline libremidi::ump note_on(uint8_t group, uint8_t channel, uint8_t pitch, uint32_t vel) { @@ -63,7 +63,7 @@ inline libremidi::ump pitch_bend(uint8_t group, uint8_t channel, uint32_t value) } } -namespace libremidi::from_midi1 +NAMESPACE_LIBREMIDI::from_midi1 { inline libremidi::ump note_on(uint8_t channel, uint8_t pitch, uint8_t vel) { @@ -122,7 +122,7 @@ inline libremidi::ump pitch_bend(uint8_t channel, uint16_t value) } } -namespace libremidi::from_01 +NAMESPACE_LIBREMIDI::from_01 { inline libremidi::ump note_on(uint8_t channel, uint8_t pitch, double vel) { @@ -179,7 +179,7 @@ inline libremidi::ump pitch_bend(uint8_t channel, double value) } } -namespace libremidi::as_midi1 +NAMESPACE_LIBREMIDI::as_midi1 { inline auto note_off(const libremidi::ump& mess) { @@ -281,7 +281,7 @@ inline auto pitch_bend(const libremidi::ump& mess) } } -namespace libremidi::as_01 +NAMESPACE_LIBREMIDI::as_01 { inline auto note_off(const libremidi::ump& mess) { diff --git a/include/libremidi/writer.cpp b/include/libremidi/writer.cpp index 7a078fcf..1d65b781 100644 --- a/include/libremidi/writer.cpp +++ b/include/libremidi/writer.cpp @@ -47,12 +47,12 @@ constexpr R bit_cast(const T& v) noexcept } } #endif -namespace libremidi +NAMESPACE_LIBREMIDI { namespace util { template -static LIBREMIDI_INLINE std::ostream& write_be(std::ostream& out, T value) +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION std::ostream& write_be(std::ostream& out, T value) { static_assert( std::endian::native == std::endian::big || std::endian::native == std::endian::little); @@ -77,7 +77,7 @@ static LIBREMIDI_INLINE std::ostream& write_be(std::ostream& out, T value) // Write a number to the midifile // as a variable length value which segments a file into 7-bit // values. Maximum size of aValue is 0x7fffffff -static LIBREMIDI_INLINE void write_variable_length(uint32_t aValue, std::vector& outdata) +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION void write_variable_length(uint32_t aValue, std::vector& outdata) { uint8_t bytes[5] = {0}; @@ -99,7 +99,7 @@ static LIBREMIDI_INLINE void write_variable_length(uint32_t aValue, std::vector< outdata.push_back(bytes[4]); } -static LIBREMIDI_INLINE void +LIBREMIDI_STATIC_INLINE_IMPLEMENTATION void add_event_track_count_check(std::vector& tracks, int track) { if (track < 0) diff --git a/include/libremidi/writer.hpp b/include/libremidi/writer.hpp index 489df861..348ce869 100644 --- a/include/libremidi/writer.hpp +++ b/include/libremidi/writer.hpp @@ -30,7 +30,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -namespace libremidi +NAMESPACE_LIBREMIDI { struct LIBREMIDI_EXPORT writer { diff --git a/src/libremidi.ixx b/src/libremidi.ixx new file mode 100644 index 00000000..c42bf4ca --- /dev/null +++ b/src/libremidi.ixx @@ -0,0 +1,248 @@ +module; +// Platform config +#if defined(_WIN32) +#define NOMINMAX 1 +#define WIN32_LEAN_AND_MEAN 1 +#endif + +#if __has_include() && !defined(LIBREMIDI_NO_BOOST) + #if LIBREMIDI_SLIM_MESSAGE > 0 + #include + #else + #include + #endif +#endif + +// Platform headers +#if defined(LIBREMIDI_ALSA) + #include + + #if __has_include() + #include + #endif +#endif + +#if defined(LIBREMIDI_ANDROID) + #include + #include + #include +#endif + +#if defined(LIBREMIDI_COREMIDI) + #include + #include + #include + #include + + #if TARGET_OS_IPHONE + #include + #endif +#endif + +#if defined(LIBREMIDI_EMSCRIPTEN) + #include +#endif + +#if __has_include() + #include +#elif __has_include() + #include +#elif __has_include() + #include + #include + #include +#endif + +#if defined(LIBREMIDI_NETWORK) + #include + #include + #include + #include + #include + #include +#endif + +#if defined(LIBREMIDI_PIPEWIRE) + #include + #include + + #include + #include + #include + #include + #include + #if __has_include() + #include + #endif +#endif + +#if defined(_WIN32) + #include + #include + #include + #if defined(LIBREMIDI_WINMM) + #include + #endif + + #if defined(LIBREMIDI_WINUWP) + #include + #include + #include + #include + #include + #endif + + #if defined(LIBREMIDI_WINMIDI) + #include + #include + #include + #endif +#endif + +#if !defined(_WIN32) + #include + #include + #include + #include + + #if __has_include() + #include + #endif + + #if __has_include() + #include + #endif + + #if __has_include() + #include + #endif +#endif + + +#if LIBREMIDI_NI_MIDI2_COMPAT + #include + #include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if __has_include() && (__cpp_lib_source_location >= 201907L) +#include +#endif + +#include +#include + +#if __has_include() && __cpp_lib_jthread >= 201911L +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +// External includes +export module libremidi; + +#define LIBREMIDI_MODULE_BUILD 1 +// #define LIBREMIDI_HEADER_ONLY 1 + +// Internal libremidi headers + +#include + +#undef LIBREMIDI_STATIC +#undef LIBREMIDI_STATIC_IMPLEMENTATION +#undef LIBREMIDI_STATIC_INLINE_IMPLEMENTATION +#undef LIBREMIDI_INLINE_IMPLEMENTATION +#undef LIBREMIDI_ANONYMOUS_NAMESPACE +#undef LIBREMIDI_INLINE +#define LIBREMIDI_STATIC +#define LIBREMIDI_STATIC_IMPLEMENTATION +#define LIBREMIDI_STATIC_INLINE_IMPLEMENTATION +#define LIBREMIDI_INLINE_IMPLEMENTATION +#define LIBREMIDI_ANONYMOUS_NAMESPACE detail +#define LIBREMIDI_INLINE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__clang__) || defined(_MSC_VER) +module :private; +#endif + +#undef NAMESPACE_LIBREMIDI +#define NAMESPACE_LIBREMIDI namespace libremidi +#include +#include +#include +#include +#include +#include +// #include