MIDAS
Loading...
Searching...
No Matches
mlxspeaker.cxx File Reference
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include "midas.h"
#include "msystem.h"
#include "mstrlcpy.h"
Include dependency graph for mlxspeaker.cxx:

Go to the source code of this file.

Macros

#define SPEECH_PROGRAM   "festival --tts -"
 

Functions

void sigpipehandler (int sig)
 
void siginthandler (int sig)
 
void receive_message (HNDLE hBuf, HNDLE id, EVENT_HEADER *header, void *message)
 
int main (int argc, char *argv[])
 

Variables

static FILEfp = NULL
 
char mtUserStr [128]
 
char mtTalkStr [128]
 
DWORD shutupTime = 10
 

Macro Definition Documentation

◆ SPEECH_PROGRAM

#define SPEECH_PROGRAM   "festival --tts -"

Definition at line 22 of file mlxspeaker.cxx.

Function Documentation

◆ main()

int main ( int  argc,
char argv[] 
)

Definition at line 103 of file mlxspeaker.cxx.

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
#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
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
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
#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
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
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
Here is the call graph for this function:

◆ receive_message()

void receive_message ( HNDLE  hBuf,
HNDLE  id,
EVENT_HEADER header,
void message 
)

Definition at line 49 of file mlxspeaker.cxx.

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}
unsigned int DWORD
Definition mcstd.h:51
#define MT_TALK
Definition midas.h:547
#define MT_USER
Definition midas.h:545
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
#define message(type, str)
char str[256]
Definition odbhist.cxx:33
short int trigger_mask
Definition midas.h:853
Here is the call graph for this function:
Here is the caller graph for this function:

◆ siginthandler()

void siginthandler ( int  sig)

Definition at line 39 of file mlxspeaker.cxx.

40{
41 cm_msg(MINFO, "Speaker", "Speaker interrupted");
43 pclose(fp);
44 exit(0);
45}
#define MINFO
Definition midas.h:560
Here is the call graph for this function:
Here is the caller graph for this function:

◆ sigpipehandler()

void sigpipehandler ( int  sig)

Definition at line 31 of file mlxspeaker.cxx.

32{
33 cm_msg(MERROR, "Speaker", "No speech synthesizer attached");
35 pclose(fp);
36 exit(2);
37}
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ fp

FILE* fp = NULL
static

Definition at line 25 of file mlxspeaker.cxx.

◆ mtTalkStr

char mtTalkStr[128]

Definition at line 26 of file mlxspeaker.cxx.

◆ mtUserStr

char mtUserStr[128]

Definition at line 26 of file mlxspeaker.cxx.

◆ shutupTime

DWORD shutupTime = 10

Definition at line 27 of file mlxspeaker.cxx.