MIDAS
Loading...
Searching...
No Matches
mlxspeaker.cxx
Go to the documentation of this file.
1/********************************************************************\
2
3 Name: mlxspeaker.c
4 Created by: Pierre-Andre Amaudruz
5
6 Contents: Speaks midas messages (UNIX version)
7
8 $Id$
9
10\********************************************************************/
11
12#include <stdio.h>
13#include <string.h>
14#include <signal.h>
15#include "midas.h"
16#include "msystem.h"
17#include "mstrlcpy.h"
18
19#ifdef OS_DARWIN
20#define SPEECH_PROGRAM "say"
21#else
22#define SPEECH_PROGRAM "festival --tts -"
23#endif
24
25static FILE *fp = NULL;
26char mtUserStr[128], mtTalkStr[128];
28
29/*------------------------------------------------------------------*/
30
31void sigpipehandler(int sig)
32{
33 cm_msg(MERROR, "Speaker", "No speech synthesizer attached");
35 pclose(fp);
36 exit(2);
37}
38
39void siginthandler(int sig)
40{
41 cm_msg(MINFO, "Speaker", "Speaker interrupted");
43 pclose(fp);
44 exit(0);
45}
46
47/*----- receive_message --------------------------------------------*/
48
50{
51 char str[256], *pc, *sp;
52 static DWORD last_beep = 0;
53
54 /* print message */
55 printf("%s\n", (char *) (message));
56
57 if (fp == NULL) {
58 fputs("Speech synthesizer not enabled - terminating\n", stderr);
60 exit(2);
61 }
62
63 /* skip none talking message */
64 if (header->trigger_mask == MT_TALK || header->trigger_mask == MT_USER) {
65 pc = strchr((char *) (message), ']') + 2;
66 sp = pc + strlen(pc) - 1;
67 while (*sp == ' ' || *sp == '\t')
68 sp--;
69 *(++sp) = '\0';
70
71 /* Send beep first */
72 // "play --volume=0.3 /etc/mt_talk.wav"
73 if ((ss_time() - last_beep) > shutupTime) {
74 switch (header->trigger_mask) {
75 case MT_TALK:
76 if (mtTalkStr[0])
77 sprintf(str, "%s", mtTalkStr);
78 break;
79 case MT_USER:
80 if (mtUserStr[0])
81 sprintf(str, "%s", mtUserStr);
82 break;
83 }
86 ss_sleep(1000);
87 }
88
89#ifdef OS_DARWIN
90 sprintf(str, "say %s.", pc);
92#else
93 fprintf(fp, "%s.\n", pc);
94 fflush(fp);
95#endif
96 }
97
98 return;
99}
100
101/*------------------------------------------------------------------*/
102
103int main(int argc, char *argv[])
104{
105 BOOL daemon = FALSE;
106 INT status, i, ch;
108 char exp_name[NAME_LENGTH];
109 const char *speech_program = SPEECH_PROGRAM;
110
111 /* get default from environment */
113
114#ifdef OS_DARWIN
115 mstrlcpy(mtTalkStr, "afplay $MIDASSYS/utils/notify.wav", sizeof(mtTalkStr));
116 mstrlcpy(mtUserStr, "afplay $MIDASSYS/utils/notify.wav", sizeof(mtTalkStr));
117#endif
118
119 /* parse command line parameters */
120 for (i = 1; i < argc; i++) {
121 if (argv[i][0] == '-' && argv[i][1] == 'D')
122 daemon = TRUE;
123 else if (argv[i][0] == '-') {
124 if (i + 1 >= argc || argv[i + 1][0] == '-')
125 goto usage;
126 if (argv[i][1] == 'e')
127 strcpy(exp_name, argv[++i]);
128 else if (argv[i][1] == 'h')
129 strcpy(host_name, argv[++i]);
130 else if (argv[i][1] == 'c')
131 speech_program = argv[++i];
132 else if (argv[i][1] == 't')
133 strcpy(mtTalkStr, argv[++i]);
134 else if (argv[i][1] == 'u')
135 strcpy(mtUserStr, argv[++i]);
136 else if (argv[i][1] == 's')
137 shutupTime = atoi(argv[++i]);
138 else {
139 usage:
140 printf
141 ("usage: mlxspeaker [-h Hostname] [-e Experiment] [-c command] [-D] daemon\n");
142 printf(" [-t mt_talk] Specify the mt_talk alert command\n");
143 printf(" [-u mt_user] Specify the mt_user alert command\n");
144 printf(" [-s shut up time] Specify the min time interval between alert [s]\n");
145 printf(" The -t & -u switch require a command equivalent to:\n");
146 printf(" '-t play --volume=0.3 file.wav'\n");
147 printf(" [-c command] Used to start the speech synthesizer,\n");
148 printf(" which should read text from it's standard input.\n");
149 printf(" eg: mlxspeaker -c 'festival --tts -'\n\n");
150 return 0;
151 }
152 }
153 }
154
155 if (daemon) {
156 printf("Becoming a daemon...\n");
158 }
159
160 /* Handle SIGPIPE signals generated from errors on the pipe */
163
164 fp = popen(speech_program, "w");
165 if (fp == NULL) {
166 cm_msg(MERROR, "Speaker", "Unable to start \"%s\": %s\n",
169 exit(2);
170 }
171
172 /* now connect to server */
174 if (status != CM_SUCCESS)
175 return 1;
176
178
179 printf("Midas Message Speaker connected to %s. Press \"!\" to exit.\n", host_name[0] ? host_name : "local host");
180
181 /* initialize terminal */
182 ss_getchar(0);
183
184 do {
185 status = cm_yield(1000);
186 while (ss_kbhit()) {
187 ch = ss_getchar(0);
188 if (ch == -1)
189 ch = getchar();
190 if (ch == '!')
192 }
193
194 } while (status != SS_ABORT && status != RPC_SHUTDOWN);
195
196#if defined(SIGPIPE) && defined(SIG_IGN)
198#endif
199
200 /* reset terminal */
202
203 pclose(fp);
204
206 return 1;
207}
#define FALSE
Definition cfortran.h:309
static void usage()
INT cm_yield(INT millisec)
Definition midas.cxx:5642
INT cm_connect_experiment(const char *host_name, const char *exp_name, const char *client_name, void(*func)(char *))
Definition midas.cxx:2278
INT cm_disconnect_experiment(void)
Definition midas.cxx:2846
INT cm_get_environment(char *host_name, int host_name_size, char *exp_name, int exp_name_size)
Definition midas.cxx:2134
#define CM_SUCCESS
Definition midas.h:582
#define SS_ABORT
Definition midas.h:677
#define RPC_SHUTDOWN
Definition midas.h:707
unsigned int DWORD
Definition mcstd.h:51
#define MINFO
Definition midas.h:560
#define MT_TALK
Definition midas.h:547
#define MT_USER
Definition midas.h:545
#define MERROR
Definition midas.h:559
BOOL ss_kbhit()
Definition system.cxx:3664
INT ss_getchar(BOOL reset)
Definition system.cxx:7503
INT ss_daemon_init(BOOL keep_stdout)
Definition system.cxx:2001
DWORD ss_time()
Definition system.cxx:3462
INT ss_sleep(INT millisec)
Definition system.cxx:3628
INT ss_system(const char *command)
Definition system.cxx:2116
INT cm_msg_register(EVENT_HANDLER *func)
Definition midas.cxx:1051
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
Definition midas.cxx:915
int main()
Definition hwtest.cxx:23
char exp_name[NAME_LENGTH]
Definition mana.cxx:243
BOOL daemon
Definition mana.cxx:258
char host_name[HOST_NAME_LENGTH]
Definition mana.cxx:242
INT i
Definition mdump.cxx:32
INT HNDLE
Definition midas.h:132
#define HOST_NAME_LENGTH
Definition midas.h:273
DWORD BOOL
Definition midas.h:105
int INT
Definition midas.h:129
#define TRUE
Definition midas.h:182
#define NAME_LENGTH
Definition midas.h:272
#define message(type, str)
HNDLE hBuf
Definition minife.c:23
void sigpipehandler(int sig)
char mtUserStr[128]
char mtTalkStr[128]
void receive_message(HNDLE hBuf, HNDLE id, EVENT_HEADER *header, void *message)
#define SPEECH_PROGRAM
void siginthandler(int sig)
static FILE * fp
DWORD shutupTime
char str[256]
Definition odbhist.cxx:33
DWORD status
Definition odbhist.cxx:39
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
Definition rmidas.h:24
short int trigger_mask
Definition midas.h:853