diff --git a/src/effects/VST/VSTEffect.cpp b/src/effects/VST/VSTEffect.cpp index d9332cd50..2b651c114 100644 --- a/src/effects/VST/VSTEffect.cpp +++ b/src/effects/VST/VSTEffect.cpp @@ -1114,12 +1114,12 @@ void VSTEffect::BundleDeleter::operator() (void* p) const CFRelease(static_cast(p)); } -void VSTEffect::ResourceDeleter::operator() (void *p) const +void VSTEffect::ResourceHandle::reset() { - if (mpHandle) { - int resource = (int)p; - CFBundleCloseBundleResourceMap(mpHandle->get(), resource); - } + if (mpHandle) + CFBundleCloseBundleResourceMap(mpHandle, mNum); + mpHandle = nullptr; + mNum = 0; } #endif @@ -2061,10 +2061,8 @@ bool VSTEffect::Load() mBundleRef = std::move(bundleRef); // Open the resource map ... some plugins (like GRM Tools) need this. - mResource = ResourceHandle { - reinterpret_cast( - CFBundleOpenBundleResourceMap(mBundleRef.get())), - ResourceDeleter{&mBundleRef} + mResource = ResourceHandle{ + mBundleRef.get(), CFBundleOpenBundleResourceMap(mBundleRef.get()) }; #elif defined(__WXMSW__) @@ -2267,7 +2265,7 @@ void VSTEffect::Unload() if (mModule) { #if defined(__WXMAC__) - mResource = ResourceHandle{}; + mResource.reset(); mBundleRef.reset(); #endif diff --git a/src/effects/VST/VSTEffect.h b/src/effects/VST/VSTEffect.h index e4737058c..5026da413 100644 --- a/src/effects/VST/VSTEffect.h +++ b/src/effects/VST/VSTEffect.h @@ -302,15 +302,27 @@ private: BundleHandle mBundleRef; - struct ResourceDeleter { - const BundleHandle *mpHandle; - ResourceDeleter(const BundleHandle *pHandle = nullptr) - : mpHandle(pHandle) {} - void operator() (void*) const; + struct ResourceHandle { + ResourceHandle( + CFBundleRef pHandle = nullptr, CFBundleRefNum num = 0) + : mpHandle{ pHandle }, mNum{ num } + {} + ResourceHandle& operator=( ResourceHandle &&other ) + { + if (this != &other) { + mpHandle = other.mpHandle; + mNum = other.mNum; + other.mpHandle = nullptr; + other.mNum = 0; + } + return *this; + } + ~ResourceHandle() { reset(); } + void reset(); + + CFBundleRef mpHandle{}; + CFBundleRefNum mNum{}; }; - using ResourceHandle = std::unique_ptr< - char, ResourceDeleter - >; ResourceHandle mResource; #endif