Mercurial > hg > pub > prymula > com
diff DPF-Prymula-audioplugins/dpf/dgl/src/Application.cpp @ 3:84e66ea83026
DPF-Prymula-audioplugins-0.231015-2
author | prymula <prymula76@outlook.com> |
---|---|
date | Mon, 16 Oct 2023 21:53:34 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DPF-Prymula-audioplugins/dpf/dgl/src/Application.cpp Mon Oct 16 21:53:34 2023 +0200 @@ -0,0 +1,112 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com> + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "ApplicationPrivateData.hpp" + +#if defined(__EMSCRIPTEN__) +# include <emscripten/emscripten.h> +#elif defined(DISTRHO_OS_MAC) +# include <CoreFoundation/CoreFoundation.h> +#endif + +START_NAMESPACE_DGL + +// -------------------------------------------------------------------------------------------------------------------- + +#ifdef __EMSCRIPTEN__ +static void app_idle(void* const app) +{ + static_cast<Application*>(app)->idle(); +} +#endif + +Application::Application(const bool isStandalone) + : pData(new PrivateData(isStandalone)) {} + +Application::~Application() +{ + delete pData; +} + +void Application::idle() +{ + pData->idle(0); +} + +void Application::exec(const uint idleTimeInMs) +{ + DISTRHO_SAFE_ASSERT_RETURN(pData->isStandalone,); + +#if defined(__EMSCRIPTEN__) + emscripten_set_main_loop_arg(app_idle, this, 0, true); +#elif defined(DISTRHO_OS_MAC) + const CFTimeInterval idleTimeInSecs = static_cast<CFTimeInterval>(idleTimeInMs) / 1000; + + while (! pData->isQuitting) + { + pData->idle(0); + + if (CFRunLoopRunInMode(kCFRunLoopDefaultMode, idleTimeInSecs, true) == kCFRunLoopRunFinished) + break; + } +#else + while (! pData->isQuitting) + pData->idle(idleTimeInMs); +#endif +} + +void Application::quit() +{ + pData->quit(); +} + +bool Application::isQuitting() const noexcept +{ + return pData->isQuitting || pData->isQuittingInNextCycle; +} + +bool Application::isStandalone() const noexcept +{ + return pData->isStandalone; +} + +double Application::getTime() const +{ + return pData->getTime(); +} + +void Application::addIdleCallback(IdleCallback* const callback) +{ + DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,) + + pData->idleCallbacks.push_back(callback); +} + +void Application::removeIdleCallback(IdleCallback* const callback) +{ + DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,) + + pData->idleCallbacks.remove(callback); +} + +void Application::setClassName(const char* const name) +{ + pData->setClassName(name); +} + +// -------------------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DGL