9#if (__cplusplus<201703L)
10 #error "Need C++17 for this example"
13#if defined(_WIN32) || defined(WIN32)
16 #include <stringapiset.h>
20#define SAMPLE_RATE 48000
22#define CHANNEL_COUNT 2
32 #if defined(_WIN32) || defined(WIN32)
34 _setmode(_fileno(stdin), _O_BINARY);
35 _setmode(_fileno(stdout), _O_BINARY);
42 std::cerr <<
"ProcessLoop: input stopped"<< std::endl;
46 if (stopthread)
break;
51 std::cerr <<
"Failed to write audio output" << std::endl;
60 std::cerr <<
"Usage: " << progname << std::endl;;
61 std::cerr <<
" Reads audio from stdin and return processed audio in stdout" << std::endl;
62 std::cerr <<
"Environment:"<< std::endl;;
63 std::cerr <<
" - S4STORE_PATH : path to store config [default: ./state]"<< std::endl;;
64 std::cerr <<
" - S4LOGINKEY : SOUND4 Login key (or S4USERID)"<< std::endl;;
65 std::cerr <<
" - RADIO_NAME : SOUND4 Radio Name"<< std::endl;;
66 std::cerr <<
" - ACCESS_KEY_ID : SOUND4 Access Key ID"<< std::endl;;
67 std::cerr <<
" - ACCESS_KEY_SECRET : SOUND4 Access Key Secret"<< std::endl;;
68 std::cerr << std::endl;
69 std::cerr <<
"Example:"<< std::endl;
71 #if defined(_WIN32) || defined(WIN32)
80 std::cerr << str << std::endl;
84int main(
int argc,
char *
const argv[])
87 const char *store_path_str=getenv(
"S4STORE_PATH");
89 char *pLoginKey=getenv(
"S4LOGINKEY");
91 pLoginKey=getenv(
"S4USERID");
93 char *pRadioName=getenv(
"RADIO_NAME");
94 char *pKeyId=getenv(
"ACCESS_KEY_ID");
95 char *pAccessKey=getenv(
"ACCESS_KEY_SECRET");
97 const char *progname=argv[0];
100 if ((strcasecmp(argv[1],
"-h")==0) || (strcasecmp(argv[1],
"--help")==0)) {
105 if (!pLoginKey || !pRadioName || !pKeyId || !pAccessKey) {
106 std::cerr <<
"Missing credentials in environment" << std::endl;
111 std::filesystem::path fs_store_path;
112 if (!store_path_str || store_path_str[0]==0) {
113 fs_store_path=std::filesystem::current_path(ec) /
"state";
115 fs_store_path = std::filesystem::path(store_path_str);
117 if (!std::filesystem::exists(fs_store_path,ec) || !std::filesystem::is_directory(fs_store_path,ec)) {
118 std::cerr <<
"Storage folder '"<<fs_store_path.c_str()<<
"' is not a valid directory" << std::endl;
122 std::string store_path;
126 std::wstring wstr(fs_store_path.wstring());
127 if (wstr.empty())
return {};
128 int size = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (
int)wstr.size(), NULL, 0, NULL, NULL);
129 std::string str(size, 0);
130 WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (
int)wstr.size(), &str[0], size, NULL, NULL);
134 store_path=fs_store_path;
169 pInstance=
impact_InitProcess2(pLoginKey,pRadioName,pKeyId,pAccessKey,store_path.c_str(), params);
172 std::cerr <<
"Failed to create the process instance"<< std::endl;
177 std::thread updater([pInstance](){
179 std::cerr <<
"impact_StartUpdateThread (no json port)" << std::endl;
181 std::cerr <<
"impact_StartUpdateThread END" << std::endl;
185 std::cerr <<
"Waiting update thread" << std::endl;
187 std::cerr <<
"Timeout to create the process instance"<< std::endl;
189 std::cerr <<
"Waiting update thread DONE" << std::endl;
191#if (IMPACT_HAS_WEBSERVER)
194 std::cerr <<
"Starting web server" << std::endl;
195 int listenport= 8080;
196 int listenport_secure= 8443;
198 if (listenport || listenport_secure) {
201 std::cerr <<
"Starting web server FAILED" << std::endl;
206 std::cerr <<
"Web server listening on port " << listenport;
208 std::cerr <<
"Web server failed to listen on port " << listenport;
211 if (listenport_secure) {
213 std::cerr <<
"Web server listening on secure port " << listenport_secure;
215 std::cerr <<
"Web server failed to listen on secure port " << listenport_secure;
218 std::cerr <<
"Starting web server DONE" << std::endl;
240#if (IMPACT_HAS_WEBSERVER)
242 std::cerr <<
"Stopping web server" << std::endl;
244 std::cerr <<
"Stopping web server DONE" << std::endl;
248 std::cerr <<
"Stopping Update thread" << std::endl;
250 std::cerr <<
"Stopping Update thread DONE" << std::endl;
void impact_ProcessAudio(struct impact_CInstance *instance, const float *input, float *output)
unsigned int impact_GetEstimatedDelay(struct impact_CInstance *instance)
const char * impact_GetVersion()
unsigned int impact_GetChunkSizeInFrames()
unsigned int impact_GetChannelCount()
void impact_SetLogSeverity(enum impact_LogSeverity severity)
unsigned int impact_GetSampleRate()
struct impact_CParameters * impact_NewParameters()
void impact_SetParameter(struct impact_CParameters *params, const char *name, const char *value)
struct impact_CInstance * impact_InitProcess2(const char *LoginKey, const char *RadioName, const char *Access_Key_ID, const char *Access_Key_Secret, const char *save_path, const struct impact_CParameters *parameters)
void impact_FreeParameters(struct impact_CParameters *params)
void impact_ExitProcess(struct impact_CInstance *instance)
void impact_StopUpdateThread(struct impact_CInstance *instance)
void impact_StartUpdateThread(struct impact_CInstance *instance, unsigned int 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)
uint64_t impact_Webserver(unsigned int listenport, unsigned int listenport_secure, struct impact_CInstance *instance)
int impact_Webserver_Status(uint64_t id)
#define SOUND4_WEBSERVER_HTTP_OK
#define SOUND4_INVALID_WEBSERVER_ID
void MyLogger(impact_LogSeverity severe, const char *str)
void ProcessLoop(struct impact_CInstance *pInstance)
void Usage(const char *progname)
int main(int argc, char *const argv[])