|
- /*!
- @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
|