/*
 * Flite input interface using FIFO: by megacz@usa.com
*/

pre_:
SIGNAL ON Halt
SIGNAL ON Break_C
null="00"x
lf="0A"x

var_:
pipe_device  = 'FIFO:'
pipe_dev_rf  = '/rt'
pipe_dev_wf  = '/wmKk'
pipe_dev_bf  = '/wmeKkC'
flite_stream = 'flitetextstream'
flite_exec   = 'flite16'
flite_stack  = 25000
flite_pri    = 0

main_:
say " /// breaking previously started instance ..."
_break=OPEN(__fifo,pipe_device||flite_stream||pipe_dev_bf,'W')
_close=CLOSE(__fifo)
IF OPEN(__fifo,pipe_device||flite_stream||pipe_dev_wf,'A')<=0 THEN DO
say " *** oops, seemd that you do not have '"pipe_device"' in your system!"
EXIT
END
say " /// launching '"flite_exec" "pipe_device||flite_stream||pipe_dev_rf"' ..."
_stack=PRAGMA('S',flite_stack)
_pri=PRAGMA('P',flite_pri)
ADDRESS COMMAND "RUN "flite_exec" "pipe_device||flite_stream||pipe_dev_rf 
say " /// type text or leave with '/quit' or 'CTRL+C RETURN'."
DO FOREVER
PARSE PULL _textdata
IF _textdata~="" THEN DO
IF UPPER(_textdata)="/QUIT" THEN CALL Halt
_writefifo=WRITECH(__fifo,_textdata||lf)
_writefifo=WRITECH(__fifo,null||lf)
END
END

Halt:
Break_C:
_close=CLOSE(__fifo)
_break=OPEN(__fifo,pipe_device||flite_stream||pipe_dev_bf,'W')
say " *** processes terminated!"
EXIT