1 /*
2  * Carla Bridge definitions
3  * Copyright (C) 2013-2020 Filipe Coelho <falktx@falktx.com>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of
8  * the License, or any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * For a full copy of the GNU General Public License see the doc/GPL.txt file.
16  */
17 
18 #ifndef CARLA_BRIDGE_DEFINES_HPP_INCLUDED
19 #define CARLA_BRIDGE_DEFINES_HPP_INCLUDED
20 
21 #include "CarlaDefines.h"
22 
23 // how much backwards compatible we are
24 #define CARLA_PLUGIN_BRIDGE_API_VERSION_MINIMUM 6
25 
26 // current API version, bumped when something is added
27 #define CARLA_PLUGIN_BRIDGE_API_VERSION_CURRENT 8
28 
29 // -------------------------------------------------------------------------------------------------------------------
30 
31 // Server sends these to client during RT
32 enum PluginBridgeRtClientOpcode {
33     kPluginBridgeRtClientNull = 0,
34     kPluginBridgeRtClientSetAudioPool,            // ulong/ptr
35     kPluginBridgeRtClientSetBufferSize,           // uint
36     kPluginBridgeRtClientSetSampleRate,           // double
37     kPluginBridgeRtClientSetOnline,               // bool
38     kPluginBridgeRtClientControlEventParameter,   // uint/frame, byte/chan, ushort, float
39     kPluginBridgeRtClientControlEventMidiBank,    // uint/frame, byte/chan, ushort
40     kPluginBridgeRtClientControlEventMidiProgram, // uint/frame, byte/chan, ushort
41     kPluginBridgeRtClientControlEventAllSoundOff, // uint/frame, byte/chan
42     kPluginBridgeRtClientControlEventAllNotesOff, // uint/frame, byte/chan
43     kPluginBridgeRtClientMidiEvent,               // uint/frame, byte/port, byte/size, byte[]/data
44     kPluginBridgeRtClientProcess,                 // uint/frames
45     kPluginBridgeRtClientQuit
46 };
47 
48 // Server sends these to client during non-RT
49 enum PluginBridgeNonRtClientOpcode {
50     kPluginBridgeNonRtClientNull = 0,
51     kPluginBridgeNonRtClientVersion,                        // uint
52     kPluginBridgeNonRtClientPing,
53     kPluginBridgeNonRtClientPingOnOff,                      // bool
54     kPluginBridgeNonRtClientActivate,
55     kPluginBridgeNonRtClientDeactivate,
56     kPluginBridgeNonRtClientInitialSetup,                   // uint, double
57     kPluginBridgeNonRtClientSetParameterValue,              // uint, float
58     kPluginBridgeNonRtClientSetParameterMidiChannel,        // uint, byte
59     kPluginBridgeNonRtClientSetParameterMappedControlIndex, // uint, short
60     kPluginBridgeNonRtClientSetProgram,                     // int
61     kPluginBridgeNonRtClientSetMidiProgram,                 // int
62     kPluginBridgeNonRtClientSetCustomData,                  // uint/size, str[], uint/size, str[], uint/size, str[]
63     kPluginBridgeNonRtClientSetChunkDataFile,               // uint/size, str[] (filename, base64 content)
64     kPluginBridgeNonRtClientSetCtrlChannel,                 // short
65     kPluginBridgeNonRtClientSetOption,                      // uint/option, bool
66     kPluginBridgeNonRtClientGetParameterText,               // uint
67     kPluginBridgeNonRtClientPrepareForSave,
68     kPluginBridgeNonRtClientRestoreLV2State,
69     kPluginBridgeNonRtClientShowUI,
70     kPluginBridgeNonRtClientHideUI,
71     kPluginBridgeNonRtClientUiParameterChange,              // uint, float
72     kPluginBridgeNonRtClientUiProgramChange,                // uint
73     kPluginBridgeNonRtClientUiMidiProgramChange,            // uint
74     kPluginBridgeNonRtClientUiNoteOn,                       // byte, byte, byte
75     kPluginBridgeNonRtClientUiNoteOff,                      // byte, byte
76     kPluginBridgeNonRtClientQuit,
77     // stuff added in API 7
78     kPluginBridgeNonRtClientSetParameterMappedRange,        // uint, float, float
79     kPluginBridgeNonRtClientSetOptions,                     // uint
80     // stuff added in API 8
81     kPluginBridgeNonRtClientSetWindowTitle,                 // uint/size, str[]
82 };
83 
84 // Client sends these to server during non-RT
85 enum PluginBridgeNonRtServerOpcode {
86     kPluginBridgeNonRtServerNull = 0,
87     kPluginBridgeNonRtServerPong,
88     kPluginBridgeNonRtServerPluginInfo1,        // uint/category, uint/hints, uint/optionsAvailable, uint/optionsEnabled, long/uniqueId
89     kPluginBridgeNonRtServerPluginInfo2,        // uint/size, str[] (realName), uint/size, str[] (label), uint/size, str[] (maker), uint/size, str[] (copyright)
90     kPluginBridgeNonRtServerAudioCount,         // uint/ins, uint/outs
91     kPluginBridgeNonRtServerMidiCount,          // uint/ins, uint/outs
92     kPluginBridgeNonRtServerCvCount,            // uint/ins, uint/outs
93     kPluginBridgeNonRtServerParameterCount,     // uint/count
94     kPluginBridgeNonRtServerProgramCount,       // uint/count
95     kPluginBridgeNonRtServerMidiProgramCount,   // uint/count
96     kPluginBridgeNonRtServerPortName,           // byte/type, uint/index, uint/size, str[] (name)
97     kPluginBridgeNonRtServerParameterData1,     // uint/index, int/rindex, uint/type, uint/hints, short/cc
98     kPluginBridgeNonRtServerParameterData2,     // uint/index, uint/size, str[] (name), uint/size, str[] (symbol), uint/size, str[] (unit)
99     kPluginBridgeNonRtServerParameterRanges,    // uint/index, float/def, float/min, float/max, float/step, float/stepSmall, float/stepLarge
100     kPluginBridgeNonRtServerParameterValue,     // uint/index, float/value
101     kPluginBridgeNonRtServerParameterValue2,    // uint/index, float/value (used for init/output parameters only, don't resend values)
102     kPluginBridgeNonRtServerParameterTouch,     // uint/index, bool/touch
103     kPluginBridgeNonRtServerDefaultValue,       // uint/index, float/value
104     kPluginBridgeNonRtServerCurrentProgram,     // int/index
105     kPluginBridgeNonRtServerCurrentMidiProgram, // int/index
106     kPluginBridgeNonRtServerProgramName,        // uint/index, uint/size, str[] (name)
107     kPluginBridgeNonRtServerMidiProgramData,    // uint/index, uint/bank, uint/program, uint/size, str[] (name)
108     kPluginBridgeNonRtServerSetCustomData,      // uint/size, str[], uint/size, str[], uint/size, str[]
109     kPluginBridgeNonRtServerSetChunkDataFile,   // uint/size, str[] (filename, base64 content)
110     kPluginBridgeNonRtServerSetLatency,         // uint
111     kPluginBridgeNonRtServerSetParameterText,   // uint/index, uint/size, str[] (name)
112     kPluginBridgeNonRtServerReady,
113     kPluginBridgeNonRtServerSaved,
114     kPluginBridgeNonRtServerUiClosed,
115     kPluginBridgeNonRtServerError,              // uint/size, str[]
116     // stuff added in API 7
117     kPluginBridgeNonRtServerVersion             // uint
118 };
119 
120 // used for kPluginBridgeNonRtServerPortName
121 enum PluginBridgePortType {
122     kPluginBridgePortNull = 0,
123     kPluginBridgePortAudioInput,
124     kPluginBridgePortAudioOutput,
125     kPluginBridgePortCvInput,
126     kPluginBridgePortCvOutput,
127     kPluginBridgePortMidiInput,
128     kPluginBridgePortMidiOutput,
129     kPluginBridgePortTypeCount
130 };
131 
132 enum PluginBridgeTimeInfoFlags {
133     kPluginBridgeTimeInfoValidBBT = 0x1
134 };
135 
136 // -------------------------------------------------------------------------------------------------------------------
137 
138 struct BridgeSemaphore {
139     union {
140         void* server;
141         char _padServer[64];
142     };
143     union {
144         void* client;
145         char _padClient[64];
146     };
147 };
148 
149 // NOTE: needs to be 64bit aligned
150 struct BridgeTimeInfo {
151     uint64_t playing;
152     uint64_t frame;
153     uint64_t usecs;
154     uint32_t validFlags;
155     uint32_t unused;
156     // bbt
157     int32_t bar, beat;
158     float beatsPerBar, beatType;
159     double tick, barStartTick, ticksPerBeat, beatsPerMinute;
160 };
161 
162 // -------------------------------------------------------------------------------------------------------------------
163 
164 #endif // CARLA_BRIDGE_DEFINES_HPP_INCLUDED
165