Mach1 Spatial SDK
Loading...
Searching...
No Matches
Mach1Transcode.h
1// Mach1 Spatial SDK
2// Copyright © 2017-2021 Mach1. All rights reserved.
3
4#ifndef MACH1SPATIALSDK_MACH1TRANSCODE_H
5#define MACH1SPATIALSDK_MACH1TRANSCODE_H
6
7#include "Mach1TranscodeCAPI.h"
8#include <string>
9#include <vector>
10
11template <typename PCM>
13 public:
15
17
21 int getInputFormat();
22
26 int getOutputFormat();
27
33
38 void setInputFormat(int inFmt);
39
45
50 void setOutputFormat(int outFmt);
51
57 int getFormatFromString(std::string str);
58
64 std::string getFormatName(int fmt);
65
70 std::vector<std::string> getAllFormatNames();
71
75 int getFormatsCount();
76
80 PCM processNormalization(std::vector<std::vector<PCM> > &bufs);
81
82#ifndef __EMSCRIPTEN__
87 PCM processNormalization(PCM **bufs, int numSamples);
88#endif
89
95 void processMasterGain(std::vector<std::vector<PCM> > &bufs, PCM masterGain);
96
97#ifndef __EMSCRIPTEN__
104 void processMasterGain(PCM **bufs, int numSamples, PCM masterGain);
105#endif
106
112 void setLFESub(std::vector<int> subChannelIndices, int sampleRate);
113
118 void setSpatialDownmixer(float corrThreshold = 0.1);
119
127
132 void setInputFormatCustomPointsJson(std::string inJson);
133
138 void setInputFormatCustomPoints(std::vector<Mach1Point3D> points);
139
144 void setOutputFormatCustomPointsJson(std::string outJson);
145
150 void setOutputFormatCustomPoints(std::vector<Mach1Point3D> points);
151
152 void setCustomPointsSamplerCallback(Mach1Point3D *(*callback)(long long, int &));
153
160
165 std::vector<std::vector<PCM> > getMatrixConversion();
166
174 std::vector<int> getFormatConversionPath();
175
179 void processConversion(std::vector<std::vector<PCM> > &in, std::vector<std::vector<PCM> > &out, int numSamples);
180
181#ifndef __EMSCRIPTEN__
185 void processConversion(PCM **inBufs, PCM **outBufs, int numSamples);
186#endif
187
192 void processConversionRebuffer(std::vector<std::vector<PCM> > &in, std::vector<std::vector<PCM> > &out, int numSamples);
193
194 std::vector<PCM> getAvgSamplesDiff();
195
196 PCM db2level(PCM db);
197
198 PCM level2db(PCM level);
199
200 private:
201 void *M1obj;
202
203 std::vector<PCM *> input_ptrs;
204 std::vector<PCM *> output_ptrs;
205
206 std::vector<std::vector<PCM> > input_conversion_buffer;
207 std::vector<std::vector<PCM> > output_conversion_buffer;
208
209 int ic_channel_count{};
210 size_t ic_buffer_size{};
211
212 int oc_channel_count{};
213 size_t oc_buffer_size{};
214};
215
216#endif // MACH1SPATIALSDK_MACH1TRANSCODE_H
217
218// Implementation of Mach1Transcode<PCM>
219#ifndef MACH1SPATIALSDK_MACH1TRANSCODE_TPP
220#define MACH1SPATIALSDK_MACH1TRANSCODE_TPP
221
222#include <cstring>
223
224template <typename PCM>
226 M1obj = Mach1TranscodeCAPI_create();
227}
228
229template <typename PCM>
231 Mach1TranscodeCAPI_delete(M1obj);
232}
233
234template <typename PCM>
236 return Mach1TranscodeCAPI_getInputFormat(M1obj);
237}
238
239template <typename PCM>
241 return Mach1TranscodeCAPI_getOutputFormat(M1obj);
242}
243
244template <typename PCM>
246 return Mach1TranscodeCAPI_getInputNumChannels(M1obj);
247}
248
249template <typename PCM>
251 Mach1TranscodeCAPI_setInputFormat(M1obj, inFmt);
252}
253
254template <typename PCM>
256 return Mach1TranscodeCAPI_getOutputNumChannels(M1obj);
257}
258
259template <typename PCM>
261 Mach1TranscodeCAPI_setOutputFormat(M1obj, outFmt);
262}
263
264template <typename PCM>
266 return Mach1TranscodeCAPI_getFormatFromString(M1obj, (char *)str.c_str());
267}
268
269template <typename PCM>
271 const char *name = Mach1TranscodeCAPI_getFormatName(M1obj, fmt);
272 return name ? std::string(name) : std::string();
273}
274
275template <typename PCM>
276std::vector<std::string> Mach1Transcode<PCM>::getAllFormatNames() {
277 const char **formats = Mach1TranscodeCAPI_getAllFormatNames(M1obj);
278 std::vector<std::string> formatNames;
279 for (size_t i = 0; formats[i] != nullptr; i++) {
280 formatNames.push_back(std::string(formats[i]));
281 }
282 return formatNames;
283}
284
285template <typename PCM>
287 return Mach1TranscodeCAPI_getFormatsCount(M1obj);
288}
289
290#ifndef __EMSCRIPTEN__
291template <typename PCM>
292PCM Mach1Transcode<PCM>::processNormalization(PCM **bufs, int numSamples) {
293 return Mach1TranscodeCAPI_processNormalization(M1obj, bufs, numSamples);
294}
295
296template <typename PCM>
297void Mach1Transcode<PCM>::processMasterGain(PCM **bufs, int numSamples, PCM masterGain) {
298 Mach1TranscodeCAPI_processMasterGain(M1obj, bufs, numSamples, masterGain);
299}
300#endif
301
302template <typename PCM>
303PCM Mach1Transcode<PCM>::processNormalization(std::vector<std::vector<PCM> > &bufs) {
304 if (bufs.size() == 0)
305 return 0;
306
307 float **b = new float *[bufs.size()];
308 for (int i = 0; i < bufs.size(); i++) {
309 b[i] = bufs[i].data();
310 }
311 float peak = Mach1TranscodeCAPI_processNormalization(M1obj, b, (int)bufs[0].size());
312 delete[] b;
313
314 return peak;
315}
316
317template <typename PCM>
318void Mach1Transcode<PCM>::processMasterGain(std::vector<std::vector<PCM> > &bufs, PCM masterGain) {
319 if (bufs.size() == 0)
320 return;
321
322 float **b = new float *[bufs.size()];
323 for (int i = 0; i < bufs.size(); i++) {
324 b[i] = bufs[i].data();
325 }
326 Mach1TranscodeCAPI_processMasterGain(M1obj, b, (int)bufs[0].size(), masterGain);
327 delete[] b;
328}
329
330template <typename PCM>
332 return Mach1TranscodeCAPI_db2level(M1obj, db);
333}
334
335template <typename PCM>
336PCM Mach1Transcode<PCM>::level2db(PCM level) {
337 return Mach1TranscodeCAPI_level2db(M1obj, level);
338}
339
340template <typename PCM>
341void Mach1Transcode<PCM>::setLFESub(std::vector<int> subChannelIndices, int sampleRate) {
342 Mach1TranscodeCAPI_setLFESub(M1obj, subChannelIndices.data(), (int)subChannelIndices.size(), sampleRate);
343}
344
345template <typename PCM>
347 Mach1TranscodeCAPI_setSpatialDownmixer(M1obj, corrThreshold);
348}
349
350template <typename PCM>
352 return Mach1TranscodeCAPI_getSpatialDownmixerPossibility(M1obj);
353}
354
355template <typename PCM>
357 float *avg = Mach1TranscodeCAPI_getAvgSamplesDiff(M1obj);
358 return std::vector<float>(avg, avg + 4);
359}
360
361template <typename PCM>
363 Mach1TranscodeCAPI_setInputFormatCustomPointsJson(M1obj, (char *)inJson.c_str());
364}
365
366template <typename PCM>
367void Mach1Transcode<PCM>::setInputFormatCustomPoints(std::vector<Mach1Point3D> points) {
368 Mach1TranscodeCAPI_setInputFormatCustomPoints(M1obj, points.data(), (int)points.size());
369}
370
371template <typename PCM>
373 Mach1TranscodeCAPI_setOutputFormatCustomPointsJson(M1obj, (char *)strJson.c_str());
374}
375
376template <typename PCM>
377void Mach1Transcode<PCM>::setOutputFormatCustomPoints(std::vector<Mach1Point3D> points) {
378 Mach1TranscodeCAPI_setInputFormatCustomPoints(M1obj, points.data(), (int)points.size());
379}
380
381template <typename PCM>
382void Mach1Transcode<PCM>::setCustomPointsSamplerCallback(Mach1Point3D *(*callback)(long long, int &)) {
383 Mach1TranscodeCAPI_setCustomPointsSamplerCallback(M1obj, callback);
384}
385
386template <typename PCM>
388 return Mach1TranscodeCAPI_processConversionPath(M1obj);
389}
390
391template <typename PCM>
392std::vector<std::vector<PCM> > Mach1Transcode<PCM>::getMatrixConversion() {
393 float *matrix = new float[getInputNumChannels() * getOutputNumChannels()];
394 Mach1TranscodeCAPI_getMatrixConversion(M1obj, matrix);
395
396 std::vector<std::vector<float> > vec;
397 vec.resize(getOutputNumChannels());
398 for (size_t i = 0; i < vec.size(); i++) {
399 vec[i].resize(getInputNumChannels());
400 for (size_t j = 0; j < vec[i].size(); j++) {
401 vec[i][j] = matrix[i * getInputNumChannels() + j];
402 }
403 }
404
405 delete[] matrix;
406 return vec;
407}
408#ifndef __EMSCRIPTEN__
409template <typename PCM>
410void Mach1Transcode<PCM>::processConversion(PCM **inBufs, PCM **outBufs, int numSamples) {
411 Mach1TranscodeCAPI_processConversion(M1obj, inBufs, outBufs, numSamples);
412}
413#endif
414
415template <typename PCM>
416void Mach1Transcode<PCM>::processConversion(std::vector<std::vector<PCM> > &in, std::vector<std::vector<PCM> > &out, int numSamples) {
417 if (in.size() == 0 || out.size() == 0)
418 return;
419
420 // restructure input buffer
421 if (ic_channel_count != in.size() || ic_buffer_size != numSamples) {
422 input_conversion_buffer.resize(in.size());
423 input_ptrs.resize(in.size());
424
425 for (int i = 0; i < in.size(); i++) {
426 input_conversion_buffer[i].resize(numSamples);
427 }
428
429 ic_channel_count = in.size();
430 ic_buffer_size = numSamples;
431 }
432
433 for (int i = 0; i < in.size(); i++) {
434 input_ptrs[i] = in[i].data();
435 }
436
437 // restructure output buffer
438 if (oc_channel_count != out.size() || oc_buffer_size != numSamples) {
439 output_conversion_buffer.resize(out.size());
440 output_ptrs.resize(out.size());
441
442 for (int i = 0; i < out.size(); i++) {
443 output_conversion_buffer[i].resize(numSamples);
444 }
445
446 oc_channel_count = out.size();
447 oc_buffer_size = numSamples;
448 }
449
450 for (int i = 0; i < out.size(); i++) {
451 output_ptrs[i] = out[i].data();
452 }
453
454 Mach1TranscodeCAPI_processConversion(M1obj, input_ptrs.data(), output_ptrs.data(), numSamples);
455}
456
457template <typename PCM>
458void Mach1Transcode<PCM>::processConversionRebuffer(std::vector<std::vector<PCM> > &in, std::vector<std::vector<PCM> > &out, int numSamples) {
459 if (in.size() == 0 || out.size() == 0) {
460 return;
461 }
462
463 // restructure input buffer
464 if (ic_channel_count != in.size() || ic_buffer_size != numSamples) {
465 input_conversion_buffer.resize(in.size());
466 input_ptrs.resize(in.size());
467
468 for (int i = 0; i < in.size(); i++) {
469 input_conversion_buffer[i].resize(numSamples);
470 }
471
472 ic_channel_count = in.size();
473 ic_buffer_size = numSamples;
474 }
475
476 for (int i = 0; i < ic_channel_count; i++) {
477 memcpy(input_conversion_buffer[i].data(), in.data(), sizeof(PCM) * ic_buffer_size);
478 input_ptrs[i] = input_conversion_buffer[i].data();
479 }
480
481 // restructure output buffer
482 if (oc_channel_count != out.size() || oc_buffer_size != numSamples) {
483 output_conversion_buffer.resize(out.size());
484 output_ptrs.resize(out.size());
485
486 for (int i = 0; i < out.size(); i++) {
487 output_conversion_buffer[i].resize(numSamples);
488 }
489
490 oc_channel_count = out.size();
491 oc_buffer_size = numSamples;
492 }
493
494 for (int i = 0; i < oc_channel_count; i++) {
495 memcpy(output_conversion_buffer[i].data(), out.data(), sizeof(PCM) * oc_buffer_size);
496 output_ptrs[i] = output_conversion_buffer[i].data();
497 }
498
499 Mach1TranscodeCAPI_processConversion(M1obj, input_ptrs.data(), output_ptrs.data(), numSamples);
500
501 for (int i = 0; i < oc_channel_count; i++) {
502 memcpy(out.data(), output_conversion_buffer[i].data(), sizeof(PCM) * oc_buffer_size);
503 }
504}
505
506template <typename PCM>
508 int count = 0;
509 int *arr = Mach1TranscodeCAPI_getFormatConversionPath(M1obj, &count);
510
511 std::vector<int> vec(arr, arr + count);
512 return vec;
513}
514
515#endif // MACH1SPATIALSDK_MACH1TRANSCODE_TPP
Definition Mach1Transcode.h:12
void setInputFormatCustomPoints(std::vector< Mach1Point3D > points)
Sets the input format for transcoding from CustomPoints directly.
Definition Mach1Transcode.h:367
int getInputFormat()
Get the input format that this Mach1Transcode has been configured to process.
Definition Mach1Transcode.h:235
PCM processNormalization(std::vector< std::vector< PCM > > &bufs)
Get the largest PCM value in the given buffer, which would be used for normalization.
Definition Mach1Transcode.h:303
void setInputFormatCustomPointsJson(std::string inJson)
Sets the input format for transcoding from CustomPoints directly.
Definition Mach1Transcode.h:362
std::string getFormatName(int fmt)
Given an input/output format index, return its human-readable name.
Definition Mach1Transcode.h:270
void setOutputFormatCustomPointsJson(std::string outJson)
Sets the output format for transcoding from an external JSON source.
Definition Mach1Transcode.h:372
bool processConversionPath()
Use this function to control when to call for calculating the format transcoding calculations.
Definition Mach1Transcode.h:387
std::vector< std::vector< PCM > > getMatrixConversion()
Get the transcoding matrix of coefficients based on the set input and output formats.
Definition Mach1Transcode.h:392
void setOutputFormatCustomPoints(std::vector< Mach1Point3D > points)
Sets the output format for transcoding from CustomPoints directly.
Definition Mach1Transcode.h:377
void setOutputFormat(int outFmt)
Sets the output format for transcoding from this Mach1Transcode options.
Definition Mach1Transcode.h:260
void processMasterGain(std::vector< std::vector< PCM > > &bufs, PCM masterGain)
Apply an input gain to the output sound field.
Definition Mach1Transcode.h:318
int getOutputFormat()
Get the output format that this Mach1Transcode has been configured to process.
Definition Mach1Transcode.h:240
void setInputFormat(int inFmt)
Sets the input format for transcoding from this Mach1Transcode options.
Definition Mach1Transcode.h:250
bool getSpatialDownmixerPossibility()
Get whether the compared signals are less than the setSpatialDownmixer(corrThreshold).
Definition Mach1Transcode.h:351
std::vector< int > getFormatConversionPath()
Get the shortest found conversion path to get from input format X to output format Y,...
Definition Mach1Transcode.h:507
std::vector< std::string > getAllFormatNames()
Get a list of all the names of available formats in Mach1Transcode API.
Definition Mach1Transcode.h:276
void setSpatialDownmixer(float corrThreshold=0.1)
Sets the threshold float for getSpatialDownmixerPossibility calculation.
Definition Mach1Transcode.h:346
void setLFESub(std::vector< int > subChannelIndices, int sampleRate)
Apply a low pass filter (LPF) to each indicated channel index of the input format and sound field.
Definition Mach1Transcode.h:341
int getFormatFromString(std::string str)
the enum for indicated format's string name.
Definition Mach1Transcode.h:265
int getInputNumChannels()
Get the number of channels that this Mach1Transcode has been configured to process,...
Definition Mach1Transcode.h:245
void processConversion(std::vector< std::vector< PCM > > &in, std::vector< std::vector< PCM > > &out, int numSamples)
Process the conversion as set by previous functions.
Definition Mach1Transcode.h:416
int getOutputNumChannels()
Get the number of channels that this Mach1Transcode has been configured to convert to,...
Definition Mach1Transcode.h:255
int getFormatsCount()
Get the amount of available formats in Mach1Transcode API.
Definition Mach1Transcode.h:286
void processConversionRebuffer(std::vector< std::vector< PCM > > &in, std::vector< std::vector< PCM > > &out, int numSamples)
Process the conversion as set by previous functions.
Definition Mach1Transcode.h:458
Definition Mach1Point3D.h:17