Loading...
Searching...
No Matches
CPUNode.hpp
1#pragma once
2
3#include <JS/Executor/JSAPIWrapper.hpp>
4#include <JS/Qml/Metatypes.hpp>
5#include <JS/Qml/QmlObjects.hpp>
6#include <JS/Qml/ValueTypes.Qt6.hpp>
7
8#include <ossia/dataflow/graph/graph_interface.hpp>
9#include <ossia/dataflow/graph_edge.hpp>
10#include <ossia/dataflow/graph_edge_helpers.hpp>
11#include <ossia/dataflow/graph_node.hpp>
12#include <ossia/dataflow/node_process.hpp>
13#include <ossia/dataflow/port.hpp>
14#include <ossia/detail/logger.hpp>
15#include <ossia/detail/ssize.hpp>
16#include <ossia/editor/scenario/time_interval.hpp>
17#include <ossia/editor/state/message.hpp>
18#include <ossia/editor/state/state.hpp>
19
20#include <ossia-qt/invoke.hpp>
21#include <ossia-qt/js_utilities.hpp>
22#include <ossia-qt/time.hpp>
23#include <ossia-qt/token_request.hpp>
24namespace ossia::qt
25{
26class qml_engine_functions;
27}
28
29namespace JS
30{
31class js_node final : public ossia::graph_node
32{
33public:
34 explicit js_node(ossia::execution_state& st);
35 ~js_node();
36
37 [[nodiscard]] std::string label() const noexcept override { return "javascript"; }
38
39 void run(const ossia::token_request& t, ossia::exec_state_facade) noexcept override;
40 void clear() noexcept override;
41 void setupComponent();
42 void setScript(const QString& val);
43
44 ossia::execution_state& m_st;
45
46 QQmlEngine* m_engine{};
47 std::vector<Inlet*> m_jsInlets;
48 std::vector<std::pair<ControlInlet*, ossia::inlet_ptr>> m_ctrlInlets;
49 std::vector<std::pair<Impulse*, ossia::inlet_ptr>> m_impulseInlets;
50 std::vector<std::pair<ValueInlet*, ossia::inlet_ptr>> m_valInlets;
51 std::vector<std::pair<ValueOutlet*, ossia::outlet_ptr>> m_valOutlets;
52 std::vector<std::pair<AudioInlet*, ossia::inlet_ptr>> m_audInlets;
53 std::vector<std::pair<AudioOutlet*, ossia::outlet_ptr>> m_audOutlets;
54 std::vector<std::pair<MidiInlet*, ossia::inlet_ptr>> m_midInlets;
55 std::vector<std::pair<MidiOutlet*, ossia::outlet_ptr>> m_midOutlets;
56 JS::Script* m_object{};
57 ossia::qt::qml_engine_functions* m_execFuncs{};
58 QJSValueList m_tickCall;
59 std::size_t m_gcIndex{};
60
61 bool triggerStart{};
62 bool triggerStop{};
63 bool triggerPause{};
64 bool triggerResume{};
65
66 void setControl(std::size_t index, const QVariant& val)
67 {
68 if(index > m_jsInlets.size())
69 return;
70 if(auto v = qobject_cast<ValueInlet*>(m_jsInlets[index]))
71 v->setValue(val);
72 else if(auto v = qobject_cast<ControlInlet*>(m_jsInlets[index]))
73 v->setValue(val);
74 }
75 void impulse(std::size_t index)
76 {
77 if(index > m_jsInlets.size())
78 return;
79 if(auto v = qobject_cast<Impulse*>(m_jsInlets[index]))
80 v->impulse();
81 }
82};
83
84struct js_process final : public ossia::node_process
85{
86 using node_process::node_process;
87 js_node& js() const { return static_cast<js_node&>(*node); }
88 void start() override { js().triggerStart = true; }
89 void stop() override { js().triggerStop = true; }
90 void pause() override { js().triggerPause = true; }
91 void resume() override { js().triggerResume = true; }
92 void transport_impl(ossia::time_value date) override
93 {
94 QMetaObject::invokeMethod(
95 js().m_object, "transport", Qt::DirectConnection,
96 Q_ARG(QVariant, double(date.impl)));
97 }
98 void offset_impl(ossia::time_value date) override
99 {
100 QMetaObject::invokeMethod(
101 js().m_object, "offset", Qt::DirectConnection,
102 Q_ARG(QVariant, double(date.impl)));
103 }
104};
105
106}
Definition QmlObjects.hpp:613
Definition CPUNode.hpp:32
Definition CPUNode.hpp:85