26#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS))
29#include <ARA_Library/Debug/ARADebug.h>
31#include <ARA_Library/Dispatch/ARAHostDispatch.cpp>
35struct ARAEditGuardState
39 bool add (ARA::Host::DocumentController& dc)
41 const std::lock_guard<std::mutex> lock (
mutex);
42 return ++counts[&dc] == 1;
46 bool remove (ARA::Host::DocumentController& dc)
48 const std::lock_guard<std::mutex> lock (
mutex);
49 return --counts[&dc] == 0;
53 std::map<ARA::Host::DocumentController*, int> counts;
57static ARAEditGuardState editGuardState;
59ARAEditGuard::ARAEditGuard (ARA::Host::DocumentController& dcIn) : dc (dcIn)
61 if (editGuardState.add (dc))
65ARAEditGuard::~ARAEditGuard()
67 if (editGuardState.remove (dc))
76AudioSource::AudioSource (ARA::ARAAudioSourceHostRef hostRef,
77 ARA::Host::DocumentController& dc,
78 const ARA::ARAAudioSourceProperties& props)
79 : ManagedARAHandle (dc, [&]
81 const ARAEditGuard guard (dc);
82 return dc.createAudioSource (hostRef, &props);
87void AudioSource::update (
const ARA::ARAAudioSourceProperties& props)
89 const ARAEditGuard guard (getDocumentController());
90 getDocumentController().updateAudioSourceProperties (getPluginRef(), &props);
93void AudioSource::enableAudioSourceSamplesAccess (
bool x)
95 const ARAEditGuard guard (getDocumentController());
96 getDocumentController().enableAudioSourceSamplesAccess (getPluginRef(),
x);
99void AudioSource::destroy (ARA::Host::DocumentController& dc, Ptr ptr)
101 dc.destroyAudioSource (ptr);
105AudioModification::AudioModification (ARA::ARAAudioModificationHostRef hostRef,
106 ARA::Host::DocumentController& dc,
108 const ARA::ARAAudioModificationProperties& props)
109 : ManagedARAHandle (dc, [&]
111 const ARAEditGuard guard (dc);
112 return dc.createAudioModification (
s.getPluginRef(), hostRef, &props);
118void AudioModification::update (
const ARA::ARAAudioModificationProperties& props)
120 const ARAEditGuard guard (getDocumentController());
121 getDocumentController().updateAudioModificationProperties (getPluginRef(), &props);
124void AudioModification::destroy (ARA::Host::DocumentController& dc, Ptr ptr)
126 dc.destroyAudioModification (ptr);
130class PlaybackRegion::Impl :
public ManagedARAHandle<Impl, ARA::ARAPlaybackRegionRef>,
131 public DeletionListener
134 Impl (ARA::ARAPlaybackRegionHostRef hostRef,
135 ARA::Host::DocumentController& dc,
136 AudioModification&
m,
137 const ARA::ARAPlaybackRegionProperties& props);
141 for (
const auto&
l : listeners)
142 l->removeListener (*
this);
152 void update (
const ARA::ARAPlaybackRegionProperties& props);
154 auto& getAudioModification()
const {
return modification; }
156 static void destroy (ARA::Host::DocumentController&, Ptr);
158 void addListener (DeletionListener&
l) { listeners.insert (&
l); }
159 void removeListener (DeletionListener&
l)
noexcept override { listeners.erase (&
l); }
162 AudioModification* modification =
nullptr;
163 std::unordered_set<DeletionListener*> listeners;
166PlaybackRegion::Impl::Impl (ARA::ARAPlaybackRegionHostRef hostRef,
167 ARA::Host::DocumentController& dc,
168 AudioModification&
m,
169 const ARA::ARAPlaybackRegionProperties& props)
170 : ManagedARAHandle (dc, [&]
172 const ARAEditGuard guard (dc);
173 return dc.createPlaybackRegion (
m.getPluginRef(), hostRef, &props);
179PlaybackRegion::~PlaybackRegion() =
default;
181void PlaybackRegion::Impl::update (
const ARA::ARAPlaybackRegionProperties& props)
183 const ARAEditGuard guard (getDocumentController());
184 getDocumentController().updatePlaybackRegionProperties (getPluginRef(), &props);
187void PlaybackRegion::Impl::destroy (ARA::Host::DocumentController& dc, Ptr ptr)
189 dc.destroyPlaybackRegion (ptr);
192PlaybackRegion::PlaybackRegion (ARA::ARAPlaybackRegionHostRef hostRef,
193 ARA::Host::DocumentController& dc,
194 AudioModification&
m,
195 const ARA::ARAPlaybackRegionProperties& props)
196 : impl (
std::make_unique<Impl> (hostRef, dc,
m, props))
200void PlaybackRegion::update (
const ARA::ARAPlaybackRegionProperties& props) { impl->update (props); }
202void PlaybackRegion::addListener (DeletionListener&
x) { impl->addListener (
x); }
204auto& PlaybackRegion::getAudioModification()
const {
return impl->getAudioModification(); }
206ARA::ARAPlaybackRegionRef PlaybackRegion::getPluginRef()
const noexcept {
return impl->getPluginRef(); }
208DeletionListener& PlaybackRegion::getDeletionListener()
const noexcept {
return *impl.get(); }
211MusicalContext::MusicalContext (ARA::ARAMusicalContextHostRef hostRef,
212 ARA::Host::DocumentController& dc,
213 const ARA::ARAMusicalContextProperties& props)
214 : ManagedARAHandle (dc, [&]
216 const ARAEditGuard guard (dc);
217 return dc.createMusicalContext (hostRef, &props);
222void MusicalContext::update (
const ARA::ARAMusicalContextProperties& props)
224 const ARAEditGuard guard (getDocumentController());
225 return getDocumentController().updateMusicalContextProperties (getPluginRef(), &props);
228void MusicalContext::destroy (ARA::Host::DocumentController& dc, Ptr ptr)
230 dc.destroyMusicalContext (ptr);
234RegionSequence::RegionSequence (ARA::ARARegionSequenceHostRef hostRef,
235 ARA::Host::DocumentController& dc,
236 const ARA::ARARegionSequenceProperties& props)
237 : ManagedARAHandle (dc, [&]
239 const ARAEditGuard guard (dc);
240 return dc.createRegionSequence (hostRef, &props);
245void RegionSequence::update (
const ARA::ARARegionSequenceProperties& props)
247 const ARAEditGuard guard (getDocumentController());
248 return getDocumentController().updateRegionSequenceProperties (getPluginRef(), &props);
251void RegionSequence::destroy (ARA::Host::DocumentController& dc, Ptr ptr)
253 dc.destroyRegionSequence (ptr);
257PlaybackRendererInterface PlugInExtensionInstance::getPlaybackRendererInterface()
const
259 if (instance !=
nullptr)
260 return PlaybackRendererInterface (instance->playbackRendererRef, instance->playbackRendererInterface);
265EditorRendererInterface PlugInExtensionInstance::getEditorRendererInterface()
const
267 if (instance !=
nullptr)
268 return EditorRendererInterface (instance->editorRendererRef, instance->editorRendererInterface);
276class ARAHostDocumentController::Impl
279 Impl (ARAFactoryWrapper araFactoryIn,
280 std::unique_ptr<ARA::Host::DocumentControllerHostInstance>&& dcHostInstanceIn,
281 const ARA::ARADocumentControllerInstance* documentControllerInstance)
282 : araFactory (std::
move (araFactoryIn)),
283 dcHostInstance (std::
move (dcHostInstanceIn)),
284 documentController (documentControllerInstance)
290 documentController.destroyDocumentController();
293 static std::unique_ptr<Impl>
294 createImpl (ARAFactoryWrapper araFactory,
295 const String& documentName,
296 std::unique_ptr<ARA::Host::AudioAccessControllerInterface>&& audioAccessController,
297 std::unique_ptr<ARA::Host::ArchivingControllerInterface>&& archivingController,
298 std::unique_ptr<ARA::Host::ContentAccessControllerInterface>&& contentAccessController,
299 std::unique_ptr<ARA::Host::ModelUpdateControllerInterface>&& modelUpdateController,
300 std::unique_ptr<ARA::Host::PlaybackControllerInterface>&& playbackController)
302 std::unique_ptr<ARA::Host::DocumentControllerHostInstance> dcHostInstance =
303 std::make_unique<ARA::Host::DocumentControllerHostInstance> (audioAccessController.release(),
304 archivingController.release(),
305 contentAccessController.release(),
306 modelUpdateController.release(),
307 playbackController.release());
311 if (
auto* dci = araFactory.get()->createDocumentControllerWithDocument (dcHostInstance.get(), &documentProperties))
312 return std::make_unique<Impl> (std::move (araFactory), std::move (dcHostInstance), dci);
317 ARAHostModel::PlugInExtensionInstance bindDocumentToPluginInstance (AudioPluginInstance& instance,
318 ARA::ARAPlugInInstanceRoleFlags knownRoles,
319 ARA::ARAPlugInInstanceRoleFlags assignedRoles)
322 const auto makeVisitor = [] (
auto vst3Fn,
auto auFn)
324 using Vst3Fn =
decltype (vst3Fn);
325 using AuFn =
decltype (auFn);
327 struct Visitor : ExtensionsVisitor, Vst3Fn, AuFn
329 explicit Visitor (Vst3Fn vst3Fn, AuFn auFn) : Vst3Fn (std::
move (vst3Fn)), AuFn (std::
move (auFn)) {}
330 void visitVST3Client (
const VST3Client&
x)
override { Vst3Fn::operator() (
x); }
331 void visitAudioUnitClient (
const AudioUnitClient&
x)
override { AuFn::operator() (
x); }
334 return Visitor { std::move (vst3Fn), std::move (auFn) };
337 const ARA::ARAPlugInExtensionInstance* pei =
nullptr;
338 auto visitor = makeVisitor ([
this, &pei, knownRoles, assignedRoles] (
const ExtensionsVisitor::VST3Client& vst3Client)
340 auto* iComponentPtr = vst3Client.getIComponentPtr();
341 VSTComSmartPtr<ARA::IPlugInEntryPoint2> araEntryPoint;
343 if (araEntryPoint.loadFrom (iComponentPtr))
344 pei = araEntryPoint->bindToDocumentControllerWithRoles (documentController.getRef(), knownRoles, assignedRoles);
346 #if JUCE_PLUGINHOST_AU && JUCE_MAC
347 [
this, &pei, knownRoles, assignedRoles] (
const ExtensionsVisitor::AudioUnitClient& auClient)
349 auto audioUnit = auClient.getAudioUnitHandle();
350 auto propertySize = (UInt32)
sizeof (ARA::ARAAudioUnitPlugInExtensionBinding);
351 const auto expectedPropertySize = propertySize;
352 ARA::ARAAudioUnitPlugInExtensionBinding audioUnitBinding { ARA::kARAAudioUnitMagic,
353 documentController.getRef(),
358 auto status = AudioUnitGetProperty (audioUnit,
359 ARA::kAudioUnitProperty_ARAPlugInExtensionBindingWithRoles,
360 kAudioUnitScope_Global,
366 && propertySize == expectedPropertySize
367 && audioUnitBinding.inOutMagicNumber == ARA::kARAAudioUnitMagic
368 && audioUnitBinding.inDocumentControllerRef == documentController.getRef()
369 && audioUnitBinding.outPlugInExtension !=
nullptr)
371 pei = audioUnitBinding.outPlugInExtension;
381 instance.getExtensions (visitor);
382 return ARAHostModel::PlugInExtensionInstance { pei };
385 auto& getDocumentController() {
return documentController; }
388 ARAFactoryWrapper araFactory;
389 std::unique_ptr<ARA::Host::DocumentControllerHostInstance> dcHostInstance;
390 ARA::Host::DocumentController documentController;
393ARAHostDocumentController::ARAHostDocumentController (std::unique_ptr<Impl>&& implIn)
397std::unique_ptr<ARAHostDocumentController> ARAHostDocumentController::create (ARAFactoryWrapper factory,
398 const String& documentName,
399 std::unique_ptr<ARA::Host::AudioAccessControllerInterface> audioAccessController,
400 std::unique_ptr<ARA::Host::ArchivingControllerInterface> archivingController,
401 std::unique_ptr<ARA::Host::ContentAccessControllerInterface> contentAccessController,
402 std::unique_ptr<ARA::Host::ModelUpdateControllerInterface> modelUpdateController,
403 std::unique_ptr<ARA::Host::PlaybackControllerInterface> playbackController)
405 if (
auto impl = Impl::createImpl (std::move (factory),
407 std::move (audioAccessController),
408 std::move (archivingController),
409 std::move (contentAccessController),
410 std::move (modelUpdateController),
411 std::move (playbackController)))
413 return rawToUniquePtr (
new ARAHostDocumentController (std::move (impl)));
419ARAHostDocumentController::~ARAHostDocumentController() =
default;
421ARA::Host::DocumentController& ARAHostDocumentController::getDocumentController()
const
423 return impl->getDocumentController();
426ARAHostModel::PlugInExtensionInstance ARAHostDocumentController::bindDocumentToPluginInstance (AudioPluginInstance& instance,
427 ARA::ARAPlugInInstanceRoleFlags knownRoles,
428 ARA::ARAPlugInInstanceRoleFlags assignedRoles)
430 return impl->bindDocumentToPluginInstance (instance, knownRoles, assignedRoles);
433void createARAFactoryAsync (AudioPluginInstance& instance, std::function<
void (ARAFactoryWrapper)> cb)
435 if (! instance.getPluginDescription().hasARAExtension)
436 cb (ARAFactoryWrapper{});
438 struct Extensions :
public ExtensionsVisitor
440 Extensions (std::function<
void (ARAFactoryWrapper)> callbackIn)
444 void visitARAClient (
const ARAClient& araClient)
override
446 araClient.createARAFactoryAsync (std::move (
callback));
452 Extensions extensions { std::move(cb) };
453 instance.getExtensions (extensions);
pthread_mutex_t mutex
Definition Controller.C:6
#define noexcept
Definition DistrhoDefines.h:72
const char * toRawUTF8() const
Definition String.cpp:1925
int * l
Definition inflate.c:1579
unsigned * m
Definition inflate.c:1559
unsigned s
Definition inflate.c:1555
unsigned x[BMAX+1]
Definition inflate.c:1586
void move(void *from, void *to)
Definition juce_FixedSizeFunction.h:53
Definition carla_juce.cpp:31
constexpr Obj makeARASizedStruct(Member Obj::*member, Ts &&... ts)
Definition juce_ARACommon.h:79
std::unique_ptr< T > rawToUniquePtr(T *ptr)
Definition juce_Memory.h:195
void add(SampleFrame *dst, const SampleFrame *src, int frames)
Add samples from src to dst.
Definition MixHelpers.cpp:135
Definition juce_Uuid.h:141
RECT const char void(* callback)(const char *droppath))) SWELL_API_DEFINE(BOOL
Definition swell-functions.h:1004
#define void
Definition unzip.h:396
#define const
Definition zconf.h:137