iPlug2 - C++ Audio Plug-in Framework
Loading...
Searching...
No Matches
IPlugStructs.h
1/*
2 ==============================================================================
3
4 This file is part of the iPlug 2 library. Copyright (C) the iPlug 2 developers.
5
6 See LICENSE.txt for more info.
7
8 ==============================================================================
9*/
10
11#pragma once
12
20#include <algorithm>
21#include "wdlstring.h"
22#include "ptrlist.h"
23
24#include "IPlugConstants.h"
25#include "IPlugPlatform.h"
26#include "IPlugMidi.h" // <- Midi related structs in here
27#include "IPlugUtilities.h"
28
29BEGIN_IPLUG_NAMESPACE
30
33{
34 int idx;
35 double value;
36
37 ParamTuple(int idx = kNoParameter, double value = 0.)
38 : idx(idx)
39 , value(value)
40 {}
41};
42
45{
46 SysExData(int offset = 0, int size = 0, const void* pData = 0)
47 : mOffset(offset)
48 , mSize(size)
49 {
50 assert(size < MAX_SYSEX_SIZE);
51
52 if (pData)
53 memcpy(mData, pData, size);
54 else
55 memset(mData, 0, MAX_SYSEX_SIZE);
56 }
57
58 int mOffset;
59 int mSize;
60 uint8_t mData[MAX_SYSEX_SIZE];
61};
62
65{
73 static inline int GetBytes(const uint8_t* pSrc, int srcSize, void* pDst, int nBytesToCopy, int startPos)
74 {
75 int endPos = startPos + nBytesToCopy;
76 if (startPos >= 0 && endPos <= srcSize)
77 {
78 memcpy(pDst, pSrc + startPos, nBytesToCopy);
79 return endPos;
80 }
81 return -1;
82 }
83
90 static inline int GetStr(const uint8_t* pSrc, int srcSize, WDL_String& str, int startPos)
91 {
92 int len;
93 int strStartPos = GetBytes(pSrc, srcSize, &len, sizeof(len), startPos);
94 if (strStartPos >= 0)
95 {
96 int strEndPos = strStartPos + len;
97 if (strEndPos <= srcSize)
98 {
99 if (len > 0)
100 str.Set((char*) (pSrc + strStartPos), len);
101 else
102 str.Set("");
103 }
104 return strEndPos;
105 }
106 return -1;
107 }
108};
109
111class IByteChunk : private IByteGetter
112{
113public:
114 IByteChunk() {}
115 ~IByteChunk() {}
116
120 {
121 chunk.Clear();
122 int magic = IPLUG_VERSION_MAGIC;
123 chunk.Put(&magic);
124 int ver = IPLUG_VERSION;
125 chunk.Put(&ver);
126 }
127
132 static int GetIPlugVerFromChunk(const IByteChunk& chunk, int& position)
133 {
134 int magic = 0, ver = 0;
135 int magicpos = chunk.Get(&magic, position);
136
137 if (magicpos > position && magic == IPLUG_VERSION_MAGIC)
138 position = chunk.Get(&ver, magicpos);
139
140 return ver;
141 }
142
147 inline int PutBytes(const void* pSrc, int nBytesToCopy)
148 {
149 int n = mBytes.GetSize();
150 mBytes.Resize(n + nBytesToCopy);
151 memcpy(mBytes.Get() + n, pSrc, nBytesToCopy);
152 return mBytes.GetSize();
153 }
154
160 inline int GetBytes(void* pDst, int nBytesToCopy, int startPos) const
161 {
162 return IByteGetter::GetBytes(mBytes.Get(), Size(), pDst, nBytesToCopy, startPos);
163 }
164
169 template <class T>
170 inline int Put(const T* pVal)
171 {
172 return PutBytes(pVal, sizeof(T));
173 }
174
180 template <class T>
181 inline int Get(T* pDst, int startPos) const
182 {
183 return GetBytes(pDst, sizeof(T), startPos);
184 }
185
189 inline int PutStr(const char* str)
190 {
191 int slen = (int) strlen(str);
192 Put(&slen);
193 return PutBytes(str, slen);
194 }
195
200 inline int GetStr(WDL_String& str, int startPos) const
201 {
202 return IByteGetter::GetStr(mBytes.Get(), Size(), str, startPos);
203 }
204
208 inline int PutChunk(const IByteChunk* pRHS)
209 {
210 return PutBytes(pRHS->GetData(), pRHS->Size());
211 }
212
214 inline void Clear()
215 {
216 mBytes.Resize(0);
217 }
218
221 inline int Size() const
222 {
223 return mBytes.GetSize();
224 }
225
229 inline int Resize(int newSize)
230 {
231 int n = mBytes.GetSize();
232 mBytes.Resize(newSize);
233 if (newSize > n)
234 {
235 memset(mBytes.Get() + n, 0, (newSize - n));
236 }
237 return n;
238 }
239
242 inline uint8_t* GetData()
243 {
244 return mBytes.Get();
245 }
246
249 inline const uint8_t* GetData() const
250 {
251 return mBytes.Get();
252 }
253
257 inline bool IsEqual(IByteChunk& otherChunk) const
258 {
259 return (otherChunk.Size() == Size() && !memcmp(otherChunk.mBytes.Get(), mBytes.Get(), Size()));
260 }
261
262private:
263 WDL_TypedBuf<uint8_t> mBytes;
264};
265
268{
269public:
270 IByteStream(const void *pData, int dataSize) : mBytes(reinterpret_cast<const uint8_t *>(pData)), mSize(dataSize) {}
271 ~IByteStream() {}
272
278 inline int GetBytes(void* pDst, int nBytesToCopy, int startPos) const
279 {
280 return IByteGetter::GetBytes(mBytes, Size(), pDst, nBytesToCopy, startPos);
281 }
282
288 template <class T>
289 inline int Get(T* pDst, int startPos) const
290 {
291 return GetBytes(pDst, sizeof(T), startPos);
292 }
293
298 inline int GetStr(WDL_String& str, int startPos) const
299 {
300 return IByteGetter::GetStr(mBytes, Size(), str, startPos);
301 }
302
305 inline int Size() const
306 {
307 return mSize;
308 }
309
313 inline bool IsEqual(IByteStream& otherStream) const
314 {
315 return (otherStream.Size() == Size() && !memcmp(otherStream.mBytes, mBytes, Size()));
316 }
317
320 inline const uint8_t* GetData()
321 {
322 return mBytes;
323 }
324
325private:
326 const uint8_t* mBytes;
327 int mSize;
328};
329
332{
333public:
334 IByteChunkReader(const IByteChunk& chunk, int startPos = 0)
335 : mChunk(chunk)
336 , mPos(startPos)
337 {
338 }
339
344 inline int GetBytes(void* pBuf, int nBytesToCopy)
345 {
346 mPos = mChunk.GetBytes(pBuf, nBytesToCopy, mPos);
347 return mPos;
348 }
349
354 template <class T>
355 inline int Get(T* pDst)
356 {
357 mPos = mChunk.Get(pDst, mPos);
358 return mPos;
359 }
360
364 inline int GetStr(WDL_String& str)
365 {
366 mPos = mChunk.GetStr(str, mPos);
367 return mPos;
368 }
369
372 inline int Tell() const
373 {
374 return mPos;
375 }
376
379 inline void Seek(int pos)
380 {
381 mPos = pos;
382 }
383
384private:
385 const IByteChunk& mChunk;
386 int mPos;
387};
388
390struct Config
391{
392 int nParams;
393 int nPresets;
394 const char* channelIOStr;
395 const char* pluginName;
396 const char* productName;
397 const char* mfrName;
398 int vendorVersion;
399 int uniqueID;
400 int mfrID;
401 int latency;
402 bool plugDoesMidiIn;
403 bool plugDoesMidiOut;
404 bool plugDoesMPE;
405 bool plugDoesChunks;
406 int plugType;
407 bool plugHasUI;
408 int plugWidth;
409 int plugHeight;
410 int plugMinWidth;
411 int plugMaxWidth;
412 int plugMinHeight;
413 int plugMaxHeight;
414 bool plugHostResize;
415 const char* bundleID;
416 const char* appGroupID;
417
418 Config(int nParams,
419 int nPresets,
420 const char* channelIOStr,
421 const char* pluginName,
422 const char* productName,
423 const char* mfrName,
424 int vendorVersion,
425 int uniqueID,
426 int mfrID,
427 int latency,
428 bool plugDoesMidiIn,
429 bool plugDoesMidiOut,
430 bool plugDoesMPE,
431 bool plugDoesChunks,
432 int plugType,
433 bool plugHasUI,
434 int plugWidth,
435 int plugHeight,
436 bool plugHostResize,
437 int plugMinWidth,
438 int plugMaxWidth,
439 int plugMinHeight,
440 int plugMaxHeight,
441 const char* bundleID,
442 const char* appGroupID)
443
444 : nParams(nParams)
445 , nPresets(nPresets)
446 , channelIOStr(channelIOStr)
447 , pluginName(pluginName)
448 , productName(productName)
449 , mfrName(mfrName)
450 , vendorVersion(vendorVersion)
451 , uniqueID(uniqueID)
452 , mfrID(mfrID)
453 , latency(latency)
454 , plugDoesMidiIn(plugDoesMidiIn)
455 , plugDoesMidiOut(plugDoesMidiOut)
456 , plugDoesMPE(plugDoesMPE)
457 , plugDoesChunks(plugDoesChunks)
458 , plugType(plugType)
459 , plugHasUI(plugHasUI)
460 , plugWidth(plugWidth)
461 , plugHeight(plugHeight)
462 , plugMinWidth(plugMinWidth)
463 , plugMaxWidth(plugMaxWidth)
464 , plugMinHeight(plugMinHeight)
465 , plugMaxHeight(plugMaxHeight)
466 , plugHostResize(plugHostResize)
467 , bundleID(bundleID)
468 , appGroupID(appGroupID)
469 {};
470};
471
473template<class TIN = PLUG_SAMPLE_SRC, class TOUT = PLUG_SAMPLE_DST>
475{
476 bool mConnected = false;
477 TOUT** mData = nullptr; // If this is for an input channel, points into IPlugProcessor::mInData, if it's for an output channel points into IPlugProcessor::mOutData
478 TIN* mIncomingData = nullptr;
479 WDL_TypedBuf<TOUT> mScratchBuf;
480 WDL_String mLabel;
481};
482
485{
486public:
487 IBusInfo(ERoute direction, int nchans = 0)
488 : mDirection(direction)
489 , mNChans(nchans)
490 {
491 }
492
493 int NChans() const { return mNChans; }
494
495 ERoute GetDirection() const { return mDirection; }
496
497private:
498 ERoute mDirection;
499 int mNChans;
500};
501
504{
505 WDL_PtrList<IBusInfo> mBusInfo[2]; // A particular valid io config may have multiple input buses or output busses
506
507 ~IOConfig()
508 {
509 mBusInfo[0].Empty(true);
510 mBusInfo[1].Empty(true);
511 }
512
517 void AddBusInfo(ERoute direction, int NChans)
518 {
519 mBusInfo[direction].Add(new IBusInfo(direction, NChans));
520 }
521
526 const IBusInfo* GetBusInfo(ERoute direction, int index) const
527 {
528 assert(index >= 0 && index < mBusInfo[direction].GetSize());
529 return mBusInfo[direction].Get(index);
530 }
531
536 int NChansOnBusSAFE(ERoute direction, int index) const
537 {
538 int NChans = 0;
539
540 if(index >= 0 && index < mBusInfo[direction].GetSize())
541 NChans = mBusInfo[direction].Get(index)->NChans();
542
543 return NChans;
544 }
545
549 int NBuses(ERoute direction) const
550 {
551 return mBusInfo[direction].GetSize();
552 }
553
557 int GetTotalNChannels(ERoute direction) const
558 {
559 int total = 0;
560
561 for(int i = 0; i < mBusInfo[direction].GetSize(); i++)
562 total += mBusInfo[direction].Get(i)->NChans();
563
564 return total;
565 }
566
571 bool ContainsWildcard(ERoute direction) const
572 {
573 for(auto i = 0; i < mBusInfo[direction].GetSize(); i++)
574 {
575 if(mBusInfo[direction].Get(i)->NChans() < 0)
576 return true;
577 }
578
579 return false;
580 }
581};
582
585{
586 double mTempo = DEFAULT_TEMPO;
587 double mSamplePos = -1.0;
588 double mPPQPos = -1.0;
589 double mLastBar = -1.0;
590 double mCycleStart = -1.0;
591 double mCycleEnd = -1.0;
592
593 int mNumerator = 4;
594 int mDenominator = 4;
595
596 bool mTransportIsRunning = false;
597 bool mTransportLoopEnabled = false;
598};
599
602{
603 bool mInitialized = false;
604 char mName[MAX_PRESET_NAME_LEN];
605
606 IByteChunk mChunk;
607
608 IPreset()
609 {
610 snprintf(mName, MAX_PRESET_NAME_LEN, "%s", UNUSED_PRESET_NAME);
611 }
612};
613
616{
617 int VK; // Windows VK_XXX
618 char utf8[5] = { 0 }; // UTF8 key
619 bool S, C, A; // SHIFT / CTRL(WIN) or CMD (MAC) / ALT
620
627 IKeyPress(const char* _utf8, int vk, bool s = false, bool c = false, bool a = false)
628 : VK(vk)
629 , S(s), C(c), A(a)
630 {
631 strcpy(utf8, _utf8);
632 }
633
634 void DBGPrint() const { DBGMSG("VK: %i\n", VK); }
635};
636
637END_IPLUG_NAMESPACE
638
IPlug Constant definitions, Types, magic numbers.
MIDI and sysex structs/utilites.
Include to get consistently named preprocessor macros for different platforms and logging functionali...
Utility functions and macros.
Used to manage information about a bus such as whether it's an input or output, channel count.
Definition: IPlugStructs.h:485
Manages a block of memory, for plug-in settings store/recall.
Definition: IPlugStructs.h:112
static int GetIPlugVerFromChunk(const IByteChunk &chunk, int &position)
Helper method to retrieve the IPlug version number from the beginning of the byte chunk.
Definition: IPlugStructs.h:132
const uint8_t * GetData() const
Gets a const ptr to the chunk data.
Definition: IPlugStructs.h:249
int Put(const T *pVal)
Copies arbitary typed data into the IByteChunk.
Definition: IPlugStructs.h:170
int GetBytes(void *pDst, int nBytesToCopy, int startPos) const
Copy raw bytes from the IByteChunk, returning the new position for subsequent calls.
Definition: IPlugStructs.h:160
int PutStr(const char *str)
Put a string into the IByteChunk.
Definition: IPlugStructs.h:189
int Get(T *pDst, int startPos) const
Get arbitary typed data from the IByteChunk.
Definition: IPlugStructs.h:181
int PutBytes(const void *pSrc, int nBytesToCopy)
Copies data into the chunk, placing it at the end, resizing if necessary.
Definition: IPlugStructs.h:147
void Clear()
Clears the chunk (resizes to 0)
Definition: IPlugStructs.h:214
bool IsEqual(IByteChunk &otherChunk) const
Compares the size & values of the data of another chunk with this one.
Definition: IPlugStructs.h:257
uint8_t * GetData()
Gets a ptr to the chunk data.
Definition: IPlugStructs.h:242
static void InitChunkWithIPlugVer(IByteChunk &chunk)
This method is used in order to place the IPlug version number in the chunk when serialising data.
Definition: IPlugStructs.h:119
int Size() const
Returns the current size of the chunk.
Definition: IPlugStructs.h:221
int Resize(int newSize)
Resizes the chunk.
Definition: IPlugStructs.h:229
int GetStr(WDL_String &str, int startPos) const
Get a string from the IByteChunk.
Definition: IPlugStructs.h:200
int PutChunk(const IByteChunk *pRHS)
Put another IByteChunk into this one.
Definition: IPlugStructs.h:208
Helper class to maintain a read position whilst extracting data from an IByteChunk
Definition: IPlugStructs.h:332
void Seek(int pos)
Set the current position in the managed IByteChunk.
Definition: IPlugStructs.h:379
int Tell() const
Return the current position in the managed IByteChunk.
Definition: IPlugStructs.h:372
int Get(T *pDst)
Copy arbitary typed data out of the managed IByteChunk at the current position and update the positio...
Definition: IPlugStructs.h:355
int GetBytes(void *pBuf, int nBytesToCopy)
Copy nBytesToCopy bytes from the managed IByteChunk into pBuf .
Definition: IPlugStructs.h:344
int GetStr(WDL_String &str)
Retrieve a string from the managed IByteChunk and put it in str .
Definition: IPlugStructs.h:364
Manages a non-owned block of memory, for receiving arbitrary message byte streams.
Definition: IPlugStructs.h:268
int GetStr(WDL_String &str, int startPos) const
Get a string from the stream.
Definition: IPlugStructs.h:298
int Size() const
Returns the size of the stream.
Definition: IPlugStructs.h:305
int GetBytes(void *pDst, int nBytesToCopy, int startPos) const
Copy raw bytes from the stream, returning the new position for subsequent calls.
Definition: IPlugStructs.h:278
bool IsEqual(IByteStream &otherStream) const
Compares the size & values of the data of another stream with this one.
Definition: IPlugStructs.h:313
int Get(T *pDst, int startPos) const
Get arbitary typed data from the stream.
Definition: IPlugStructs.h:289
const uint8_t * GetData()
Gets a const ptr to the stream data.
Definition: IPlugStructs.h:320
ERoute
Used to identify whether a bus/channel connection is an input or an output.
Used to manage scratch buffers for each channel of I/O, which may involve converting from single to d...
Definition: IPlugStructs.h:475
Encapsulates information about the host transport state.
Definition: IPlugStructs.h:585
A helper class for IByteChunk and IByteStream that avoids code duplication.
Definition: IPlugStructs.h:65
static int GetStr(const uint8_t *pSrc, int srcSize, WDL_String &str, int startPos)
Get a string from a byte array, to a WDL_String, returning the new position for subsequent calls.
Definition: IPlugStructs.h:90
static int GetBytes(const uint8_t *pSrc, int srcSize, void *pDst, int nBytesToCopy, int startPos)
Copy raw bytes from a byte array, returning the new position for subsequent calls.
Definition: IPlugStructs.h:73
Used for key press info, such as ASCII representation, virtual key (mapped to win32 codes) and modifi...
Definition: IPlugStructs.h:616
IKeyPress(const char *_utf8, int vk, bool s=false, bool c=false, bool a=false)
IKeyPress Constructor.
Definition: IPlugStructs.h:627
An IOConfig is used to store bus info for each input/output configuration defined in the channel io s...
Definition: IPlugStructs.h:504
int NChansOnBusSAFE(ERoute direction, int index) const
Definition: IPlugStructs.h:536
int NBuses(ERoute direction) const
Definition: IPlugStructs.h:549
int GetTotalNChannels(ERoute direction) const
Get the total number of channels across all direction buses for this IOConfig.
Definition: IPlugStructs.h:557
bool ContainsWildcard(ERoute direction) const
Definition: IPlugStructs.h:571
const IBusInfo * GetBusInfo(ERoute direction, int index) const
Definition: IPlugStructs.h:526
void AddBusInfo(ERoute direction, int NChans)
Definition: IPlugStructs.h:517
A struct used for specifying baked-in factory presets.
Definition: IPlugStructs.h:602
In certain cases we need to queue parameter changes for transferral between threads.
Definition: IPlugStructs.h:33
This structure is used when queueing Sysex messages.
Definition: IPlugStructs.h:45