1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2 
3 #ifndef SPECTMORPH_SYNTH_INTERFACE_HH
4 #define SPECTMORPH_SYNTH_INTERFACE_HH
5 
6 #include "smmidisynth.hh"
7 #include "smproject.hh"
8 namespace SpectMorph
9 {
10 
11 class SynthInterface
12 {
13   Project *m_project = nullptr;
14 public:
15   SynthInterface (Project *project)
16   {
17     m_project = project;
18   }
19   Project *
20   get_project()
21   {
22     return m_project;
23   }
24   template<class DATA>
25   void
26   send_control_event (const std::function<void(Project *)>& func, DATA *data = nullptr)
27   {
28     m_project->synth_take_control_event (new InstFunc (func, [data]() { delete data;}));
29   }
30   void
31   send_control_event (const std::function<void(Project *)>& func)
32   {
33     m_project->synth_take_control_event (new InstFunc (func, []() {}));
34   }
35   void
36   synth_inst_edit_update (bool active, WavSet *take_wav_set, WavSet *take_ref_wav_set)
37   {
38     /* ownership of take_wav_set is transferred to the event */
39     struct EventData
40     {
41       std::unique_ptr<WavSet> wav_set;
42       std::unique_ptr<WavSet> ref_wav_set;
43     } *event_data = new EventData;
44 
45     event_data->wav_set.reset (take_wav_set);
46     event_data->ref_wav_set.reset (take_ref_wav_set);
47 
48     send_control_event (
49       [=] (Project *project)
50         {
51           project->midi_synth()->set_inst_edit (active);
52 
53           if (active)
54             project->midi_synth()->inst_edit_synth()->take_wav_sets (event_data->wav_set.release(), event_data->ref_wav_set.release());
55         },
56       event_data);
57   }
58   void
59   synth_inst_edit_note (int note, bool on, unsigned int layer)
60   {
61     send_control_event (
62       [=] (Project *project)
63         {
64           unsigned char event[3];
65 
66           event[0] = on ? 0x90 : 0x80;
67           event[1] = note;
68           event[2] = on ? 100 : 0;
69 
70           project->midi_synth()->inst_edit_synth()->handle_midi_event (event, layer);
71         });
72   }
73   void
74   emit_update_plan (MorphPlanPtr new_plan)
75   {
76     /* ownership of plan is transferred to the event */
77     struct EventData
78     {
79       MorphPlanPtr plan;
80     } *event_data = new EventData;
81 
82     // FIXME: refptr is locking (which is not too good)
83     event_data->plan = new_plan;
84 
85     send_control_event (
86       [=] (Project *project)
87         {
88           project->midi_synth()->update_plan (event_data->plan);
89         },
90       event_data);
91   }
92   void
93   emit_update_gain (double gain)
94   {
95     send_control_event (
96       [=] (Project *project)
97         {
98           project->midi_synth()->set_gain (gain);
99         });
100   }
101   void
102   emit_add_rebuild_result (int object_id, WavSet *take_wav_set)
103   {
104     /* ownership of take_wav_set is transferred to the event */
105     struct EventData
106     {
107       std::unique_ptr<WavSet> wav_set;
108     } *event_data = new EventData;
109 
110     event_data->wav_set.reset (take_wav_set);
111 
112     send_control_event (
113       [=] (Project *project)
114         {
115           project->add_rebuild_result (object_id, event_data->wav_set.release());
116         },
117         event_data);
118   }
119   void
120   emit_clear_wav_sets()
121   {
122     send_control_event (
123       [=] (Project *project)
124         {
125           project->clear_wav_sets();
126         });
127   }
128   Signal<SynthNotifyEvent *> signal_notify_event;
129 };
130 
131 }
132 
133 #endif
134