17 #elif defined(_WIN32) || defined(WIN32)
18 #include <stringapiset.h>
31 static constexpr
const char *process_name =
"SOUND4 x1.CLOUD";
32 static constexpr
const char *process_shortname =
"x1";
68 static inline std::string WStringToUTF8(
const std::wstring& wstr) {
69 if (wstr.empty())
return {};
70 int size = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (
int)wstr.size(), NULL, 0, NULL, NULL);
71 std::string str(size, 0);
72 WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (
int)wstr.size(), &str[0], size, NULL, NULL);
80 static inline std::wstring UTF8ToWString(
const std::string& str) {
81 if (str.empty())
return std::wstring();
82 int size = MultiByteToWideChar(CP_UTF8, 0, &str[0], (
int)str.size(), NULL, 0);
83 std::wstring wstr(size, 0);
84 MultiByteToWideChar(CP_UTF8, 0, &str[0], (
int)str.size(), &wstr[0], size);
117 static inline std::string GetVersion()
132 static inline uint GetChunkSizeInFrames()
144 static inline uint GetChannelCount()
157 static inline uint GetAudioInputCount()
170 static inline uint GetAudioOutputCount()
182 static inline uint GetSampleRate()
192 static inline void SanityCheck()
196 throw std::runtime_error(
"Bad library sampling rate");
199 throw std::runtime_error(
"Bad library frame size");
202 throw std::runtime_error(
"Bad library channel count");
205 throw std::runtime_error(
"Bad library input count");
208 throw std::runtime_error(
"Bad library output count");
227 _log_cb(severity, std::string(c_msg));
233 static inline void SetLogSeverity(
LogSeverity severity)
240 static inline void SetLoggerCallback(
log_cb_t cb)
258 if (!params)
throw std::bad_alloc();
274 bool IsOk()
const {
return instance!=
nullptr; }
280 void SetParam(
const std::string& name,
const std::string& value)
294 std::string ret(c_value);
311 bool Create(
const std::string& LoginKey,
const std::string& RadioName,
const std::string& AWS_Access_ID,
const std::string& AWS_Access_Secret,
const std::string& save_path,
int json_port = 0)
314 const char *pSavePath = save_path.empty() ? NULL : save_path.c_str();
315 instance =
cloudx1_InitProcess2(LoginKey.c_str(), RadioName.c_str(), AWS_Access_ID.c_str(), AWS_Access_Secret.c_str(), pSavePath, params);
316 if (!instance)
return false;
317 update_thread = std::thread([
this, json_port](){
366 if (!instance)
return;
368 if (update_thread.joinable()) {
370 update_thread.join();
401 return reinterpret_cast< std::array<float,InputSampleSize>&
>(*buf);
418 return reinterpret_cast< std::array<float,OutputSampleSize>&
>(*buf);
465 std::vector<T> output;
468 uint todo = input.size();
472 output.resize(out_offset + out_avail);
473 GetAudio(&output[out_offset], out_avail);
474 out_offset+=out_avail;
475 in_offset += todo-left;
492 if (!client)
throw std::bad_alloc();
511 std::string
ProcessJson(
const std::string &request,
bool *NeedSave =
nullptr)
516 if (!canswer)
return {};
517 std::string answer(canswer);
520 *NeedSave=(need_save!=0);
537 return std::make_shared<CClient>(instance);
557 std::thread update_thread;
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
CInstance & operator=(const CInstance &)=delete
std::string GetParam(const std::string &name)
std::shared_ptr< CClient > NewClient()
bool Create(const std::string &LoginKey, const std::string &RadioName, const std::string &AWS_Access_ID, const std::string &AWS_Access_Secret, const std::string &save_path, int json_port=0)
uint GetAudio(T *payload, uint max_nFrame)
void ProcessAudio_Planar(float const *const (&input)[InputChannels], float *const (&output)[OutputChannels])
bool StartWebServer(int http_port, int https_port=0)
std::array< float, OutputSampleSize > & GetBufferOut()
uint AddAudio(const T *payload, uint nFrame)
std::vector< T > ProcessAnyAudio(const std::vector< T > input)
std::array< float, InputSampleSize > & GetBufferIn()
CInstance(const CInstance &)=delete
void SetParam(const std::string &name, const std::string &value)
uint cloudx1_GetAudio(struct cloudx1_CInstance *instance, uint8_t *payload, uint max_nFrame, enum cloudx1_SampleFormat fmt)
uint cloudx1_GetOutputCount(struct cloudx1_CInstance *instance)
uint cloudx1_AddAudio(struct cloudx1_CInstance *instance, const uint8_t *payload, uint nFrame, enum cloudx1_SampleFormat fmt)
@ F32_NATIVE
32-bit floating-point, native
@ S16_NATIVE
16-bit signed integer, native
@ S32_NATIVE
32-bit signed integer, native
struct cloudx1_CClientInstance * cloudx1_NewClient(struct cloudx1_CInstance *instance)
void cloudx1_DeleteClient(struct cloudx1_CClientInstance *client)
void cloudx1_FreeJsonAnswer(const char *json_str)
const char * cloudx1_ProcessJson(struct cloudx1_CClientInstance *client, const char *json_str, int *need_save)
float * cloudx1_GetBufferIn(struct cloudx1_CInstance *instance)
void cloudx1_ProcessAudio(struct cloudx1_CInstance *instance, const float *input, float *output)
uint cloudx1_GetEstimatedDelay(struct cloudx1_CInstance *instance)
void cloudx1_ProcessAudio_Planar(struct cloudx1_CInstance *instance, float const *const (&input)[CLOUDX1_CHANNEL_COUNT *CLOUDX1_AUDIO_INPUT_COUNT], float *const (&output)[CLOUDX1_CHANNEL_COUNT *CLOUDX1_AUDIO_OUTPUT_COUNT])
float * cloudx1_GetBufferOut(struct cloudx1_CInstance *instance)
uint cloudx1_GetSampleRate()
#define CLOUDX1_AUDIO_INPUT_COUNT
uint cloudx1_GetChunkSizeInFrames()
const char * cloudx1_GetVersion()
uint cloudx1_GetAudioOutputCount()
uint cloudx1_GetChannelCount()
#define CLOUDX1_AUDIOFRAME_COUNT
uint cloudx1_GetAudioInputCount()
void cloudx1_SetLoggerCallback(cloudx1_loggerfn logger)
#define CLOUDX1_SAMPLE_RATE
#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)
struct cloudx1_CParameters * cloudx1_NewParameters()
void cloudx1_SetParameter(struct cloudx1_CParameters *params, const char *name, const char *value)
struct cloudx1_CInstance * cloudx1_InitProcess2(const char *LoginKey, const char *RadioName, const char *AWS_Access_ID, const char *AWS_Access_Secret, const char *save_path, const struct cloudx1_CParameters *parameters)
const char * cloudx1_GetParameter(struct cloudx1_CParameters *params, const char *name)
void cloudx1_StartUpdateThread(struct cloudx1_CInstance *instance, uint port)
int cloudx1_WaitUpdateThreadReady(struct cloudx1_CInstance *instance, int milliseconds)
void cloudx1_StopUpdateThread(struct cloudx1_CInstance *instance)
#define SOUND4_WEBSERVER_HTTPS_OK
int cloudx1_Webserver_Status(uint64_t id)
uint64_t cloudx1_Webserver(uint listenport, uint listenport_secure, struct cloudx1_CInstance *instance)
#define SOUND4_WEBSERVER_HTTP_OK
#define SOUND4_INVALID_WEBSERVER_ID
int cloudx1_Webserver_Stop(uint64_t id, int timeout_ms)
std::function< void(LogSeverity, const std::string &)> log_cb_t
const size_t InputChannels
const size_t OutputSampleSize
cloudx1_LogSeverity LogSeverity
const size_t InputSampleSize
const size_t OutputChannels