mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
98 lines
2.3 KiB
C++
98 lines
2.3 KiB
C++
/*!
|
|
@file AudioUnitSDK/ComponentBase.cpp
|
|
@copyright © 2000-2021 Apple Inc. All rights reserved.
|
|
*/
|
|
// self
|
|
#include <AudioUnitSDK/AUUtility.h>
|
|
#include <AudioUnitSDK/ComponentBase.h>
|
|
|
|
// std
|
|
#include <mutex>
|
|
|
|
namespace ausdk {
|
|
|
|
static OSStatus CB_GetComponentDescription(
|
|
AudioComponentInstance inInstance, AudioComponentDescription* outDesc);
|
|
|
|
std::recursive_mutex& ComponentBase::InitializationMutex()
|
|
{
|
|
__attribute__((no_destroy)) static std::recursive_mutex global;
|
|
return global;
|
|
}
|
|
|
|
ComponentBase::ComponentBase(AudioComponentInstance inInstance) : mComponentInstance(inInstance)
|
|
{
|
|
(void)GetComponentDescription();
|
|
}
|
|
|
|
void ComponentBase::DoPostConstructor()
|
|
{
|
|
PostConstructorInternal();
|
|
PostConstructor();
|
|
}
|
|
|
|
void ComponentBase::DoPreDestructor()
|
|
{
|
|
PreDestructor();
|
|
PreDestructorInternal();
|
|
}
|
|
|
|
OSStatus ComponentBase::AP_Open(void* self, AudioComponentInstance compInstance)
|
|
{
|
|
OSStatus result = noErr;
|
|
const auto acpi = static_cast<AudioComponentPlugInInstance*>(self);
|
|
try {
|
|
const std::lock_guard guard{ InitializationMutex() };
|
|
|
|
auto* const cb =
|
|
static_cast<ComponentBase*>((*acpi->mConstruct)(&acpi->mInstanceStorage, compInstance));
|
|
cb->DoPostConstructor(); // allows base class to do additional initialization
|
|
// once the derived class is fully constructed
|
|
result = noErr;
|
|
}
|
|
AUSDK_Catch(result)
|
|
if (result != noErr) {
|
|
delete acpi; // NOLINT
|
|
}
|
|
return result;
|
|
}
|
|
|
|
OSStatus ComponentBase::AP_Close(void* self)
|
|
{
|
|
OSStatus result = noErr;
|
|
try {
|
|
const auto acpi = static_cast<AudioComponentPlugInInstance*>(self);
|
|
if (const auto acImp =
|
|
reinterpret_cast<ComponentBase*>(&acpi->mInstanceStorage)) { // NOLINT
|
|
acImp->DoPreDestructor();
|
|
(*acpi->mDestruct)(&acpi->mInstanceStorage);
|
|
free(self); // NOLINT manual memory management
|
|
}
|
|
}
|
|
AUSDK_Catch(result)
|
|
return result;
|
|
}
|
|
|
|
AudioComponentDescription ComponentBase::GetComponentDescription() const
|
|
{
|
|
AudioComponentDescription desc = {};
|
|
|
|
if (CB_GetComponentDescription(mComponentInstance, &desc) == noErr) {
|
|
return desc;
|
|
}
|
|
|
|
return {};
|
|
}
|
|
|
|
static OSStatus CB_GetComponentDescription(
|
|
AudioComponentInstance inInstance, AudioComponentDescription* outDesc)
|
|
{
|
|
const AudioComponent comp = AudioComponentInstanceGetComponent(inInstance);
|
|
if (comp != nullptr) {
|
|
return AudioComponentGetDescription(comp, outDesc);
|
|
}
|
|
|
|
return kAudio_ParamError;
|
|
}
|
|
|
|
} // namespace ausdk
|