10 #if __has_include(<filesystem>)
14 #include <experimental/filesystem>
16 namespace filesystem = experimental::filesystem;
19 #if defined(_WIN32) || defined(WIN32)
25 #define SAMPLE_RATE 48000
27 #define CHANNEL_COUNT 2
33 bool stopthread=
false;
37 #if defined(_WIN32) || defined(WIN32)
39 _setmode(_fileno(stdin), _O_BINARY);
40 _setmode(_fileno(stdout), _O_BINARY);
47 std::cerr <<
"ProcessLoop: input stopped"<< std::endl;
51 if (stopthread)
break;
56 std::cerr <<
"Failed to write audio output" << std::endl;
63 void Usage(
const char *progname)
65 std::cerr <<
"Usage: " << progname << std::endl;;
66 std::cerr <<
" Reads audio from stdin and return processed audio in stdout" << std::endl;
67 std::cerr <<
"Environment:"<< std::endl;;
68 std::cerr <<
" - S4STORE_PATH : path to store config [default: ./state]"<< std::endl;;
69 std::cerr <<
" - S4LOGINKEY : SOUND4 Login key (or S4USERID)"<< std::endl;;
70 std::cerr <<
" - RADIO_NAME : SOUND4 Radio Name"<< std::endl;;
71 std::cerr <<
" - S4_AWS_ACCESS_KEY_ID : SOUND4 Access Key ID"<< std::endl;;
72 std::cerr <<
" - S4_AWS_SECRET_ACCESS_KEY: SOUND4 Access Key Secret"<< std::endl;;
73 std::cerr << std::endl;
74 std::cerr <<
"Example:"<< std::endl;
76 #if defined(_WIN32) || defined(WIN32)
85 std::cerr << str << std::endl;
89 int main(
int argc,
char *
const argv[])
92 const char *store_path=getenv(
"S4STORE_PATH");
94 char *pLoginKey=getenv(
"S4LOGINKEY");
96 pLoginKey=getenv(
"S4USERID");
98 char *pRadioName=getenv(
"RADIO_NAME");
99 char *pKeyId=getenv(
"S4_AWS_ACCESS_KEY_ID");
100 char *pAccessKey=getenv(
"S4_AWS_SECRET_ACCESS_KEY");
102 const char *progname=argv[0];
105 if ((strcasecmp(argv[1],
"-h")==0) || (strcasecmp(argv[1],
"--help")==0)) {
110 if (!pLoginKey || !pRadioName || !pKeyId || !pAccessKey) {
111 std::cerr <<
"Missing credentials in environment" << std::endl;
116 store_path=
"./state";
118 if (!std::filesystem::exists(store_path) || !std::filesystem::is_directory(store_path)) {
119 std::cerr <<
"Storage folder '"<<store_path<<
"' is not a valid directory" << std::endl;
159 std::cerr <<
"Failed to create the process instance"<< std::endl;
164 std::thread updater([pInstance](){
166 std::cerr <<
"cloudx1_StartUpdateThread (no json port)" << std::endl;
168 std::cerr <<
"cloudx1_StartUpdateThread END" << std::endl;
172 std::cerr <<
"Waiting update thread" << std::endl;
174 std::cerr <<
"Timeout to create the process instance"<< std::endl;
176 std::cerr <<
"Waiting update thread DONE" << std::endl;
181 std::cerr <<
"Starting web server" << std::endl;
182 int listenport= 8080;
183 int listenport_secure= 8443;
185 if (listenport || listenport_secure) {
188 std::cerr <<
"Starting web server FAILED" << std::endl;
193 std::cerr <<
"Web server listening on port " << listenport;
195 std::cerr <<
"Web server failed to listen on port " << listenport;
198 if (listenport_secure) {
200 std::cerr <<
"Web server listening on secure port " << listenport_secure;
202 std::cerr <<
"Web server failed to listen on secure port " << listenport_secure;
205 std::cerr <<
"Starting web server DONE" << std::endl;
229 std::cerr <<
"Stopping web server" << std::endl;
231 std::cerr <<
"Stopping web server DONE" << std::endl;
235 std::cerr <<
"Stopping Update thread" << std::endl;
237 std::cerr <<
"Stopping Update thread DONE" << std::endl;
void cloudx1_ProcessAudio(struct cloudx1_CInstance *instance, const float *input, float *output)
uint cloudx1_GetEstimatedDelay(struct cloudx1_CInstance *instance)
uint cloudx1_GetSampleRate()
uint cloudx1_GetChunkSizeInFrames()
const char * cloudx1_GetVersion()
uint cloudx1_GetChannelCount()
void cloudx1_SetLogSeverity(enum cloudx1_LogSeverity severity)
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)
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)
void ProcessLoop(struct cloudx1_CInstance *pInstance)
void Usage(const char *progname)
void MyLogger(cloudx1_LogSeverity severe[[maybe_unused]], const char *str)
int main(int argc, char *const argv[])