working on win32 uwp! and libremidi update
This commit is contained in:
@@ -3,14 +3,9 @@
|
||||
#include <libremidi/config.hpp>
|
||||
#include <libremidi/detail/observer.hpp>
|
||||
|
||||
#include <chrono>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <optional>
|
||||
#include <span>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
|
||||
// Credits: greatly inspired from
|
||||
@@ -87,39 +82,16 @@ struct snd_ctl_wrapper
|
||||
struct enumerator
|
||||
{
|
||||
const libasound& snd = libasound::instance();
|
||||
const error_handler& handler;
|
||||
const observer_configuration& configuration;
|
||||
std::vector<alsa_raw_port_info> inputs;
|
||||
std::vector<alsa_raw_port_info> outputs;
|
||||
|
||||
std::function<void(std::string_view)> error_callback;
|
||||
std::function<void(std::string_view)> warn_callback;
|
||||
explicit enumerator(const auto& self)
|
||||
: handler{self}
|
||||
, configuration{self.configuration}
|
||||
{
|
||||
|
||||
template <typename... Args>
|
||||
void warning(Args&&... args)
|
||||
{
|
||||
std::string s;
|
||||
((s += args), ...);
|
||||
if (warn_callback)
|
||||
{
|
||||
warn_callback(std::move(s));
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cerr << s << std::endl;
|
||||
}
|
||||
}
|
||||
template <typename... Args>
|
||||
void error(Args&&... args)
|
||||
{
|
||||
std::string s;
|
||||
((s += args), ...);
|
||||
if (error_callback)
|
||||
{
|
||||
error_callback(std::move(s));
|
||||
}
|
||||
else
|
||||
{
|
||||
throw std::runtime_error(s.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
// 1: is an input / output
|
||||
@@ -141,9 +113,9 @@ struct enumerator
|
||||
}
|
||||
else if (status < 0 && status != -ENXIO)
|
||||
{
|
||||
error(
|
||||
"alsa_raw_helpers::enumerator::is: cannot get rawmidi information:", card, device, sub,
|
||||
snd.strerror(status));
|
||||
handler.libremidi_handle_error(
|
||||
configuration, "Cannot get rawmidi information: " + device_identifier(card, device, sub)
|
||||
+ " : " + snd.strerror(status));
|
||||
return status;
|
||||
}
|
||||
else
|
||||
@@ -185,26 +157,23 @@ struct enumerator
|
||||
return s;
|
||||
}
|
||||
|
||||
void enumerate_cards()
|
||||
stdx::error enumerate_cards()
|
||||
{
|
||||
using namespace std::literals;
|
||||
int card = -1;
|
||||
|
||||
int status = snd.card.next(&card);
|
||||
if (status < 0)
|
||||
{
|
||||
error(
|
||||
"alsa_raw_helpers::enumerator::enumerate_cards: "
|
||||
"cannot determine card number: ",
|
||||
snd.strerror(status));
|
||||
return;
|
||||
handler.libremidi_handle_error(
|
||||
configuration, "Cannot determine card number: "s + snd.strerror(status));
|
||||
return from_errc(status);
|
||||
}
|
||||
|
||||
if (card < 0)
|
||||
{
|
||||
error(
|
||||
"alsa_raw_helpers::enumerator::enumerate_cards: "
|
||||
"no sound cards found");
|
||||
return;
|
||||
handler.libremidi_handle_error(configuration, "No sound cards found");
|
||||
return std::errc::no_such_device;
|
||||
}
|
||||
|
||||
while (card >= 0)
|
||||
@@ -213,13 +182,12 @@ struct enumerator
|
||||
|
||||
if ((status = snd.card.next(&card)) < 0)
|
||||
{
|
||||
error(
|
||||
"alsa_raw_helpers::enumerator::enumerate_cards: "
|
||||
"cannot determine card number: ",
|
||||
snd.strerror(status));
|
||||
break;
|
||||
handler.libremidi_handle_error(
|
||||
configuration, "cannot determine card number: "s + snd.strerror(status));
|
||||
return std::errc::no_such_device;
|
||||
}
|
||||
}
|
||||
return stdx::error{};
|
||||
}
|
||||
|
||||
virtual void enumerate_devices(int card) = 0;
|
||||
@@ -228,20 +196,22 @@ struct enumerator
|
||||
inline snd_ctl_wrapper::snd_ctl_wrapper(enumerator& self, const char* name)
|
||||
: snd{self.snd}
|
||||
{
|
||||
using namespace std::literals;
|
||||
int status = snd.ctl.open(&ctl, name, 0);
|
||||
if (status < 0)
|
||||
{
|
||||
self.error(
|
||||
"alsa_raw_helpers::enumerator::snd_ctl_wrapper: "
|
||||
"cannot open control for card",
|
||||
name, snd.strerror(status));
|
||||
self.handler.libremidi_handle_error(
|
||||
self.configuration, "cannot open control for card"s + name + " : " + snd.strerror(status));
|
||||
}
|
||||
}
|
||||
|
||||
struct midi1_enumerator : enumerator
|
||||
{
|
||||
using alsa_raw::enumerator::enumerator;
|
||||
|
||||
void enumerate_devices(int card) override
|
||||
{
|
||||
using namespace std::literals;
|
||||
char name[128];
|
||||
|
||||
sprintf(name, "hw:%d", card);
|
||||
@@ -261,10 +231,8 @@ struct midi1_enumerator : enumerator
|
||||
|
||||
if (status < 0)
|
||||
{
|
||||
error(
|
||||
"alsa_raw::midi1_enumerator::enumerate_devices: "
|
||||
"cannot determine device number: ",
|
||||
snd.strerror(status));
|
||||
handler.libremidi_handle_error(
|
||||
configuration, "Cannot determine device number: "s + snd.strerror(status));
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user