SOUND4 x1.CLOUD Library [1.5.7]
Loading...
Searching...
No Matches
sound4.x1.cloud.hpp
Go to the documentation of this file.
1
4#pragma once
5
6#include <string>
7#include <exception>
8#include <thread>
9#include <functional>
10#include <memory>
11#include <array>
12#include <assert.h>
13#include <stdexcept>
14#include <filesystem>
15#include <string.h>
16
17#include "sound4.x1.cloud.h"
18
19
20// Filesystem path char type
21#ifdef _WIN32
22 #include <stringapiset.h>
23 #include <wchar.h>
25 #define fs_strdup wcsdup
26 #ifdef _MSC_VER
27 #pragma warning(disable : 4996)
28 #endif
29#else // !_WIN32
31 #define fs_strdup strdup
32#endif // !_WIN32
33
34// bridge C callbacks to CPresetLoader
35extern "C" {
36 static char *cloudx1_custom_reader(const fs_char *filename, void* userdata);
37 static void cloudx1_custom_reader_free(char *content, void* userdata);
38 static int cloudx1_custom_writer(const fs_char *filename, const char *content, void* userdata);
39 static int cloudx1_custom_exists(const fs_char *filename, void* userdata);
40 static fs_char** cloudx1_custom_getall(void* userdata);
41 static void cloudx1_custom_getall_free(fs_char** all, void* userdata);
42 static int cloudx1_custom_remove(const fs_char *filename, void* userdata);
43 static int cloudx1_custom_rename(const fs_char *from, const fs_char *to, void* userdata);
44};
45
49namespace sound4 {
53namespace cloudx1 {
54 static constexpr const char *process_name = "SOUND4 x1.CLOUD";
55 static constexpr const char *process_shortname = "x1";
87
91 namespace helper {
92 #ifdef _WIN32
98 static inline std::string WStringToUTF8(const std::wstring& wstr) {
99 if (wstr.empty()) return {};
100 int size = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
101 std::string str(size, 0);
102 WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &str[0], size, NULL, NULL);
103 return str;
104 }
110 static inline std::wstring UTF8ToWString(const std::string& str) {
111 if (str.empty()) return std::wstring();
112 int size = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
113 std::wstring wstr(size, 0);
114 MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstr[0], size);
115 return wstr;
116 }
117 #endif // _WIN32
118
124 template<typename T>
126 };
127 template<>
128 struct SampleFormat<int16_t> {
129 const cloudx1_SampleFormat format = S16_NATIVE;
130 };
131 template<>
132 struct SampleFormat<int32_t> {
133 const cloudx1_SampleFormat format = S32_NATIVE;
134 };
135 template<>
136 struct SampleFormat<float> {
137 const cloudx1_SampleFormat format = F32_NATIVE;
138 };
139
140 // --------------------------------------------------------------
151 static inline void AudioConvertFrom(const uint8_t *payload, float *output, size_t nSpl, cloudx1_SampleFormat fmt) {
152 cloudx1_AudioConvertFrom(payload, output, nSpl, fmt);
153 }
154
165 static inline void AudioConvertTo(const float *input, uint8_t *payload, size_t nSpl, cloudx1_SampleFormat fmt) {
166 cloudx1_AudioConvertTo(input, payload, nSpl, fmt);
167 }
168
178 static inline void StereoToMono(const float *input, float *output, size_t nFrame) {
179 cloudx1_StereoToMono(input, output, nFrame);
180 }
181
191 static inline void MonoToStereo(const float *input, float *output, size_t nFrame) {
192 cloudx1_MonoToStereo(input, output, nFrame);
193 }
194
205 static inline void StereoToMono_Planar(const float *inputL, const float *inputR, float *output, size_t nFrame) {
206 cloudx1_StereoToMono_Planar(inputL, inputR, output, nFrame);
207 }
208
219 static inline void MonoToStereo_Planar(const float *input, float *outputL, float *outputR, size_t nFrame) {
220 cloudx1_MonoToStereo_Planar(input, outputL, outputR, nFrame);
221 }
222
229 static inline void AudioMonoFromLiveStereo(const uint8_t *payload, float *output) {
230 cloudx1_AudioMonoFromLiveStereo(payload, output);
231 }
232
239 static inline void AudioMonoToLiveStereo(const float *input, uint8_t *payload) {
240 cloudx1_AudioMonoToLiveStereo(input, payload);
241 }
242
243 }; // namespace helper
244
250 static inline std::string GetVersion()
251 {
252 return std::string(cloudx1_GetVersion());
253 }
254
265 static inline unsigned int GetChunkSizeInFrames()
266 {
268 }
269
278 static inline std::vector<unsigned int> GetPossibleChunkSizeInFrames()
279 {
280 std::vector<unsigned int> list;
281 for (unsigned int* src=cloudx1_GetPossibleChunkSizeInFrames();*src;src++) {
282 list.push_back(*src);
283 }
284 return list;
285 }
286
292 static inline unsigned int GetChannelCount()
293 {
295 }
296
304 static inline unsigned int GetAudioInputCount()
305 {
307 }
308
316 static inline unsigned int GetAudioOutputCount()
317 {
319 }
320
328 static inline unsigned int GetSampleRate()
329 {
330 return cloudx1_GetSampleRate();
331 }
332
338 static inline void SanityCheck(bool a_bCheckFrames = true)
339 {
340 // Do some sanity checks
342 throw std::runtime_error("Bad library sampling rate");
343 }
344 if (a_bCheckFrames && cloudx1_GetChunkSizeInFrames()!=ChunkFrames) {
345 throw std::runtime_error("Bad library frame size");
346 }
348 throw std::runtime_error("Bad library channel count");
349 }
351 throw std::runtime_error("Bad library input count");
352 }
354 throw std::runtime_error("Bad library output count");
355 }
356 }
357
364 static inline std::string GetFormatName(const SampleFormat fmt)
365 {
366 return std::string(cloudx1_GetFormatName(fmt));
367 }
368
375 static inline SampleFormat GetFormatFromName(const std::string& name)
376 {
377 return cloudx1_GetFormatFromName(name.c_str());
378 }
379
386 static inline unsigned int GetBytesFromFormat(const SampleFormat fmt)
387 {
388 return cloudx1_GetBytesFromFormat(fmt);
389 }
390
398 using log_cb_t = std::function<void(LogSeverity,const std::string&)>;
399
404 extern "C" {
405 static inline void _log_cb_c(cloudx1_LogSeverity severity, const char *c_msg) {
406 _log_cb(severity, std::string(c_msg));
407 }
408 }
412 static inline void SetLogSeverity(LogSeverity severity)
413 {
414 cloudx1_SetLogSeverity(severity);
415 }
419 static inline void SetLoggerCallback(log_cb_t cb)
420 {
421 _log_cb=cb;
423 }
424
425#if CLOUDX1_HAS_CLOUDBUS
431 class CBus {
432 public:
433 CBus()
434 : m_bus(cloudx1_NewBus()) {}
435 ~CBus()
436 {
437 cloudx1_FreeBus(m_bus);
438 m_bus = nullptr;
439 }
440 cloudx1_CBus *Get() const { return m_bus; }
441 private:
442 cloudx1_CBus *m_bus;
443 };
444#endif // CLOUDX1_HAS_CLOUDBUS
445
452 public:
453 CPresetLoader() = default;
454 virtual ~CPresetLoader() = default;
455
456 virtual bool IsReadOnly() = 0;
457 virtual bool Exists(const std::filesystem::path &name) = 0;
458 virtual bool Remove(const std::filesystem::path &name) = 0;
459 virtual bool Rename(const std::filesystem::path &from, const std::filesystem::path &to) = 0;
460 virtual std::vector<std::filesystem::path> GetAll() = 0;
461 virtual std::string Read(const std::filesystem::path &filename) = 0;
462 virtual bool Write(const std::filesystem::path &filename, const std::string &content) =0;
463 };
465
471 class CInstance {
472 public:
477 {
478 params = cloudx1_NewParameters();
479 if (!params) throw std::bad_alloc();
480 }
481 // non-copyable
482 CInstance( const CInstance& ) = delete;
483 CInstance& operator=( const CInstance& ) = delete;
487 virtual ~CInstance()
488 {
489 Stop();
490 if (params) cloudx1_FreeParameters(params);
491 }
495 bool IsOk() const { return instance!=nullptr; }
505 void SetParam(const std::string& name, const std::string& value)
506 {
507 assert(params);
508 cloudx1_SetParameter(params, name.c_str(), value.c_str());
509 }
516 std::string GetParam(const std::string& name)
517 {
518 assert(params);
519 auto c_value=cloudx1_GetParameter(params, name.c_str());
520 std::string ret(c_value);
522 return ret;
523 }
524
525#if CLOUDX1_HAS_CLOUDBUS
534 void SetBus(const CBus& bus) {
535 assert(params);
536 cloudx1_SetInstanceBus(params,bus.Get());
537 }
538#endif // CLOUDX1_HAS_CLOUDBUS
539
550 void SetPresetManager(CPresetLoader *preset_manager)
551 {
552 if (!preset_manager) return;
553 assert(params);
563 preset_manager->IsReadOnly(),
564 preset_manager
565 );
566 }
567
590 bool Create(const std::string& LoginKey, const std::string& RadioName, const std::string& Access_Key_ID, const std::string& Access_Key_Secret, const std::filesystem::path& save_path, int json_port = 0, unsigned int frames_per_chunk=64)
591 {
592 assert(!instance);
593 std::string l_save_path;
594 if (!save_path.empty()) {
595 l_save_path = save_path.u8string();
596 }
597 instance = cloudx1_InitProcess3(LoginKey.c_str(), RadioName.c_str(), Access_Key_ID.c_str(), Access_Key_Secret.c_str(), l_save_path.c_str(), params, frames_per_chunk);
598 if (!instance) return false;
599 if (!init_metadata.empty()) {
600 for (auto&& [key,value]: init_metadata) {
601 cloudx1_SetMetadata(instance, key.c_str(), value.c_str());
602 }
603 init_metadata.clear();
604 }
605 update_thread = std::thread([this, json_port](){
607 cloudx1_StartUpdateThread(instance, json_port);
609 });
610 int timeout=5000;
611 #ifdef DEBUG
612 timeout=60*1000; // For debugger pauses
613 #endif
614 if (cloudx1_WaitUpdateThreadReady(instance, timeout)<0) {
615 return false;
616 }
617 return true;
618 }
619
627 unsigned int GetChunkFrames() {
628 if (instance) {
629 return cloudx1_GetProcessChunkFrames(instance);
630 }
631 return 0;
632 }
633
641 void PresetManager_InformChange(const std::filesystem::path& relative_path, PresetChange_Kind change_kind)
642 {
643 cloudx1_PresetManager_InformChange(instance, relative_path.c_str(), (cloudx1_PresetChange_Kind) change_kind);
644 }
645
657 void SetMetadata(const std::string& key, const char* value)
658 {
659 if (instance) {
660 cloudx1_SetMetadata(instance, key.c_str(), value);
661 } else {
662 init_metadata.push_back( {key, value} );
663 }
664 }
665
675 void SetMetadataMulti(const std::unordered_map<std::string, const char*>& list)
676 {
677 if (instance) {
678 typedef const char* pchar;
679 pchar* keyvalue=new pchar[2*list.size()+1];
680 size_t n=0;
681 for (auto&& [key,value]: list) {
682 keyvalue[2*n+0]=key.c_str();
683 keyvalue[2*n+1]=value;
684 n++;
685 }
686 keyvalue[2*n+0]=nullptr;
687
688 cloudx1_SetMetadataMulti(instance, keyvalue);
689
690 delete[] keyvalue;
691 } else {
692 for (auto&& [key,value]: list) {
693 if (value) {
694 init_metadata.push_back( {key, value} );
695 }
696 }
697 }
698 }
699
705 std::vector< std::tuple<std::string,std::string> > GetMetadataInfos()
706 {
707 std::vector< std::tuple<std::string,std::string> > values;
708 const char** c_values = cloudx1_GetMetadataInfos(instance);
709 if (c_values) {
710 for (const char** c_value=c_values; *c_value; ) {
711 std::string key(*c_value);
712 c_value++;
713 if (*c_value) {
714 std::string descr(*c_value);
715 c_value++;
716 values.push_back( {key,descr} );
717 }
718 }
719 cloudx1_FreeMetadataInfos(instance, c_values);
720 }
721 return values;
722 }
723
727 virtual void OnUpdateThreadStart() {}
731 virtual void OnUpdateThreadStop() {}
732
733#if CLOUDX1_HAS_WEBSERVER
747 bool StartWebServer(int http_port, int https_port=0)
748 {
749 assert(instance);
750 assert(webserver==SOUND4_INVALID_WEBSERVER_ID);
751 webserver = cloudx1_Webserver(http_port,https_port,instance);
752 if (webserver==SOUND4_INVALID_WEBSERVER_ID) {
753 return false;
754 }
755 int web_status=cloudx1_Webserver_Status(webserver);
756 if (http_port && (web_status & SOUND4_WEBSERVER_HTTP_OK) == 0) {
757 return false;
758 }
759 if (https_port && (web_status & SOUND4_WEBSERVER_HTTPS_OK) == 0) {
760 return false;
761 }
762 return true;
763 }
764
772 void StopWebServer(int timeout_ms = 1000)
773 {
774 if (webserver != SOUND4_INVALID_WEBSERVER_ID) {
775 cloudx1_Webserver_Stop(webserver, timeout_ms);
776 webserver = SOUND4_INVALID_WEBSERVER_ID;
777 }
778 }
779
783 void SetWebServerAppHealth(int httpcode, const std::string& contenttype, const std::string& content)
784 {
785 assert(instance);
786 cloudx1_Webserver_SetAppHealth(instance, httpcode, contenttype.c_str(), content.c_str());
787 }
791 void GetWebServerAppHealth(int &httpcode, std::string& contenttype, std::string& content)
792 {
793 assert(instance);
794 char* c_contenttype=nullptr;
795 char* c_content=nullptr;
796 cloudx1_Webserver_GetAppHealth(instance, &httpcode, &c_contenttype, &c_content);
797 contenttype=c_contenttype;
798 content=c_content;
799 cloudx1_Webserver_FreeString(c_contenttype);
801 }
802#endif // CLOUDX1_HAS_WEBSERVER
803
813 {
814 if (!instance) return 0;
815 return cloudx1_TerminateProcess(instance);
816 }
817
821 void Stop()
822 {
823 if (!instance) return;
824#if CLOUDX1_HAS_WEBSERVER
826#endif // CLOUDX1_HAS_WEBSERVER
827 if (update_thread.joinable()) {
828 cloudx1_StopUpdateThread(instance); // this will exit the update thread
829 update_thread.join();
830 }
831 cloudx1_ExitProcess(instance);
832 instance=nullptr;
833 }
834
844 unsigned int GetEstimatedDelay()
845 {
846 assert(instance);
847 return cloudx1_GetEstimatedDelay(instance);
848 }
849
862 std::array<float,InputSampleSize>& GetBufferIn()
863 {
864 assert(instance);
865 float *buf=cloudx1_GetBufferIn(instance);
866 return reinterpret_cast< std::array<float,InputSampleSize>& >(*buf);
867
868 }
880 std::array<float,OutputSampleSize>& GetBufferOut()
881 {
882 assert(instance);
883 float *buf= cloudx1_GetBufferOut(instance);
884 return reinterpret_cast< std::array<float,OutputSampleSize>& >(*buf);
885 }
890 {
891 assert(instance);
892 cloudx1_ProcessAudio(instance, cloudx1_GetBufferIn(instance), cloudx1_GetBufferOut(instance));
893 }
905 void ProcessAudio_Planar(float const * const *input, float * const *output)
906 {
907 assert(instance);
908 cloudx1_ProcessAudio_Planar(instance, input, output);
909 }
910
922 template<typename T>
923 std::vector<T> ProcessAnyAudio(const std::vector<T> input)
924 {
925 assert(instance);
926 std::vector<T> output;
927 unsigned int out_offset=0;
928 unsigned int in_offset=0;
929 unsigned int todo = input.size();
930 while (todo>0) {
931 unsigned int left = AddAudio(&input[in_offset], todo);
932 unsigned int out_avail = cloudx1_GetOutputCount(instance);
933 output.resize(out_offset + out_avail);
934 GetAudio(&output[out_offset], out_avail);
935 out_offset+=out_avail;
936 in_offset += todo-left;
937 todo=left;
938 }
939 return output;
940 }
941
947 class CClient {
948 public:
950 {
951 assert(instance);
952 client=cloudx1_NewClient(instance);
953 if (!client) throw std::bad_alloc();
954 }
955 // non-copyable
956 CClient( const CInstance& ) = delete;
957 CClient& operator=( const CInstance& ) = delete;
959 {
960 if (client) {
961 cloudx1_DeleteClient(client);
962 client=nullptr;
963 }
964 }
972 std::string ProcessJson(const std::string &request, bool *NeedSave = nullptr)
973 {
974 assert(client);
975 int need_save=0;
976 const char *canswer = cloudx1_ProcessJson(client, request.c_str(), &need_save);
977 if (!canswer) return {};
978 std::string answer(canswer);
979 cloudx1_FreeJsonAnswer (canswer);
980 if (NeedSave) {
981 *NeedSave=(need_save!=0);
982 }
983 return answer;
984 }
985 private:
986 cloudx1_CClientInstance *client = nullptr;
987 };
995 std::shared_ptr<CClient> NewClient()
996 {
997 assert(instance);
998 return std::make_shared<CClient>(instance);
999 }
1000
1011 bool SaveState() {
1012 assert(instance);
1013 if (cloudx1_SaveState(instance)!=0) {
1014 return false;
1015 }
1016 return true;
1017 }
1018#ifdef _WIN32
1025 void SetInstanceTracing(TraceLoggingHProvider tracing_provider, GUID activity_guid = {}) {
1026 cloudx1_SetInstanceTracing(params, tracing_provider, activity_guid);
1027 }
1034 void SetInstanceTracingProcessActivity(GUID activity_guid) {
1035 assert(instance);
1036 cloudx1_SetInstanceTracingProcessActivity(instance, activity_guid);
1037 }
1038#endif // _WIN32
1039 protected:
1040 template<typename T>
1041 unsigned int AddAudio(const T* payload, unsigned int nFrame)
1042 {
1043 assert(instance);
1044 return cloudx1_AddAudio(instance, reinterpret_cast<const T*>(payload), nFrame, helper::SampleFormat<T>::format);
1045 }
1046 template<typename T>
1047 unsigned int GetAudio(T* payload, unsigned int max_nFrame)
1048 {
1049 assert(instance);
1050 return cloudx1_GetAudio(instance, reinterpret_cast<T*>(payload), max_nFrame, helper::SampleFormat<T>::format);
1051 }
1052
1053 private:
1054 cloudx1_CParameters* params = nullptr;
1055 cloudx1_CInstance* instance = nullptr;
1056 std::thread update_thread;
1057 std::vector< std::pair<std::string,std::string> > init_metadata;
1058#if CLOUDX1_HAS_WEBSERVER
1059 uint64_t webserver = SOUND4_INVALID_WEBSERVER_ID;
1060#endif // CLOUDX1_HAS_WEBSERVER
1061 };
1062
1063}; // namespace cloudx1
1064}; // namespace sound4
1065
1066// bridge C callbacks to CPresetLoader
1067extern "C" {
1068 static char *cloudx1_custom_reader(const fs_char *filename, void* userdata) {
1069 sound4::cloudx1::CPresetLoader *preset_loader=reinterpret_cast<sound4::cloudx1::CPresetLoader*>(userdata);
1070 std::string content=preset_loader->Read(filename);
1071 return strdup(content.c_str());
1072 }
1073 static void cloudx1_custom_reader_free(char *content, void* userdata) {
1074 if (!content) return;
1075 free(content);
1076 }
1077 static int cloudx1_custom_writer(const fs_char *filename, const char *content, void* userdata) {
1078 sound4::cloudx1::CPresetLoader *preset_loader=reinterpret_cast<sound4::cloudx1::CPresetLoader*>(userdata);
1079 auto res=preset_loader->Write(filename,content);
1080 return res?0:-1;
1081 }
1082 static int cloudx1_custom_exists(const fs_char *filename, void* userdata) {
1083 sound4::cloudx1::CPresetLoader *preset_loader=reinterpret_cast<sound4::cloudx1::CPresetLoader*>(userdata);
1084 auto res=preset_loader->Exists(filename);
1085 return res?0:-1;
1086 }
1087 static fs_char** cloudx1_custom_getall(void* userdata) {
1088 sound4::cloudx1::CPresetLoader *preset_loader=reinterpret_cast<sound4::cloudx1::CPresetLoader*>(userdata);
1089 auto res=preset_loader->GetAll();
1090 fs_char**all=(fs_char**)malloc((res.size()+1)*sizeof(const fs_char*));
1091 for (size_t n=0;n<res.size();n++) {
1092 all[n]=fs_strdup(res[n].c_str());
1093 }
1094 all[res.size()]=nullptr;
1095 return all;
1096 }
1097 static void cloudx1_custom_getall_free(fs_char** all, void* userdata) {
1098 if (!all) return;
1099 for (fs_char** one=all;*one;one++) {
1100 free(*one);
1101 }
1102 free(all);
1103 }
1104 static int cloudx1_custom_remove(const fs_char *filename, void* userdata) {
1105 sound4::cloudx1::CPresetLoader *preset_loader=reinterpret_cast<sound4::cloudx1::CPresetLoader*>(userdata);
1106 auto res=preset_loader->Remove(filename);
1107 return res?0:-1;
1108 }
1109 static int cloudx1_custom_rename(const fs_char *from, const fs_char *to, void* userdata) {
1110 sound4::cloudx1::CPresetLoader *preset_loader=reinterpret_cast<sound4::cloudx1::CPresetLoader*>(userdata);
1111 auto res=preset_loader->Rename(from,to);
1112 return res?0:-1;
1113 }
1114
1115};
Shared Bus.
Definition sound4cl.hpp:841
sound4cl_CBus * Get() const
Definition sound4cl.hpp:859
std::string ProcessJson(const std::string &request, bool *NeedSave=nullptr)
Process a JSON request and returns the answer.
CClient & operator=(const CInstance &)=delete
CClient(cloudx1_CInstance *instance)
CClient(const CInstance &)=delete
Instance handling class.
void PresetManager_InformChange(const std::filesystem::path &relative_path, PresetChange_Kind change_kind)
void StopWebServer(int timeout_ms=1000)
void SetWebServerAppHealth(int httpcode, const std::string &contenttype, const std::string &content)
void ProcessAudio_Planar(float const *const *input, float *const *output)
std::string GetParam(const std::string &name)
void SetPresetManager(CPresetLoader *preset_manager)
std::array< float, OutputSampleSize > & GetBufferOut()
bool Create(const std::string &LoginKey, const std::string &RadioName, const std::string &Access_Key_ID, const std::string &Access_Key_Secret, const std::filesystem::path &save_path, int json_port=0, unsigned int frames_per_chunk=64)
bool StartWebServer(int http_port, int https_port=0)
std::vector< T > ProcessAnyAudio(const std::vector< T > input)
std::vector< std::tuple< std::string, std::string > > GetMetadataInfos()
std::array< float, InputSampleSize > & GetBufferIn()
CInstance(const CInstance &)=delete
unsigned int GetAudio(T *payload, unsigned int max_nFrame)
void SetMetadataMulti(const std::unordered_map< std::string, const char * > &list)
void SetMetadata(const std::string &key, const char *value)
CInstance & operator=(const CInstance &)=delete
void SetInstanceTracingProcessActivity(GUID activity_guid)
std::shared_ptr< CClient > NewClient()
void SetInstanceTracing(TraceLoggingHProvider tracing_provider, GUID activity_guid={})
unsigned int AddAudio(const T *payload, unsigned int nFrame)
void GetWebServerAppHealth(int &httpcode, std::string &contenttype, std::string &content)
void SetParam(const std::string &name, const std::string &value)
Custom preset handler helper.
virtual bool Exists(const std::filesystem::path &name)=0
virtual bool Remove(const std::filesystem::path &name)=0
virtual bool Write(const std::filesystem::path &filename, const std::string &content)=0
virtual bool Rename(const std::filesystem::path &from, const std::filesystem::path &to)=0
virtual ~CPresetLoader()=default
virtual std::vector< std::filesystem::path > GetAll()=0
virtual std::string Read(const std::filesystem::path &filename)=0
enum cloudx1_SampleFormat cloudx1_GetFormatFromName(const char *name)
cloudx1_SampleFormat
const char * cloudx1_GetFormatName(const enum cloudx1_SampleFormat fmt)
unsigned int cloudx1_GetOutputCount(struct cloudx1_CInstance *instance)
unsigned int cloudx1_AddAudio(struct cloudx1_CInstance *instance, const uint8_t *payload, unsigned int nFrame, enum cloudx1_SampleFormat fmt)
unsigned int cloudx1_GetBytesFromFormat(const enum cloudx1_SampleFormat fmt)
unsigned int cloudx1_GetAudio(struct cloudx1_CInstance *instance, uint8_t *payload, unsigned int max_nFrame, enum cloudx1_SampleFormat fmt)
struct cloudx1_CClientInstance * cloudx1_NewClient(struct cloudx1_CInstance *instance)
int cloudx1_SaveState(struct cloudx1_CInstance *instance)
void cloudx1_DeleteClient(struct cloudx1_CClientInstance *client)
const char * cloudx1_ProcessJson(struct cloudx1_CClientInstance *client, const char *json_str, int *need_save)
void cloudx1_FreeJsonAnswer(const char *json_str)
void cloudx1_AudioConvertTo(const float *input, uint8_t *payload, size_t nSpl, enum cloudx1_SampleFormat fmt)
void cloudx1_AudioMonoToLiveStereo(const float *input, uint8_t *payload)
void cloudx1_MonoToStereo_Planar(const float *input, float *outputL, float *outputR, size_t nFrame)
void cloudx1_StereoToMono(const float *input, float *output, size_t nFrame)
void cloudx1_AudioConvertFrom(const uint8_t *payload, float *output, size_t nSpl, enum cloudx1_SampleFormat fmt)
void cloudx1_MonoToStereo(const float *input, float *output, size_t nFrame)
void cloudx1_AudioMonoFromLiveStereo(const uint8_t *payload, float *output)
void cloudx1_StereoToMono_Planar(const float *inputL, const float *inputR, float *output, size_t nFrame)
float * cloudx1_GetBufferOut(struct cloudx1_CInstance *instance)
void cloudx1_ProcessAudio_Planar(struct cloudx1_CInstance *instance, float const *const *input, float *const *output)
void cloudx1_ProcessAudio(struct cloudx1_CInstance *instance, const float *input, float *output)
unsigned int cloudx1_GetEstimatedDelay(struct cloudx1_CInstance *instance)
float * cloudx1_GetBufferIn(struct cloudx1_CInstance *instance)
unsigned int * cloudx1_GetPossibleChunkSizeInFrames()
unsigned int cloudx1_GetAudioInputCount()
#define CLOUDX1_AUDIO_INPUT_COUNT
cloudx1_LogSeverity
unsigned int cloudx1_GetChunkSizeInFrames()
#define CLOUDX1_AUDIOFRAME_COUNT
unsigned int cloudx1_GetAudioOutputCount()
unsigned int cloudx1_GetChannelCount()
void cloudx1_SetLoggerCallback(cloudx1_loggerfn logger)
unsigned int cloudx1_GetSampleRate()
#define CLOUDX1_SAMPLE_RATE
const char * cloudx1_GetVersion()
#define CLOUDX1_CHANNEL_COUNT
#define CLOUDX1_AUDIO_OUTPUT_COUNT
void cloudx1_SetLogSeverity(enum cloudx1_LogSeverity severity)
void cloudx1_FreeParameterValue(const char *value)
void cloudx1_ExitProcess(struct cloudx1_CInstance *instance)
void cloudx1_FreeParameters(struct cloudx1_CParameters *params)
void cloudx1_SetParameter(struct cloudx1_CParameters *params, const char *name, const char *value)
struct cloudx1_CParameters * cloudx1_NewParameters()
int cloudx1_TerminateProcess(struct cloudx1_CInstance *instance)
const char * cloudx1_GetParameter(struct cloudx1_CParameters *params, const char *name)
unsigned int cloudx1_GetProcessChunkFrames(struct cloudx1_CInstance *instance)
struct cloudx1_CInstance * cloudx1_InitProcess3(const char *LoginKey, const char *RadioName, const char *Access_Key_ID, const char *Access_Key_Secret, const char *save_path, const struct cloudx1_CParameters *parameters, unsigned int frames_per_chunk)
const char ** cloudx1_GetMetadataInfos(struct cloudx1_CInstance *instance)
void cloudx1_SetMetadata(struct cloudx1_CInstance *instance, const char *key, const char *value)
void cloudx1_FreeMetadataInfos(struct cloudx1_CInstance *instance, const char **infos)
void cloudx1_SetMetadataMulti(struct cloudx1_CInstance *instance, const char **keyvalue)
cloudx1_PresetChange_Kind
void cloudx1_SetPresetManager(struct cloudx1_CParameters *params, cloudx1_storage_reader reader, cloudx1_storage_reader_free, cloudx1_storage_writer writer, cloudx1_storage_exists exists, cloudx1_storage_getall getall, cloudx1_storage_getall_free getall_free, cloudx1_storage_remove remove, cloudx1_storage_rename rename, int IsReadOnly, void *userdata)
void cloudx1_PresetManager_InformChange(struct cloudx1_CInstance *instance, const fs_char *relative_path, enum cloudx1_PresetChange_Kind change_kind)
wchar_t fs_char
void cloudx1_SetInstanceTracingProcessActivity(struct cloudx1_CInstance *instance, GUID activity_guid)
void cloudx1_SetInstanceTracing(struct cloudx1_CParameters *params, TraceLoggingHProvider tracing_provider, GUID activity_guid)
void cloudx1_StartUpdateThread(struct cloudx1_CInstance *instance, unsigned int port)
int cloudx1_WaitUpdateThreadReady(struct cloudx1_CInstance *instance, int milliseconds)
void cloudx1_StopUpdateThread(struct cloudx1_CInstance *instance)
#define SOUND4_WEBSERVER_HTTPS_OK
uint64_t cloudx1_Webserver(unsigned int listenport, unsigned int listenport_secure, struct cloudx1_CInstance *instance)
void cloudx1_Webserver_FreeString(char *str)
int cloudx1_Webserver_Status(uint64_t id)
#define SOUND4_WEBSERVER_HTTP_OK
#define SOUND4_INVALID_WEBSERVER_ID
int cloudx1_Webserver_Stop(uint64_t id, int timeout_ms)
void cloudx1_Webserver_GetAppHealth(struct cloudx1_CInstance *instance, int *httpcode, char **contenttype, char **content)
void cloudx1_Webserver_SetAppHealth(struct cloudx1_CInstance *instance, int httpcode, const char *contenttype, const char *content)
static void AudioConvertTo(const float *input, uint8_t *payload, size_t nSpl, cloudx1_SampleFormat fmt)
static void StereoToMono_Planar(const float *inputL, const float *inputR, float *output, size_t nFrame)
static std::string WStringToUTF8(const std::wstring &wstr)
static std::wstring UTF8ToWString(const std::string &str)
static void AudioMonoFromLiveStereo(const uint8_t *payload, float *output)
static void AudioConvertFrom(const uint8_t *payload, float *output, size_t nSpl, cloudx1_SampleFormat fmt)
static void StereoToMono(const float *input, float *output, size_t nFrame)
static void AudioMonoToLiveStereo(const float *input, uint8_t *payload)
static void MonoToStereo(const float *input, float *output, size_t nFrame)
static void MonoToStereo_Planar(const float *input, float *outputL, float *outputR, size_t nFrame)
static void SanityCheck(bool a_bCheckFrames=true)
const size_t SampleRate
static constexpr const char * process_name
static void _log_cb_c(cloudx1_LogSeverity severity, const char *c_msg)
static unsigned int GetSampleRate()
std::function< void(LogSeverity, const std::string &)> log_cb_t
static std::string GetVersion()
static unsigned int GetAudioOutputCount()
const size_t InputChannels
const size_t OutputSampleSize
static constexpr const char * process_shortname
static void SetLogSeverity(LogSeverity severity)
static unsigned int GetChannelCount()
static void SetLoggerCallback(log_cb_t cb)
const size_t InputSampleSize
static log_cb_t _log_cb
static std::string GetFormatName(const SampleFormat fmt)
static unsigned int GetAudioInputCount()
const size_t ChunkFrames
const size_t OutputChannels
static SampleFormat GetFormatFromName(const std::string &name)
static std::vector< unsigned int > GetPossibleChunkSizeInFrames()
static unsigned int GetChunkSizeInFrames()
static unsigned int GetBytesFromFormat(const SampleFormat fmt)
@ S32_NATIVE
32-bit signed integer, native
Definition sound4cl.hpp:72
@ F32_NATIVE
32-bit floating-point, native
Definition sound4cl.hpp:73
@ S16_NATIVE
16-bit signed integer, native
Definition sound4cl.hpp:70
C interface for library.
struct _tlgProvider_t const * TraceLoggingHProvider
static void cloudx1_custom_getall_free(fs_char **all, void *userdata)
static void cloudx1_custom_reader_free(char *content, void *userdata)
static int cloudx1_custom_exists(const fs_char *filename, void *userdata)
static int cloudx1_custom_remove(const fs_char *filename, void *userdata)
static char * cloudx1_custom_reader(const fs_char *filename, void *userdata)
static int cloudx1_custom_rename(const fs_char *from, const fs_char *to, void *userdata)
static fs_char ** cloudx1_custom_getall(void *userdata)
static int cloudx1_custom_writer(const fs_char *filename, const char *content, void *userdata)
Helper for Sample format types.