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
+66 -57
View File
@@ -2,6 +2,7 @@
#include <libremidi/backends/linux/helpers.hpp>
#include <libremidi/backends/linux/pipewire.hpp>
#include <libremidi/backends/pipewire/config.hpp>
#include <libremidi/backends/pipewire/context.hpp>
#include <libremidi/detail/memory.hpp>
#include <libremidi/detail/midi_in.hpp>
@@ -55,10 +56,10 @@ struct pipewire_helpers
}
template <typename Self>
void create_filter(Self& self)
stdx::error create_filter(Self& self)
{
if (this->filter)
return;
return stdx::error{};
auto& configuration = self.configuration;
if (configuration.context && configuration.filter && configuration.set_process_func)
@@ -90,8 +91,9 @@ struct pipewire_helpers
#pragma GCC diagnostic pop
this->filter->create_filter(self.configuration.client_name, filter_events, &self);
this->filter->start_filter();
return this->filter->start_filter();
}
return stdx::error{};
}
template <typename Self>
@@ -117,10 +119,10 @@ struct pipewire_helpers
}
template <typename Self>
int create_context(Self& self)
stdx::error create_context(Self& self)
{
if (this->global_context)
return 0;
return stdx::error{};
// Initialize PipeWire client
auto& configuration = self.configuration;
@@ -133,7 +135,10 @@ struct pipewire_helpers
this->global_instance = std::make_shared<pipewire_instance>();
this->global_context = std::make_shared<pipewire_context>(this->global_instance);
}
return 0;
if (!this->global_context->main_loop)
return std::errc::connection_refused;
return stdx::error{};
}
void destroy_context()
@@ -170,7 +175,9 @@ struct pipewire_helpers
{
int result = pw_loop_iterate(lp, 0);
if (result < 0)
std::cerr << "pw_loop_iterate: " << spa_strerror(result) << "\n";
{
LIBREMIDI_LOG(spa_strerror(result));
}
}
fds[0].revents = 0;
}
@@ -190,7 +197,7 @@ struct pipewire_helpers
}
template <typename Self>
bool create_local_port(Self& self, std::string_view portName, spa_direction direction)
stdx::error create_local_port(Self& self, std::string_view portName, spa_direction direction)
{
assert(this->global_context);
assert(this->filter);
@@ -200,15 +207,15 @@ struct pipewire_helpers
if (!this->filter->port)
{
this->filter->create_local_port(portName.data(), direction);
auto ret = this->filter->create_local_port(portName.data(), direction);
if (ret != stdx::error{})
{
self.libremidi_handle_error(self.configuration, "error creating port");
return ret;
}
}
if (!this->filter->port)
{
self.template error<driver_error>(self.configuration, "PipeWire: error creating port");
return false;
}
return true;
return stdx::error{};
}
void add_callbacks(const observer_configuration& conf)
@@ -293,12 +300,12 @@ struct pipewire_helpers
}
}
void do_close_port()
stdx::error do_close_port()
{
if (!this->filter)
return;
return stdx::error{};
if (!this->filter->port)
return;
return stdx::error{};
if (!this->global_context->owns_main_loop)
{
@@ -307,13 +314,19 @@ struct pipewire_helpers
}
unlink_ports();
this->filter->remove_port();
return this->filter->remove_port();
}
void rename_port(std::string_view port_name)
stdx::error rename_port(std::string_view port_name)
{
if (this->filter)
this->filter->rename_port(port_name);
{
return this->filter->rename_port(port_name);
}
else
{
return std::errc::not_connected;
}
}
void unlink_ports()
@@ -325,7 +338,7 @@ struct pipewire_helpers
}
}
bool link_ports(auto& self, const input_port& in_port)
stdx::error link_ports(auto& self, const input_port& in_port)
{
// Wait for the pipewire server to send us back our node's info
for (int i = 0; i < 1000; i++)
@@ -335,19 +348,13 @@ struct pipewire_helpers
auto& midi = this->global_context->current_graph.software_midi;
auto node_it = midi.find(this_node);
if (node_it == midi.end())
{
std::cerr << "Node " << this_node << " not found! \n";
return false;
}
return std::errc::invalid_argument;
// Wait for the pipewire server to send us back our node's ports
this->filter->synchronize_ports(node_it->second);
if (node_it->second.inputs.empty())
{
std::cerr << "Node " << this_node << " has no ports! \n";
return false;
}
return std::errc::no_link;
// Link ports
const auto& p = node_it->second.inputs.front();
@@ -355,16 +362,16 @@ struct pipewire_helpers
pw_loop_iterate(this->global_context->lp, 1);
if (!link)
{
self.template error<invalid_parameter_error>(
self.libremidi_handle_error(
self.configuration,
"PipeWire: could not connect to port: " + in_port.port_name + " -> " + p.port_name);
return false;
"could not connect to port: " + in_port.port_name + " -> " + p.port_name);
return std::errc::no_link;
}
return true;
return stdx::error{};
}
bool link_ports(auto& self, const output_port& out_port)
stdx::error link_ports(auto& self, const output_port& out_port)
{
// Wait for the pipewire server to send us back our node's info
for (int i = 0; i < 1000; i++)
@@ -375,8 +382,7 @@ struct pipewire_helpers
auto node_it = midi.find(this_node);
if (node_it == midi.end())
{
std::cerr << "Node " << this_node << " not found! \n";
return false;
return std::errc::invalid_argument;
}
// Wait for the pipewire server to send us back our node's ports
@@ -384,8 +390,7 @@ struct pipewire_helpers
if (node_it->second.outputs.empty())
{
std::cerr << "Node " << this_node << " has no ports! \n";
return false;
return std::errc::no_link;
}
// Link ports
@@ -394,13 +399,13 @@ struct pipewire_helpers
pw_loop_iterate(this->global_context->lp, 1);
if (!link)
{
self.template error<invalid_parameter_error>(
self.libremidi_handle_error(
self.configuration,
"PipeWire: could not connect to port: " + p.port_name + " -> " + out_port.port_name);
return false;
"could not connect to port: " + p.port_name + " -> " + out_port.port_name);
return std::errc::no_link;
}
return true;
return stdx::error{};
}
template <spa_direction Direction>
@@ -432,30 +437,34 @@ struct pipewire_helpers
// Note: keep in mind that an "input" port for us (e.g. a keyboard that goes to the computer)
// is an "output" port from the point of view of pipewire as data will come out of it
template <spa_direction Direction>
static auto get_ports(const pipewire_context& ctx) noexcept -> std::vector<
std::conditional_t<Direction == SPA_DIRECTION_OUTPUT, input_port, output_port>>
static auto get_ports(const observer_configuration& conf, const pipewire_context& ctx) noexcept
-> std::vector<
std::conditional_t<Direction == SPA_DIRECTION_OUTPUT, input_port, output_port>>
{
std::vector<std::conditional_t<Direction == SPA_DIRECTION_OUTPUT, input_port, output_port>>
ret;
{
std::lock_guard _{ctx.current_graph.mtx};
for (auto& node : ctx.current_graph.physical_midi)
{
for (auto& p :
(Direction == SPA_DIRECTION_INPUT ? node.second.inputs : node.second.outputs))
if (conf.track_any || conf.track_hardware)
for (auto& node : ctx.current_graph.physical_midi)
{
ret.push_back(to_port_info<Direction>(p));
for (auto& port :
(Direction == SPA_DIRECTION_INPUT ? node.second.inputs : node.second.outputs))
{
ret.push_back(to_port_info<Direction>(port));
}
}
}
for (auto& node : ctx.current_graph.software_midi)
{
for (auto& p :
(Direction == SPA_DIRECTION_INPUT ? node.second.inputs : node.second.outputs))
if (conf.track_any || conf.track_virtual)
for (auto& node : ctx.current_graph.software_midi)
{
ret.push_back(to_port_info<Direction>(p));
for (auto& port :
(Direction == SPA_DIRECTION_INPUT ? node.second.inputs : node.second.outputs))
{
ret.push_back(to_port_info<Direction>(port));
}
}
}
}
return ret;