Browse Source

More cleanup, move plugin gui stuff to his own header

tags/1.9.4
falkTX 12 years ago
parent
commit
6e9d658686
8 changed files with 224 additions and 182 deletions
  1. +33
    -33
      source/backend/CarlaPlugin.hpp
  2. +1
    -1
      source/backend/engine/CarlaEngineOsc.cpp
  3. +1
    -0
      source/backend/plugin/CarlaPlugin.pro
  4. +72
    -115
      source/backend/plugin/CarlaPluginGui.cpp
  5. +78
    -0
      source/backend/plugin/CarlaPluginGui.hpp
  6. +0
    -18
      source/backend/plugin/CarlaPluginInternal.hpp
  7. +5
    -1
      source/backend/plugin/Makefile
  8. +34
    -14
      source/backend/plugin/VstPlugin.cpp

+ 33
- 33
source/backend/CarlaPlugin.hpp View File

@@ -659,6 +659,11 @@ public:
*/ */
virtual void sampleRateChanged(const double newSampleRate); virtual void sampleRateChanged(const double newSampleRate);


/*!
* Initialize all RT buffers of the plugin.
*/
virtual void initBuffers();

/*! /*!
* TODO. * TODO.
*/ */
@@ -727,6 +732,34 @@ public:
*/ */
void postRtEventsRun(); void postRtEventsRun();


// -------------------------------------------------------------------
// Post-poned UI Stuff

/*!
* Tell the UI a parameter has changed.
*/
virtual void uiParameterChange(const uint32_t index, const float value);

/*!
* Tell the UI the current program has changed.
*/
virtual void uiProgramChange(const uint32_t index);

/*!
* Tell the UI the current midi program has changed.
*/
virtual void uiMidiProgramChange(const uint32_t index);

/*!
* Tell the UI a note has been pressed.
*/
virtual void uiNoteOn(const uint8_t channel, const uint8_t note, const uint8_t velo);

/*!
* Tell the UI a note has been released.
*/
virtual void uiNoteOff(const uint8_t channel, const uint8_t note);

// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Plugin initializers // Plugin initializers


@@ -768,42 +801,9 @@ protected:
friend struct CarlaPluginProtectedData; friend struct CarlaPluginProtectedData;
CarlaPluginProtectedData* const kData; //!< Internal data, for CarlaPlugin subclasses only. CarlaPluginProtectedData* const kData; //!< Internal data, for CarlaPlugin subclasses only.


// -------------------------------------------------------------------
// Post-poned UI Stuff

/*!
* Tell the UI a parameter has changed.
*/
virtual void uiParameterChange(const uint32_t index, const float value);

/*!
* Tell the UI the current program has changed.
*/
virtual void uiProgramChange(const uint32_t index);

/*!
* Tell the UI the current midi program has changed.
*/
virtual void uiMidiProgramChange(const uint32_t index);

/*!
* Tell the UI a note has been pressed.
*/
virtual void uiNoteOn(const uint8_t channel, const uint8_t note, const uint8_t velo);

/*!
* Tell the UI a note has been released.
*/
virtual void uiNoteOff(const uint8_t channel, const uint8_t note);

// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Cleanup // Cleanup


/*!
* Initialize all RT buffers of the plugin.
*/
virtual void initBuffers();

/*! /*!
* Delete all temporary buffers of the plugin. * Delete all temporary buffers of the plugin.
*/ */


+ 1
- 1
source/backend/engine/CarlaEngineOsc.cpp View File

@@ -477,7 +477,7 @@ int CarlaEngineOsc::handleMsgControl(CARLA_ENGINE_OSC_HANDLE_ARGS2)
const int32_t rindex = argv[0]->i; const int32_t rindex = argv[0]->i;
const float value = argv[1]->f; const float value = argv[1]->f;


plugin->setParameterValueByRIndex(rindex, value, false, true, true);
plugin->setParameterValueByRealIndex(rindex, value, false, true, true);


return 0; return 0;
} }


+ 1
- 0
source/backend/plugin/CarlaPlugin.pro View File

@@ -59,6 +59,7 @@ SOURCES = \


