/* audio.c by Michael Thorpe 2022-12-12 */ #include #include #include #include #include #include #include #include #include #include "runner.h" static int audiofd=-1; static pid_t audiopid=-1; void stopaudio() { close(audiofd); audiofd=-1; kill(audiopid,SIGTERM); audiopid=-1; } void audiodied() { fputs("Audio process died\n",stderr); wait(0); exit(1); } int startaudio(int testmode) { int fds[2]; struct stat st; if(-1 != audiofd) return(0); /* already started */ if(testmode) { audiofd=open("/dev/null",O_WRONLY); if(-1==audiofd) return(1); return(0); } if(pipe(fds)) return(1); audiopid=fork(); if(-1==audiopid) return(1); if(0==audiopid) { if(-1==close(fds[1])) exit(-1); if(0 != fds[0]) { if(-1==dup2(fds[0],0)) exit(-1); if(-1==close(fds[0])) exit(-1); } close(1); close(2); if(1 != open("/dev/null",O_WRONLY)) exit(-1); if(-1==dup2(1,2)) exit(-1); if(stat(".cachesfx",&st)) execl("./Effects","Effects",".sfxmap",NULL); else execl("./Effects","Effects","-c",".cachesfx",".sfxmap",NULL); exit(-1); } if(-1==close(fds[0])) return(1); audiofd=fds[1]; atexit(stopaudio); signal(SIGCHLD,audiodied); return(0); } void playaudio(const char *s) { int len; len=strlen(s); if(len) write(audiofd,s,len); }