| @@ -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 | |||