HEADERS = \ HEADERS = \
CarlaPluginInternal.hpp \ CarlaPluginInternal.hpp \
CarlaPluginGui.hpp \
CarlaPluginThread.hpp CarlaPluginThread.hpp


HEADERS += \ HEADERS += \


+ 72
- 115
source/backend/plugin/CarlaPluginGui.cpp View File

@@ -15,10 +15,7 @@
* For a full copy of the GNU General Public License see the GPL.txt file * For a full copy of the GNU General Public License see the GPL.txt file
*/ */


#include "CarlaPluginInternal.hpp"

#include <QtGui/QMainWindow>
#include <QtGui/QCloseEvent>
#include "CarlaPluginGui.hpp"


#ifdef Q_WS_X11 #ifdef Q_WS_X11
# include <QtGui/QX11EmbedContainer> # include <QtGui/QX11EmbedContainer>
@@ -26,173 +23,133 @@


CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


#include "moc_CarlaPluginGui.cpp"

// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Engine Helpers, defined in CarlaEngine.cpp // Engine Helpers, defined in CarlaEngine.cpp


extern QMainWindow* getEngineHostWindow(CarlaEngine* const engine); extern QMainWindow* getEngineHostWindow(CarlaEngine* const engine);


class CarlaPluginGUI : public QMainWindow
{
public:
class Callback
{
public:
virtual ~Callback() {}
virtual void guiClosedCallback() = 0;
};

CarlaPluginGUI(CarlaEngine* const engine, Callback* const callback);
~CarlaPluginGUI();

void idle();
void resizeLater(int width, int height);

// Parent UIs
void* getContainerWinId();
void closeContainer();

// Qt4 UIs, TODO

protected:
void closeEvent(QCloseEvent* const event);

private:
Callback* const kCallback;
QWidget* fContainer;

int fNextWidth;
int fNextHeight;

CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginGUI)
};

// ------------------------------------------------------------------- // -------------------------------------------------------------------
// CarlaPluginGUI // CarlaPluginGUI


CarlaPluginGUI::CarlaPluginGUI(CarlaEngine* const engine, Callback* const callback)
CarlaPluginGui::CarlaPluginGui(CarlaEngine* const engine, Callback* const callback, const Options& options)
: QMainWindow(getEngineHostWindow(engine)), : QMainWindow(getEngineHostWindow(engine)),
kCallback(callback), kCallback(callback),
fContainer(nullptr), fContainer(nullptr),
fNextWidth(0),
fNextHeight(0)
fOptions(options)
{ {
CARLA_ASSERT(callback != nullptr); CARLA_ASSERT(callback != nullptr);
carla_debug("CarlaPluginGUI::CarlaPluginGUI(%p, %p)", engine, callback);
}
carla_debug("CarlaPluginGui::CarlaPluginGui(%p, %p)", engine, callback);


CarlaPluginGUI::~CarlaPluginGUI()
{
carla_debug("CarlaPluginGUI::~CarlaPluginGUI()");
if (options.parented)
{
#ifdef Q_WS_X11
fContainer = new QX11EmbedContainer(this);
#else
fContainer = new QWidget(this);
#endif
setCentralWidget(fContainer);
}

#ifdef Q_OS_WIN
if (! options.resizable)
setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint);
#endif


closeContainer();
connect(this, SIGNAL(setSizeSafeSignal(int,int)), SLOT(setSizeSafeSlot(int,int)));
} }


void CarlaPluginGUI::idle()
CarlaPluginGui::~CarlaPluginGui()
{ {
if (fNextWidth > 0 && fNextHeight > 0)
carla_debug("CarlaPluginGui::~CarlaPluginGui()");

if (fOptions.parented)
{ {
setFixedSize(fNextWidth, fNextHeight);
fNextWidth = 0;
fNextHeight = 0;
CARLA_ASSERT(fContainer != nullptr);
#ifdef Q_WS_X11
delete (QX11EmbedContainer*)fContainer;
#else
delete fContainer;
#endif
}
else
{
CARLA_ASSERT(fContainer == nullptr);
} }
} }


