24 #include <libloaderapi.h>
26 #error "Unsupported OS"
33 static char *sound4cl_custom_reader(
const fs_char *filename,
void* userdata);
34 static void sound4cl_custom_reader_free(
char *content,
void* userdata);
35 static int sound4cl_custom_writer(
const fs_char *filename,
const char *content,
void* userdata);
36 static int sound4cl_custom_exists(
const fs_char *filename,
void* userdata);
37 static fs_char** sound4cl_custom_getall(
void* userdata);
38 static void sound4cl_custom_getall_free(
fs_char** all,
void* userdata);
39 static int sound4cl_custom_remove(
const fs_char *filename,
void* userdata);
40 static int sound4cl_custom_rename(
const fs_char *from,
const fs_char *to,
void* userdata);
58 static inline std::string WStringToUTF8(
const std::wstring& wstr) {
59 if (wstr.empty())
return {};
60 int size = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (
int)wstr.size(), NULL, 0, NULL, NULL);
61 std::string str(size, 0);
62 WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (
int)wstr.size(), &str[0], size, NULL, NULL);
70 static inline std::wstring UTF8ToWString(
const std::string& str) {
71 if (str.empty())
return std::wstring();
72 int size = MultiByteToWideChar(CP_UTF8, 0, &str[0], (
int)str.size(), NULL, 0);
73 std::wstring wstr(size, 0);
74 MultiByteToWideChar(CP_UTF8, 0, &str[0], (
int)str.size(), &wstr[0], size);
114 template <
typename T>
121 operator bool()
const {
return (m_ptr!=NULL); }
122 bool IsOk()
const {
return m_ptr!=NULL; }
123 operator T* ()
const {
return reinterpret_cast<T*
>(m_ptr); }
139 operator bool()
const {
140 return (m_lib!=NULL);
143 return (m_lib!=NULL);
148 #ifndef __SANITIZE_ADDRESS__
154 bool Load(
const std::filesystem::path& dynlib)
157 m_lib=dlopen(dynlib.c_str(), RTLD_NOW|RTLD_LOCAL);
160 template <
typename T>
161 DynFuncHolder<T>
GetSymbol(
const std::string& name) {
162 auto ptr=dlsym(m_lib, name.c_str());
164 throw std::runtime_error(
"Missing function in library");
166 return DynFuncHolder<T>(ptr);
168 template <
typename T>
170 auto ptr=dlsym(m_lib, name.c_str());
171 return DynFuncHolder<T>(ptr);
176 auto rp=realpath(
info.dli_fname, NULL);
177 std::filesystem::path p(rp);
182 bool Load(
const std::filesystem::path& dynlib, uint32_t loadflags = LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR|LOAD_LIBRARY_SEARCH_APPLICATION_DIR|LOAD_LIBRARY_SEARCH_USER_DIRS|LOAD_LIBRARY_SEARCH_SYSTEM32)
185 m_lib=LoadLibraryExW(dynlib.c_str(), NULL, loadflags);
192 #if defined(SOUND4_CALL_FREELIBRARYANDEXITTHREAD)
193 FreeLibraryAndExitThread(m_lib, 0);
194 #elif defined(SOUND4_CALL_FREELIBRARY)
200 template <
typename T>
202 auto ptr=GetProcAddress(m_lib, name.c_str());
204 throw std::runtime_error(
"Missing function in library");
208 template <
typename T>
210 auto ptr=GetProcAddress(m_lib, name.c_str());
214 static wchar_t path[MAX_PATH]={};
216 if (GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
217 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
220 if (GetModuleFileNameW(hm, path, MAX_PATH) > 0) {
221 return std::filesystem::path(path);
259 static inline void _log_cb_c(
LogSeverity severity,
const char *c_msg) {
260 _log_cb(severity, std::string(c_msg));
274 std::string m_prefix;
363 template <
typename T>
365 std::string prefix_name = m_prefix+name;
379 bool Load(
const std::filesystem::path& filepath) {
382 if (filepath.has_parent_path() && !m_lib.
Load(filepath)) {
384 }
else if (!m_lib.
IsOk()) {
386 auto filename = filepath.filename();
389 if (!m_lib.
IsOk() && thisdir.filename()==
"bin") {
390 auto libdir = thisdir.parent_path() /
"lib";
391 m_lib.
Load(libdir / filename);
396 m_lib.
Load(thisdir / filename);
400 m_lib.
Load(std::filesystem::current_path() / filename);
409 auto info = GetInfo();
410 m_prefix =
info->prefix;
411 }
catch (std::runtime_error& ) {
414 std::string filename = helper::WStringToUTF8(filepath.stem());
416 std::string filename = filepath.stem();
418 filename=filename.substr(3);
420 if (filename==
"sound4.x1.cloud") {
422 }
else if (filename==
"sound4.impact.cl") {
424 }
else if (filename==
"sound4.bigvoice.cl") {
425 m_prefix=
"bigvoice_";
433 fnGetVersion = GetPrefixSymbol< decltype(sound4cl_GetVersion ) >(
"GetVersion" );
434 fnGetChunkSizeInFrames = GetPrefixSymbol< decltype(sound4cl_GetChunkSizeInFrames ) >(
"GetChunkSizeInFrames" );
435 fnGetChannelCount = GetPrefixSymbol< decltype(sound4cl_GetChannelCount ) >(
"GetChannelCount" );
436 fnGetAudioInputCount = GetPrefixSymbol< decltype(sound4cl_GetAudioInputCount ) >(
"GetAudioInputCount" );
437 fnGetAudioOutputCount = GetPrefixSymbol< decltype(sound4cl_GetAudioOutputCount ) >(
"GetAudioOutputCount" );
438 fnGetSampleRate = GetPrefixSymbol< decltype(sound4cl_GetSampleRate ) >(
"GetSampleRate" );
439 fnSetLoggerCallback = GetPrefixSymbol< decltype(sound4cl_SetLoggerCallback ) >(
"SetLoggerCallback" );
440 fnSetLogSeverity = GetPrefixSymbol< decltype(sound4cl_SetLogSeverity ) >(
"SetLogSeverity" );
441 fnNewParameters = GetPrefixSymbol< decltype(sound4cl_NewParameters ) >(
"NewParameters" );
442 fnFreeParameters = GetPrefixSymbol< decltype(sound4cl_FreeParameters ) >(
"FreeParameters" );
443 fnSetParameter = GetPrefixSymbol< decltype(sound4cl_SetParameter ) >(
"SetParameter" );
444 fnGetParameter = GetPrefixSymbol< decltype(sound4cl_GetParameter ) >(
"GetParameter" );
445 fnFreeParameterValue = GetPrefixSymbol< decltype(sound4cl_FreeParameterValue ) >(
"FreeParameterValue" );
446 fnInitProcess = GetPrefixSymbol< decltype(sound4cl_InitProcess ) >(
"InitProcess" );
447 fnInitProcess2 = GetPrefixSymbol< decltype(sound4cl_InitProcess2 ) >(
"InitProcess2" );
448 fnTerminateProcess = GetPrefixSymbol< decltype(sound4cl_TerminateProcess ) >(
"TerminateProcess" );
449 fnExitProcess = GetPrefixSymbol< decltype(sound4cl_ExitProcess ) >(
"ExitProcess" );
450 fnStartUpdateThread = GetPrefixSymbol< decltype(sound4cl_StartUpdateThread ) >(
"StartUpdateThread" );
451 fnStopUpdateThread = GetPrefixSymbol< decltype(sound4cl_StopUpdateThread ) >(
"StopUpdateThread" );
452 fnWaitUpdateThreadReady = GetPrefixSymbol< decltype(sound4cl_WaitUpdateThreadReady ) >(
"WaitUpdateThreadReady" );
453 fnProcessAudio = GetPrefixSymbol< decltype(sound4cl_ProcessAudio ) >(
"ProcessAudio" );
454 fnProcessAudio_Planar = GetPrefixSymbol< decltype(sound4cl_ProcessAudio_Planar ) >(
"ProcessAudio_Planar" );
455 fnGetBufferIn = GetPrefixSymbol< decltype(sound4cl_GetBufferIn ) >(
"GetBufferIn" );
456 fnGetBufferOut = GetPrefixSymbol< decltype(sound4cl_GetBufferOut ) >(
"GetBufferOut" );
457 fnGetEstimatedDelay = GetPrefixSymbol< decltype(sound4cl_GetEstimatedDelay ) >(
"GetEstimatedDelay" );
458 fnGetFormatName = GetPrefixSymbol< decltype(sound4cl_GetFormatName ) >(
"GetFormatName" );
459 fnGetFormatFromName = GetPrefixSymbol< decltype(sound4cl_GetFormatFromName ) >(
"GetFormatFromName" );
460 fnGetBytesFromFormat = GetPrefixSymbol< decltype(sound4cl_GetBytesFromFormat ) >(
"GetBytesFromFormat" );
461 fnGetMaxPacketFrame = GetPrefixSymbol< decltype(sound4cl_GetMaxPacketFrame ) >(
"GetMaxPacketFrame" );
462 fnAddAudio = GetPrefixSymbol< decltype(sound4cl_AddAudio ) >(
"AddAudio" );
463 fnAddPadAudio = GetPrefixSymbol< decltype(sound4cl_AddPadAudio ) >(
"AddPadAudio" );
464 fnGetOutputCount = GetPrefixSymbol< decltype(sound4cl_GetOutputCount ) >(
"GetOutputCount" );
465 fnGetAudio = GetPrefixSymbol< decltype(sound4cl_GetAudio ) >(
"GetAudio" );
466 fnAudioConvertFrom = GetPrefixSymbol< decltype(sound4cl_AudioConvertFrom ) >(
"AudioConvertFrom" );
467 fnAudioConvertTo = GetPrefixSymbol< decltype(sound4cl_AudioConvertTo ) >(
"AudioConvertTo" );
468 fnStereoToMono = GetPrefixSymbol< decltype(sound4cl_StereoToMono ) >(
"StereoToMono" );
469 fnMonoToStereo = GetPrefixSymbol< decltype(sound4cl_MonoToStereo ) >(
"MonoToStereo" );
471 fnAudioMonoToLiveStereo = GetPrefixSymbol< decltype(sound4cl_AudioMonoToLiveStereo ) >(
"AudioMonoToLiveStereo" );
472 fnNewClient = GetPrefixSymbol< decltype(sound4cl_NewClient ) >(
"NewClient" );
473 fnDeleteClient = GetPrefixSymbol< decltype(sound4cl_DeleteClient ) >(
"DeleteClient" );
474 fnProcessJson = GetPrefixSymbol< decltype(sound4cl_ProcessJson ) >(
"ProcessJson" );
475 fnFreeJsonAnswer = GetPrefixSymbol< decltype(sound4cl_FreeJsonAnswer ) >(
"FreeJsonAnswer" );
476 fnSaveState = GetPrefixSymbol< decltype(sound4cl_SaveState ) >(
"SaveState" );
477 }
catch (std::runtime_error& ) {
482 fnWebserver_tcp = GetPrefixSymbol< decltype(sound4cl_Webserver_tcp ) >(
"Webserver_tcp" );
483 fnWebserver_tcp2 = GetPrefixSymbol< decltype(sound4cl_Webserver_tcp2 ) >(
"Webserver_tcp2" );
484 fnWebserver = GetPrefixSymbol< decltype(sound4cl_Webserver ) >(
"Webserver" );
485 fnWebserver_Stop = GetPrefixSymbol< decltype(sound4cl_Webserver_Stop ) >(
"Webserver_Stop" );
486 fnWebserver_Status = GetPrefixSymbol< decltype(sound4cl_Webserver_Status ) >(
"Webserver_Status" );
487 }
catch (std::runtime_error& ) {
493 fnStereoToMono_Planar = GetPrefixSymbol< decltype(sound4cl_StereoToMono_Planar ) >(
"StereoToMono_Planar" );
494 fnMonoToStereo_Planar = GetPrefixSymbol< decltype(sound4cl_MonoToStereo_Planar ) >(
"MonoToStereo_Planar" );
496 }
catch (std::runtime_error& ) {
502 fnSetMetadata = GetPrefixSymbol< decltype(sound4cl_SetMetadata ) >(
"SetMetadata" );
503 fnGetMetadataInfos = GetPrefixSymbol< decltype(sound4cl_GetMetadataInfos ) >(
"GetMetadataInfos" );
504 fnFreeMetadataInfos = GetPrefixSymbol< decltype(sound4cl_FreeMetadataInfos ) >(
"FreeMetadataInfos" );
506 fnSetPresetManager = GetPrefixSymbol< decltype(sound4cl_SetPresetManager ) >(
"SetPresetManager" );
511 fnGetProcessChunkFrames = GetPrefixSymbol< decltype(sound4cl_GetProcessChunkFrames ) >(
"GetProcessChunkFrames" );
512 fnInitProcess3 = GetPrefixSymbol< decltype(sound4cl_InitProcess3 ) >(
"InitProcess3" );
513 }
catch (std::runtime_error& ) {
520 fnNewBus = GetPrefixSymbol< decltype(sound4cl_NewBus ) >(
"NewBus" );
521 fnFreeBus = GetPrefixSymbol< decltype(sound4cl_FreeBus ) >(
"FreeBus" );
522 fnSetInstanceBus = GetPrefixSymbol< decltype(sound4cl_SetInstanceBus ) >(
"SetInstanceBus" );
523 }
catch (std::runtime_error& ) {
530 fnSetMetadataMulti = GetPrefixSymbol< decltype(sound4cl_SetMetadataMulti ) >(
"SetMetadataMulti" );
532 }
catch (std::runtime_error& ) {
539 fnWebserver_SetAppHealth = GetPrefixSymbol< decltype(sound4cl_Webserver_SetAppHealth ) >(
"Webserver_SetAppHealth" );
540 fnWebserver_GetAppHealth = GetPrefixSymbol< decltype(sound4cl_Webserver_GetAppHealth ) >(
"Webserver_GetAppHealth" );
541 fnWebserver_FreeString = GetPrefixSymbol< decltype(sound4cl_Webserver_FreeString ) >(
"Webserver_FreeString" );
542 }
catch (std::runtime_error& ) {
609 std::vector<unsigned int> list;
612 list.push_back(*src);
719 sound4cl_CBus *
Get()
const {
return m_bus; }
722 sound4cl_CBus *m_bus;
736 virtual bool Exists(
const std::filesystem::path &name) = 0;
737 virtual bool Remove(
const std::filesystem::path &name) = 0;
738 virtual bool Rename(
const std::filesystem::path &from,
const std::filesystem::path &to) = 0;
739 virtual std::vector<std::filesystem::path>
GetAll() = 0;
740 virtual std::string
Read(
const std::filesystem::path &filename) = 0;
741 virtual bool Write(
const std::filesystem::path &filename,
const std::string &content) =0;
759 if (!params)
throw std::bad_alloc();
775 bool IsOk()
const {
return instance!=
nullptr; }
783 void SetParam(
const std::string& name,
const std::string& value)
797 std::string ret(c_value);
823 if (!preset_manager)
return;
827 sound4cl_custom_reader,
828 sound4cl_custom_reader_free,
829 sound4cl_custom_writer,
830 sound4cl_custom_exists,
831 sound4cl_custom_getall,
832 sound4cl_custom_getall_free,
833 sound4cl_custom_remove,
834 sound4cl_custom_rename,
854 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=0)
857 std::string l_save_path;
858 if (!save_path.empty()) {
859 l_save_path = save_path.u8string();
861 if (frames_per_chunk==0) {
865 instance = m_dynlib.
fnInitProcess3(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);
869 instance = m_dynlib.
fnInitProcess2(LoginKey.c_str(), RadioName.c_str(), Access_Key_ID.c_str(), Access_Key_Secret.c_str(), l_save_path.c_str(), params);
871 if (!instance)
return false;
872 if (!init_metadata.empty()) {
873 for (
auto&& [key,value]: init_metadata) {
874 m_dynlib.
fnSetMetadata(instance, key.c_str(), value.c_str());
876 init_metadata.clear();
878 update_thread = std::thread([
this, json_port](){
938 init_metadata.push_back( {key, value} );
957 typedef const char* pchar;
958 pchar* keyvalue=
new pchar[2*list.size()+1];
960 for (
auto&& [key,value]: list) {
961 keyvalue[2*n+0]=key.c_str();
962 keyvalue[2*n+1]=value;
965 keyvalue[2*n+0]=
nullptr;
971 for (
auto&& [key,value]: list) {
976 for (
auto&& [key,value]: list) {
978 init_metadata.push_back( {key, value} );
991 std::vector< std::tuple<std::string,std::string> > values;
995 for (
const char** c_value=c_values; *c_value; ) {
996 std::string key(*c_value);
999 std::string descr(*c_value);
1001 values.push_back( {key,descr} );
1027 webserver = m_dynlib.
fnWebserver(http_port,https_port,instance);
1070 char* c_contenttype=
nullptr;
1071 char* c_content=
nullptr;
1073 contenttype=c_contenttype;
1086 if (!instance)
return 0;
1097 if (!instance)
return;
1099 if (update_thread.joinable()) {
1101 update_thread.join();
1190 template<
typename T>
1194 std::vector<T> output;
1195 unsigned int out_offset=0;
1196 unsigned int in_offset=0;
1197 unsigned int todo = input.size();
1199 unsigned int left =
AddAudio(&input[in_offset], todo);
1201 output.resize(out_offset + out_avail);
1202 GetAudio(&output[out_offset], out_avail);
1203 out_offset+=out_avail;
1204 in_offset += todo-left;
1222 if (!client)
throw std::bad_alloc();
1241 std::string
ProcessJson(
const std::string &request,
bool *NeedSave =
nullptr)
1245 const char *canswer = m_dynlib.
fnProcessJson(client, request.c_str(), &need_save);
1246 if (!canswer)
return {};
1247 std::string answer(canswer);
1250 *NeedSave=(need_save!=0);
1256 sound4cl_CClientInstance *client =
nullptr;
1268 return std::make_shared<CClient>(instance, m_dynlib);
1272 template<
typename T>
1273 unsigned int AddAudio(
const T* payload,
unsigned int nFrame)
1278 template<
typename T>
1279 unsigned int GetAudio(T* payload,
unsigned int max_nFrame)
1287 sound4cl_CParameters* params =
nullptr;
1288 sound4cl_CInstance* instance =
nullptr;
1289 std::thread update_thread;
1290 std::vector< std::pair<std::string,std::string> > init_metadata;
1299 static char *sound4cl_custom_reader(
const fs_char *filename,
void* userdata) {
1301 std::string content=preset_loader->
Read(filename);
1302 return strdup(content.c_str());
1304 static void sound4cl_custom_reader_free(
char *content,
void* userdata) {
1305 if (!content)
return;
1308 static int sound4cl_custom_writer(
const fs_char *filename,
const char *content,
void* userdata) {
1310 auto res=preset_loader->
Write(filename,content);
1313 static int sound4cl_custom_exists(
const fs_char *filename,
void* userdata) {
1315 auto res=preset_loader->
Exists(filename);
1318 static fs_char** sound4cl_custom_getall(
void* userdata) {
1320 auto res=preset_loader->
GetAll();
1322 for (
size_t n=0;n<res.size();n++) {
1325 all[res.size()]=
nullptr;
1328 static void sound4cl_custom_getall_free(
fs_char** all,
void* userdata) {
1330 for (
fs_char** one=all;*one;one++) {
1335 static int sound4cl_custom_remove(
const fs_char *filename,
void* userdata) {
1337 auto res=preset_loader->
Remove(filename);
1340 static int sound4cl_custom_rename(
const fs_char *from,
const fs_char *to,
void* userdata) {
1342 auto res=preset_loader->
Rename(from,to);
sound4cl_CBus * Get() const
CClient(const CInstance &)=delete
CClient(sound4cl_CInstance *instance, CProcessor &dynlib)
CClient & operator=(const CInstance &)=delete
std::string ProcessJson(const std::string &request, bool *NeedSave=nullptr)
Process a JSON request and returns the answer.
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=0)
void ProcessAudio_Planar(float const *const *input, float *const *output)
std::shared_ptr< CClient > NewClient()
std::vector< std::tuple< std::string, std::string > > GetMetadataInfos()
CInstance(const CInstance &)=delete
void GetWebServerAppHealth(int &httpcode, std::string &contenttype, std::string &content)
void SetPresetManager(CPresetLoader *preset_manager)
void SetBus(const CBus &bus)
virtual void OnUpdateThreadStop()
unsigned int GetChunkFrames()
void SetWebServerAppHealth(int httpcode, const std::string &contenttype, const std::string &content)
CInstance(CProcessor &dynlib)
void SetParam(const std::string &name, const std::string &value)
virtual void OnUpdateThreadStart()
bool StartWebServer(int http_port, int https_port=0)
void PresetManager_InformChange(const std::filesystem::path &relative_path, PresetChange_Kind change_kind)
void SetMetadataMulti(const std::unordered_map< std::string, const char * > &list)
unsigned int AddAudio(const T *payload, unsigned int nFrame)
unsigned int GetEstimatedDelay()
void SetMetadata(const std::string &key, const char *value)
std::vector< T > ProcessAnyAudio(const std::vector< T > input)
unsigned int GetAudio(T *payload, unsigned int max_nFrame)
std::string GetParam(const std::string &name)
CInstance & operator=(const CInstance &)=delete
Custom preset handler helper.
virtual std::string Read(const std::filesystem::path &filename)=0
virtual bool Rename(const std::filesystem::path &from, const std::filesystem::path &to)=0
virtual bool Exists(const std::filesystem::path &name)=0
virtual bool Write(const std::filesystem::path &filename, const std::string &content)=0
virtual ~CPresetLoader()=default
virtual bool Remove(const std::filesystem::path &name)=0
virtual std::vector< std::filesystem::path > GetAll()=0
virtual bool IsReadOnly()=0
Dynamic library interface.
helper::DynFuncHolder< decltype(sound4cl_SetMetadataMulti) > fnSetMetadataMulti
helper::DynFuncHolder< decltype(sound4cl_MonoToStereo_Planar) > fnMonoToStereo_Planar
helper::DynFuncHolder< decltype(sound4cl_SetParameter) > fnSetParameter
void StereoToMono_Planar(const float *inputL, const float *inputR, float *output, size_t nSpl)
helper::DynFuncHolder< decltype(sound4cl_GetAudioOutputCount) > fnGetAudioOutputCount
helper::DynFuncHolder< decltype(sound4cl_Webserver_FreeString) > fnWebserver_FreeString
helper::DynFuncHolder< decltype(sound4cl_NewClient) > fnNewClient
helper::DynFuncHolder< decltype(sound4cl_StereoToMono_Planar) > fnStereoToMono_Planar
std::vector< unsigned int > GetPossibleChunkSizeInFrames()
unsigned int GetBytesFromFormat(const sound4cl_SampleFormat fmt)
void AudioConvertTo(const float *input, uint8_t *payload, size_t nSpl, sound4cl_SampleFormat fmt)
helper::DynFuncHolder< decltype(sound4cl_DeleteClient) > fnDeleteClient
helper::DynFuncHolder< decltype(sound4cl_AudioMonoToLiveStereo) > fnAudioMonoToLiveStereo
helper::DynFuncHolder< decltype(sound4cl_GetParameter) > fnGetParameter
bool Load(const std::filesystem::path &filepath)
Loads the library.
void SetLogSeverity(LogSeverity severity)
helper::DynFuncHolder< decltype(sound4cl_Webserver_Stop) > fnWebserver_Stop
helper::DynFuncHolder< decltype(sound4cl_SetInstanceBus) > fnSetInstanceBus
void AudioConvertFrom(const uint8_t *payload, float *output, size_t nSpl, sound4cl_SampleFormat fmt)
helper::DynFuncHolder< decltype(sound4cl_GetMetadataInfos) > fnGetMetadataInfos
helper::DynFuncHolder< decltype(sound4cl_Webserver_Status) > fnWebserver_Status
helper::DynFuncHolder< decltype(sound4cl_NewParameters) > fnNewParameters
helper::DynFuncHolder< decltype(sound4cl_WaitUpdateThreadReady) > fnWaitUpdateThreadReady
helper::DynFuncHolder< decltype(sound4cl_Webserver_SetAppHealth) > fnWebserver_SetAppHealth
unsigned int GetAudioInputCount()
void AudioMonoToLiveStereo(const float *input, uint8_t *payload)
helper::DynFuncHolder< decltype(sound4cl_NewBus) > fnNewBus
helper::DynFuncHolder< decltype(sound4cl_AudioConvertFrom) > fnAudioConvertFrom
helper::DynFuncHolder< decltype(sound4cl_InitProcess3) > fnInitProcess3
void SetLoggerCallback(log_cb_t cb)
helper::DynFuncHolder< decltype(sound4cl_GetBytesFromFormat) > fnGetBytesFromFormat
helper::DynFuncHolder< decltype(sound4cl_AudioConvertTo) > fnAudioConvertTo
helper::DynFuncHolder< decltype(sound4cl_FreeMetadataInfos) > fnFreeMetadataInfos
helper::DynFuncHolder< decltype(sound4cl_SetMetadata) > fnSetMetadata
unsigned int GetChunkSizeInFrames()
helper::DynFuncHolder< decltype(sound4cl_MonoToStereo) > fnMonoToStereo
helper::DynFuncHolder< decltype(sound4cl_GetBufferIn) > fnGetBufferIn
helper::DynFuncHolder< decltype(sound4cl_StereoToMono) > fnStereoToMono
helper::DynFuncHolder< decltype(sound4cl_SaveState) > fnSaveState
helper::DynFuncHolder< decltype(sound4cl_SetLoggerCallback) > fnSetLoggerCallback
helper::DynFuncHolder< decltype(sound4cl_InitProcess2) > fnInitProcess2
helper::DynFuncHolder< decltype(sound4cl_GetOutputCount) > fnGetOutputCount
helper::DynFuncHolder< decltype(sound4cl_ProcessAudio) > fnProcessAudio
helper::DynFuncHolder< decltype(sound4cl_GetSampleRate) > fnGetSampleRate
helper::DynFuncHolder< decltype(sound4cl_Webserver) > fnWebserver
helper::DynFuncHolder< decltype(sound4cl_GetChannelCount) > fnGetChannelCount
helper::DynFuncHolder< decltype(sound4cl_TerminateProcess) > fnTerminateProcess
helper::DynFuncHolder< decltype(sound4cl_ProcessJson) > fnProcessJson
helper::DynFuncHolder< decltype(sound4cl_GetMaxPacketFrame) > fnGetMaxPacketFrame
helper::DynFuncHolder< decltype(sound4cl_FreeBus) > fnFreeBus
helper::DynFuncHolder< decltype(sound4cl_Webserver_tcp2) > fnWebserver_tcp2
helper::DynFuncHolder< decltype(sound4cl_GetProcessChunkFrames) > fnGetProcessChunkFrames
helper::DynFuncHolder< decltype(sound4cl_StartUpdateThread) > fnStartUpdateThread
helper::DynFuncHolder< decltype(sound4cl_AddPadAudio) > fnAddPadAudio
unsigned int GetAudioOutputCount()
sound4cl_SampleFormat GetFormatFromName(const std::string &name)
helper::DynFuncHolder< decltype(sound4cl_Webserver_GetAppHealth) > fnWebserver_GetAppHealth
std::string GetFormatName(const sound4cl_SampleFormat fmt)
helper::DynFuncHolder< decltype(sound4cl_SetLogSeverity) > fnSetLogSeverity
helper::DynFuncHolder< decltype(sound4cl_AddAudio) > fnAddAudio
helper::DynFuncHolder< decltype(sound4cl_GetAudio) > fnGetAudio
unsigned int GetSampleRate()
helper::DynFuncHolder< decltype(sound4cl_InitProcess) > fnInitProcess
helper::DynFuncHolder< decltype(sound4cl_AudioMonoFromLiveStereo) > fnAudioMonoFromLiveStereo
void MonoToStereo(const float *input, float *output, size_t nSpl)
helper::DynFuncHolder< decltype(sound4cl_GetVersion) > fnGetVersion
helper::DynFuncHolder< decltype(sound4cl_FreeParameters) > fnFreeParameters
helper::DynFuncHolder< decltype(sound4cl_GetPossibleChunkSizeInFrames) > fnGetPossibleChunkSizeInFrames
void AudioMonoFromLiveStereo(const uint8_t *payload, float *output)
helper::DynFuncHolder< decltype(sound4cl_GetChunkSizeInFrames) > fnGetChunkSizeInFrames
helper::DynFuncHolder< decltype(sound4cl_StopUpdateThread) > fnStopUpdateThread
helper::DynFuncHolder< decltype(sound4cl_ProcessAudio_Planar) > fnProcessAudio_Planar
bool IsOk() const
Check if the library was loaded correctly.
helper::DynFuncHolder< decltype(sound4cl_GetFormatName) > fnGetFormatName
helper::DynFuncHolder< decltype(sound4cl_FreeParameterValue) > fnFreeParameterValue
helper::DynFuncHolder< decltype(sound4cl_GetFormatFromName) > fnGetFormatFromName
helper::DynFuncHolder< decltype(sound4cl_GetAudioInputCount) > fnGetAudioInputCount
void MonoToStereo_Planar(const float *input, float *outputL, float *outputR, size_t nSpl)
helper::DynFuncHolder< decltype(sound4cl_ExitProcess) > fnExitProcess
helper::DynFuncHolder< T > GetPrefixSymbol(const std::string &name)
helper::DynFuncHolder< decltype(sound4cl_SetPresetManager) > fnSetPresetManager
void StereoToMono(const float *input, float *output, size_t nSpl)
unsigned int GetChannelCount()
helper::DynFuncHolder< decltype(sound4cl_GetEstimatedDelay) > fnGetEstimatedDelay
helper::DynFuncHolder< decltype(sound4cl_FreeJsonAnswer) > fnFreeJsonAnswer
helper::DynFuncHolder< decltype(sound4cl_GetBufferOut) > fnGetBufferOut
helper::DynFuncHolder< decltype(sound4cl_Webserver_tcp) > fnWebserver_tcp
helper::DynFuncHolder< decltype(sound4cl_PresetManager_InformChange) > fnPresetManager_InformChange
Helper to load dynamic library.
DynFuncHolder< T > GetSymbol_safe(const std::string &name)
bool Load(const std::filesystem::path &dynlib, uint32_t loadflags=LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR|LOAD_LIBRARY_SEARCH_APPLICATION_DIR|LOAD_LIBRARY_SEARCH_USER_DIRS|LOAD_LIBRARY_SEARCH_SYSTEM32)
DynFuncHolder< T > GetSymbol(const std::string &name)
CDynLoader & operator=(CDynLoader const &)=delete
CDynLoader(const CDynLoader &)=delete
static std::filesystem::path GetThisLibraryPath(void)
CDynLoader(CDynLoader &&)=default
Helper to wrap a function pointer.
DynFuncHolder(DynFunc_t a_ptr)
@ F32_NATIVE
32-bit floating-point, native
@ S16_NATIVE
16-bit signed integer, native
@ S32_NATIVE
32-bit signed integer, native
#define SOUND4_WEBSERVER_HTTPS_OK
#define SOUND4_WEBSERVER_HTTP_OK
#define SOUND4_INVALID_WEBSERVER_ID
const LogSeverity verbose5
std::function< void(LogSeverity, const std::string &)> log_cb_t
const LogSeverity verbose4
const LogSeverity verbose
const LogSeverity warning
sound4cl_LogSeverity LogSeverity
const LogSeverity verbose3
const LogSeverity verbose2
#define fs_strdup
helper for OS dependant file name copy
C function signature definition for all sound4.cl libraries.
struct sound4cl_CInstance * sound4cl_InitProcess3(const char *LoginKey, const char *RadioName, const char *Access_Key_ID, const char *Access_Key_Secret, const char *save_path, const struct sound4cl_CParameters *parameters, unsigned int frames_per_chunk)
unsigned int sound4cl_AddAudio(struct sound4cl_CInstance *instance, const uint8_t *payload, unsigned int nFrame, enum sound4cl_SampleFormat fmt)
unsigned int sound4cl_GetMaxPacketFrame(struct sound4cl_CInstance *instance)
uint64_t sound4cl_Webserver_tcp(unsigned int listenport, unsigned int listenport_secure, const char *socket_ip, unsigned int socket_port)
void sound4cl_Webserver_SetAppHealth(struct sound4cl_CInstance *instance, int httpcode, const char *contenttype, const char *content)
struct sound4cl_CBus * sound4cl_NewBus()
void sound4cl_FreeMetadataInfos(struct sound4cl_CInstance *instance, const char **infos)
struct sound4cl_CInstance * sound4cl_InitProcess(const char *LoginKey, const char *RadioName, const char *Access_Key_ID, const char *Access_Key_Secret, const char *save_path)
void sound4cl_SetPresetManager(struct sound4cl_CParameters *params, sound4cl_storage_reader reader, sound4cl_storage_reader_free, sound4cl_storage_writer writer, sound4cl_storage_exists exists, sound4cl_storage_getall getall, sound4cl_storage_getall_free getall_free, sound4cl_storage_remove remove, sound4cl_storage_rename rename, int IsReadOnly, void *userdata)
unsigned int sound4cl_GetAudio(struct sound4cl_CInstance *instance, uint8_t *payload, unsigned int max_nFrame, enum sound4cl_SampleFormat fmt)
void sound4cl_SetParameter(struct sound4cl_CParameters *params, const char *name, const char *value)
unsigned int sound4cl_GetEstimatedDelay(struct sound4cl_CInstance *instance)
void sound4cl_DeleteClient(struct sound4cl_CClientInstance *client)
void sound4cl_FreeParameters(struct sound4cl_CParameters *params)
void sound4cl_MonoToStereo_Planar(const float *input, float *outputL, float *outputR, size_t nFrame)
void sound4cl_StereoToMono_Planar(const float *inputL, const float *inputR, float *output, size_t nFrame)
int sound4cl_Webserver_Stop(uint64_t id, int timeout_ms)
void sound4cl_SetInstanceBus(struct sound4cl_CParameters *params, struct sound4cl_CBus *bus)
void sound4cl_SetMetadataMulti(struct sound4cl_CInstance *instance, const char **keyvalue)
void sound4cl_SetLogSeverity(enum sound4cl_LogSeverity severity)
void sound4cl_StartUpdateThread(struct sound4cl_CInstance *instance, unsigned int port)
const char * sound4cl_ProcessJson(struct sound4cl_CClientInstance *client, const char *json_str, int *need_save)
const char * sound4cl_GetParameter(struct sound4cl_CParameters *params, const char *name)
void sound4cl_ProcessAudio_Planar(struct sound4cl_CInstance *instance, float const *const *input, float *const *output)
void sound4cl_FreeJsonAnswer(const char *json_str)
int sound4cl_SaveState(struct sound4cl_CInstance *instance)
void sound4cl_Webserver_GetAppHealth(struct sound4cl_CInstance *instance, int *httpcode, char **contenttype, char **content)
void sound4cl_StereoToMono(const float *input, float *output, size_t nFrame)
unsigned int sound4cl_AddPadAudio(struct sound4cl_CInstance *instance)
int sound4cl_WaitUpdateThreadReady(struct sound4cl_CInstance *instance, int milliseconds)
void sound4cl_SetMetadata(struct sound4cl_CInstance *instance, const char *key, const char *value)
const char * sound4cl_GetVersion()
void sound4cl_AudioMonoFromLiveStereo(const uint8_t *payload, float *output)
float * sound4cl_GetBufferOut(struct sound4cl_CInstance *instance)
struct sound4cl_CParameters * sound4cl_NewParameters()
uint64_t sound4cl_Webserver_tcp2(unsigned int listenport, unsigned int listenport_secure, const char *socket_ip, unsigned int socket_port, const struct sound4cl_CParameters *parameters)
unsigned int sound4cl_GetAudioInputCount()
void sound4cl_AudioConvertFrom(const uint8_t *payload, float *output, size_t nSpl, enum sound4cl_SampleFormat fmt)
unsigned int sound4cl_GetProcessChunkFrames(struct sound4cl_CInstance *instance)
const char ** sound4cl_GetMetadataInfos(struct sound4cl_CInstance *instance)
const struct sound4cl_SOUND4_ProcessInfo * sound4cl_SOUND4_GetProcessInfo()
void sound4cl_FreeParameterValue(const char *value)
void sound4cl_AudioConvertTo(const float *input, uint8_t *payload, size_t nSpl, enum sound4cl_SampleFormat fmt)
unsigned int sound4cl_GetChannelCount()
void sound4cl_PresetManager_InformChange(struct sound4cl_CInstance *instance, const fs_char *relative_path, enum sound4cl_PresetChange_Kind change_kind)
void sound4cl_ProcessAudio(struct sound4cl_CInstance *instance, const float *input, float *output)
int sound4cl_Webserver_Status(uint64_t id)
enum sound4cl_SampleFormat sound4cl_GetFormatFromName(const char *name)
unsigned int sound4cl_GetChunkSizeInFrames()
int sound4cl_TerminateProcess(struct sound4cl_CInstance *instance)
void sound4cl_Webserver_FreeString(char *str)
unsigned int sound4cl_GetAudioOutputCount()
void sound4cl_MonoToStereo(const float *input, float *output, size_t nFrame)
void sound4cl_AudioMonoToLiveStereo(const float *input, uint8_t *payload)
void sound4cl_ExitProcess(struct sound4cl_CInstance *instance)
void sound4cl_StopUpdateThread(struct sound4cl_CInstance *instance)
uint64_t sound4cl_Webserver(unsigned int listenport, unsigned int listenport_secure, struct sound4cl_CInstance *instance)
void sound4cl_FreeBus(struct sound4cl_CBus *bus)
unsigned int sound4cl_GetBytesFromFormat(const enum sound4cl_SampleFormat fmt)
unsigned int * sound4cl_GetPossibleChunkSizeInFrames()
struct sound4cl_CClientInstance * sound4cl_NewClient(struct sound4cl_CInstance *instance)
const char * sound4cl_GetFormatName(const enum sound4cl_SampleFormat fmt)
struct sound4cl_CInstance * sound4cl_InitProcess2(const char *LoginKey, const char *RadioName, const char *Access_Key_ID, const char *Access_Key_Secret, const char *save_path, const struct sound4cl_CParameters *parameters)
sound4cl_PresetChange_Kind
unsigned int sound4cl_GetSampleRate()
float * sound4cl_GetBufferIn(struct sound4cl_CInstance *instance)
unsigned int sound4cl_GetOutputCount(struct sound4cl_CInstance *instance)
void sound4cl_SetLoggerCallback(sound4cl_loggerfn logger)