Audacity 3.2.0
AudioUnitWrapper.h
Go to the documentation of this file.
1/*!********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 @file AudioUnitWrapper.h
6
7 Dominic Mazzoni
8 Leland Lucius
9
10 Paul Licameli split from AudioUnitEffect.h
11
12**********************************************************************/
13#ifndef AUDACITY_AUDIOUNIT_WRAPPER_H
14#define AUDACITY_AUDIOUNIT_WRAPPER_H
15
16#if USE_AUDIO_UNITS
17
18#include <optional>
19#include <map>
20#include <set>
21#include <unordered_map>
22#include <wx/string.h>
23
24#include "AudioUnitUtils.h"
25#include "Identifier.h"
26
27class wxCFStringRef;
28class wxMemoryBuffer;
30class EffectSettings;
33
39
45 using StringSet = std::set<wxString>;
46 const std::shared_ptr<StringSet> mSharedNames{
47 std::make_shared<StringSet>() };
48
50 std::optional<SInt32> mPresetNumber;
51
54 using Pair = std::pair<const wxString &, AudioUnitParameterValue>;
55 using Map = std::map<AudioUnitParameterID, std::optional<Pair>>;
57
59 AudioUnitEffectSettings(Map map) : values{ move(map) } {}
60
63 const wxString &Intern(const wxString &name) {
64 // std::set::insert guarantees this iterator is not at the end
65 auto [iter, _] = mSharedNames->insert(name);
66 // so dereference it merrily
67 return *iter;
68 }
69
72 {
73 for (auto &[_, value] : values)
74 value.reset();
75 }
76};
77
79
84{
86
90
94 AudioUnitWrapper(AudioComponent component, Parameters *pParameters)
95 : mComponent{ component }
96 , mParameters{ pParameters ? *pParameters : mOwnParameters }
97 {
98 }
99
100 // Supply most often used values as defaults for scope and element
101 template<typename T>
102 OSStatus GetFixedSizeProperty(AudioUnitPropertyID inID, T &property,
103 AudioUnitScope inScope = kAudioUnitScope_Global,
104 AudioUnitElement inElement = 0) const
105 {
106 // Supply mUnit.get() to the non-member function
108 inID, property, inScope, inElement);
109 }
110
111 // Supply most often used values as defaults for scope and element
112 template<typename T>
113 OSStatus GetVariableSizeProperty(AudioUnitPropertyID inID,
114 PackedArray::Ptr<T> &pObject,
115 AudioUnitScope inScope = kAudioUnitScope_Global,
116 AudioUnitElement inElement = 0) const
117 {
119 inID, pObject, inScope, inElement);
120 }
121
122 // Supply most often used values as defaults for scope and element
123 template<typename T>
124 OSStatus SetProperty(AudioUnitPropertyID inID, const T &property,
125 AudioUnitScope inScope = kAudioUnitScope_Global,
126 AudioUnitElement inElement = 0) const
127 {
128 // Supply mUnit.get() to the non-member function
130 inID, property, inScope, inElement);
131 }
132
133 class ParameterInfo;
136 std::function< bool(const ParameterInfo &pi, AudioUnitParameterID ID) >;
137 void ForEachParameter(ParameterVisitor visitor) const;
138
139 bool LoadPreset(const EffectDefinitionInterface &effect,
140 const RegistryPath & group, EffectSettings &settings) const;
142 int id, EffectSettings *pSettings) const;
143
145
150 std::pair<CF_ptr<CFDataRef>, TranslatableString>
153 const wxCFStringRef &cfname, bool binary) const;
154
156
161 const wxString &group, const wxMemoryBuffer &buf) const;
162
165 bool fetchValues, bool fetchPreset = false) const;
166 bool StoreSettings(const EffectDefinitionInterface &effect,
167 const AudioUnitEffectSettings &settings) const;
168
170 static bool MoveSettingsContents(
171 AudioUnitEffectSettings &&src, AudioUnitEffectSettings &dst, bool merge);
172
173 bool CreateAudioUnit();
174
175 AudioUnit GetAudioUnit() const { return mUnit.get(); }
176 AudioComponent GetComponent() const { return mComponent; }
178 { return mParameters; }
179
180 // @param identifier only for logging messages
181 bool SetRateAndChannels(double sampleRate, const wxString &identifier);
182
183protected:
184 const AudioComponent mComponent;
186
189
190 // Reassinged in GetRateAndChannels()
191 unsigned mAudioIns{ 2 };
192 unsigned mAudioOuts{ 2 };
193};
194
196{
197public:
199 ParameterInfo(AudioUnit mUnit, AudioUnitParameterID parmID);
201 static std::optional<AudioUnitParameterID> ParseKey(const wxString &key);
202
203 std::optional<wxString> mName;
205
206private:
207 // constants
208 static constexpr char idBeg = wxT('<');
209 static constexpr char idSep = wxT(',');
210 static constexpr char idEnd = wxT('>');
211};
212
213#endif
214
215#endif
wxT("CloseDown"))
std::unique_ptr< T, AudioUnitCleaner< T, fn > > AudioUnitCleanup
RAII for cleaning up AU plugin state.
const TranslatableString name
Definition: Distortion.cpp:76
wxString RegistryPath
Definition: Identifier.h:218
#define _(s)
Definition: Internat.h:73
static const AudacityProject::AttachedObjects::RegisteredFactory key
static Settings & settings()
Definition: TrackInfo.cpp:69
ParameterInfo(AudioUnit mUnit, AudioUnitParameterID parmID)
Make a structure holding a key for the config file and a value.
static std::optional< AudioUnitParameterID > ParseKey(const wxString &key)
Recover the parameter ID from the key, if well formed.
std::optional< wxString > mName
AudioUnitUtils::ParameterInfo mInfo
EffectDefinitionInterface is a ComponentInterface that adds some basic read-only information about ef...
Holds a msgid for the translation catalog; may also bind format arguments.
OSStatus GetFixedSizeProperty(AudioUnit unit, AudioUnitPropertyID inID, T &property, AudioUnitScope inScope=kAudioUnitScope_Global, AudioUnitElement inElement=0)
OSStatus SetProperty(AudioUnit unit, AudioUnitPropertyID inID, const T &property, AudioUnitScope inScope=kAudioUnitScope_Global, AudioUnitElement inElement=0)
OSStatus GetVariableSizeProperty(AudioUnit unit, AudioUnitPropertyID inID, PackedArray::Ptr< T > &pObject, AudioUnitScope inScope=kAudioUnitScope_Global, AudioUnitElement inElement=0)
AudioUnitEffectSettings()=default
const wxString & Intern(const wxString &name)
std::set< wxString > StringSet
std::pair< const wxString &, AudioUnitParameterValue > Pair
const std::shared_ptr< StringSet > mSharedNames
void ResetValues()
Associate nullopt with all keys already present in the map.
std::optional< SInt32 > mPresetNumber
Optionally store a preset.
std::map< AudioUnitParameterID, std::optional< Pair > > Map
Common base class for AudioUnitEffect and its Instance.
Parameters & mParameters
bool LoadPreset(const EffectDefinitionInterface &effect, const RegistryPath &group, EffectSettings &settings) const
AudioUnitWrapper(AudioComponent component, Parameters *pParameters)
bool StoreSettings(const EffectDefinitionInterface &effect, const AudioUnitEffectSettings &settings) const
bool LoadFactoryPreset(const EffectDefinitionInterface &effect, int id, EffectSettings *pSettings) const
OSStatus GetFixedSizeProperty(AudioUnitPropertyID inID, T &property, AudioUnitScope inScope=kAudioUnitScope_Global, AudioUnitElement inElement=0) const
std::function< bool(const ParameterInfo &pi, AudioUnitParameterID ID) > ParameterVisitor
Return value: if true, continue visiting.
static bool MoveSettingsContents(AudioUnitEffectSettings &&src, AudioUnitEffectSettings &dst, bool merge)
Copy, then clear the optionals in src.
OSStatus GetVariableSizeProperty(AudioUnitPropertyID inID, PackedArray::Ptr< T > &pObject, AudioUnitScope inScope=kAudioUnitScope_Global, AudioUnitElement inElement=0) const
AudioUnit GetAudioUnit() const
TranslatableString InterpretBlob(AudioUnitEffectSettings &settings, const wxString &group, const wxMemoryBuffer &buf) const
Interpret the dump made before by MakeBlob.
const Parameters & GetParameters() const
bool SetRateAndChannels(double sampleRate, const wxString &identifier)
AudioComponent GetComponent() const
AudioUnitCleanup< AudioUnit, AudioComponentInstanceDispose > mUnit
OSStatus SetProperty(AudioUnitPropertyID inID, const T &property, AudioUnitScope inScope=kAudioUnitScope_Global, AudioUnitElement inElement=0) const
static AudioUnitEffectSettings & GetSettings(EffectSettings &settings)
const AudioComponent mComponent
Parameters mOwnParameters
std::pair< CF_ptr< CFDataRef >, TranslatableString > MakeBlob(const EffectDefinitionInterface &effect, const AudioUnitEffectSettings &settings, const wxCFStringRef &cfname, bool binary) const
Obtain dump of the setting state of an AudioUnit instance.
void ForEachParameter(ParameterVisitor visitor) const
bool FetchSettings(AudioUnitEffectSettings &settings, bool fetchValues, bool fetchPreset=false) const
May allocate memory, so should be called only in the main thread.
Externalized state of a plug-in.