33 #include <system_net.h>
36 #include <libFreeWRL.h>
39 #include "../scenegraph/sounds.h"
44 #if defined(_MSC_VER) || defined(_ANDROID) || defined(GLES2)
47 Sound_toserver(
char *message)
50 int SoundEngineInit(
void){
return 0;}
57 SoundEngineDestroy(
void)
61 SoundSourceRegistered(
int num)
65 SoundSourceInit(
int num,
74 SetAudioActive(
int num,
int stat)
90 const char SSPATH[] =
"/usr/local/bin/FreeWRL_SoundServer";
92 const char SSPATH[] =
"freewrl_snd";
96 static int initialized = SOUND_NEEDS_STARTING;
101 int msq_toserver = -1;
102 int msq_fromserver = -1;
104 char* serverpipe =
"/tmp/soundserver";
105 char* clientpipe =
"/tmp/soundclient";
106 int server_pipe_fd, client_pipe_fd;
107 time_t last_time, current_time;
112 void Sound_toserver (
char *message) {
115 if (initialized != SOUND_STARTED)
return;
117 strcpy (msg.msg,message);
119 printf (
"Client:Sending to server %s\n",msg.msg);
123 while((xx = msgsnd(msq_toserver, &msg,strlen(msg.msg)+1,IPC_NOWAIT)));
125 xx = (int) write(server_pipe_fd, &msg,
sizeof(msg));
131 perror(
"server error");
132 printf (
"SoundEngineServer - error sending ready msg\n");
134 initialized = SOUND_FAILED;
139 void SoundEngineInit () {
143 struct stat enginestat;
146 if (initialized != SOUND_NEEDS_STARTING)
return;
148 #if defined(SOUNDSERVERBINARY)
149 sspath = (
char *) malloc( strlen(SOUNDSERVERBINARY) + 1 );
150 sprintf(sspath,
"%s", SOUNDSERVERBINARY);
152 sspath = (
char *) malloc( strlen(SSPATH) + 1 );
153 strcpy(sspath, SSPATH);
157 if (stat(sspath,&enginestat)) {
158 printf (
"FreeWRL: SoundEngine not installed on system\n");
159 initialized = SOUND_FAILED;
163 my_ipc_key = getpid();
169 for (x=0; x<MAXSOUNDS; x++) SReg[x]=FALSE;
175 if ( (msq_toserver = msgget(my_ipc_key,IPC_CREAT|0666)) < 0 ) {
176 ConsoleMessage (
"FreeWRL:SoundServer error creating toserver message queue\n");
177 initialized = SOUND_FAILED;
180 if ( (msq_fromserver = msgget(my_ipc_key+1,IPC_CREAT|0666)) < 0 ) {
181 ConsoleMessage (
"FreeWRL:SoundServer error creating fromserver message queue\n");
182 initialized = SOUND_FAILED;
187 if ((client_pipe_fd = open (clientpipe, O_RDONLY | O_NONBLOCK)) < 0) {
188 if ((mkfifo(clientpipe, S_IRUSR | S_IWUSR | S_IXUSR)) < 0) {
189 ConsoleMessage (
"FreeWRL:SoundServer error creating client pipe\n");
190 initialized = SOUND_FAILED;
193 if ((client_pipe_fd = open (clientpipe, O_RDONLY | O_NONBLOCK)) < 0) {
194 ConsoleMessage (
"FreeWRL:SoundServer error opening client pipe\n");
195 initialized = SOUND_FAILED;
201 printf (
"SoundClient - msq_toserver=%x, msq_fromserver=%x.\n", msq_toserver,msq_fromserver);
204 sprintf(buf,
"INIT %d",my_ipc_key);
206 printf(
"buf='%s' sspath='%s'.\n",buf,sspath);
210 if ( (S_Server_PID = fork()) == (pid_t)0L ) {
212 execl((
const char *)sspath,(
const char *)buf,
"",NULL);
215 printf(
"FreeWRL:SoundServer:%s: exec of %s\n",strerror(errno),sspath);
217 msgctl(msq_toserver,IPC_RMID,NULL);
218 msgctl(msq_fromserver,IPC_RMID,NULL);
220 close(client_pipe_fd);
222 initialized = SOUND_FAILED;
225 }
else if ( S_Server_PID < 0 ) {
226 ConsoleMessage (
"FreeWRL:SoundServer %s: error starting server process",
229 msgctl(msq_toserver,IPC_RMID,NULL);
230 msgctl(msq_fromserver,IPC_RMID,NULL);
232 close(client_pipe_fd);
234 initialized = SOUND_FAILED;
240 printf (
"Client: - server pid %d\n",S_Server_PID);
245 atexit(SoundEngineDestroy);
251 if ((server_pipe_fd = open (serverpipe, O_WRONLY | O_NONBLOCK)) < 0) {
252 perror(
"Open error\n");
253 printf(
"FreeWRL:SoundServer error opening server pipe\n");
254 initialized = SOUND_FAILED;
258 if (initialized == SOUND_FAILED) {
259 printf(
"FreeWRL:SoundServer: Timeout: starting server.");
260 SoundEngineDestroy();
265 void waitformessage () {
281 xx = msgrcv(msq_fromserver,&msg,128,1,0);
283 xx = (int) read (client_pipe_fd, &msg,
sizeof(msg));
293 printf (
"message received was %s type %ld\n", msg.msg,msg.mtype);
298 if ( msg.mtype == 1 ) {
299 initialized = SOUND_STARTED;
303 while ((PID=waitpid(-1,&proc_status,WNOHANG)) == -1
306 ConsoleMessage (
"FreeWRL:SoundServer process ID %ld terminated: %d",
308 initialized = SOUND_FAILED;
322 void SoundEngineDestroy() {
324 if (initialized == SOUND_STARTED) {
326 msgctl(msq_toserver,IPC_RMID,NULL);
327 msgctl(msq_fromserver,IPC_RMID,NULL);
334 printf (
"SoundEngineDestroy, sound was started successfully\n");
335 kill(S_Server_PID,SIGTERM);
337 initialized = SOUND_NEEDS_STARTING;
340 int SoundSourceRegistered (
int num) {
341 if (num >= MAXSOUNDS) {
342 printf (
"Too many sounds in VRML file - max %d",num);
348 float SoundSourceInit (
int num,
int loop,
double pitch,
double start_time,
double stop_time,
359 printf (
"start of SoundSourceInit)\n");
360 printf (
"num %d\n",num);
361 printf (
"loop %d\n",loop);
362 printf (
"pitch %f\n",pitch);
363 printf (
"start_time %f\n",start_time);
364 printf (
"stop_time %f\n",stop_time);
365 printf (
"SoundSourceInit - url is %s\n",url);
370 printf (
"SoundSourceInit - no file to source \n");
374 if (strlen(url) > 192) {
375 printf (
"SoundSourceInit - url %s is too long\n",url);
381 sprintf (mystring,
"REGS:\"%s\" %2d %2d %4.3f %4.3f %4.3f",url,num,loop,pitch,start_time, stop_time);
383 sprintf (mystring,
"REGS:%s %2d %2d %4.3f %4.3f %4.3f",url,num,loop,pitch,start_time, stop_time);
385 Sound_toserver(mystring);
388 printf (
"SoundSourceInit, waiting for response\n");
394 printf (
"SoundSourceInit, got message %s\n",msg.msg);
397 if (sscanf (msg.msg,
"REGS %d %f",&returnednum,&duration) != 2) {
406 void SetAudioActive (
int num,
int stat) {
410 printf (
"SoundSource - got SetAudioActive for %d state %d\n",num,stat);
413 sprintf (mystring,
"ACTV %2d %2d",num,stat);
414 Sound_toserver(mystring);
417 void SoundServer_finish()