19 halp_meta(name,
"Buffer queue")
20 halp_meta(author,
"ossia team")
21 halp_meta(category,
"Control/Data Processing")
22 halp_meta(description,
"Queue input messages and output them as a buffer")
23 halp_meta(c_name,
"avnd_buffer_queue")
24 halp_meta(uuid,
"8f68b81e-e5ba-4a10-a888-6581a5d770fe")
25 halp_meta(manual_url,
"https://ossia.io/score-docs/processes/buffer-queue.html")
54 halp::val_port<
"Input", std::optional<ossia::value>> input;
55 struct : halp::spinbox_i32<
"Max length", halp::range{0, 100000, 100}>
57 void update(
Queue& self)
61 self.buffer.set_capacity(this->value);
66 halp::maintained_button<
"Clear"> clear;
67 halp::maintained_button<
"Lock"> lock;
68 struct : halp::combobox_t<
"Mode", OutputMode>
72 std::string_view values[8]{
77 "On input, when full",
78 "On change, when full",
80 "On bang, pop oldest"};
81 OutputMode init{EveryTick};
84 struct : halp::combobox_t<
"Data", OutputData>
88 std::string_view values[3]{
"Oldest",
"Newest",
"Whole buffer"};
89 OutputData init{Oldest};
93 struct : halp::impulse_button<
"Bang">
95 void update(
Queue& self) { self.banged =
true; }
99 halp::toggle<
"Pop"> pop;
104 halp::val_port<
"Output", std::optional<ossia::value>> output;
107 boost::circular_buffer<ossia::value> buffer;
110 bool triggered(
bool received,
bool changed)
const noexcept
112 const bool full = buffer.full();
115 case OutputMode::EveryTick:
117 case OutputMode::OnInput:
119 case OutputMode::OnChange:
121 case OutputMode::WhenFull:
123 case OutputMode::OnInputWhenFull:
124 return received && full;
125 case OutputMode::OnChangeWhenFull:
126 return changed && full;
127 case OutputMode::OnBang:
128 case OutputMode::OnBangPopOldest:
138 if(inputs.data == OutputData::WholeBuffer)
139 outputs.output.value = std::vector<ossia::value>{};
141 outputs.output.value = ossia::value{};
147 case OutputData::Oldest:
148 outputs.output.value = buffer.front();
149 if(inputs.pop || inputs.mode == OutputMode::OnBangPopOldest)
152 case OutputData::WholeBuffer:
153 outputs.output.value = std::vector<ossia::value>(buffer.begin(), buffer.end());
156 else if(inputs.mode == OutputMode::OnBangPopOldest)
159 case OutputData::Newest:
160 outputs.output.value = buffer.back();
163 else if(inputs.mode == OutputMode::OnBangPopOldest)
171 const bool bang = std::exchange(banged,
false);
172 outputs.output.value.reset();
174 const bool received = bool(inputs.input.value);
175 bool changed =
false;
178 if(!inputs.lock && !inputs.clear && buffer.capacity() > 0)
180 buffer.push_back(std::move(*inputs.input.value));
183 inputs.input.value.reset();
186 if(inputs.clear && !buffer.empty())
192 if(bang || triggered(received, changed))