working on win32 uwp! and libremidi update

This commit is contained in:
Sebastian @ HfG
2024-10-28 19:24:18 +01:00
parent 06cb6d8319
commit 1e3755148c
106 changed files with 8474 additions and 2198 deletions
+35 -52
View File
@@ -22,20 +22,17 @@ public:
explicit midi_in_winmm(input_configuration&& conf, winmm_input_configuration&& apiconf)
: configuration{std::move(conf), std::move(apiconf)}
{
// We'll issue a warning here if no devices are available but not
// throw an error since the user can plugin something later.
if (midiInGetNumDevs() == 0)
{
warning(
configuration, "midi_in_winmm::initialize: no MIDI input devices currently available.");
}
if (!InitializeCriticalSectionAndSpinCount(&(this->_mutex), 0x00000400))
{
warning(
libremidi_handle_error(
configuration,
"midi_in_winmm::initialize: InitializeCriticalSectionAndSpinCount failed.");
"InitializeCriticalSectionAndSpinCount failed.");
this->client_open_ = std::errc::too_many_files_open;
return;
}
this->client_open_ = stdx::error{};
}
~midi_in_winmm() override
@@ -43,35 +40,22 @@ public:
// Close a connection if it exists.
midi_in_winmm::close_port();
DeleteCriticalSection(&(this->_mutex));
}
bool open_virtual_port(std::string_view) override
{
warning(configuration, "midi_in_winmm: open_virtual_port unsupported");
return false;
}
void set_client_name(std::string_view) override
{
warning(configuration, "midi_in_winmm: set_client_name unsupported");
}
void set_port_name(std::string_view) override
{
warning(configuration, "midi_in_winmm: set_port_name unsupported");
if(this->client_open_ == stdx::error{})
DeleteCriticalSection(&(this->_mutex));
}
libremidi::API get_current_api() const noexcept override { return libremidi::API::WINDOWS_MM; }
bool do_open(unsigned int portNumber)
stdx::error do_open(std::size_t portNumber)
{
MMRESULT result = midiInOpen(
&this->inHandle, portNumber, std::bit_cast<DWORD_PTR>(&midiInputCallback),
std::bit_cast<DWORD_PTR>(this), CALLBACK_FUNCTION);
if (result != MMSYSERR_NOERROR)
{
error<driver_error>(
configuration, "midi_in_winmm::open_port: error creating Windows MM MIDI input port.");
return false;
libremidi_handle_error(
configuration, "error creating Windows MM MIDI input port.");
return from_mmerr(result);
}
// Allocate and init the sysex buffers.
@@ -90,11 +74,11 @@ public:
{
midiInClose(this->inHandle);
this->inHandle = nullptr;
error<driver_error>(
libremidi_handle_error(
configuration,
"midi_in_winmm::open_port: error starting Windows MM MIDI input port "
"error starting Windows MM MIDI input port "
"(PrepareHeader).");
return false;
return from_mmerr(result);
}
// Register the buffer.
@@ -103,11 +87,11 @@ public:
{
midiInClose(this->inHandle);
this->inHandle = nullptr;
error<driver_error>(
libremidi_handle_error(
configuration,
"midi_in_winmm::open_port: error starting Windows MM MIDI input port "
"error starting Windows MM MIDI input port "
"(AddBuffer).");
return false;
return from_mmerr(result);
}
}
@@ -117,15 +101,15 @@ public:
{
midiInClose(this->inHandle);
this->inHandle = nullptr;
error<driver_error>(
configuration, "midi_in_winmm::open_port: error starting Windows MM MIDI input port.");
return false;
libremidi_handle_error(
configuration, "error starting Windows MM MIDI input port.");
return from_mmerr(result);
}
return true;
return stdx::error{};
}
bool open_port(const input_port& p, std::string_view) override
stdx::error open_port(const input_port& p, std::string_view) override
{
observer_winmm obs{{}, winmm_observer_configuration{}};
auto ports = obs.get_input_ports();
@@ -142,12 +126,12 @@ public:
if (p.port_name == port.port_name)
return do_open(port.port);
}
error<invalid_parameter_error>(
configuration, "midi_in_winmm::open_port: port not found: " + p.port_name);
return false;
libremidi_handle_error(
configuration, "port not found: " + p.port_name);
return std::errc::invalid_argument;
}
void close_port() override
stdx::error close_port() override
{
if (connected_)
{
@@ -170,9 +154,9 @@ public:
if (res != MMSYSERR_NOERROR)
{
warning(
libremidi_handle_warning(
configuration,
"midi_in_winmm::open_port: error closing Windows MM MIDI input "
"error closing Windows MM MIDI input "
"port (midiInUnprepareHeader).");
continue;
}
@@ -187,6 +171,7 @@ public:
this->inHandle = nullptr;
LeaveCriticalSection(&(this->_mutex));
}
return stdx::error{};
}
private:
@@ -255,8 +240,7 @@ private:
const auto* sysex = reinterpret_cast<MIDIHDR*>(midiMessage);
if(inputStatus == MIM_LONGERROR)
{
self.m_processing.message.bytes.clear();
self.m_processing.state = self.m_processing.main;
self.m_processing.reset();
}
else if (!self.configuration.ignore_sysex)
{
@@ -286,10 +270,9 @@ private:
LeaveCriticalSection(&(self._mutex));
if (result != MMSYSERR_NOERROR)
{
#if defined(__LIBREMIDI_DEBUG__)
std::cerr << "\nmidi_in::midiInputCallback: error sending sysex to "
"Midi device!!\n\n";
#endif
LIBREMIDI_LOG(
"error sending sysex to "
"Midi device!!");
}
}
}