| 
							- /*
 -  * 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"
 - 
 - #if defined(CARLA_OS_WIN) && defined(BUILDING_CARLA_FOR_WINDOWS)
 - # define PLUGIN_BRIDGE_NAMEPREFIX_AUDIO_POOL    "Global\\carla-bridge_shm_ap_"
 - # define PLUGIN_BRIDGE_NAMEPREFIX_RT_CLIENT     "Global\\carla-bridge_shm_rtC_"
 - # define PLUGIN_BRIDGE_NAMEPREFIX_NON_RT_CLIENT "Global\\carla-bridge_shm_nonrtC_"
 - # define PLUGIN_BRIDGE_NAMEPREFIX_NON_RT_SERVER "Global\\carla-bridge_shm_nonrtS_"
 - #else
 - # define PLUGIN_BRIDGE_NAMEPREFIX_AUDIO_POOL    "/crlbrdg_shm_ap_"
 - # define PLUGIN_BRIDGE_NAMEPREFIX_RT_CLIENT     "/crlbrdg_shm_rtC_"
 - # define PLUGIN_BRIDGE_NAMEPREFIX_NON_RT_CLIENT "/crlbrdg_shm_nonrtC_"
 - # define PLUGIN_BRIDGE_NAMEPREFIX_NON_RT_SERVER "/crlbrdg_shm_nonrtS_"
 - #endif
 - 
 - // -----------------------------------------------------------------------
 - 
 - // Server sends these to client during RT
 - enum PluginBridgeRtClientOpcode {
 -     kPluginBridgeRtClientNull = 0,
 -     kPluginBridgeRtClientSetAudioPool,            // ulong/ptr
 -     kPluginBridgeRtClientControlEventParameter,   // uint/frame, byte/chan, ushort, float
 -     kPluginBridgeRtClientControlEventMidiBank,    // uint/frame, byte/chan, ushort
 -     kPluginBridgeRtClientControlEventMidiProgram, // uint/frame, byte/chan, ushort
 -     kPluginBridgeRtClientControlEventAllSoundOff, // uint/frame, byte/chan
 -     kPluginBridgeRtClientControlEventAllNotesOff, // uint/frame, byte/chan
 -     kPluginBridgeRtClientMidiEvent,               // uint/frame, byte/port, byte/size, byte[]/data
 -     kPluginBridgeRtClientProcess,
 -     kPluginBridgeRtClientQuit
 - };
 - 
 - // Server sends these to client during non-RT
 - enum PluginBridgeNonRtClientOpcode {
 -     kPluginBridgeNonRtClientNull = 0,
 -     kPluginBridgeNonRtClientPing,
 -     kPluginBridgeNonRtClientPingOnOff,               // bool
 -     kPluginBridgeNonRtClientActivate,
 -     kPluginBridgeNonRtClientDeactivate,
 -     kPluginBridgeNonRtClientSetBufferSize,           // uint
 -     kPluginBridgeNonRtClientSetSampleRate,           // double
 -     kPluginBridgeNonRtClientSetOffline,
 -     kPluginBridgeNonRtClientSetOnline,
 -     kPluginBridgeNonRtClientSetParameterValue,       // uint, float
 -     kPluginBridgeNonRtClientSetParameterMidiChannel, // uint, byte
 -     kPluginBridgeNonRtClientSetParameterMidiCC,      // uint, short
 -     kPluginBridgeNonRtClientSetProgram,              // int
 -     kPluginBridgeNonRtClientSetMidiProgram,          // int
 -     kPluginBridgeNonRtClientSetCustomData,           // uint/size, str[], uint/size, str[], uint/size, str[]
 -     kPluginBridgeNonRtClientSetChunkDataFile,        // uint/size, str[] (filename, base64 content)
 -     kPluginBridgeNonRtClientSetCtrlChannel,          // short
 -     kPluginBridgeNonRtClientSetOption,               // uint/option, bool
 -     kPluginBridgeNonRtClientPrepareForSave,
 -     kPluginBridgeNonRtClientShowUI,
 -     kPluginBridgeNonRtClientHideUI,
 -     kPluginBridgeNonRtClientUiParameterChange,       // uint, float
 -     kPluginBridgeNonRtClientUiProgramChange,         // uint
 -     kPluginBridgeNonRtClientUiMidiProgramChange,     // uint
 -     kPluginBridgeNonRtClientUiNoteOn,                // byte, byte, byte
 -     kPluginBridgeNonRtClientUiNoteOff,               // byte, byte
 -     kPluginBridgeNonRtClientQuit
 - };
 - 
 - // Client sends these to server during non-RT
 - enum PluginBridgeNonRtServerOpcode {
 -     kPluginBridgeNonRtServerNull = 0,
 -     kPluginBridgeNonRtServerPong,
 -     kPluginBridgeNonRtServerPluginInfo1,        // uint/category, uint/hints, uint/optionsAvailable, uint/optionsEnabled, long/uniqueId
 -     kPluginBridgeNonRtServerPluginInfo2,        // uint/size, str[] (realName), uint/size, str[] (label), uint/size, str[] (maker), uint/size, str[] (copyright)
 -     kPluginBridgeNonRtServerAudioCount,         // uint/ins, uint/outs
 -     kPluginBridgeNonRtServerMidiCount,          // uint/ins, uint/outs
 -     kPluginBridgeNonRtServerCvCount,            // uint/ins, uint/outs
 -     kPluginBridgeNonRtServerParameterCount,     // uint/count
 -     kPluginBridgeNonRtServerProgramCount,       // uint/count
 -     kPluginBridgeNonRtServerMidiProgramCount,   // uint/count
 -     kPluginBridgeNonRtServerPortName,           // byte/type, uint/index, uint/size, str[] (name)
 -     kPluginBridgeNonRtServerParameterData1,     // uint/index, int/rindex, uint/type, uint/hints, short/cc
 -     kPluginBridgeNonRtServerParameterData2,     // uint/index, uint/size, str[] (name), uint/size, str[] (symbol), uint/size, str[] (unit)
 -     kPluginBridgeNonRtServerParameterRanges,    // uint/index, float/def, float/min, float/max, float/step, float/stepSmall, float/stepLarge
 -     kPluginBridgeNonRtServerParameterValue,     // uint/index, float/value
 -     kPluginBridgeNonRtServerParameterValue2,    // uint/index, float/value (used for init/output parameters only, don't resend values)
 -     kPluginBridgeNonRtServerDefaultValue,       // uint/index, float/value
 -     kPluginBridgeNonRtServerCurrentProgram,     // int/index
 -     kPluginBridgeNonRtServerCurrentMidiProgram, // int/index
 -     kPluginBridgeNonRtServerProgramName,        // uint/index, uint/size, str[] (name)
 -     kPluginBridgeNonRtServerMidiProgramData,    // uint/index, uint/bank, uint/program, uint/size, str[] (name)
 -     kPluginBridgeNonRtServerSetCustomData,      // uint/size, str[], uint/size, str[], uint/size, str[]
 -     kPluginBridgeNonRtServerSetChunkDataFile,   // uint/size, str[] (filename, base64 content)
 -     kPluginBridgeNonRtServerSetLatency,         // uint
 -     kPluginBridgeNonRtServerReady,
 -     kPluginBridgeNonRtServerSaved,
 -     kPluginBridgeNonRtServerUiClosed,
 -     kPluginBridgeNonRtServerError               // uint/size, str[]
 - };
 - 
 - // used for kPluginBridgeNonRtServerPortName
 - enum PluginBridgePortType {
 -     kPluginBridgePortNull = 0,
 -     kPluginBridgePortAudioInput,
 -     kPluginBridgePortAudioOutput,
 -     kPluginBridgePortCvInput,
 -     kPluginBridgePortCvOutput,
 -     kPluginBridgePortMidiInput,
 -     kPluginBridgePortMidiOutput,
 -     kPluginBridgePortTypeCount
 - };
 - 
 - // -----------------------------------------------------------------------
 - 
 - 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;
 - };
 - 
 - // -----------------------------------------------------------------------
 - 
 - static const std::size_t kBridgeRtClientDataMidiOutSize = 512*4;
 - 
 - // Server => Client RT
 - struct BridgeRtClientData {
 -     BridgeSemaphore sem;
 -     BridgeTimeInfo timeInfo;
 -     SmallStackBuffer ringBuffer;
 -     uint8_t midiOut[kBridgeRtClientDataMidiOutSize];
 - };
 - 
 - // Server => Client Non-RT
 - struct BridgeNonRtClientData {
 -     BigStackBuffer ringBuffer;
 - };
 - 
 - // Client => Server Non-RT
 - struct BridgeNonRtServerData {
 -     HugeStackBuffer ringBuffer;
 - };
 - 
 - // -----------------------------------------------------------------------
 - 
 - static inline
 - const char* PluginBridgeRtClientOpcode2str(const PluginBridgeRtClientOpcode opcode) noexcept
 - {
 -     switch (opcode)
 -     {
 -     case kPluginBridgeRtClientNull:
 -         return "kPluginBridgeRtClientNull";
 -     case kPluginBridgeRtClientSetAudioPool:
 -         return "kPluginBridgeRtClientSetAudioPool";
 -     case kPluginBridgeRtClientControlEventParameter:
 -         return "kPluginBridgeRtClientControlEventParameter";
 -     case kPluginBridgeRtClientControlEventMidiBank:
 -         return "kPluginBridgeRtClientControlEventMidiBank";
 -     case kPluginBridgeRtClientControlEventMidiProgram:
 -         return "kPluginBridgeRtClientControlEventMidiProgram";
 -     case kPluginBridgeRtClientControlEventAllSoundOff:
 -         return "kPluginBridgeRtClientControlEventAllSoundOff";
 -     case kPluginBridgeRtClientControlEventAllNotesOff:
 -         return "kPluginBridgeRtClientControlEventAllNotesOff";
 -     case kPluginBridgeRtClientMidiEvent:
 -         return "kPluginBridgeRtClientMidiEvent";
 -     case kPluginBridgeRtClientProcess:
 -         return "kPluginBridgeRtClientProcess";
 -     case kPluginBridgeRtClientQuit:
 -         return "kPluginBridgeRtClientQuit";
 -     }
 - 
 -     carla_stderr("CarlaBackend::PluginBridgeRtClientOpcode2str(%i) - invalid opcode", opcode);
 -     return nullptr;
 - }
 - 
 - static inline
 - const char* PluginBridgeNonRtClientOpcode2str(const PluginBridgeNonRtClientOpcode opcode) noexcept
 - {
 -     switch (opcode)
 -     {
 -     case kPluginBridgeNonRtClientNull:
 -         return "kPluginBridgeNonRtClientNull";
 -     case kPluginBridgeNonRtClientPing:
 -         return "kPluginBridgeNonRtClientPing";
 -     case kPluginBridgeNonRtClientPingOnOff:
 -         return "kPluginBridgeNonRtClientPingOnOff";
 -     case kPluginBridgeNonRtClientActivate:
 -         return "kPluginBridgeNonRtClientActivate";
 -     case kPluginBridgeNonRtClientDeactivate:
 -         return "kPluginBridgeNonRtClientDeactivate";
 -     case kPluginBridgeNonRtClientSetBufferSize:
 -         return "kPluginBridgeNonRtClientSetBufferSize";
 -     case kPluginBridgeNonRtClientSetSampleRate:
 -         return "kPluginBridgeNonRtClientSetSampleRate";
 -     case kPluginBridgeNonRtClientSetOffline:
 -         return "kPluginBridgeNonRtClientSetOffline";
 -     case kPluginBridgeNonRtClientSetOnline:
 -         return "kPluginBridgeNonRtClientSetOnline";
 -     case kPluginBridgeNonRtClientSetParameterValue:
 -         return "kPluginBridgeNonRtClientSetParameterValue";
 -     case kPluginBridgeNonRtClientSetParameterMidiChannel:
 -         return "kPluginBridgeNonRtClientSetParameterMidiChannel";
 -     case kPluginBridgeNonRtClientSetParameterMidiCC:
 -         return "kPluginBridgeNonRtClientSetParameterMidiCC";
 -     case kPluginBridgeNonRtClientSetProgram:
 -         return "kPluginBridgeNonRtClientSetProgram";
 -     case kPluginBridgeNonRtClientSetMidiProgram:
 -         return "kPluginBridgeNonRtClientSetMidiProgram";
 -     case kPluginBridgeNonRtClientSetCustomData:
 -         return "kPluginBridgeNonRtClientSetCustomData";
 -     case kPluginBridgeNonRtClientSetChunkDataFile:
 -         return "kPluginBridgeNonRtClientSetChunkDataFile";
 -     case kPluginBridgeNonRtClientSetCtrlChannel:
 -         return "kPluginBridgeNonRtClientSetCtrlChannel";
 -     case kPluginBridgeNonRtClientSetOption:
 -         return "kPluginBridgeNonRtClientSetOption";
 -     case kPluginBridgeNonRtClientPrepareForSave:
 -         return "kPluginBridgeNonRtClientPrepareForSave";
 -     case kPluginBridgeNonRtClientShowUI:
 -         return "kPluginBridgeNonRtClientShowUI";
 -     case kPluginBridgeNonRtClientHideUI:
 -         return "kPluginBridgeNonRtClientHideUI";
 -     case kPluginBridgeNonRtClientUiParameterChange:
 -         return "kPluginBridgeNonRtClientUiParameterChange";
 -     case kPluginBridgeNonRtClientUiProgramChange:
 -         return "kPluginBridgeNonRtClientUiProgramChange";
 -     case kPluginBridgeNonRtClientUiMidiProgramChange:
 -         return "kPluginBridgeNonRtClientUiMidiProgramChange";
 -     case kPluginBridgeNonRtClientUiNoteOn:
 -         return "kPluginBridgeNonRtClientUiNoteOn";
 -     case kPluginBridgeNonRtClientUiNoteOff:
 -         return "kPluginBridgeNonRtClientUiNoteOff";
 -     case kPluginBridgeNonRtClientQuit:
 -         return "kPluginBridgeNonRtClientQuit";
 -     }
 - 
 -     carla_stderr("CarlaBackend::PluginBridgeNonRtClientOpcode2str(%i) - invalid opcode", opcode);
 -     return nullptr;
 - }
 - 
 - static inline
 - const char* PluginBridgeNonRtServerOpcode2str(const PluginBridgeNonRtServerOpcode opcode) noexcept
 - {
 -     switch (opcode)
 -     {
 -     case kPluginBridgeNonRtServerNull:
 -         return "kPluginBridgeNonRtServerNull";
 -     case kPluginBridgeNonRtServerPong:
 -         return "kPluginBridgeNonRtServerPong";
 -     case kPluginBridgeNonRtServerPluginInfo1:
 -         return "kPluginBridgeNonRtServerPluginInfo1";
 -     case kPluginBridgeNonRtServerPluginInfo2:
 -         return "kPluginBridgeNonRtServerPluginInfo2";
 -     case kPluginBridgeNonRtServerAudioCount:
 -         return "kPluginBridgeNonRtServerAudioCount";
 -     case kPluginBridgeNonRtServerMidiCount:
 -         return "kPluginBridgeNonRtServerMidiCount";
 -     case kPluginBridgeNonRtServerCvCount:
 -         return "kPluginBridgeNonRtServerCvCount";
 -     case kPluginBridgeNonRtServerParameterCount:
 -         return "kPluginBridgeNonRtServerParameterCount";
 -     case kPluginBridgeNonRtServerProgramCount:
 -         return "kPluginBridgeNonRtServerProgramCount";
 -     case kPluginBridgeNonRtServerMidiProgramCount:
 -         return "kPluginBridgeNonRtServerMidiProgramCount";
 -     case kPluginBridgeNonRtServerPortName:
 -         return "kPluginBridgeNonRtServerPortName";
 -     case kPluginBridgeNonRtServerParameterData1:
 -         return "kPluginBridgeNonRtServerParameterData1";
 -     case kPluginBridgeNonRtServerParameterData2:
 -         return "kPluginBridgeNonRtServerParameterData2";
 -     case kPluginBridgeNonRtServerParameterRanges:
 -         return "kPluginBridgeNonRtServerParameterRanges";
 -     case kPluginBridgeNonRtServerParameterValue:
 -         return "kPluginBridgeNonRtServerParameterValue";
 -     case kPluginBridgeNonRtServerParameterValue2:
 -         return "kPluginBridgeNonRtServerParameterValue2";
 -     case kPluginBridgeNonRtServerDefaultValue:
 -         return "kPluginBridgeNonRtServerDefaultValue";
 -     case kPluginBridgeNonRtServerCurrentProgram:
 -         return "kPluginBridgeNonRtServerCurrentProgram";
 -     case kPluginBridgeNonRtServerCurrentMidiProgram:
 -         return "kPluginBridgeNonRtServerCurrentMidiProgram";
 -     case kPluginBridgeNonRtServerProgramName:
 -         return "kPluginBridgeNonRtServerProgramName";
 -     case kPluginBridgeNonRtServerMidiProgramData:
 -         return "kPluginBridgeNonRtServerMidiProgramData";
 -     case kPluginBridgeNonRtServerSetCustomData:
 -         return "kPluginBridgeNonRtServerSetCustomData";
 -     case kPluginBridgeNonRtServerSetChunkDataFile:
 -         return "kPluginBridgeNonRtServerSetChunkDataFile";
 -     case kPluginBridgeNonRtServerSetLatency:
 -         return "kPluginBridgeNonRtServerSetLatency";
 -     case kPluginBridgeNonRtServerReady:
 -         return "kPluginBridgeNonRtServerReady";
 -     case kPluginBridgeNonRtServerSaved:
 -         return "kPluginBridgeNonRtServerSaved";
 -     case kPluginBridgeNonRtServerUiClosed:
 -         return "kPluginBridgeNonRtServerUiClosed";
 -     case kPluginBridgeNonRtServerError:
 -         return "kPluginBridgeNonRtServerError";
 -     }
 - 
 -     carla_stderr("CarlaBackend::PluginBridgeNonRtServerOpcode2str%i) - invalid opcode", opcode);
 -     return nullptr;
 - }
 - 
 - // -----------------------------------------------------------------------
 - 
 - #endif // CARLA_BRIDGE_UTILS_HPP_INCLUDED
 
 
  |