File: PluginCommand.h

package info (click to toggle)
pd-vstplugin 0.6.1-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 2,008 kB
  • sloc: cpp: 22,783; lisp: 2,860; makefile: 37; sh: 26
file content (276 lines) | stat: -rw-r--r-- 6,770 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
#pragma once

#include "Interface.h"

namespace vst {

// commands
struct Command {
    static constexpr size_t maxShortStringSize = 11;

    // type
    enum Type {
        // RT commands
        SetParamValue, // 0
        SetParamString,
        SetParamStringShort,
        SetBypass,
        SetTempo,
        SetTimeSignature,
        SetTransportPlaying,
        SetTransportRecording,
        SetTransportAutomationWriting,
        SetTransportAutomationReading,
        SetTransportCycleActive,
        SetTransportCycleStart,
        SetTransportCycleEnd,
        SetTransportPosition,
        SendMidi,
        SendSysex,
        SetProgram,
        SetProgramName,
        // NRT commands
        CreatePlugin, // 18
        DestroyPlugin,
        Suspend,
        Resume,
        SetNumSpeakers,
        SetupProcessing,
        ReadProgramFile, // 24
        ReadProgramData,
        ReadBankFile,
        ReadBankData,
        WriteProgramFile,
        WriteProgramData,
        WriteBankFile,
        WriteBankData,
        // window
        WindowOpen, // 32
        WindowClose,
        WindowSetPos,
        WindowSetSize,
        // events/replies
        PluginData, // 36
        PluginDataFile,
        SpeakerArrangement,
        ProgramChange,
        ProgramNumber,
        ProgramName,
        ProgramNameIndexed,
        ParameterUpdate, // 43
        ParamAutomated,
        LatencyChanged,
        UpdateDisplay,
        MidiReceived,
        SysexReceived,
        // for plugin bridge
        Error, // 49
        Process,
        Quit
    };
    Command(){}
    Command(Command::Type _type) : type(_type){}

    static const size_t headerSize = 8;

    // NOTE: the union needs to be 8 byte aligned
    // and we make the padding explicit.
    uint32_t type;
    uint32_t padding;

    // NOTE: with a few exceptions, the union members are
    // layout compatible with the ones in ShmCommand.
    union {
        // no data
        struct {} empty;
        // generic integer
        int32_t i;
        // generic float
        float f;
        // generic double
        double d;
        // C string
        char *s;
        // param automated
        struct {
            int32_t index;
            float value;
        } paramAutomated;
        // param value
        struct {
            uint16_t offset;
            uint16_t index;
            float value;
        } paramValue;
        // param string
        struct {
            uint16_t offset;
            uint16_t index;
            uint32_t size;
            char* str;
        } paramString;
        // short param string
        // (avoid heap allocation, same size as paramString on 64-bit)
        struct {
            uint16_t offset;
            uint16_t index;
            uint8_t pstr[maxShortStringSize + 1]; // pascal string!
        } paramStringShort;
        static_assert(sizeof(paramStringShort) == 16, "wrong size for paramStringShort member");
        // time signature
        struct {
            int32_t num;
            int32_t denom;
        } timeSig;
        // midi
        MidiEvent midi;
        SysexEvent sysex;
    };
};

// additional commands/replies (for IPC over shared memory)
// that are not covered by Command.
struct ShmCommand {
    ShmCommand(){}
    ShmCommand(Command::Type _type)
        : type(_type), id(0) {}
    ShmCommand(Command::Type _type, uint32_t _id)
        : type(_type), id(_id){}

    static const size_t headerSize = 8;

    // data
    // NOTE: the union needs to be 8 byte aligned, so we use
    // the additional space for the (optional) 'id' member.
    uint32_t type;
    uint32_t id;

    union {
        // no data
        struct {} empty;
        // generic integer
        int32_t i;
        // generic float
        float f;
        // generic double
        double d;
        // flat C string
        char s[1];
        // generic buffer (e.g. preset data)
        struct {
            int32_t size;
            char data[1];
        } buffer;
        // param value, for setParameter()
        struct {
            uint16_t offset;
            uint16_t index;
            float value;
        } paramValue;
        // flat param string, for setParameterString()
        struct {
            uint16_t offset;
            uint16_t index;
            uint8_t pstr[1]; // pascal string!
        } paramString;
        // flat param state, for parameter updates
        struct {
            float value;
            uint16_t index;
            uint8_t pstr[1]; // pascal string!
        } paramState;
        // program name (indexed)
        struct {
            uint16_t index;
            char name[1];
        } programName;
        // midi message
        MidiEvent midi;
        // flat sysex data
        struct {
            int32_t delta;
            int32_t size;
            char data[1];
        } sysex;
        // time signature
        struct {
            int32_t num;
            int32_t denom;
        } timeSig;
        // plugin
        struct {
            int32_t size;
            char data[1];
        } plugin;
        // process
        struct {
            uint16_t numSamples;
            uint8_t precision;
            uint8_t mode;
            uint16_t numInputs;
            uint16_t numOutputs;
        } process;
        // setup processing
        struct {
            float sampleRate;
            uint16_t maxBlockSize;
            uint8_t precision;
            uint8_t mode;
        } setup;
        // setup speakers
        struct {
            uint16_t numInputs;
            uint16_t numOutputs;
            uint32_t speakers[1];
        } speakers;
        // error
        struct {
            int32_t code;
            char msg[1];
        } error;
    };

    void throwError() const {
        throw Error(static_cast<Error::ErrorCode>(error.code), error.msg);
    }
};

// additional commands/replies (for IPC over shared memory)
// that are not covered by Command.
struct ShmUICommand {
    ShmUICommand(){}
    ShmUICommand(Command::Type _type, uint32_t _id)
        : type(_type), id(_id){}

    static const size_t headerSize = 8;

    uint32_t type = 0;
    uint32_t id = 0;

    union {
        // no data
        struct {} empty;
        // window position
        struct {
            int32_t x;
            int32_t y;
        } windowPos;
        // window size
        struct {
            int32_t width;
            int32_t height;
        } windowSize;
        // parameter automated
        struct {
            int32_t index;
            float value;
        } paramAutomated;
        // latency change
        int32_t latency;
    };
};

#define CommandSize(Class, field, extra) \
    (Class::headerSize + sizeof(Class::field) + extra)

} // vst