working on win32 uwp! and libremidi update
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include <libremidi/cmidi2.hpp>
|
||||
#include <libremidi/detail/conversion.hpp>
|
||||
#include <libremidi/detail/midi_api.hpp>
|
||||
#include <libremidi/error_handler.hpp>
|
||||
#include <libremidi/output_configuration.hpp>
|
||||
|
||||
#include <string_view>
|
||||
@@ -18,19 +19,21 @@ public:
|
||||
midi_out_api& operator=(const midi_out_api&) = delete;
|
||||
midi_out_api& operator=(midi_out_api&&) = delete;
|
||||
|
||||
[[nodiscard]] virtual bool open_port(const output_port& pt, std::string_view local_port_name)
|
||||
[[nodiscard]] virtual stdx::error
|
||||
open_port(const output_port& pt, std::string_view local_port_name)
|
||||
= 0;
|
||||
|
||||
[[nodiscard]] virtual int64_t current_time() const noexcept { return 0; }
|
||||
|
||||
virtual void send_message(const unsigned char* message, std::size_t size) = 0;
|
||||
virtual void schedule_message(int64_t /*ts*/, const unsigned char* message, std::size_t size)
|
||||
virtual stdx::error send_message(const unsigned char* message, std::size_t size) = 0;
|
||||
virtual stdx::error
|
||||
schedule_message(int64_t /*ts*/, const unsigned char* message, std::size_t size)
|
||||
{
|
||||
return send_message(message, size);
|
||||
}
|
||||
|
||||
virtual void send_ump(const uint32_t* message, std::size_t size) = 0;
|
||||
virtual void schedule_ump(int64_t /*ts*/, const uint32_t* ump, std::size_t size)
|
||||
virtual stdx::error send_ump(const uint32_t* message, std::size_t size) = 0;
|
||||
virtual stdx::error schedule_ump(int64_t /*ts*/, const uint32_t* ump, std::size_t size)
|
||||
{
|
||||
return send_ump(ump, size);
|
||||
}
|
||||
@@ -45,14 +48,15 @@ class out_api : public midi_out_api
|
||||
public:
|
||||
using midi_out_api::midi_out_api;
|
||||
|
||||
void send_ump(const uint32_t* message, std::size_t /*size*/)
|
||||
stdx::error send_ump(const uint32_t* message, std::size_t size)
|
||||
{
|
||||
uint8_t midi[65536];
|
||||
const auto n
|
||||
= cmidi2_convert_single_ump_to_midi1(midi, sizeof(midi), const_cast<uint32_t*>(message));
|
||||
if (n > 0)
|
||||
send_message(midi, n);
|
||||
return converter.convert(
|
||||
message, size, 0, [this](const unsigned char* midi, std::size_t n, int64_t /* ts */) {
|
||||
return send_message(midi, n);
|
||||
});
|
||||
}
|
||||
|
||||
midi2_to_midi1 converter;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -65,25 +69,15 @@ class out_api : public midi_out_api
|
||||
public:
|
||||
using midi_out_api::midi_out_api;
|
||||
|
||||
void send_message(const unsigned char* message, std::size_t size)
|
||||
stdx::error send_message(const unsigned char* message, std::size_t size)
|
||||
{
|
||||
cmidi2_midi_conversion_context context{};
|
||||
cmidi2_midi_conversion_context_initialize(&context);
|
||||
|
||||
uint32_t ump[65536 / 4];
|
||||
|
||||
context.midi1 = const_cast<unsigned char*>(message);
|
||||
context.midi1_num_bytes = size;
|
||||
context.midi1_proceeded_bytes = 0;
|
||||
context.ump = ump;
|
||||
context.ump_num_bytes = sizeof(ump);
|
||||
context.ump_proceeded_bytes = 0;
|
||||
|
||||
if (auto res = cmidi2_convert_midi1_to_ump(&context); res != CMIDI2_CONVERSION_RESULT_OK)
|
||||
return;
|
||||
|
||||
send_ump(context.ump, context.ump_proceeded_bytes / 4);
|
||||
return converter.convert(
|
||||
message, size, 0, [this](const uint32_t* ump, std::size_t count, int64_t /* ts */) {
|
||||
return send_ump(ump, count);
|
||||
});
|
||||
}
|
||||
|
||||
midi1_to_midi2 converter;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user