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")
39 halp::val_port<
"Input", ossia::value> input;
40 struct : halp::spinbox_i32<
"Max length", halp::range{0, 100000, 100}>
42 void update(
Queue& self)
46 self.buffer.set_capacity(this->value);
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;
58 halp::val_port<
"Output", ossia::value> output;
61 boost::circular_buffer<ossia::value> buffer;
65 if(inputs.input.value.valid())
67 if(!inputs.lock && !inputs.clear)
68 buffer.push_back(std::move(inputs.input.value));
74 if(inputs.mode == OutputMode::WhenFull)
76 if(buffer.size() < buffer.capacity())
79 else if(inputs.mode == OutputMode::ManualBang)
81 if(!inputs.bang.value)
84 else if(inputs.mode == OutputMode::ManualPop)
86 if(!inputs.bang.value)
92 if(inputs.data == OutputData::WholeBuffer)
94 outputs.output.value = std::vector<ossia::value>{};
98 outputs.output.value = ossia::value{};
105 case OutputData::SingleValue:
106 outputs.output.value = buffer.front();
108 case OutputData::WholeBuffer: {
109 outputs.output.value = std::vector<ossia::value>(buffer.begin(), buffer.end());
114 if(inputs.mode == OutputMode::ManualPop)