17 #elif defined(_WIN32) || defined(WIN32)
18 #include <stringapiset.h>
31 static constexpr
const char *process_name =
"SOUND4 IMPACT.CL";
32 static constexpr
const char *process_shortname =
"impact";
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 =
impact_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](){
374 if (!instance)
return;
376 if (update_thread.joinable()) {
378 update_thread.join();
409 return reinterpret_cast< std::array<float,InputSampleSize>&
>(*buf);
426 return reinterpret_cast< std::array<float,OutputSampleSize>&
>(*buf);
473 std::vector<T> output;
476 uint todo = input.size();
480 output.resize(out_offset + out_avail);
481 GetAudio(&output[out_offset], out_avail);
482 out_offset+=out_avail;
483 in_offset += todo-left;
500 if (!client)
throw std::bad_alloc();
519 std::string
ProcessJson(
const std::string &request,
bool *NeedSave =
nullptr)
524 if (!canswer)
return {};
525 std::string answer(canswer);
528 *NeedSave=(need_save!=0);
545 return std::make_shared<CClient>(instance);
565 std::thread update_thread;
CClient(impact_CInstance *instance)
std::string ProcessJson(const std::string &request, bool *NeedSave=nullptr)
Process a JSON request and returns the answer.
CClient & operator=(const CInstance &)=delete
CClient(const CInstance &)=delete
std::shared_ptr< CClient > NewClient()
void SetParam(const std::string &name, const std::string &value)
virtual void OnUpdateThreadStart()
void ProcessAudio_Planar(float const *const (&input)[InputChannels], float *const (&output)[OutputChannels])
std::string GetParam(const std::string &name)
CInstance(const CInstance &)=delete
CInstance & operator=(const CInstance &)=delete
virtual void OnUpdateThreadStop()
uint GetAudio(T *payload, uint max_nFrame)
bool StartWebServer(int http_port, int https_port=0)
std::array< float, OutputSampleSize > & GetBufferOut()
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 AddAudio(const T *payload, uint nFrame)
std::vector< T > ProcessAnyAudio(const std::vector< T > input)
std::array< float, InputSampleSize > & GetBufferIn()
uint impact_GetAudio(struct impact_CInstance *instance, uint8_t *payload, uint max_nFrame, enum impact_SampleFormat fmt)
uint impact_GetOutputCount(struct impact_CInstance *instance)
uint impact_AddAudio(struct impact_CInstance *instance, const uint8_t *payload, uint nFrame, enum impact_SampleFormat fmt)
@ F32_NATIVE
32-bit floating-point, native
@ S16_NATIVE
16-bit signed integer, native
@ S32_NATIVE
32-bit signed integer, native
void impact_FreeJsonAnswer(const char *json_str)
void impact_DeleteClient(struct impact_CClientInstance *client)
const char * impact_ProcessJson(struct impact_CClientInstance *client, const char *json_str, int *need_save)
struct impact_CClientInstance * impact_NewClient(struct impact_CInstance *instance)
float * impact_GetBufferIn(struct impact_CInstance *instance)
void impact_ProcessAudio(struct impact_CInstance *instance, const float *input, float *output)
float * impact_GetBufferOut(struct impact_CInstance *instance)
uint impact_GetEstimatedDelay(struct impact_CInstance *instance)
void impact_ProcessAudio_Planar(struct impact_CInstance *instance, float const *const (&input)[IMPACT_CHANNEL_COUNT *IMPACT_AUDIO_INPUT_COUNT], float *const (&output)[IMPACT_CHANNEL_COUNT *IMPACT_AUDIO_OUTPUT_COUNT])
#define IMPACT_AUDIO_INPUT_COUNT
const char * impact_GetVersion()
#define IMPACT_SAMPLE_RATE
uint impact_GetAudioInputCount()
uint impact_GetChunkSizeInFrames()
uint impact_GetChannelCount()
void impact_SetLoggerCallback(impact_loggerfn logger)
#define IMPACT_CHANNEL_COUNT
#define IMPACT_AUDIOFRAME_COUNT
void impact_SetLogSeverity(enum impact_LogSeverity severity)
#define IMPACT_AUDIO_OUTPUT_COUNT
uint impact_GetSampleRate()
uint impact_GetAudioOutputCount()
void impact_SetParameter(struct impact_CParameters *params, const char *name, const char *value)
struct impact_CParameters * impact_NewParameters()
void impact_FreeParameters(struct impact_CParameters *params)
void impact_ExitProcess(struct impact_CInstance *instance)
const char * impact_GetParameter(struct impact_CParameters *params, const char *name)
void impact_FreeParameterValue(const char *value)
struct impact_CInstance * impact_InitProcess2(const char *LoginKey, const char *RadioName, const char *AWS_Access_ID, const char *AWS_Access_Secret, const char *save_path, const struct impact_CParameters *parameters)
void impact_StopUpdateThread(struct impact_CInstance *instance)
void impact_StartUpdateThread(struct impact_CInstance *instance, uint port)
int impact_WaitUpdateThreadReady(struct impact_CInstance *instance, int milliseconds)
#define SOUND4_WEBSERVER_HTTPS_OK
int impact_Webserver_Stop(uint64_t id, int timeout_ms)
int impact_Webserver_Status(uint64_t id)
#define SOUND4_WEBSERVER_HTTP_OK
#define SOUND4_INVALID_WEBSERVER_ID
uint64_t impact_Webserver(uint listenport, uint listenport_secure, struct impact_CInstance *instance)
const size_t OutputSampleSize
const size_t InputChannels
const size_t OutputChannels
impact_LogSeverity LogSeverity
const size_t InputSampleSize
std::function< void(LogSeverity, const std::string &)> log_cb_t