| @@ -378,8 +378,6 @@ namespace AUHelpers | |||||
| JUCE_AU_PUBLIC "OtherBases/AUEffectBase.h", | JUCE_AU_PUBLIC "OtherBases/AUEffectBase.h", | ||||
| JUCE_AU_PUBLIC "Utility/AUBuffer.cpp", | JUCE_AU_PUBLIC "Utility/AUBuffer.cpp", | ||||
| JUCE_AU_PUBLIC "Utility/AUBuffer.h", | 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/AUInputFormatConverter.h", | ||||
| JUCE_AU_PUBLIC "Utility/AUSilentTimeout.h", | JUCE_AU_PUBLIC "Utility/AUSilentTimeout.h", | ||||
| JUCE_AU_PUBLIC "Utility/AUTimestampGenerator.h", 0 }; | JUCE_AU_PUBLIC "Utility/AUTimestampGenerator.h", 0 }; | ||||
| @@ -96,8 +96,6 @@ static bool recursionCheck = false; | |||||
| static juce::uint32 lastMasterIdleCall = 0; | static juce::uint32 lastMasterIdleCall = 0; | ||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| extern void JUCE_API juce_callAnyTimersSynchronously(); | |||||
| #if JUCE_MAC | #if JUCE_MAC | ||||
| extern void initialiseMac(); | extern void initialiseMac(); | ||||
| extern void* attachComponentToWindowRef (Component* component, void* windowRef); | extern void* attachComponentToWindowRef (Component* component, void* windowRef); | ||||
| @@ -947,7 +945,7 @@ public: | |||||
| recursionCheck = true; | recursionCheck = true; | ||||
| JUCE_AUTORELEASEPOOL | JUCE_AUTORELEASEPOOL | ||||
| juce_callAnyTimersSynchronously(); | |||||
| Timer::callPendingTimersSynchronously(); | |||||
| for (int i = ComponentPeer::getNumPeers(); --i >= 0;) | for (int i = ComponentPeer::getNumPeers(); --i >= 0;) | ||||
| ComponentPeer::getPeer (i)->performAnyPendingRepaintsNow(); | ComponentPeer::getPeer (i)->performAnyPendingRepaintsNow(); | ||||
| @@ -79,9 +79,6 @@ BEGIN_JUCE_NAMESPACE | |||||
| static void _clearfp() {} | static void _clearfp() {} | ||||
| #endif | #endif | ||||
| extern void JUCE_API juce_callAnyTimersSynchronously(); | |||||
| //============================================================================== | //============================================================================== | ||||
| const int fxbVersionNum = 1; | const int fxbVersionNum = 1; | ||||
| @@ -2247,7 +2244,7 @@ VstIntPtr VSTPluginInstance::handleCallback (VstInt32 opcode, VstInt32 index, Vs | |||||
| dispatch (effEditIdle, 0, 0, 0, 0); | dispatch (effEditIdle, 0, 0, 0, 0); | ||||
| #endif | #endif | ||||
| juce_callAnyTimersSynchronously(); | |||||
| Timer::callPendingTimersSynchronously(); | |||||
| handleUpdateNowIfNeeded(); | handleUpdateNowIfNeeded(); | ||||
| @@ -105,6 +105,14 @@ protected: | |||||
| jassert (getReferenceCount() == 0); | 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: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| Atomic <int> refCount; | Atomic <int> refCount; | ||||
| @@ -26,15 +26,15 @@ | |||||
| BEGIN_JUCE_NAMESPACE | 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: | public: | ||||
| typedef CriticalSection LockType; // (mysteriously, using a SpinLock here causes problems on some XP machines..) | typedef CriticalSection LockType; // (mysteriously, using a SpinLock here causes problems on some XP machines..) | ||||
| InternalTimerThread() | |||||
| TimerThread() | |||||
| : Thread ("Juce Timer"), | : Thread ("Juce Timer"), | ||||
| firstTimer (nullptr), | firstTimer (nullptr), | ||||
| callbackNeeded (0) | callbackNeeded (0) | ||||
| @@ -42,7 +42,7 @@ public: | |||||
| triggerAsyncUpdate(); | triggerAsyncUpdate(); | ||||
| } | } | ||||
| ~InternalTimerThread() noexcept | |||||
| ~TimerThread() noexcept | |||||
| { | { | ||||
| stopThread (4000); | stopThread (4000); | ||||
| @@ -158,16 +158,10 @@ public: | |||||
| callTimers(); | callTimers(); | ||||
| } | } | ||||
| static void callAnyTimersSynchronously() | |||||
| { | |||||
| if (InternalTimerThread::instance != nullptr) | |||||
| InternalTimerThread::instance->callTimersSynchronously(); | |||||
| } | |||||
| static inline void add (Timer* const tim) noexcept | static inline void add (Timer* const tim) noexcept | ||||
| { | { | ||||
| if (instance == nullptr) | if (instance == nullptr) | ||||
| instance = new InternalTimerThread(); | |||||
| instance = new TimerThread(); | |||||
| instance->addTimer (tim); | instance->addTimer (tim); | ||||
| } | } | ||||
| @@ -194,10 +188,10 @@ public: | |||||
| } | } | ||||
| } | } | ||||
| private: | |||||
| friend class Timer; | |||||
| static InternalTimerThread* instance; | |||||
| static TimerThread* instance; | |||||
| static LockType lock; | static LockType lock; | ||||
| private: | |||||
| Timer* volatile firstTimer; | Timer* volatile firstTimer; | ||||
| Atomic <int> callbackNeeded; | Atomic <int> callbackNeeded; | ||||
| @@ -302,16 +296,11 @@ private: | |||||
| startThread (7); | 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 | #if JUCE_DEBUG | ||||
| @@ -325,7 +314,7 @@ Timer::Timer() noexcept | |||||
| next (nullptr) | next (nullptr) | ||||
| { | { | ||||
| #if JUCE_DEBUG | #if JUCE_DEBUG | ||||
| const InternalTimerThread::LockType::ScopedLockType sl (InternalTimerThread::lock); | |||||
| const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); | |||||
| activeTimers.add (this); | activeTimers.add (this); | ||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -337,7 +326,7 @@ Timer::Timer (const Timer&) noexcept | |||||
| next (nullptr) | next (nullptr) | ||||
| { | { | ||||
| #if JUCE_DEBUG | #if JUCE_DEBUG | ||||
| const InternalTimerThread::LockType::ScopedLockType sl (InternalTimerThread::lock); | |||||
| const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); | |||||
| activeTimers.add (this); | activeTimers.add (this); | ||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -353,7 +342,7 @@ Timer::~Timer() | |||||
| void Timer::startTimer (const int interval) noexcept | void Timer::startTimer (const int interval) noexcept | ||||
| { | { | ||||
| const InternalTimerThread::LockType::ScopedLockType sl (InternalTimerThread::lock); | |||||
| const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); | |||||
| #if JUCE_DEBUG | #if JUCE_DEBUG | ||||
| // this isn't a valid object! Your timer might be a dangling pointer or something.. | // 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; | countdownMs = interval; | ||||
| periodMs = jmax (1, interval); | periodMs = jmax (1, interval); | ||||
| InternalTimerThread::add (this); | |||||
| TimerThread::add (this); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| InternalTimerThread::resetCounter (this, interval); | |||||
| TimerThread::resetCounter (this, interval); | |||||
| } | } | ||||
| } | } | ||||
| void Timer::stopTimer() noexcept | void Timer::stopTimer() noexcept | ||||
| { | { | ||||
| const InternalTimerThread::LockType::ScopedLockType sl (InternalTimerThread::lock); | |||||
| const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); | |||||
| #if JUCE_DEBUG | #if JUCE_DEBUG | ||||
| // this isn't a valid object! Your timer might be a dangling pointer or something.. | // 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) | if (periodMs > 0) | ||||
| { | { | ||||
| InternalTimerThread::remove (this); | |||||
| TimerThread::remove (this); | |||||
| periodMs = 0; | periodMs = 0; | ||||
| } | } | ||||
| } | } | ||||
| void JUCE_CALLTYPE Timer::callPendingTimersSynchronously() | |||||
| { | |||||
| if (TimerThread::instance != nullptr) | |||||
| TimerThread::instance->callTimersSynchronously(); | |||||
| } | |||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| @@ -26,8 +26,6 @@ | |||||
| #ifndef __JUCE_TIMER_JUCEHEADER__ | #ifndef __JUCE_TIMER_JUCEHEADER__ | ||||
| #define __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: | private: | ||||
| friend class InternalTimerThread; | |||||
| class TimerThread; | |||||
| friend class TimerThread; | |||||
| int countdownMs, periodMs; | int countdownMs, periodMs; | ||||
| Timer* previous; | Timer* previous; | ||||
| Timer* next; | Timer* next; | ||||
| @@ -164,8 +164,7 @@ public: | |||||
| glTexParameterf (textureType, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | glTexParameterf (textureType, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | ||||
| glTexParameterf (textureType, GL_TEXTURE_WRAP_T, 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) | if (wantsDepthBuffer || wantsStencilBuffer) | ||||
| { | { | ||||
| @@ -222,25 +221,6 @@ public: | |||||
| bool bind() { return bind (frameBufferHandle); } | bool bind() { return bind (frameBufferHandle); } | ||||
| bool unbind() { return bind (0); } | 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; | const int width, height; | ||||
| GLuint textureID, frameBufferHandle, depthOrStencilBuffer; | GLuint textureID, frameBufferHandle, depthOrStencilBuffer; | ||||
| bool hasDepthBuffer, hasStencilBuffer, ok; | 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; } | int OpenGLFrameBuffer::getHeight() const noexcept { return pimpl != nullptr ? pimpl->height : 0; } | ||||
| GLuint OpenGLFrameBuffer::getTextureID() const noexcept { return pimpl != nullptr ? pimpl->textureID : 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() | void OpenGLFrameBuffer::releaseCurrentTarget() | ||||
| @@ -310,4 +289,13 @@ void OpenGLFrameBuffer::releaseCurrentTarget() | |||||
| pimpl->unbind(); | pimpl->unbind(); | ||||
| } | } | ||||
| void OpenGLFrameBuffer::clear (const Colour& colour) | |||||
| { | |||||
| if (makeCurrentTarget()) | |||||
| { | |||||
| OpenGLHelpers::clear (colour); | |||||
| releaseCurrentTarget(); | |||||
| } | |||||
| } | |||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| @@ -66,11 +66,13 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Selects this buffer as the current OpenGL rendering target. */ | /** Selects this buffer as the current OpenGL rendering target. */ | ||||
| void makeCurrentTarget(); | |||||
| bool makeCurrentTarget(); | |||||
| /** Deselects this buffer as the current OpenGL rendering target. */ | /** Deselects this buffer as the current OpenGL rendering target. */ | ||||
| void releaseCurrentTarget(); | void releaseCurrentTarget(); | ||||
| void clear (const Colour& colour); | |||||
| private: | private: | ||||
| class Pimpl; | class Pimpl; | ||||
| friend class ScopedPointer<Pimpl>; | friend class ScopedPointer<Pimpl>; | ||||