Loading...
Searching...
No Matches
PortTap.hpp
1#pragma once
2#include <Process/Dataflow/PortType.hpp>
3#include <Process/ExecutionAction.hpp>
4#include <Process/Monitoring/EventRing.hpp>
5#include <Process/Monitoring/Monitor.hpp>
6#include <Process/Monitoring/SampleRing.hpp>
7
8#include <ossia/dataflow/dataflow_fwd.hpp>
9#include <ossia/detail/lockfree_queue.hpp>
10#include <ossia/network/dataspace/dataspace.hpp>
11#include <ossia/network/value/value.hpp>
12
13#include <score_lib_process_export.h>
14
15#include <atomic>
16#include <memory>
17#include <vector>
18
19namespace Process
20{
21class Port;
22}
23namespace Execution
24{
25struct Context;
26struct ExecutionCommandQueue;
27struct GCCommandQueue;
28
30struct SCORE_LIB_PROCESS_EXPORT TapMonitor final : Process::Monitor
31{
32 explicit TapMonitor(Process::PortType t);
33 ~TapMonitor() override;
34
35 const Process::PortType type;
36
38 Process::SampleRing samples{1 << 15};
39
41 struct Midi
42 {
43 uint8_t bytes[3]{};
44 uint8_t size{};
45 };
47
49 ossia::spsc_queue<ossia::value> values{128};
51 ossia::unit_t unit;
52};
53
67class SCORE_LIB_PROCESS_EXPORT PortTap
68{
69public:
70 PortTap(const Process::Port& port, const Execution::Context& ctx);
71 ~PortTap();
72 PortTap(const PortTap&) = delete;
73 PortTap& operator=(const PortTap&) = delete;
74
77 TapMonitor* monitor() const noexcept;
78
79private:
80 // Not the context: it ends with playback, which the tap may outlive.
81 std::weak_ptr<const Execution::Context> m_context;
82 std::weak_ptr<ExecutionCommandQueue> m_queue;
83 std::weak_ptr<GCCommandQueue> m_gc;
84 std::weak_ptr<ossia::graph_interface> m_graph;
85 std::weak_ptr<ossia::execution_state> m_state;
86 std::shared_ptr<TapMonitor> m_monitor;
87 std::shared_ptr<ossia::graph_node> m_node;
88 std::vector<ossia::edge_ptr> m_edges;
89};
90
100class SCORE_LIB_PROCESS_EXPORT TapTicker final : public ExecutionAction
101{
102 SCORE_CONCRETE("0b7a5c1e-6f2d-4c9b-9a3e-5d8e2f71c4a6")
103public:
104 TapTicker();
105 ~TapTicker() override;
106 static TapTicker* instance() noexcept;
107
108 void startTick(const ossia::audio_tick_state& st) override;
109
111 void add(std::shared_ptr<ossia::graph_node> node);
112 void remove(const ossia::graph_node* node);
113
114private:
115 using node_list = std::vector<std::shared_ptr<ossia::graph_node>>;
116 void publish();
117 void collect();
118
119 std::atomic<const node_list*> m_current{};
121 std::atomic<uint64_t> m_ticks{};
122
123 // GUI thread
124 node_list m_nodes;
125 std::unique_ptr<const node_list> m_published;
126 struct retired
127 {
128 std::unique_ptr<const node_list> list;
129 uint64_t ticks{};
130 };
131 std::vector<retired> m_retired;
132};
133}
Definition ExecutionAction.hpp:12
Definition PortTap.hpp:68
Definition PortTap.hpp:101
Definition EventRing.hpp:27
Definition Port.hpp:106
Definition SampleRing.hpp:35
Components used for the execution of a score.
Definition PortTap.cpp:24
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
Definition ExecutionContext.hpp:208
MIDI, as MIDI 1 bytes.
Definition PortTap.hpp:42
What a tap saw pass through a port, for a probe to show.
Definition PortTap.hpp:31
ossia::unit_t unit
What the values are in: what the port declares, else its address.
Definition PortTap.hpp:51
Definition Monitor.hpp:27