diff options
author | Pierre GRANDIN <pgrandin@users.noreply.github.com> | 2017-01-30 10:49:43 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-30 10:49:43 -0800 |
commit | 6772f29e12b7755c3d7b19db22cdd22992425959 (patch) | |
tree | b5d268de8545e4dccd23f2cdc03dbb932007d274 /contrib/tomtom | |
parent | 179c1c344b00bcde8069b56559361dfcd9a94f19 (diff) | |
download | navit-6772f29e12b7755c3d7b19db22cdd22992425959.tar.gz |
Reducing code duplication in the tomtom builds (#201)R7272
* Reducing code duplication in the tomtom builds
* Reducing code duplication in the tomtom builds
* Reducing code duplication in the tomtom builds
* Track each build result to catch errors
* Track each build result to catch errors
* Stop builds on errors
* Working on the tomtom plugin build
* Moving espeak for tomtom to the common script
* Moving sdl tests for tomtom to the common script
* fix espeakdsp buffer usage for tomtom (#200)
* fix buffer usage
dont send more bytes then received.
* remove last blank line
* Disabling dbus tests, needs investigation
Diffstat (limited to 'contrib/tomtom')
-rw-r--r-- | contrib/tomtom/espeakdsp.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/contrib/tomtom/espeakdsp.c b/contrib/tomtom/espeakdsp.c new file mode 100644 index 000000000..bd6689a1f --- /dev/null +++ b/contrib/tomtom/espeakdsp.c @@ -0,0 +1,101 @@ +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/soundcard.h> +#include <sys/wait.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <libgen.h> + +#define espeakpath "/mnt/sdcard/navit/bin/espeak" +#define IBUFFERLEN 1024 +#define MAXARGC 30 + + +int main(int argc, char *argv[],char *envp[]) +{ + int pipefd[2]; + pid_t cpid; + char buf; + int co,wp,l,fh; + short bufi[IBUFFERLEN],bufo[IBUFFERLEN*2]; + int rate=22050; + + char *newargv[MAXARGC+2]; + + for(co=0;co<argc;co++) + { + if(co>=MAXARGC)break; + newargv[co]=argv[co]; + } + newargv[co++]="--stdout"; + newargv[co++]=NULL; + + if (pipe(pipefd) == -1) + { + perror("pipe"); + exit(EXIT_FAILURE); + } + + if(setpriority(PRIO_PROCESS,0,-10)) + perror ("setpriority"); + + cpid = fork(); + if (cpid == -1) + { + perror("fork"); + exit(EXIT_FAILURE); + } + + if (cpid == 0) + { /* Child writes to pipe */ + + close(pipefd[0]); /* Close unused read end */ + dup2(pipefd[1],1); + execve(espeakpath,newargv,envp); + perror(espeakpath); + close(pipefd[1]); /* Reader will see EOF */ + wait(NULL); /* Wait for child */ + exit(EXIT_SUCCESS); + + } else { /* Parent read from pipe */ + + close(pipefd[1]); /* Close unused write end */ + + l=read(pipefd[0],bufi,64); + if(memcmp(bufi,"RIFF",4)) + { + while(l>0) + { + write(1,bufi,l); + l=read(pipefd[0],bufi,IBUFFERLEN); + } + exit(EXIT_SUCCESS); + } + l=read(pipefd[0],bufi,IBUFFERLEN); + + fh=open("/dev/dsp",O_WRONLY); + if(fh<0) + { + perror("open /dev/dsp"); + exit(EXIT_FAILURE); + } + ioctl(fh, SNDCTL_DSP_SPEED , &rate); + ioctl(fh, SNDCTL_DSP_SYNC, 0); + while(l) + { + for(co=0,wp=0;(co<IBUFFERLEN)&&(co<l);co++) + { + bufo[wp++]=bufi[co]; /* mono->stereo */ + bufo[wp++]=bufi[co]; + } + write (fh,bufo,wp); + l=read(pipefd[0],bufi,IBUFFERLEN); + } + ioctl(fh, SNDCTL_DSP_SYNC, 0); + close(pipefd[0]); + exit(EXIT_SUCCESS); + } +} |