| 
							- /*
 -  * Carla Bridge utils
 -  * Copyright (C) 2013-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_BRIDGE_UTILS_HPP_INCLUDED
 - #define CARLA_BRIDGE_UTILS_HPP_INCLUDED
 - 
 - #include "CarlaRingBuffer.hpp"
 - 
 - // -----------------------------------------------------------------------
 - 
 - // carla-plugin receives these via osc
 - enum PluginBridgeOscInfoType {
 -     kPluginBridgeOscNull = 0,
 -     kPluginBridgeOscPong,
 -     kPluginBridgeOscPluginInfo1,          // uuuuh => category, hints, optionsAvailable, optionsEnabled, uniqueId
 -     kPluginBridgeOscPluginInfo2,          // ssss  => realName, label, maker, copyright
 -     kPluginBridgeOscAudioCount,           // uu    => ins, outs
 -     kPluginBridgeOscMidiCount,            // uu    => ins, outs
 -     kPluginBridgeOscParameterCount,       // uu    => ins, outs
 -     kPluginBridgeOscProgramCount,         // u     => count
 -     kPluginBridgeOscMidiProgramCount,     // u     => count
 -     kPluginBridgeOscParameterData1,       // uiuui => index, rindex, type, hints, cc
 -     kPluginBridgeOscParameterData2,       // uss   => index, name, unit
 -     kPluginBridgeOscParameterRanges1,     // ufff  => index, def, min, max
 -     kPluginBridgeOscParameterRanges2,     // ufff  => index, step, stepSmall, stepLarge
 -     kPluginBridgeOscParameterValue,       // uf    => index, value
 -     kPluginBridgeOscDefaultValue,         // uf    => index, value
 -     kPluginBridgeOscCurrentProgram,       // i     => index
 -     kPluginBridgeOscCurrentMidiProgram,   // i     => index
 -     kPluginBridgeOscProgramName,          // us    => index, name
 -     kPluginBridgeOscMidiProgramData,      // uuus  => index, bank, program, name
 -     kPluginBridgeOscConfigure,            // ss    => key, value
 -     kPluginBridgeOscSetCustomData,        // sss   => type, key, value
 -     kPluginBridgeOscSetChunkDataFile,     // s     => chunkFile
 -     kPluginBridgeOscLatency,              // u     => value
 -     kPluginBridgeOscReady,
 -     kPluginBridgeOscError
 - };
 - 
 - // carla-plugin sends these during RT
 - enum PluginBridgeRtOpcode {
 -     kPluginBridgeRtNull = 0,
 -     kPluginBridgeRtSetAudioPool,            // ulong/ptr
 -     kPluginBridgeRtSetCVPool,               // ulong/ptr
 -     kPluginBridgeRtControlEventParameter,   // uint/frame, byte/chan, ushort, float
 -     kPluginBridgeRtControlEventMidiBank,    // uint/frame, byte/chan, ushort
 -     kPluginBridgeRtControlEventMidiProgram, // uint/frame, byte/chan, ushort
 -     kPluginBridgeRtControlEventAllSoundOff, // uint/frame, byte/chan
 -     kPluginBridgeRtControlEventAllNotesOff, // uint/frame, byte/chan
 -     kPluginBridgeRtMidiEvent,               // uint/frame, byte/port, byte/size, byte[]/data
 -     kPluginBridgeRtProcess,
 -     kPluginBridgeRtQuit
 - };
 - 
 - // carla-plugin sends these during non-RT
 - enum PluginBridgeNonRtOpcode {
 -     kPluginBridgeNonRtNull = 0,
 -     kPluginBridgeNonRtPing,
 -     kPluginBridgeNonRtActivate,
 -     kPluginBridgeNonRtDeactivate,
 -     kPluginBridgeNonRtSetBufferSize,           // uint
 -     kPluginBridgeNonRtSetSampleRate,           // double
 -     kPluginBridgeNonRtSetOffline,
 -     kPluginBridgeNonRtSetOnline,
 -     kPluginBridgeNonRtSetParameterValue,       // uint, float
 -     kPluginBridgeNonRtSetParameterMidiChannel, // uint, byte
 -     kPluginBridgeNonRtSetParameterMidiCC,      // uint, short
 -     kPluginBridgeNonRtSetProgram,              // int
 -     kPluginBridgeNonRtSetMidiProgram,          // int
 -     kPluginBridgeNonRtSetCustomData,           // uint/size, str[], uint/size, str[], uint/size, str[] TODO plugin
 -     kPluginBridgeNonRtSetChunkDataFile,        // uint/size, str[]/file
 -     kPluginBridgeNonRtSetCtrlChannel,          // short
 -     kPluginBridgeNonRtSetOscURL,               // uint/size, str[]/url
 -     kPluginBridgeNonRtSetOption,               // uint/option, bool
 -     kPluginBridgeNonRtPrepareForSave,
 -     kPluginBridgeNonRtShowUI,
 -     kPluginBridgeNonRtHideUI,
 -     kPluginBridgeNonRtUiParameterChange,       // uint, float
 -     kPluginBridgeNonRtUiProgramChange,         // uint
 -     kPluginBridgeNonRtUiMidiProgramChange,     // uint
 -     kPluginBridgeNonRtUiNoteOn,                // byte, byte, byte
 -     kPluginBridgeNonRtUiNoteOff,               // byte, byte
 -     kPluginBridgeNonRtQuit
 - };
 - 
 - // -----------------------------------------------------------------------
 - 
 - const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host configure, tells host GUI is now hidden
 - const char* const CARLA_BRIDGE_MSG_SAVED    = "CarlaBridgeSaved";   //!< Plugin -> Host configure, tells host state is saved
 - 
 - static const std::size_t kBridgeRtDataMidiOutSize = 512*4;
 - 
 - // -----------------------------------------------------------------------
 - 
 - struct BridgeSemaphore {
 -     union {
 -         void* server;
 -         char _padServer[64];
 -     };
 -     union {
 -         void* client;
 -         char _padClient[64];
 -     };
 - };
 - 
 - // needs to be 64bit aligned
 - struct BridgeTimeInfo {
 -     uint64_t playing;
 -     uint64_t frame;
 -     uint64_t usecs;
 -     uint32_t valid;
 -     // bbt
 -     int32_t bar, beat, tick;
 -     float beatsPerBar, beatType;
 -     double barStartTick, ticksPerBeat, beatsPerMinute;
 - };
 - 
 - struct BridgeRtData {
 -     BridgeSemaphore sem;
 -     BridgeTimeInfo timeInfo;
 -     StackBuffer ringBuffer;
 -     uint8_t midiOut[kBridgeRtDataMidiOutSize];
 - };
 - 
 - struct BridgeNonRtData {
 -     BigStackBuffer ringBuffer;
 - };
 - 
 - // -----------------------------------------------------------------------
 - 
 - static inline
 - const char* PluginBridgeOscInfoType2str(const PluginBridgeOscInfoType type) noexcept
 - {
 -     switch (type)
 -     {
 -     case kPluginBridgeOscNull:
 -         return "kPluginBridgeOscNull";
 -     case kPluginBridgeOscPong:
 -         return "kPluginBridgeOscPong";
 -     case kPluginBridgeOscPluginInfo1:
 -         return "kPluginBridgeOscPluginInfo1";
 -     case kPluginBridgeOscPluginInfo2:
 -         return "kPluginBridgeOscPluginInfo2";
 -     case kPluginBridgeOscAudioCount:
 -         return "kPluginBridgeOscAudioCount";
 -     case kPluginBridgeOscMidiCount:
 -         return "kPluginBridgeOscMidiCount";
 -     case kPluginBridgeOscParameterCount:
 -         return "kPluginBridgeOscParameterCount";
 -     case kPluginBridgeOscProgramCount:
 -         return "kPluginBridgeOscProgramCount";
 -     case kPluginBridgeOscMidiProgramCount:
 -         return "kPluginBridgeOscMidiProgramCount";
 -     case kPluginBridgeOscParameterData1:
 -         return "kPluginBridgeOscParameterData1";
 -     case kPluginBridgeOscParameterData2:
 -         return "kPluginBridgeOscParameterData2";
 -     case kPluginBridgeOscParameterRanges1:
 -         return "kPluginBridgeOscParameterRanges1";
 -     case kPluginBridgeOscParameterRanges2:
 -         return "kPluginBridgeOscParameterRanges2";
 -     case kPluginBridgeOscParameterValue:
 -         return "kPluginBridgeOscParameterValue";
 -     case kPluginBridgeOscDefaultValue:
 -         return "kPluginBridgeOscDefaultValue";
 -     case kPluginBridgeOscCurrentProgram:
 -         return "kPluginBridgeOscCurrentProgram";
 -     case kPluginBridgeOscCurrentMidiProgram:
 -         return "kPluginBridgeOscCurrentMidiProgram";
 -     case kPluginBridgeOscProgramName:
 -         return "kPluginBridgeOscProgramName";
 -     case kPluginBridgeOscMidiProgramData:
 -         return "kPluginBridgeOscMidiProgramData";
 -     case kPluginBridgeOscConfigure:
 -         return "kPluginBridgeOscConfigure";
 -     case kPluginBridgeOscSetCustomData:
 -         return "kPluginBridgeOscSetCustomData";
 -     case kPluginBridgeOscSetChunkDataFile:
 -         return "kPluginBridgeOscSetChunkDataFile";
 -     case kPluginBridgeOscLatency:
 -         return "kPluginBridgeOscLatency";
 -     case kPluginBridgeOscReady:
 -         return "kPluginBridgeOscReady";
 -     case kPluginBridgeOscError:
 -         return "kPluginBridgeOscError";
 -     }
 - 
 -     carla_stderr("CarlaBackend::PluginBridgeOscInfoType2str(%i) - invalid type", type);
 -     return nullptr;
 - }
 - 
 - static inline
 - const char* PluginBridgeRtOpcode2str(const PluginBridgeRtOpcode opcode) noexcept
 - {
 -     switch (opcode)
 -     {
 -     case kPluginBridgeRtNull:
 -         return "kPluginBridgeRtNull";
 -     case kPluginBridgeRtSetAudioPool:
 -         return "kPluginBridgeRtSetAudioPool";
 -     case kPluginBridgeRtSetCVPool:
 -         return "kPluginBridgeRtSetCVPool";
 -     case kPluginBridgeRtControlEventParameter:
 -         return "kPluginBridgeRtControlEventParameter";
 -     case kPluginBridgeRtControlEventMidiBank:
 -         return "kPluginBridgeRtControlEventMidiBank";
 -     case kPluginBridgeRtControlEventMidiProgram:
 -         return "kPluginBridgeRtControlEventMidiProgram";
 -     case kPluginBridgeRtControlEventAllSoundOff:
 -         return "kPluginBridgeRtControlEventAllSoundOff";
 -     case kPluginBridgeRtControlEventAllNotesOff:
 -         return "kPluginBridgeRtControlEventAllNotesOff";
 -     case kPluginBridgeRtMidiEvent:
 -         return "kPluginBridgeRtMidiEvent";
 -     case kPluginBridgeRtProcess:
 -         return "kPluginBridgeRtProcess";
 -     case kPluginBridgeRtQuit:
 -         return "kPluginBridgeRtQuit";
 -     }
 - 
 -     carla_stderr("CarlaBackend::PluginBridgeRtOpcode2str(%i) - invalid opcode", opcode);
 -     return nullptr;
 - }
 - 
 - static inline
 - const char* PluginBridgeNonRtOpcode2str(const PluginBridgeNonRtOpcode opcode) noexcept
 - {
 -     switch (opcode)
 -     {
 -     case kPluginBridgeNonRtNull:
 -         return "kPluginBridgeNonRtNull";
 -     case kPluginBridgeNonRtPing:
 -         return "kPluginBridgeNonRtPing";
 -     case kPluginBridgeNonRtActivate:
 -         return "kPluginBridgeNonRtActivate";
 -     case kPluginBridgeNonRtDeactivate:
 -         return "kPluginBridgeNonRtDeactivate";
 -     case kPluginBridgeNonRtSetBufferSize:
 -         return "kPluginBridgeNonRtSetBufferSize";
 -     case kPluginBridgeNonRtSetSampleRate:
 -         return "kPluginBridgeNonRtSetSampleRate";
 -     case kPluginBridgeNonRtSetOffline:
 -         return "kPluginBridgeNonRtSetOffline";
 -     case kPluginBridgeNonRtSetOnline:
 -         return "kPluginBridgeNonRtSetOnline";
 -     case kPluginBridgeNonRtSetParameterValue:
 -         return "kPluginBridgeNonRtSetParameterValue";
 -     case kPluginBridgeNonRtSetParameterMidiChannel:
 -         return "kPluginBridgeNonRtSetParameterMidiChannel";
 -     case kPluginBridgeNonRtSetParameterMidiCC:
 -         return "kPluginBridgeNonRtSetParameterMidiCC";
 -     case kPluginBridgeNonRtSetProgram:
 -         return "kPluginBridgeNonRtSetProgram";
 -     case kPluginBridgeNonRtSetMidiProgram:
 -         return "kPluginBridgeNonRtSetMidiProgram";
 -     case kPluginBridgeNonRtSetCustomData:
 -         return "kPluginBridgeNonRtSetCustomData";
 -     case kPluginBridgeNonRtSetChunkDataFile:
 -         return "kPluginBridgeNonRtSetChunkDataFile";
 -     case kPluginBridgeNonRtSetCtrlChannel:
 -         return "kPluginBridgeNonRtSetCtrlChannel";
 -     case kPluginBridgeNonRtSetOscURL:
 -         return "kPluginBridgeNonRtSetOscURL";
 -     case kPluginBridgeNonRtSetOption:
 -         return "kPluginBridgeNonRtSetOption";
 -     case kPluginBridgeNonRtPrepareForSave:
 -         return "kPluginBridgeNonRtPrepareForSave";
 -     case kPluginBridgeNonRtShowUI:
 -         return "kPluginBridgeNonRtShowUI";
 -     case kPluginBridgeNonRtHideUI:
 -         return "kPluginBridgeNonRtHideUI";
 -     case kPluginBridgeNonRtUiParameterChange:
 -         return "kPluginBridgeNonRtUiParameterChange";
 -     case kPluginBridgeNonRtUiProgramChange:
 -         return "kPluginBridgeNonRtUiProgramChange";
 -     case kPluginBridgeNonRtUiMidiProgramChange:
 -         return "kPluginBridgeNonRtUiMidiProgramChange";
 -     case kPluginBridgeNonRtUiNoteOn:
 -         return "kPluginBridgeNonRtUiNoteOn";
 -     case kPluginBridgeNonRtUiNoteOff:
 -         return "kPluginBridgeNonRtUiNoteOff";
 -     case kPluginBridgeNonRtQuit:
 -         return "kPluginBridgeNonRtQuit";
 -     }
 - 
 -     carla_stderr("CarlaBackend::PluginBridgeNonRtOpcode2str(%i) - invalid opcode", opcode);
 -     return nullptr;
 - }
 - 
 - // -----------------------------------------------------------------------
 - 
 - #endif // CARLA_BRIDGE_UTILS_HPP_INCLUDED
 
 
  |