2 #include <ossia/detail/lockfree_queue.hpp>
3 #include <ossia/network/base/device.hpp>
4 #include <ossia/network/base/parameter.hpp>
5 #include <ossia/network/base/protocol.hpp>
6 #include <ossia/network/common/parameter_properties.hpp>
7 #include <ossia/network/context_functions.hpp>
8 #include <ossia/network/domain/domain.hpp>
9 #include <ossia/network/value/value.hpp>
10 #include <ossia/protocols/midi/detail/channel.hpp>
12 #include <libremidi/api.hpp>
13 #include <libremidi/message.hpp>
14 #include <libremidi/observer_configuration.hpp>
24 struct input_configuration;
25 struct output_configuration;
28 namespace ossia::net::midi
31 struct OSSIA_EXPORT midi_info
39 midi_info() =
default;
40 midi_info(
const libremidi::input_port& p,
bool v)
46 midi_info(
const libremidi::output_port& p,
bool v)
53 midi_info(Type t,
const libremidi::port_information& p,
bool v)
61 libremidi::port_information handle{};
65 class OSSIA_EXPORT midi_protocol final
67 ,
public Nano::Observer
70 explicit midi_protocol(
71 ossia::net::network_context_ptr, std::string device_name,
72 libremidi::input_configuration&, std::any midi_api);
73 explicit midi_protocol(
74 ossia::net::network_context_ptr, std::string device_name,
75 libremidi::output_configuration&, std::any midi_api);
76 explicit midi_protocol(
77 ossia::net::network_context_ptr, midi_info,
78 libremidi::API api = libremidi::API::UNSPECIFIED);
81 bool set_info(midi_info);
82 midi_info get_info()
const;
84 int64_t get_timestamp() const noexcept;
87 get_midi_port_name(
ossia::net::device_base* dev, const midi_info& info);
89 static std::vector<midi_info> scan(libremidi::API = libremidi::API::UNSPECIFIED);
91 void push_value(const libremidi::message&);
93 void enable_registration();
95 bool learning() const;
96 void set_learning(
bool);
98 libremidi::midi_in* midi_in() const noexcept {
return m_input.get(); }
100 ossia::spsc_queue<libremidi::message> messages;
103 ossia::net::network_context_ptr m_context;
104 std::unique_ptr<libremidi::midi_in> m_input;
105 std::unique_ptr<libremidi::midi_out> m_output;
107 std::array<midi_channel, 16> m_channels;
110 midi_device* m_dev{};
112 std::atomic_bool m_learning{};
114 friend class midi_device;
115 friend class midi_parameter;
123 void register_parameter(midi_parameter& adrs);
124 void unregister_parameter(midi_parameter& adrs);
132 void midi_callback(
const libremidi::message&);
133 void on_learn(
const libremidi::message& m);
Root of a device tree.
Definition: ossia/network/base/device.hpp:58
The node_base class.
Definition: network/base/node.hpp:48
The parameter_base class.
Definition: ossia/network/base/parameter.hpp:48
The protocol_base class.
Definition: protocol.hpp:40
The value class.
Definition: value.hpp:173
void(* value_callback)(void *, const opp::value &)
container for a value callback
Definition: ossia-cpp98.hpp:474
Full information about a parameter.
Definition: parameter_data.hpp:61