Browse Source

Add new NativePluginAndUiClass code file

tags/1.9.4
falkTX 11 years ago
parent
commit
ef349c4920
1 changed files with 194 additions and 0 deletions
  1. +194
    -0
      source/modules/CarlaNativeExtUI.hpp

+ 194
- 0
source/modules/CarlaNativeExtUI.hpp View File

@@ -0,0 +1,194 @@
/*
* Carla Native Plugin API (C++)
* Copyright (C) 2012-2014 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_NATIVE_EXTERNAL_UI_HPP_INCLUDED
#define CARLA_NATIVE_EXTERNAL_UI_HPP_INCLUDED

#include "CarlaNative.hpp"

#include "CarlaExternalUI.hpp"

/*!
* @defgroup CarlaNativeAPI Carla Native API
* @{
*/

// -----------------------------------------------------------------------
// Native Plugin and External UI class

class NativePluginAndUiClass : public NativePluginClass,
public CarlaExternalUI
{
public:
NativePluginAndUiClass(const NativeHostDescriptor* const host, const char* const extUiPath)
: NativePluginClass(host),
fExtUiPath(extUiPath)
{
}

~NativePluginAndUiClass() override
{
}

protected:
// -------------------------------------------------------------------
// Plugin UI calls

void uiShow(const bool show) override
{
if (show)
{
CarlaString path(getResourceDir() + fExtUiPath);
carla_stdout("Trying to start UI using \"%s\"", path.getBuffer());

CarlaExternalUI::setData(path.getBuffer(), getSampleRate(), getUiName());
CarlaExternalUI::start();
}
else
{
CarlaExternalUI::stop();
}
}

void uiIdle() override
{
CarlaExternalUI::idle();

if (! CarlaExternalUI::isOk())
return;

switch (CarlaExternalUI::getAndResetUiState())
{
case CarlaExternalUI::UiNone:
case CarlaExternalUI::UiShow:
break;
case CarlaExternalUI::UiCrashed:
hostUiUnavailable();
break;
case CarlaExternalUI::UiHide:
uiClosed();
break;
}
}

void uiSetParameterValue(const uint32_t index, const float value) override
{
CARLA_SAFE_ASSERT_RETURN(index < getParameterCount(),);

char tmpBuf[0xff+1];

writeMsg("control\n", 8);
std::sprintf(tmpBuf, "%i\n", index);
writeAndFixMsg(tmpBuf);
std::sprintf(tmpBuf, "%f\n", value);
writeAndFixMsg(tmpBuf);
}

void uiSetMidiProgram(const uint8_t channel, const uint32_t bank, const uint32_t program) override
{
CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,);

char tmpBuf[0xff+1];

writeMsg("program\n", 8);
std::sprintf(tmpBuf, "%i\n", channel);
writeAndFixMsg(tmpBuf);
std::sprintf(tmpBuf, "%i\n", bank);
writeAndFixMsg(tmpBuf);
std::sprintf(tmpBuf, "%i\n", program);
writeAndFixMsg(tmpBuf);
}

void uiSetCustomData(const char* const key, const char* const value) override
{
CARLA_SAFE_ASSERT_RETURN(key != nullptr,);
CARLA_SAFE_ASSERT_RETURN(value != nullptr,);

writeMsg("configure\n", 10);
writeAndFixMsg(key);
writeAndFixMsg(value);
}

// -------------------------------------------------------------------
// Pipe Server calls

bool msgReceived(const char* const msg) override
{
if (CarlaExternalUI::msgReceived(msg))
return true;

if (std::strcmp(msg, "control") == 0)
{
uint32_t param;
float value;

CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(param), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true);

uiParameterChanged(param, value);
}
else if (std::strcmp(msg, "program") == 0)
{
uint32_t channel, bank, program;

CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(channel), true);;
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(bank), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(program), true);
CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS, true);

uiMidiProgramChanged(channel, bank, program);
}
else if (std::strcmp(msg, "configure") == 0)
{
const char* key;
const char* value;

CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(key), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(value), true);

uiCustomDataChanged(key, value);

delete[] key;
delete[] value;
}
else if (std::strcmp(msg, "exiting") == 0)
{
waitChildClose();
fUiState = UiHide;

uiClosed();
}
else
{
carla_stderr("msgReceived : %s", msg);
return false;
}

return true;
}

private:
CarlaString fExtUiPath;

CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NativePluginAndUiClass)
};

/**@}*/

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

#endif // CARLA_NATIVE_EXTERNAL_UI_HPP_INCLUDED

Loading…
Cancel
Save