|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- /*
- * Carla Native Plugins
- * Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * For a full copy of the GNU General Public License see the doc/GPL.txt file.
- */
-
- #ifndef CARLA_ZITA_COMMON_HPP_INCLUDED
- #define CARLA_ZITA_COMMON_HPP_INCLUDED
-
- #include "CarlaMutex.hpp"
- #include "CarlaThread.hpp"
- #include "LinkedList.hpp"
-
- #include <png.h>
- #include <clxclient.h>
-
- #include <cairo/cairo.h>
- #include <cairo/cairo-xlib.h>
-
- #define EV_X11 16
- #define EV_EXIT 31
-
- // -----------------------------------------------------------------------
-
- struct x_cairo_t {
- cairo_t * type;
- cairo_surface_t* surf;
-
- x_cairo_t() noexcept
- : type(nullptr),
- surf(nullptr) {}
-
- ~x_cairo_t()
- {
- cairo_destroy(type);
- cairo_surface_destroy(surf);
- }
-
- void initIfNeeded(X_display* const disp)
- {
- if (surf != nullptr)
- return;
-
- surf = cairo_xlib_surface_create(disp->dpy(), 0, disp->dvi(), 50, 50);
- type = cairo_create(surf);
- }
- };
-
- // -----------------------------------------------------------------------
-
- struct X_handler_Param {
- uint32_t index;
- float value;
- };
-
- typedef LinkedList<X_handler_Param> ParamList;
-
- template<class MainwinType>
- class X_handler_thread : public CarlaThread
- {
- public:
- struct SetValueCallback {
- virtual ~SetValueCallback() {}
- virtual void setParameterValueFromHandlerThread(const uint32_t index, const float value) = 0;
- };
-
- X_handler_thread(SetValueCallback* const cb)
- : CarlaThread("X_handler"),
- fCallback(cb),
- fMutex(),
- fHandler(nullptr),
- fRootwin(nullptr),
- fMainwin(nullptr),
- fClosed(false),
- fParamMutex(),
- fParamChanges() {}
-
- void setupAndRun(X_handler* const h, X_rootwin* const r, MainwinType* const m) noexcept
- {
- const CarlaMutexLocker cml(fMutex);
-
- fHandler = h;
- fRootwin = r;
- fMainwin = m;
-
- startThread();
- }
-
- void stopThread() noexcept
- {
- signalThreadShouldExit();
-
- {
- const CarlaMutexLocker cml(fMutex);
- fHandler = nullptr;
- fRootwin = nullptr;
- fMainwin = nullptr;
- }
-
- CarlaThread::stopThread(1000);
- }
-
- CarlaMutex& getLock() noexcept
- {
- return fMutex;
- }
-
- void setParameterValueLater(const uint32_t index, const float value) noexcept
- {
- const CarlaMutexLocker cml(fParamMutex);
-
- for (ParamList::Itenerator it = fParamChanges.begin(); it.valid(); it.next())
- {
- X_handler_Param& param(it.getValue());
-
- if (param.index != index)
- continue;
-
- param.value = value;
- return;
- }
-
- const X_handler_Param param = { index, value };
- fParamChanges.append(param);
- }
-
- bool wasClosed() noexcept
- {
- if (fClosed)
- {
- fClosed = false;
- return true;
- }
- return false;
- }
-
- private:
- SetValueCallback* const fCallback;
-
- CarlaMutex fMutex;
- X_handler* fHandler;
- X_rootwin* fRootwin;
- MainwinType* fMainwin;
- volatile bool fClosed;
-
- CarlaMutex fParamMutex;
- ParamList fParamChanges;
-
- void run() override
- {
- for (; ! shouldThreadExit();)
- {
- const CarlaMutexLocker cml(fMutex);
-
- CARLA_SAFE_ASSERT_RETURN(fMainwin != nullptr,);
-
- {
- const CarlaMutexLocker cml(fParamMutex);
-
- for (ParamList::Itenerator it = fParamChanges.begin(); it.valid(); it.next())
- {
- const X_handler_Param& param(it.getValue());
- fCallback->setParameterValueFromHandlerThread(param.index, param.value);
- }
-
- fParamChanges.clear();
- }
-
- switch (fMainwin->process())
- {
- case EV_X11:
- fRootwin->handle_event();
- fHandler->next_event();
- break;
- case EV_EXIT:
- fClosed = true;
- fHandler = nullptr;
- fMainwin = nullptr;
- fRootwin = nullptr;
- return;
- case Esync::EV_TIME:
- fRootwin->handle_event();
- break;
- default:
- carla_stdout("custom X11 event for zita plugs");
- break;
- }
- }
- }
- };
-
- // -----------------------------------------------------------------------
-
- #endif // CARLA_ZITA_COMMON_HPP_INCLUDED
|