diff --git a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h index ac5af0df45..5d3581a3e3 100644 --- a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h +++ b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h @@ -378,8 +378,6 @@ namespace AUHelpers JUCE_AU_PUBLIC "OtherBases/AUEffectBase.h", JUCE_AU_PUBLIC "Utility/AUBuffer.cpp", JUCE_AU_PUBLIC "Utility/AUBuffer.h", - JUCE_AU_PUBLIC "Utility/AUDebugDispatcher.cpp", - JUCE_AU_PUBLIC "Utility/AUDebugDispatcher.h", JUCE_AU_PUBLIC "Utility/AUInputFormatConverter.h", JUCE_AU_PUBLIC "Utility/AUSilentTimeout.h", JUCE_AU_PUBLIC "Utility/AUTimestampGenerator.h", 0 }; diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp index 3605e618eb..fbeb7a5e1f 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp @@ -96,8 +96,6 @@ static bool recursionCheck = false; static juce::uint32 lastMasterIdleCall = 0; BEGIN_JUCE_NAMESPACE - extern void JUCE_API juce_callAnyTimersSynchronously(); - #if JUCE_MAC extern void initialiseMac(); extern void* attachComponentToWindowRef (Component* component, void* windowRef); @@ -947,7 +945,7 @@ public: recursionCheck = true; JUCE_AUTORELEASEPOOL - juce_callAnyTimersSynchronously(); + Timer::callPendingTimersSynchronously(); for (int i = ComponentPeer::getNumPeers(); --i >= 0;) ComponentPeer::getPeer (i)->performAnyPendingRepaintsNow(); diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index d4cd2f058a..66a64cd508 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -79,9 +79,6 @@ BEGIN_JUCE_NAMESPACE static void _clearfp() {} #endif -extern void JUCE_API juce_callAnyTimersSynchronously(); - - //============================================================================== const int fxbVersionNum = 1; @@ -2247,7 +2244,7 @@ VstIntPtr VSTPluginInstance::handleCallback (VstInt32 opcode, VstInt32 index, Vs dispatch (effEditIdle, 0, 0, 0, 0); #endif - juce_callAnyTimersSynchronously(); + Timer::callPendingTimersSynchronously(); handleUpdateNowIfNeeded(); diff --git a/modules/juce_core/memory/juce_ReferenceCountedObject.h b/modules/juce_core/memory/juce_ReferenceCountedObject.h index dc4be82897..660ba822cd 100644 --- a/modules/juce_core/memory/juce_ReferenceCountedObject.h +++ b/modules/juce_core/memory/juce_ReferenceCountedObject.h @@ -105,6 +105,14 @@ protected: jassert (getReferenceCount() == 0); } + /** Resets the reference count to zero without deleting the object. + You should probably never need to use this! + */ + void resetReferenceCount() noexcept + { + refCount = 0; + } + private: //============================================================================== Atomic refCount; diff --git a/modules/juce_events/timers/juce_Timer.cpp b/modules/juce_events/timers/juce_Timer.cpp index 5958c649ec..d8e1dd11c6 100644 --- a/modules/juce_events/timers/juce_Timer.cpp +++ b/modules/juce_events/timers/juce_Timer.cpp @@ -26,15 +26,15 @@ BEGIN_JUCE_NAMESPACE //============================================================================== -class InternalTimerThread : private Thread, - private MessageListener, - private DeletedAtShutdown, - private AsyncUpdater +class Timer::TimerThread : private Thread, + private MessageListener, + private DeletedAtShutdown, + private AsyncUpdater { public: typedef CriticalSection LockType; // (mysteriously, using a SpinLock here causes problems on some XP machines..) - InternalTimerThread() + TimerThread() : Thread ("Juce Timer"), firstTimer (nullptr), callbackNeeded (0) @@ -42,7 +42,7 @@ public: triggerAsyncUpdate(); } - ~InternalTimerThread() noexcept + ~TimerThread() noexcept { stopThread (4000); @@ -158,16 +158,10 @@ public: callTimers(); } - static void callAnyTimersSynchronously() - { - if (InternalTimerThread::instance != nullptr) - InternalTimerThread::instance->callTimersSynchronously(); - } - static inline void add (Timer* const tim) noexcept { if (instance == nullptr) - instance = new InternalTimerThread(); + instance = new TimerThread(); instance->addTimer (tim); } @@ -194,10 +188,10 @@ public: } } -private: - friend class Timer; - static InternalTimerThread* instance; + static TimerThread* instance; static LockType lock; + +private: Timer* volatile firstTimer; Atomic callbackNeeded; @@ -302,16 +296,11 @@ private: startThread (7); } - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternalTimerThread); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TimerThread); }; -InternalTimerThread* InternalTimerThread::instance = nullptr; -InternalTimerThread::LockType InternalTimerThread::lock; - -void JUCE_API juce_callAnyTimersSynchronously() -{ - InternalTimerThread::callAnyTimersSynchronously(); -} +Timer::TimerThread* Timer::TimerThread::instance = nullptr; +Timer::TimerThread::LockType Timer::TimerThread::lock; //============================================================================== #if JUCE_DEBUG @@ -325,7 +314,7 @@ Timer::Timer() noexcept next (nullptr) { #if JUCE_DEBUG - const InternalTimerThread::LockType::ScopedLockType sl (InternalTimerThread::lock); + const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); activeTimers.add (this); #endif } @@ -337,7 +326,7 @@ Timer::Timer (const Timer&) noexcept next (nullptr) { #if JUCE_DEBUG - const InternalTimerThread::LockType::ScopedLockType sl (InternalTimerThread::lock); + const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); activeTimers.add (this); #endif } @@ -353,7 +342,7 @@ Timer::~Timer() void Timer::startTimer (const int interval) noexcept { - const InternalTimerThread::LockType::ScopedLockType sl (InternalTimerThread::lock); + const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); #if JUCE_DEBUG // this isn't a valid object! Your timer might be a dangling pointer or something.. @@ -364,17 +353,17 @@ void Timer::startTimer (const int interval) noexcept { countdownMs = interval; periodMs = jmax (1, interval); - InternalTimerThread::add (this); + TimerThread::add (this); } else { - InternalTimerThread::resetCounter (this, interval); + TimerThread::resetCounter (this, interval); } } void Timer::stopTimer() noexcept { - const InternalTimerThread::LockType::ScopedLockType sl (InternalTimerThread::lock); + const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); #if JUCE_DEBUG // this isn't a valid object! Your timer might be a dangling pointer or something.. @@ -383,9 +372,15 @@ void Timer::stopTimer() noexcept if (periodMs > 0) { - InternalTimerThread::remove (this); + TimerThread::remove (this); periodMs = 0; } } +void JUCE_CALLTYPE Timer::callPendingTimersSynchronously() +{ + if (TimerThread::instance != nullptr) + TimerThread::instance->callTimersSynchronously(); +} + END_JUCE_NAMESPACE diff --git a/modules/juce_events/timers/juce_Timer.h b/modules/juce_events/timers/juce_Timer.h index 347b379e18..cde616b2e2 100644 --- a/modules/juce_events/timers/juce_Timer.h +++ b/modules/juce_events/timers/juce_Timer.h @@ -26,8 +26,6 @@ #ifndef __JUCE_TIMER_JUCEHEADER__ #define __JUCE_TIMER_JUCEHEADER__ -class InternalTimerThread; - //============================================================================== /** @@ -119,8 +117,14 @@ public: //============================================================================== + /** For internal use only: invokes any timers that need callbacks. + Don't call this unless you really know what you're doing! + */ + static void JUCE_CALLTYPE callPendingTimersSynchronously(); + private: - friend class InternalTimerThread; + class TimerThread; + friend class TimerThread; int countdownMs, periodMs; Timer* previous; Timer* next; diff --git a/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp b/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp index 56d971014b..be560caf67 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp @@ -164,8 +164,7 @@ public: glTexParameterf (textureType, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf (textureType, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, - textureType, textureID, 0); + glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, textureType, textureID, 0); if (wantsDepthBuffer || wantsStencilBuffer) { @@ -222,25 +221,6 @@ public: bool bind() { return bind (frameBufferHandle); } bool unbind() { return bind (0); } - /*Image createImage() - { - Image im; - - if (ok) - { - bind(); - - im = Image (Image::ARGB, width, height, true); - Image::BitmapData data (im, Image::BitmapData::writeOnly); - - glReadPixels (0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data.data); - - unbind(); - } - - return im; - }*/ - const int width, height; GLuint textureID, frameBufferHandle, depthOrStencilBuffer; bool hasDepthBuffer, hasStencilBuffer, ok; @@ -298,10 +278,9 @@ int OpenGLFrameBuffer::getWidth() const noexcept { return pimpl != nu int OpenGLFrameBuffer::getHeight() const noexcept { return pimpl != nullptr ? pimpl->height : 0; } GLuint OpenGLFrameBuffer::getTextureID() const noexcept { return pimpl != nullptr ? pimpl->textureID : 0; } -void OpenGLFrameBuffer::makeCurrentTarget() +bool OpenGLFrameBuffer::makeCurrentTarget() { - if (pimpl != nullptr) - pimpl->bind(); + return pimpl != nullptr && pimpl->bind(); } void OpenGLFrameBuffer::releaseCurrentTarget() @@ -310,4 +289,13 @@ void OpenGLFrameBuffer::releaseCurrentTarget() pimpl->unbind(); } +void OpenGLFrameBuffer::clear (const Colour& colour) +{ + if (makeCurrentTarget()) + { + OpenGLHelpers::clear (colour); + releaseCurrentTarget(); + } +} + END_JUCE_NAMESPACE diff --git a/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h b/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h index 9965d41b73..71b270638b 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h +++ b/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h @@ -66,11 +66,13 @@ public: //============================================================================== /** Selects this buffer as the current OpenGL rendering target. */ - void makeCurrentTarget(); + bool makeCurrentTarget(); /** Deselects this buffer as the current OpenGL rendering target. */ void releaseCurrentTarget(); + void clear (const Colour& colour); + private: class Pimpl; friend class ScopedPointer;