void CarlaPluginGUI::resizeLater(int width, int height)
void CarlaPluginGui::setSize(const int width, const int height)
{ {
CARLA_ASSERT_INT(width > 0, width); CARLA_ASSERT_INT(width > 0, width);
CARLA_ASSERT_INT(height > 0, height); CARLA_ASSERT_INT(height > 0, height);
carla_debug("CarlaPluginGui::setSize(%i, %i)", width, height);


if (width <= 0) if (width <= 0)
return; return;
if (height <= 0) if (height <= 0)
return; return;


fNextWidth = width;
fNextHeight = height;
emit setSizeSafeSignal(width, height);
} }


void* CarlaPluginGUI::getContainerWinId()
void* CarlaPluginGui::getContainerWinId()
{ {
carla_debug("CarlaPluginGUI::getContainerWinId()");

if (fContainer == nullptr)
{
#ifdef Q_WS_X11
QX11EmbedContainer* container(new QX11EmbedContainer(this));
#else
QWidget* container(new QWidget(this));
#endif
setCentralWidget(container);
fContainer = container;
}
CARLA_ASSERT(fContainer != nullptr);
carla_debug("CarlaPluginGui::getContainerWinId()");


return (void*)fContainer->winId();
return (fContainer != nullptr) ? (void*)fContainer->winId() : nullptr;
} }


void CarlaPluginGUI::closeContainer()
void CarlaPluginGui::setWidget(QWidget* const widget)
{ {
carla_debug("CarlaPluginGUI::closeContainer()");
CARLA_ASSERT(fContainer == nullptr);
carla_debug("CarlaPluginGui::setWidget(%p)", widget);


if (fContainer != nullptr)
{
#ifdef Q_WS_X11
delete (QX11EmbedContainer*)fContainer;
#else
delete (QWidget*)fContainer;
#endif
fContainer = nullptr;
}
setCentralWidget(widget);
widget->setParent(this);

fContainer = widget;
} }


void CarlaPluginGUI::closeEvent(QCloseEvent* const event)
void CarlaPluginGui::removeWidget()
{ {
carla_debug("CarlaPluginGUI::closeEvent(%p)", event);
CARLA_ASSERT(event != nullptr);

if (event == nullptr)
return;
CARLA_ASSERT(fContainer != nullptr);
carla_debug("CarlaPluginGui::removeWidget()");


if (! event->spontaneous())
{
event->ignore();
if (fContainer == nullptr)
return; return;
}


if (kCallback != nullptr)
kCallback->guiClosedCallback();
fContainer->setParent(nullptr);
setCentralWidget(nullptr);


QMainWindow::closeEvent(event);
fContainer = nullptr;
} }


// -------------------------------------------------------------------
// CarlaPluginGUI

#if 0
void createUiIfNeeded(CarlaPluginGUI::Callback* const callback)
void CarlaPluginGui::closeEvent(QCloseEvent* const event)
{ {
if (gui != nullptr)
return;

gui = new CarlaPluginGUI(engine, callback);
}
CARLA_ASSERT(event != nullptr);
carla_debug("CarlaPluginGui::closeEvent(%p)", event);


void destroyUiIfNeeded()
{
if (gui == nullptr)
if (event == nullptr)
return; return;


gui->close();
delete gui;
gui = nullptr;
if (event->spontaneous() && kCallback != nullptr)
kCallback->guiClosedCallback();

QMainWindow::closeEvent(event);
} }


void resizeUiLater(int width, int height)
void CarlaPluginGui::setSizeSafeSlot(int width, int height)
{ {
if (gui == nullptr)
return;
carla_debug("CarlaPluginGui::setSizeSafeSlot(%i, %i)", width, height);


gui->resizeLater(width, height);
if (fOptions.resizable)
resize(width, height);
else
setFixedSize(width, height);
} }
#endif

// -------------------------------------------------------------------


CARLA_BACKEND_END_NAMESPACE CARLA_BACKEND_END_NAMESPACE

+ 78
- 0
source/backend/plugin/CarlaPluginGui.hpp View File

@@ -0,0 +1,78 @@
/*
* Carla Plugin
* Copyright (C) 2011-2013 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 GPL.txt file
*/

#ifndef __CARLA_PLUGIN_GUI_HPP__
#define __CARLA_PLUGIN_GUI_HPP__

