Anklang-0.3.0-1416-gfa8ce8d2 anklang-0.3.0-1416-gfa8ce8d2
ASE — Anklang Sound Engine (C++)

« « « Anklang Documentation
Loading...
Searching...
No Matches
trkn-utils.cc
Go to the documentation of this file.
1 // This Source Code Form is licensed MPL-2.0: http://mozilla.org/MPL/2.0
2#include "trkn/tracktion.hh" // PCH include must come first
3
4#include "trkn-utils.hh"
5#include "platform.hh"
6#include "main.hh"
7#include "logging.hh"
8#include "internal.hh"
9
10namespace te = tracktion::engine;
11
12namespace Ase {
13
14static void
15trkn_prepare_parameter_value (te::AutomatableParameter &parameter)
16{
17 // Flush an implicit initial value before the first undoable change.
18 parameter.setParameter (parameter.getCurrentValue(), juce::sendNotification);
19}
20
21float
22trkn_volume_db (const te::VolumeAndPanPlugin &plugin)
23{
24 return plugin.getVolumeDb();
25}
26
27void
28trkn_volume_db (te::VolumeAndPanPlugin &plugin, float db)
29{
30 if (plugin.volume.isUsingDefault())
31 trkn_prepare_parameter_value (*plugin.volParam);
32 plugin.setVolumeDb (db);
33}
34
35float
36trkn_slider_pos (const te::VolumeAndPanPlugin &plugin)
37{
38 return plugin.getSliderPos();
39}
40
41void
42trkn_slider_pos (te::VolumeAndPanPlugin &plugin, float pos)
43{
44 if (plugin.volume.isUsingDefault())
45 trkn_prepare_parameter_value (*plugin.volParam);
46 plugin.setSliderPos (pos);
47}
48
49float
50trkn_pan (const te::VolumeAndPanPlugin &plugin)
51{
52 return plugin.getPan();
53}
54
55void
56trkn_pan (te::VolumeAndPanPlugin &plugin, float pan)
57{
58 if (plugin.pan.isUsingDefault())
59 trkn_prepare_parameter_value (*plugin.panParam);
60 plugin.setPan (pan);
61}
62
63static void
64trkn_restore_parameter_value (te::AutomatableParameter &parameter)
65{
66 if (!parameter.hasAutomationPoints() && !parameter.hasActiveModifierAssignments() && parameter.getCurrentModifierValue() == 0)
67 parameter.updateFromAttachedValue();
68}
69
70void
71trkn_restore_parameter_values (te::Edit &edit)
72{
73 auto restore = [] (te::VolumeAndPanPlugin &plugin) {
74 trkn_restore_parameter_value (*plugin.volParam);
75 trkn_restore_parameter_value (*plugin.panParam);
76 };
77 restore (*edit.getMasterVolumePlugin());
78 for (auto track : te::getAudioTracks (edit))
79 if (auto plugin = track->getVolumePlugin())
80 restore (*plugin);
81}
82
83// == SelectableBaseref ==
84using JuceWeakReference_Selectable = juce::WeakReference<tracktion::Selectable>;
85
86template<size_t N> static JuceWeakReference_Selectable&
87juce_weak_reference_selectable (const char (&mem)[N])
88{
89 static_assert (N == sizeof (JuceWeakReference_Selectable));
90 return *reinterpret_cast<JuceWeakReference_Selectable*> (const_cast<char*> (mem));
91}
92
93SelectableBaseref::SelectableBaseref()
94{
95 static_assert (sizeof (mem_) == sizeof (JuceWeakReference_Selectable));
96 JuceWeakReference_Selectable *const weakref = new (mem_) JuceWeakReference_Selectable (nullptr);
97 assert_return (weakref != nullptr);
98}
99
100SelectableBaseref::~SelectableBaseref()
101{
102 JuceWeakReference_Selectable &weakref = juce_weak_reference_selectable (mem_);
103 weakref.~JuceWeakReference_Selectable();
104}
105
106tracktion::Selectable*
107SelectableBaseref::get () const noexcept
108{
109 JuceWeakReference_Selectable &weakref = juce_weak_reference_selectable (mem_);
110 return weakref.get();
111}
112
113void
114SelectableBaseref::set (tracktion::Selectable *selectable) noexcept
115{
116 JuceWeakReference_Selectable &weakref = juce_weak_reference_selectable (mem_);
117 weakref = selectable;
118}
119
120void
121SelectableBaseref::set (const SelectableBaseref &other) noexcept
122{
123 JuceWeakReference_Selectable &weakref = juce_weak_reference_selectable (mem_);
124 const JuceWeakReference_Selectable &otherref = juce_weak_reference_selectable (other.mem_);
125 weakref = otherref;
126}
127
128// == ase_obj_ helpers ==
129
130void
131register_ase_obj (VirtualBase *ase_impl, tracktion::Selectable &selectable)
132{
133 assert_return (ase_impl != nullptr);
134 return_unless (selectable.ase_obj_ == nullptr);
135 selectable.ase_obj_ = ase_impl;
136}
137
138void
139unregister_ase_obj (VirtualBase *ase_impl, tracktion::Selectable *selectable)
140{
141 if (selectable && selectable->ase_obj_ == ase_impl)
142 selectable->ase_obj_ = nullptr;
143}
144
145VirtualBase*
146find_ase_obj_virtual_base (tracktion::Selectable *selectable)
147{
148 return selectable ? selectable->ase_obj_ : nullptr;
149}
150
151} // Ase
VolumeAndPanPlugin::Ptr getMasterVolumePlugin() const
#define assert_return(expr,...)
Return from the current function if expr is unmet and issue an assertion warning.
Definition internal.hh:28
#define return_unless(cond,...)
Return silently if cond does not evaluate to true with return value ...
Definition internal.hh:72
The Anklang C++ API namespace.
Definition api.hh:8
void register_ase_obj(VirtualBase *ase_impl, tracktion::Selectable &selectable)
Helper: register AseImpl with a tracktion Selectable via ase_obj_.
VirtualBase * find_ase_obj_virtual_base(tracktion::Selectable *selectable)
Helper: lookup Ase::VirtualBase from tracktion Selectable via ase_obj_.
void unregister_ase_obj(VirtualBase *ase_impl, tracktion::Selectable *selectable)
Helper: unregister AseImpl from a tracktion Selectable (selectable may be nullptr)
sendNotification
juce::Array< AudioTrack * > getAudioTracks(const Edit &)
Common base type to allow casting between polymorphic classes.
Definition cxxaux.hh:220