Jamba C++ API 7.5.0
Loading...
Searching...
No Matches
ParamSerializers.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018-2019 pongasoft
3 *
4 * Licensed under the Apache License, Version 2.0 or the MIT license,
5 * at your option. You may not use this file except in compliance with
6 * one of these licenses. You may obtain copies of the licenses at:
7 *
8 * https://www.apache.org/licenses/LICENSE-2.0
9 * https://opensource.org/licenses/MIT
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 * License for the specific language governing permissions and limitations under
15 * the License.
16 *
17 * @author Yan Pujante
18 */
19#pragma once
20
21#include <pongasoft/logging/logging.h>
25#include <pluginterfaces/vst/vsttypes.h>
26#include <base/source/fstreamer.h>
27#include <string>
28#include <iostream>
29#include <memory>
30#include <sstream>
31#include <map>
32#include <vector>
33
34namespace pongasoft::VST {
35
36using namespace Steinberg;
37using namespace Steinberg::Vst;
38
45template<typename T>
47{
48public:
49 virtual int32 getStepCount() const = 0;
50 virtual tresult convertFromDiscreteValue(int32 iDiscreteValue, T &oValue) const = 0;
51 virtual tresult convertToDiscreteValue(T const &iValue, int32 &oDiscreteValue) const = 0;
52};
53
63template<typename T>
65{
66public:
67 // Constructor
68 explicit StaticCastDiscreteConverter(int32 iStepCount) : fStepCount(iStepCount)
69 {
70 DCHECK_F(fStepCount > 0);
71 }
72
73 // getStepCount
74 int32 getStepCount() const override { return fStepCount; }
75
76 // convertFromDiscreteValue
77 tresult convertFromDiscreteValue(int32 iDiscreteValue, T &oValue) const override
78 {
79 iDiscreteValue = Utils::clamp(iDiscreteValue, Utils::ZERO_INT32, fStepCount);
80 oValue = static_cast<T>(iDiscreteValue);
81 return kResultOk;
82 }
83
84 // convertToDiscreteValue
85 tresult convertToDiscreteValue(T const &iValue, int32 &oDiscreteValue) const override
86 {
87 oDiscreteValue = static_cast<int32>(iValue);
88 oDiscreteValue = Utils::clamp(oDiscreteValue, Utils::ZERO_INT32, fStepCount);
89 return kResultOk;
90 }
91
92protected:
94};
95
96
107template<typename T>
109{
110public:
111 using ParamType = T;
112
117 virtual tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const { return kNotImplemented; };
118
123 virtual tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const { return kNotImplemented; };
124
130 virtual void writeToStream(ParamType const &iValue, std::ostream &oStream) const
131 {
133 {
134 oStream << iValue;
135 }
136 }
137
138 virtual std::string toString(ParamType const &iValue, int32 iPrecision) const
139 {
140 std::ostringstream s;
141 if(iPrecision >= 0)
142 {
143 s.precision(iPrecision);
144 s.setf(std::ios::fixed);
145 }
146 writeToStream(iValue, s);
147 return s.str();
148 }
149};
150
154namespace IBStreamHelper {
155
156// readDouble - contrary to IBStreamer.readDouble, this method does NOT modify oValue if cannot be read
157inline tresult readDouble(IBStreamer &iStreamer, double &oValue)
158{
159 double value;
160 if(!iStreamer.readDouble(value))
161 return kResultFalse;
162 oValue = value;
163 return kResultOk;
164}
165
166// readFloat - contrary to IBStreamer.readFloat, this method does NOT modify oValue if cannot be read
167inline tresult readFloat(IBStreamer &iStreamer, float &oValue)
168{
169 float value;
170 if(!iStreamer.readFloat(value))
171 return kResultFalse;
172 oValue = value;
173 return kResultOk;
174}
175
176// readFloatArray - contrary to IBStreamer.readFloatArray, this method returns tresult and can use any Int type
177template<typename Int>
178inline tresult readFloatArray(IBStreamer &iStreamer, float *oValue, Int iCount)
179{
180 for(Int i = 0; i < iCount; i++)
181 {
182 if(!iStreamer.readFloat(oValue[i]))
183 return kResultFalse;
184 }
185 return kResultOk;
186}
187
188
189// readInt64 - contrary to IBStreamer.readInt64, this method does NOT modify oValue if cannot be read
190inline tresult readInt64(IBStreamer &iStreamer, int64 &oValue)
191{
192 int64 value;
193 if(!iStreamer.readInt64(value))
194 return kResultFalse;
195 oValue = value;
196 return kResultOk;
197}
198
199// readInt64 - contrary to IBStreamer.readInt64, this method does NOT modify oValue if cannot be read
200inline tresult readInt64u(IBStreamer &iStreamer, uint64 &oValue)
201{
202 uint64 value;
203 if(!iStreamer.readInt64u(value))
204 return kResultFalse;
205 oValue = value;
206 return kResultOk;
207}
208
209// readInt32 - contrary to IBStreamer.readInt32, this method does NOT modify oValue if cannot be read
210inline tresult readInt32(IBStreamer &iStreamer, int32 &oValue)
211{
212 int32 value;
213 if(!iStreamer.readInt32(value))
214 return kResultFalse;
215 oValue = value;
216 return kResultOk;
217}
218
219// readBool - contrary to IBStreamer.readBool, this method does NOT modify oValue if cannot be read
220inline tresult readBool(IBStreamer &iStreamer, bool &oValue)
221{
222 bool value;
223 if(!iStreamer.readBool(value))
224 return kResultFalse;
225 oValue = value;
226 return kResultOk;
227}
228
229}
230
234class RawParamSerializer : public IParamSerializer<ParamValue>
235{
236public:
237 tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
238 {
239 return IBStreamHelper::readDouble(iStreamer, oValue);
240 }
241
242 tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
243 {
244 oStreamer.writeDouble(iValue);
245 return kResultOk;
246 }
247};
248
253{
254public:
255 tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
256 {
257 return IBStreamHelper::readDouble(iStreamer, oValue);
258 }
259
260 tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
261 {
262 oStreamer.writeDouble(iValue);
263 return kResultOk;
264 }
265};
266
271{
272public:
273 tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
274 {
275 return IBStreamHelper::readInt32(iStreamer, oValue);
276 }
277
278 tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
279 {
280 oStreamer.writeInt32(iValue);
281 return kResultOk;
282 }
283};
284
289{
290public:
291 tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
292 {
293 return IBStreamHelper::readInt64(iStreamer, oValue);
294 }
295
296 tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
297 {
298 oStreamer.writeInt64(iValue);
299 return kResultOk;
300 }
301};
302
307{
308public:
309 explicit BooleanParamSerializer(std::string iFalseString = "Off",
310 std::string iTrueString = "On") :
311 fFalseString{std::move(iFalseString)},
312 fTrueString{std::move(iTrueString)}
313 {}
314
315 tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
316 {
317 return IBStreamHelper::readBool(iStreamer, oValue);
318 }
319
320 tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
321 {
322 oStreamer.writeBool(iValue);
323 return kResultOk;
324 }
325
326 void writeToStream(ParamType const &iValue, std::ostream &oStream) const override
327 {
328 oStream << (iValue ? fTrueString : fFalseString);
329 }
330
331private:
332 inline int32 getStepCount() const override { return 1; }
333
334 tresult convertFromDiscreteValue(int32 iDiscreteValue, bool &oValue) const override
335 {
336 oValue = iDiscreteValue != 0;
337 return kResultOk;
338 }
339
340 tresult convertToDiscreteValue(const bool &iValue, int32 &oDiscreteValue) const override
341 {
342 oDiscreteValue = iValue ? 1 : 0;
343 return kResultOk;
344 }
345
346protected:
347 std::string fFalseString;
348 std::string fTrueString;
349};
350
351
357template<int size = 128>
358class CStringParamSerializer : public IParamSerializer<char[size]>
359{
360public:
361 using ParamType = char[size];
362
363 // readFromStream
364 inline tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
365 {
366 if(iStreamer.readRaw(static_cast<void*>(oValue), size) == size)
367 {
368 oValue[size - 1] = 0; // making sure it is null terminated
369 return kResultOk;
370 }
371 else
372 return kResultFalse;
373 }
374
375 // writeToStream - IBStreamer
376 inline tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
377 {
378 if(oStreamer.writeRaw(static_cast<void const *>(iValue), size) == size)
379 return kResultOk;
380 else
381 return kResultFalse;
382 }
383
384 // writeToStream - std::ostream
385 void writeToStream(ParamType const &iValue, std::ostream &oStream) const override
386 {
387 if(std::find(std::begin(iValue), std::end(iValue), 0) != std::end(iValue))
388 {
389 // this means that the string is null terminated... we are good
390 oStream << iValue;
391 }
392 else
393 {
394 char8 str[size];
395 std::copy(std::begin(iValue), std::end(iValue), std::begin(str));
396 str[size - 1] = 0; // make the copy null terminated
397 oStream << str;
398 DLOG_F(WARNING, "%s not properly null terminated!", str);
399 }
400 }
401};
402
430template<typename T, class Compare = std::less<T>>
432{
433public:
436 using TMap = std::map<T, std::pair<std::string, int32>, Compare>;
437
440 using TList = std::vector<T>;
441
444 using ConstructorType = std::initializer_list<std::pair<const T, std::string>> const &;
445
446 using ParamType = T;
447
448 // DiscreteTypeParamSerializer
450 {
451#ifndef NDEBUG
452 // by definition, a discrete parameter has a step count > 0
453 auto stepCount = static_cast<int32>(iInitList.size() - 1);
454 DCHECK_F(stepCount > 0);
455#endif
456
457 int32 i = 0;
458 for(auto &pair : iInitList)
459 {
460 fMap[pair.first] = std::make_pair(pair.second, i);
461 fList.emplace_back(pair.first);
462 i++;
463 }
464
465 // sanity check... if not the same size it means that 2 entries in the list were the same!
466 DCHECK_F(fList.size() == fMap.size());
467 }
468
469 // getStepCount
470 inline int32 getStepCount() const override { return static_cast<int32>(fMap.size() - 1); }
471
472 // convertFromDiscreteValue
473 tresult convertFromDiscreteValue(int32 iDiscreteValue, ParamType &oValue) const override
474 {
475 if(iDiscreteValue < 0 || iDiscreteValue > getStepCount())
476 return kResultFalse;
477 oValue = fList[iDiscreteValue];
478 return kResultOk;
479 }
480
481 // convertToDiscreteValue
482 tresult convertToDiscreteValue(ParamType const &iValue, int32 &oDiscreteValue) const override
483 {
484 auto iter = fMap.find(iValue);
485 if(iter != fMap.cend())
486 {
487 oDiscreteValue = std::get<1>(iter->second);
488 return kResultOk;
489 }
490 else
491 {
492 DLOG_F(WARNING, "could not convertToDiscreteValue...");
493 return kResultFalse;
494 }
495 }
496
497 // readFromStream
498 tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
499 {
500 int32 discreteValue;
501 if(IBStreamHelper::readInt32(iStreamer, discreteValue) == kResultOk)
502 {
503 return convertFromDiscreteValue(discreteValue, oValue);
504 }
505 return kResultFalse;
506 }
507
508 // writeToStream
509 tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
510 {
511 int32 discreteValue;
512 if(convertToDiscreteValue(iValue, discreteValue) == kResultOk)
513 {
514 if(oStreamer.writeInt32(discreteValue))
515 return kResultOk;
516 }
517
518 return kResultFalse;
519 }
520
521 // writeToStream
522 void writeToStream(ParamType const &iValue, std::ostream &oStream) const override
523 {
524 auto iter = fMap.find(iValue);
525 if(iter != fMap.cend())
526 {
527 oStream << std::get<0>(iter->second);
528 }
529 }
530
531private:
534};
535
536}
void writeToStream(ParamType const &iValue, std::ostream &oStream) const override
Definition ParamSerializers.h:326
int32 getStepCount() const override
Definition ParamSerializers.h:332
std::string fFalseString
Definition ParamSerializers.h:347
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:320
tresult convertFromDiscreteValue(int32 iDiscreteValue, bool &oValue) const override
Definition ParamSerializers.h:334
std::string fTrueString
Definition ParamSerializers.h:348
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:315
BooleanParamSerializer(std::string iFalseString="Off", std::string iTrueString="On")
Definition ParamSerializers.h:309
tresult convertToDiscreteValue(const bool &iValue, int32 &oDiscreteValue) const override
Definition ParamSerializers.h:340
A parameter backed by a C type string (char[size]).
Definition ParamSerializers.h:359
void writeToStream(ParamType const &iValue, std::ostream &oStream) const override
Definition ParamSerializers.h:385
char[size] ParamType
Definition ParamSerializers.h:361
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
Definition ParamSerializers.h:376
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
Definition ParamSerializers.h:364
void writeToStream(ParamType const &iValue, std::ostream &oStream) const override
By default, this implementation simply writes the value to the stream IF it is possible (determined a...
Definition ParamSerializers.h:522
int32 getStepCount() const override
Definition ParamSerializers.h:470
tresult convertToDiscreteValue(ParamType const &iValue, int32 &oDiscreteValue) const override
Definition ParamSerializers.h:482
tresult convertFromDiscreteValue(int32 iDiscreteValue, ParamType &oValue) const override
Definition ParamSerializers.h:473
std::map< T, std::pair< std::string, int32 >, Compare > TMap
Maintains the map of possible values of T (defined in constructor).
Definition ParamSerializers.h:436
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:509
std::initializer_list< std::pair< const T, std::string > > const & ConstructorType
Defines the type for the constructor argument.
Definition ParamSerializers.h:444
std::vector< T > TList
Defines the mapping: discrete value [0, stepCount] to T.
Definition ParamSerializers.h:440
T ParamType
Definition ParamSerializers.h:446
TMap fMap
Definition ParamSerializers.h:532
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:498
DiscreteTypeParamSerializer(ConstructorType iInitList)
Definition ParamSerializers.h:449
TList fList
Definition ParamSerializers.h:533
This parameter handles serializing a double parameter.
Definition ParamSerializers.h:253
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:260
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:255
Interface that defines a converter from a type T to an int32 given a number of steps (provided by get...
Definition ParamSerializers.h:47
virtual tresult convertToDiscreteValue(T const &iValue, int32 &oDiscreteValue) const =0
virtual tresult convertFromDiscreteValue(int32 iDiscreteValue, T &oValue) const =0
virtual int32 getStepCount() const =0
A vst parameter is represented by a ParamValue type which is a double in the range [0,...
Definition ParamSerializers.h:109
virtual std::string toString(ParamType const &iValue, int32 iPrecision) const
Definition ParamSerializers.h:138
virtual tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:117
virtual tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:123
virtual void writeToStream(ParamType const &iValue, std::ostream &oStream) const
By default, this implementation simply writes the value to the stream IF it is possible (determined a...
Definition ParamSerializers.h:130
T ParamType
Definition ParamSerializers.h:111
This parameter handles serializing a int32 parameter.
Definition ParamSerializers.h:271
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:278
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:273
This parameter handles serializing a int64 parameter.
Definition ParamSerializers.h:289
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:296
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:291
This parameter handles serializing a raw parameter (ParamValue).
Definition ParamSerializers.h:235
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:242
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:237
int32 getStepCount() const override
Definition ParamSerializers.h:74
tresult convertToDiscreteValue(T const &iValue, int32 &oDiscreteValue) const override
Definition ParamSerializers.h:85
int32 fStepCount
Definition ParamSerializers.h:93
tresult convertFromDiscreteValue(int32 iDiscreteValue, T &oValue) const override
Definition ParamSerializers.h:77
StaticCastDiscreteConverter(int32 iStepCount)
Definition ParamSerializers.h:68
static T clamp(const U &iValue, const T &iLower, const T &iUpper)
Make sure that the value remains within its bounds.
Definition Misc.h:34
constexpr auto ZERO_INT32
Definition Constants.h:25
constexpr auto is_operator_write_to_ostream_defined
Allows to detect whether a type defines ostream << x at compile time.
Definition Metaprogramming.h:115
IBStreamHelper - Helper functions.
Definition ParamSerializers.h:154
tresult readDouble(IBStreamer &iStreamer, double &oValue)
Definition ParamSerializers.h:157
tresult readFloat(IBStreamer &iStreamer, float &oValue)
Definition ParamSerializers.h:167
tresult readBool(IBStreamer &iStreamer, bool &oValue)
Definition ParamSerializers.h:220
tresult readInt64u(IBStreamer &iStreamer, uint64 &oValue)
Definition ParamSerializers.h:200
tresult readInt32(IBStreamer &iStreamer, int32 &oValue)
Definition ParamSerializers.h:210
tresult readInt64(IBStreamer &iStreamer, int64 &oValue)
Definition ParamSerializers.h:190
tresult readFloatArray(IBStreamer &iStreamer, float *oValue, Int iCount)
Definition ParamSerializers.h:178
Definition Clock.h:24