LMMS
Loading...
Searching...
No Matches
hostclasses.cpp
Go to the documentation of this file.
1//-----------------------------------------------------------------------------
2// Project : VST SDK
3//
4// Category : Helpers
5// Filename : public.sdk/source/vst/hosting/hostclasses.cpp
6// Created by : Steinberg, 03/05/2008.
7// Description : VST 3 hostclasses, example implementations for IHostApplication, IAttributeList and IMessage
8//
9//-----------------------------------------------------------------------------
10// LICENSE
11// (c) 2021, Steinberg Media Technologies GmbH, All Rights Reserved
12//-----------------------------------------------------------------------------
13// Redistribution and use in source and binary forms, with or without modification,
14// are permitted provided that the following conditions are met:
15//
16// * Redistributions of source code must retain the above copyright notice,
17// this list of conditions and the following disclaimer.
18// * Redistributions in binary form must reproduce the above copyright notice,
19// this list of conditions and the following disclaimer in the documentation
20// and/or other materials provided with the distribution.
21// * Neither the name of the Steinberg Media Technologies nor the names of its
22// contributors may be used to endorse or promote products derived from this
23// software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
26// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
27// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
29// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
32// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
33// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
34// OF THE POSSIBILITY OF SUCH DAMAGE.
35//-----------------------------------------------------------------------------
36
37#include "hostclasses.h"
38
39#include <algorithm>
40
41namespace Steinberg {
42namespace Vst {
43
44//-----------------------------------------------------------------------------
51
52//-----------------------------------------------------------------------------
54{
55 String str ("My VST3 HostApplication");
56 str.copyTo16 (name, 0, 127);
57 return kResultTrue;
58}
59
60//-----------------------------------------------------------------------------
61tresult PLUGIN_API HostApplication::createInstance (TUID cid, TUID _iid, void** obj)
62{
63 FUID classID (FUID::fromTUID (cid));
64 FUID interfaceID (FUID::fromTUID (_iid));
65 if (classID == IMessage::iid && interfaceID == IMessage::iid)
66 {
67 *obj = new HostMessage;
68 return kResultTrue;
69 }
70 else if (classID == IAttributeList::iid && interfaceID == IAttributeList::iid)
71 {
72 *obj = new HostAttributeList;
73 return kResultTrue;
74 }
75 *obj = nullptr;
76 return kResultFalse;
77}
78
79//-----------------------------------------------------------------------------
80tresult PLUGIN_API HostApplication::queryInterface (const char* _iid, void** obj)
81{
84
85 if (mPlugInterfaceSupport && mPlugInterfaceSupport->queryInterface (iid, obj) == kResultTrue)
86 return kResultOk;
87
88 *obj = nullptr;
89 return kResultFalse;
90}
91
92//-----------------------------------------------------------------------------
94{
95 return 1;
96}
97
98//-----------------------------------------------------------------------------
100{
101 return 1;
102}
103
104//-----------------------------------------------------------------------------
105//-----------------------------------------------------------------------------
106//-----------------------------------------------------------------------------
108//-----------------------------------------------------------------------------
110{
112}
113
114//-----------------------------------------------------------------------------
116{
117 setMessageID (nullptr);
118 if (attributeList)
119 attributeList->release ();
121}
122
123//-----------------------------------------------------------------------------
124const char* PLUGIN_API HostMessage::getMessageID ()
125{
126 return messageId;
127}
128
129//-----------------------------------------------------------------------------
130void PLUGIN_API HostMessage::setMessageID (const char* mid)
131{
132 if (messageId)
133 delete[] messageId;
134 messageId = nullptr;
135 if (mid)
136 {
137 size_t len = strlen (mid) + 1;
138 messageId = new char[len];
139 strcpy (messageId, mid);
140 }
141}
142
143//-----------------------------------------------------------------------------
150
151//-----------------------------------------------------------------------------
152//-----------------------------------------------------------------------------
153//-----------------------------------------------------------------------------
155{
156public:
164
168 HostAttribute (const TChar* value, uint32 sizeInCodeUnit) : size (sizeInCodeUnit), type (kString)
169 {
170 v.stringValue = new TChar[sizeInCodeUnit];
171 memcpy (v.stringValue, value, sizeInCodeUnit * sizeof (TChar));
172 }
173 HostAttribute (const void* value, uint32 sizeInBytes) : size (sizeInBytes), type (kBinary)
174 {
175 v.binaryValue = new char[sizeInBytes];
176 memcpy (v.binaryValue, value, sizeInBytes);
177 }
179 {
180 if (size)
181 delete[] v.binaryValue;
182 }
183
184 int64 intValue () const { return v.intValue; }
185 double floatValue () const { return v.floatValue; }
187 const TChar* stringValue (uint32& sizeInCodeUnit)
188 {
189 sizeInCodeUnit = size;
190 return v.stringValue;
191 }
192 const void* binaryValue (uint32& sizeInBytes)
193 {
194 sizeInBytes = size;
195 return v.binaryValue;
196 }
197
198 Type getType () const { return type; }
199
200protected:
210};
211
212//-----------------------------------------------------------------------------
213//-----------------------------------------------------------------------------
214//-----------------------------------------------------------------------------
216//-----------------------------------------------------------------------------
221
222//-----------------------------------------------------------------------------
224{
225 auto it = list.rbegin ();
226 while (it != list.rend ())
227 {
228 delete it->second;
229 it++;
230 }
232}
233
234//-----------------------------------------------------------------------------
236{
237 auto it = list.find (aid);
238 if (it != list.end ())
239 {
240 delete it->second;
241 list.erase (it);
242 }
243}
244
245//-----------------------------------------------------------------------------
247{
248 removeAttrID (aid);
249 list[aid] = new HostAttribute (value);
250 return kResultTrue;
251}
252
253//-----------------------------------------------------------------------------
255{
256 auto it = list.find (aid);
257 if (it != list.end () && it->second)
258 {
259 value = it->second->intValue ();
260 return kResultTrue;
261 }
262 return kResultFalse;
263}
264
265//-----------------------------------------------------------------------------
267{
268 removeAttrID (aid);
269 list[aid] = new HostAttribute (value);
270 return kResultTrue;
271}
272
273//-----------------------------------------------------------------------------
275{
276 auto it = list.find (aid);
277 if (it != list.end () && it->second)
278 {
279 value = it->second->floatValue ();
280 return kResultTrue;
281 }
282 return kResultFalse;
283}
284
285//-----------------------------------------------------------------------------
286tresult PLUGIN_API HostAttributeList::setString (AttrID aid, const TChar* string)
287{
288 removeAttrID (aid);
289 // + 1 for the null-terminate
290 list[aid] = new HostAttribute (string, String (string).length () + 1);
291 return kResultTrue;
292}
293
294//-----------------------------------------------------------------------------
295tresult PLUGIN_API HostAttributeList::getString (AttrID aid, TChar* string, uint32 sizeInBytes)
296{
297 auto it = list.find (aid);
298 if (it != list.end () && it->second)
299 {
300 uint32 sizeInCodeUnit = 0;
301 const TChar* _string = it->second->stringValue (sizeInCodeUnit);
302 memcpy (string, _string, std::min<uint32> (sizeInCodeUnit * sizeof (TChar), sizeInBytes));
303 return kResultTrue;
304 }
305 return kResultFalse;
306}
307
308//-----------------------------------------------------------------------------
309tresult PLUGIN_API HostAttributeList::setBinary (AttrID aid, const void* data, uint32 sizeInBytes)
310{
311 removeAttrID (aid);
312 list[aid] = new HostAttribute (data, sizeInBytes);
313 return kResultTrue;
314}
315
316//-----------------------------------------------------------------------------
317tresult PLUGIN_API HostAttributeList::getBinary (AttrID aid, const void*& data, uint32& sizeInBytes)
318{
319 auto it = list.find (aid);
320 if (it != list.end () && it->second)
321 {
322 data = it->second->binaryValue (sizeInBytes);
323 return kResultTrue;
324 }
325 sizeInBytes = 0;
326 return kResultFalse;
327}
328}
329} // namespace
uint32_t uint32
Definition basics.h:90
int32 copyTo16(char16 *str, uint32 idx=0, int32 n=-1) const
Definition fstring.cpp:579
Definition funknown.h:233
static FUID fromTUID(const TUID uid)
Definition funknown.h:320
virtual uint32 PLUGIN_API addRef()=0
virtual uint32 PLUGIN_API release()=0
virtual tresult PLUGIN_API queryInterface(const TUID _iid, void **obj)=0
static const FUID iid
Definition funknown.h:382
Definition fstring.h:308
IPtr< PlugInterfaceSupport > mPlugInterfaceSupport
Definition hostclasses.h:66
tresult PLUGIN_API createInstance(TUID cid, TUID _iid, void **obj) SMTG_OVERRIDE
Definition hostclasses.cpp:61
HostApplication()
Definition hostclasses.cpp:45
tresult PLUGIN_API getName(String128 name) SMTG_OVERRIDE
Definition hostclasses.cpp:53
Definition hostclasses.cpp:155
HostAttribute(const TChar *value, uint32 sizeInCodeUnit)
Definition hostclasses.cpp:168
HostAttribute(const void *value, uint32 sizeInBytes)
Definition hostclasses.cpp:173
Type
Definition hostclasses.cpp:158
@ kBinary
Definition hostclasses.cpp:162
@ kInteger
Definition hostclasses.cpp:159
@ kString
Definition hostclasses.cpp:161
@ kFloat
Definition hostclasses.cpp:160
uint32 size
Definition hostclasses.cpp:208
Type getType() const
Definition hostclasses.cpp:198
const void * binaryValue(uint32 &sizeInBytes)
Definition hostclasses.cpp:192
int64 intValue() const
Definition hostclasses.cpp:184
const TChar * stringValue(uint32 &sizeInCodeUnit)
Definition hostclasses.cpp:187
double floatValue() const
Definition hostclasses.cpp:185
HostAttribute(int64 value)
Definition hostclasses.cpp:165
HostAttribute(double value)
Definition hostclasses.cpp:166
Type type
Definition hostclasses.cpp:209
~HostAttribute()
Definition hostclasses.cpp:178
Definition hostclasses.h:75
tresult PLUGIN_API getString(AttrID aid, TChar *string, uint32 sizeInBytes) SMTG_OVERRIDE
Definition hostclasses.cpp:295
tresult PLUGIN_API setString(AttrID aid, const TChar *string) SMTG_OVERRIDE
Definition hostclasses.cpp:286
HostAttributeList()
Definition hostclasses.cpp:217
virtual ~HostAttributeList()
Definition hostclasses.cpp:223
tresult PLUGIN_API setFloat(AttrID aid, double value) SMTG_OVERRIDE
Definition hostclasses.cpp:266
std::map< String, HostAttribute * > list
Definition hostclasses.h:92
tresult PLUGIN_API getFloat(AttrID aid, double &value) SMTG_OVERRIDE
Definition hostclasses.cpp:274
tresult PLUGIN_API setInt(AttrID aid, int64 value) SMTG_OVERRIDE
Definition hostclasses.cpp:246
void removeAttrID(AttrID aid)
Definition hostclasses.cpp:235
tresult PLUGIN_API getInt(AttrID aid, int64 &value) SMTG_OVERRIDE
Definition hostclasses.cpp:254
tresult PLUGIN_API setBinary(AttrID aid, const void *data, uint32 sizeInBytes) SMTG_OVERRIDE
Definition hostclasses.cpp:309
tresult PLUGIN_API getBinary(AttrID aid, const void *&data, uint32 &sizeInBytes) SMTG_OVERRIDE
Definition hostclasses.cpp:317
Definition hostclasses.h:100
void PLUGIN_API setMessageID(const char *messageID) SMTG_OVERRIDE
Definition hostclasses.cpp:130
virtual ~HostMessage()
Definition hostclasses.cpp:115
HostAttributeList * attributeList
Definition hostclasses.h:112
HostMessage()
Definition hostclasses.cpp:109
const char *PLUGIN_API getMessageID() SMTG_OVERRIDE
Definition hostclasses.cpp:124
char * messageId
Definition hostclasses.h:111
IAttributeList *PLUGIN_API getAttributes() SMTG_OVERRIDE
Definition hostclasses.cpp:144
Definition ivstattributes.h:41
static const FUID iid
Definition ivstattributes.h:71
const char * AttrID
Definition ivstattributes.h:44
Definition ivsthostapplication.h:36
static const FUID iid
Definition ivsthostapplication.h:46
Definition ivstmessage.h:41
static const FUID iid
Definition ivstmessage.h:54
Definition pluginterfacesupport.h:52
unsigned v[N_MAX]
Definition inflate.c:1584
#define NEW
Definition fdebug.h:212
#define QUERY_INTERFACE(iid, obj, InterfaceIID, InterfaceName)
Definition funknown.h:131
#define FUNKNOWN_CTOR
Definition funknown.h:122
#define IMPLEMENT_FUNKNOWN_METHODS(ClassName, InterfaceName, ClassIID)
Definition funknown.h:150
#define FUNKNOWN_DTOR
Definition funknown.h:127
static PuglViewHint int value
Definition pugl.h:1708
static const char * name
Definition pugl.h:1582
JSAMPIMAGE data
Definition jpeglib.h:945
Definition ivstattributes.h:28
TChar String128[128]
128 character UTF-16 string
Definition vsttypes.h:63
char16 TChar
UTF-16 character.
Definition vsttypes.h:62
Definition baseiids.cpp:43
int8 TUID[16]
plain UID type
Definition funknown.h:210
@ kResultOk
Definition funknown.h:193
@ kResultFalse
Definition funknown.h:195
@ kResultTrue
Definition funknown.h:194
long long int64
Definition ftypes.h:66
int32 tresult
Definition ftypes.h:76
IPtr< I > owned(I *p)
Definition smartpointer.h:241
unsigned int uint32
Definition ftypes.h:51
png_uint_32 length
Definition png.c:2247
Definition hostclasses.cpp:202
char * binaryValue
Definition hostclasses.cpp:206
TChar * stringValue
Definition hostclasses.cpp:205
double floatValue
Definition hostclasses.cpp:204
int64 intValue
Definition hostclasses.cpp:203
memcpy(hh, h, RAND_HEAD_LEN)