OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
direct_policy.hpp
1#pragma once
2#include <ossia/detail/config.hpp>
3#include <ossia/detail/thread.hpp>
4#if !defined(OSSIA_FREESTANDING)
5#include <ossia/dataflow/execution/execution_policy.hpp>
6#include <ossia/detail/lockfree_queue.hpp>
7#include <ossia/network/base/bundle.hpp>
8
9#include <blockingconcurrentqueue.h>
10
11#include <thread>
12
13namespace ossia
14{
15// If we do not use the local state, we can use this policy instead
16struct direct_execution_state_policy : execution_state_policy
17{
18 direct_execution_state_policy();
19 ~direct_execution_state_policy();
20
21 void commit() override;
22
23 void clear_local_state() override;
24
25 bool find_and_copy(net::parameter_base& addr, inlet& in) override;
26 bool in_local_scope(net::parameter_base& other) const override;
27
28 void insert(ossia::net::parameter_base& dest, const ossia::value_port& v) override;
29 void insert(ossia::audio_parameter& dest, const audio_port& v) override;
30 void insert(ossia::net::midi::midi_parameter& dest, const midi_port& v) override;
31
32 void process_messages();
33 void process_midi();
34
35 struct T : moodycamel::ConcurrentQueueDefaultTraits
36 {
37 static constexpr std::size_t CQ_BLOCK_SIZE = 2048;
38 };
39
40 moodycamel::BlockingConcurrentQueue<ossia::bundle_element, T> m_messagesToApply;
41
42 static constexpr int max_threads = 16;
43 struct net_thread
44 {
45 ossia::thread thread;
46 } m_threads[max_threads];
47
48 ossia::thread m_midiThread;
49
50 std::atomic_bool m_startFlag{};
51 std::atomic_bool m_stopFlag{};
52
53 struct audio_msg
54 {
55 const ossia::audio_port* src{};
56 ossia::audio_parameter* dst{};
57 };
58 ossia::mpmc_queue<audio_msg> m_audioQueue;
59
60 struct midi_msg
61 {
62 const ossia::midi_port* src{};
63 ossia::net::midi::midi_parameter* dst{};
64 };
65 ossia::mpmc_queue<midi_msg> m_midiQueue;
66};
67}
68#endif
Definition git_info.h:7