Loading...
Searching...
No Matches
Queue.hpp
1#pragma once
2#include <ossia/network/value/value.hpp>
3
4#include <boost/circular_buffer.hpp>
5
6#include <halp/controls.hpp>
7#include <halp/meta.hpp>
8#include <halp/value_types.hpp>
9
10#include <optional>
11
12namespace avnd_tools
13{
14
15struct Queue
16{
17 halp_meta(name, "Buffer queue")
18 halp_meta(author, "ossia team")
19 halp_meta(category, "Control/Data processing")
20 halp_meta(description, "Queue input messages and output them as a buffer")
21 halp_meta(c_name, "avnd_buffer_queue")
22 halp_meta(uuid, "8f68b81e-e5ba-4a10-a888-6581a5d770fe")
23 halp_meta(manual_url, "https://ossia.io/score-docs/processes/buffer-queue.html")
24
25 enum OutputMode
26 {
27 Always,
28 WhenFull,
29 ManualBang,
30 ManualPop,
31 };
32 enum OutputData
33 {
34 SingleValue,
35 WholeBuffer
36 };
37 struct
38 {
39 halp::val_port<"Input", ossia::value> input;
40 struct : halp::spinbox_i32<"Max length", halp::range{0, 100000, 100}>
41 {
42 void update(Queue& self)
43 {
44 if(this->value < 0)
45 return;
46 self.buffer.set_capacity(this->value);
47 }
48 } length;
49 halp::maintained_button<"Clear"> clear;
50 halp::maintained_button<"Lock"> lock;
51 halp::enum_t<OutputMode, "Mode"> mode;
52 halp::enum_t<OutputData, "Data"> data;
53 halp::val_port<"Bang", std::optional<halp::impulse>> bang;
54 } inputs;
55
56 struct
57 {
58 halp::val_port<"Output", ossia::value> output;
59 } outputs;
60
61 boost::circular_buffer<ossia::value> buffer;
62
63 void operator()()
64 {
65 if(inputs.input.value.valid())
66 {
67 if(!inputs.lock && !inputs.clear)
68 buffer.push_back(std::move(inputs.input.value));
69 }
70
71 if(inputs.clear)
72 buffer.clear();
73
74 if(inputs.mode == OutputMode::WhenFull)
75 {
76 if(buffer.size() < buffer.capacity())
77 return;
78 }
79 else if(inputs.mode == OutputMode::ManualBang)
80 {
81 if(!inputs.bang.value)
82 return;
83 }
84 else if(inputs.mode == OutputMode::ManualPop)
85 {
86 if(!inputs.bang.value)
87 return;
88 }
89
90 if(buffer.empty())
91 {
92 if(inputs.data == OutputData::WholeBuffer)
93 {
94 outputs.output.value = std::vector<ossia::value>{};
95 }
96 else
97 {
98 outputs.output.value = ossia::value{};
99 }
100 return;
101 }
102
103 switch(inputs.data)
104 {
105 case OutputData::SingleValue:
106 outputs.output.value = buffer.front();
107 break;
108 case OutputData::WholeBuffer: {
109 outputs.output.value = std::vector<ossia::value>(buffer.begin(), buffer.end());
110 break;
111 }
112 }
113
114 if(inputs.mode == OutputMode::ManualPop)
115 {
116 buffer.pop_front();
117 }
118 }
119};
120}
Definition Queue.hpp:16