diff -urN v6/gui.py v7/gui.py --- v6/gui.py 2020-01-21 22:56:32.000000000 +0900 +++ v7/gui.py 2020-01-25 01:50:02.000000000 +0900 @@ -1,6 +1,11 @@ #!/usr/bin/env python +import sys +import threading +from decimal import Decimal import wx +import thr +import io_ut import dbg def wrap( lsts, border=4 ): @@ -15,6 +20,26 @@ return vsz def init(app, title): + rdr = io_ut.reader_new( sys.stdin, 1, no_buf=True ) + + lock = threading.Lock() + + def comm(cmd, rep_func=None): + lock.acquire() + if cmd: + dbg.out(cmd) + rep = None + if rep_func: + while rep == None: + rep = rep_func() + if rep == '': + break + lock.release() + return rep + + while comm('', rdr.readline) != 'ready\n': + pass + frame = wx.Frame(None, wx.ID_ANY, title) play_lbs = ( ' Play |>', ' Play <|', 'Pause ||' ) @@ -32,6 +57,29 @@ shifts = (2, 1, 0, -1) get_shift = lambda : shifts[ menu_speed.GetSelection() ] + + pos = wx.StaticText( frame, wx.ID_ANY,'-' ) + def pos_update(): + cmd = 'dbg.out("{}".format( snd.get_sec() ) )' + s = comm(cmd, rdr.readline).strip() + s = str( Decimal(s).quantize( Decimal('.01') ) ) + wx.CallAfter( pos.SetLabel, s ) + + pos_ev = threading.Event() + def th_func(): + tmout = 0.2 if is_play() else None + pos_ev.wait(tmout) + pos_ev.clear() + pos_update() + + th = thr.loop_new(th_func) + def th_stop(): + th.quit_ev.set() + pos_ev.set() + th.stop() + th.start() + + def lb_update(): lb = lb_pause if is_play() else play_lbs[ 1 if is_reverse() else 0 ] btn_play.SetLabel(lb) @@ -43,6 +91,7 @@ s = '' if o == btn_play: s = 'snd.{}()'.format( 'start' if is_play() else 'stop' ) + pos_ev.set() elif o == cbox_reverse: s = 'snd.reverse={}'.format( o.GetValue() ) elif o == menu_speed: @@ -51,13 +100,19 @@ if o in (cbox_reverse, menu_speed) and is_play(): s = '\n'.join( ( 'snd.stop()', s, 'snd.start()' ) ) if s: - dbg.out(s) + comm(s) + + def quit_hdl(evt): + dbg.err('quit') + th_stop() + wx.Exit() frame.Bind( wx.EVT_TOGGLEBUTTON, hdl, btn_play ) frame.Bind( wx.EVT_CHECKBOX, hdl, cbox_reverse ) frame.Bind( wx.EVT_CHOICE, hdl, menu_speed ) + frame.Bind( wx.EVT_CLOSE, quit_hdl ) - szr = wrap( [ (btn_play, cbox_reverse, menu_speed) ] ) + szr = wrap( [ (btn_play, cbox_reverse, menu_speed), (pos,) ] ) frame.SetSizer(szr) frame.Layout() frame.Fit() diff -urN v6/snddiv.py v7/snddiv.py --- v6/snddiv.py 2020-01-20 21:23:00.000000000 +0900 +++ v7/snddiv.py 2020-01-25 00:53:31.000000000 +0900 @@ -10,9 +10,10 @@ import empty import cmd_ut import thr +import io_ut import dbg -readable = lambda fd, tmout=3.0: select.select([fd], [], [], tmout)[0] == [fd] +silent = False def data_new(name_mp3): @@ -133,8 +134,7 @@ proc = cmd_ut.proc_new(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, sudo_pw=sudo_passwd) return proc - def update(): - s = e.rbuf + def update(s): if not s.startswith('In:'): return lst = s.split()[1:2] @@ -150,17 +150,12 @@ e.sec = sec e.evt.set() - def rfunc(f): - if not ( e.run and readable(f) ): + def rfunc(rdr): + if not e.run: return - c = f.read(1) - if not c: - return - c = c.decode() - e.rbuf += c - if c in '\n\r': - update() - e.rbuf = '' + s = rdr.readline() + if s: + update(s) def wfunc(f): try: @@ -170,7 +165,9 @@ f.close() proc = proc_new() - rth = thr.loop_new( rfunc, ( proc.get_stderr(), ) ) + f = proc.get_stderr() + rdr = io_ut.reader_new(f) + rth = thr.loop_new( rfunc, (rdr,) ) wth = thr.th_new( wfunc, ( proc.get_stdin(), ) ) def start(): @@ -252,31 +249,48 @@ return empty.to_attr( e, locals() ) def get_args(): + def get_idx_pop(av, k): + if k in av: + i = av.index(k) + av.pop(i) + return i + return -1 + av = sys.argv[1:] k = '-S' sudo_passwd = '' try: - if k in av: - i = av.index(k) - av.pop(i) + i = get_idx_pop(av, k) + if i >= 0: sudo_passwd = av.pop(i) - return ( av[0], sudo_passwd ) + silent = ( get_idx_pop(av, '-silent') >= 0 ) + return ( av[0], sudo_passwd, silent ) except: - dbg.err_exit( 'Usage: {} [{} sudo_passwd] filename_mp3'.format( sys.argv[0], k ) ) + dbg.err_exit( 'Usage: {} [-S sudo_passwd] [-silent] filename_mp3'.format( sys.argv[0], k ) ) if __name__ == "__main__": - ( filename_mp3, sudo_passwd ) = get_args() + ( filename_mp3, sudo_passwd, silent ) = get_args() + + dbg_out = lambda s, tail='\n': None if silent else dbg.out data = data_new(filename_mp3) - dbg.out( 'last_sec={}'.format( data.last_sec ) ) + dbg_out( 'last_sec={}'.format( data.last_sec ) ) snd = snd_new(data, sudo_passwd) + rdr = io_ut.reader_new( sys.stdin, 1, no_buf=True ) + + if silent: + dbg.out('ready') + while True: - dbg.out('snd> ', '') - s = sys.stdin.readline() + dbg_out('snd> ', '') + while True: + s = rdr.readline() + if s != None: + break if not s: - dbg.out('') + dbg_out('') break exec(s) # EOF diff -urN v6/stdio.sh v7/stdio.sh --- v6/stdio.sh 1970-01-01 09:00:00.000000000 +0900 +++ v7/stdio.sh 2020-01-25 00:55:00.000000000 +0900 @@ -0,0 +1,10 @@ +#!/bin/bash +rm -f fifo +mkfifo fifo + +$1 < fifo | $2 | tee fifo +#$1 < fifo | $2 > fifo + +rm -f fifo +# EOF +