#include "CarlaPluginInternal.hpp"

#include <QtGui/QMainWindow>
#include <QtGui/QCloseEvent>

CARLA_BACKEND_START_NAMESPACE

class CarlaPluginGui : public QMainWindow
{
Q_OBJECT

public:
class Callback
{
public:
virtual ~Callback() {}
virtual void guiClosedCallback() = 0;
};

struct Options {
bool parented;
bool resizable;
};

CarlaPluginGui(CarlaEngine* const engine, Callback* const callback, const Options& options);
~CarlaPluginGui();

void setSize(const int width, const int height);

// Parent UIs
void* getContainerWinId();

// Qt UIs
void setWidget(QWidget* widget);
void removeWidget();

protected:
void closeEvent(QCloseEvent* const event);

private:
Callback* const kCallback;
QWidget* fContainer;
const Options fOptions;

signals:
void setSizeSafeSignal(int, int);

private slots:
void setSizeSafeSlot(int width, int height);

#ifndef MOC_PARSING
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginGui)
#endif
};

CARLA_BACKEND_END_NAMESPACE

#endif // __CARLA_PLUGIN_GUI_HPP__

+ 0
- 18
source/backend/plugin/CarlaPluginInternal.hpp View File

@@ -377,24 +377,12 @@ struct ExternalMidiNote {


class CarlaPluginGui; class CarlaPluginGui;


class CarlaPluginGuiCallback
{
public:
virtual ~CarlaPluginGuiCallback() {}

protected:
virtual void guiClosedCallback() = 0;
};

// -----------------------------------------------------------------------

struct CarlaPluginProtectedData { struct CarlaPluginProtectedData {
CarlaEngine* const engine; CarlaEngine* const engine;
CarlaEngineClient* client; CarlaEngineClient* client;
CarlaPluginGui* gui; CarlaPluginGui* gui;


bool active; bool active;
//bool activeBefore;
bool needsReset; bool needsReset;
void* lib; void* lib;


@@ -524,7 +512,6 @@ struct CarlaPluginProtectedData {
client(nullptr), client(nullptr),
gui(nullptr), gui(nullptr),
active(false), active(false),
//activeBefore(false),
needsReset(false), needsReset(false),
lib(nullptr), lib(nullptr),
ctrlChannel(0), ctrlChannel(0),
@@ -576,11 +563,6 @@ struct CarlaPluginProtectedData {
} }
} }


// defined in CarlaPluginGui.cpp
void createUiIfNeeded(CarlaPluginGuiCallback* const callback);
void destroyUiIfNeeded();
void resizeUiLater(int width, int height);

static CarlaEngine* getEngine(CarlaPlugin* const plugin) static CarlaEngine* getEngine(CarlaPlugin* const plugin)
{ {
return plugin->kData->engine; return plugin->kData->engine;


+ 5
- 1
source/backend/plugin/Makefile View File

@@ -27,6 +27,7 @@ endif


OBJS = \ OBJS = \
CarlaPlugin.cpp.o \ CarlaPlugin.cpp.o \
CarlaPluginGui.cpp.o \
CarlaPluginThread.cpp.o \ CarlaPluginThread.cpp.o \
BridgePlugin.cpp.o \ BridgePlugin.cpp.o \
NativePlugin.cpp.o \ NativePlugin.cpp.o \
@@ -53,9 +54,12 @@ debug:


# -------------------------------------------------------------- # --------------------------------------------------------------


%.cpp.o: %.cpp ../CarlaBackend.hpp ../CarlaEngine.hpp ../CarlaPlugin.hpp CarlaPluginInternal.hpp CarlaPluginThread.hpp
%.cpp.o: %.cpp ../CarlaBackend.hpp ../CarlaEngine.hpp ../CarlaPlugin.hpp CarlaPluginGui.hpp CarlaPluginInternal.hpp CarlaPluginThread.hpp moc_CarlaPluginGui.cpp
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@


moc_%.cpp: %.hpp
$(MOC) $< -DMOC_PARSING -o $@

$(SHARED): $(OBJS) $(SHARED): $(OBJS)
$(CXX) $^ -shared $(LINK_FLAGS) -o $@ $(CXX) $^ -shared $(LINK_FLAGS) -o $@




+ 34
- 14
source/backend/plugin/VstPlugin.cpp View File

@@ -19,6 +19,7 @@


#ifdef WANT_VST #ifdef WANT_VST


#include "CarlaPluginGui.hpp"
#include "CarlaVstUtils.hpp" #include "CarlaVstUtils.hpp"


//#ifdef Q_WS_X11 //#ifdef Q_WS_X11
@@ -38,7 +39,7 @@ const unsigned int PLUGIN_WANTS_MIDI_INPUT = 0x8000; //!< VST Plugin wants
/**@}*/ /**@}*/


class VstPlugin : public CarlaPlugin, class VstPlugin : public CarlaPlugin,
public CarlaPluginGuiCallback
public CarlaPluginGui::Callback
{ {
public: public:
VstPlugin(CarlaEngine* const engine, const unsigned short id) VstPlugin(CarlaEngine* const engine, const unsigned short id)
@@ -360,14 +361,20 @@ public:
{ {
if (yesNo) if (yesNo)
{ {
kData->createUiIfNeeded(this);
if (kData->gui == nullptr)
{
struct CarlaPluginGui::Options guiOptions;
guiOptions.parented = true;
guiOptions.resizable = false;

kData->gui = new CarlaPluginGui(kData->engine, this, guiOptions);
}


int32_t value = 0; int32_t value = 0;
#ifdef Q_WS_X11 #ifdef Q_WS_X11
//value = (intptr_t)QX11Info::display(); //value = (intptr_t)QX11Info::display();
#endif #endif
// TODO!!
void* const ptr = nullptr; //kData->gui->getContainerWinId();
void* const ptr = kData->gui->getContainerWinId();


if (dispatcher(effEditOpen, 0, value, ptr, 0.0f) != 0) if (dispatcher(effEditOpen, 0, value, ptr, 0.0f) != 0)
{ {
@@ -380,18 +387,22 @@ public:
const int16_t width = vstRect->right - vstRect->left; const int16_t width = vstRect->right - vstRect->left;
const int16_t height = vstRect->bottom - vstRect->top; const int16_t height = vstRect->bottom - vstRect->top;


//if (width > 0 && height > 0)
//{
// kData->gui->setFixedSize(width, height);
//}
if (width > 0 && height > 0)
kData->gui->setSize(width, height);
} }


//kData->gui->setWindowTitle(QString("%1 (GUI)").arg((const char*)fName).toUtf8().constData());
//kData->gui->show();
kData->gui->setWindowTitle(QString("%1 (GUI)").arg((const char*)fName).toUtf8().constData());
kData->gui->show();
} }
else else
{ {
kData->destroyUiIfNeeded();
if (kData->gui != nullptr)
{
kData->gui->close();
delete kData->gui;
kData->gui = nullptr;
}

kData->engine->callback(CALLBACK_ERROR, fId, 0, 0, 0.0f, "Plugin refused to open its own UI"); kData->engine->callback(CALLBACK_ERROR, fId, 0, 0, 0.0f, "Plugin refused to open its own UI");
kData->engine->callback(CALLBACK_SHOW_GUI, fId, 0, 0, 0.0f, nullptr); kData->engine->callback(CALLBACK_SHOW_GUI, fId, 0, 0, 0.0f, nullptr);
return; return;
@@ -400,7 +411,13 @@ public:
else else
{ {
dispatcher(effEditClose, 0, 0, nullptr, 0.0f); dispatcher(effEditClose, 0, 0, nullptr, 0.0f);
kData->destroyUiIfNeeded();

if (kData->gui != nullptr)
{
kData->gui->close();
delete kData->gui;
kData->gui = nullptr;
}
} }
} }


@@ -1873,8 +1890,11 @@ protected:
break; break;


case audioMasterSizeWindow: case audioMasterSizeWindow:
kData->resizeUiLater(index, value);
ret = 1;
if (kData->gui != nullptr)
{
kData->gui->setSize(index, value);
ret = 1;
}
break; break;


case audioMasterGetSampleRate: case audioMasterGetSampleRate:


Loading…
Cancel
Save