diff -ur v8/gui.py v9/gui.py --- v8/gui.py 2020-01-26 19:37:29.000000000 +0900 +++ v9/gui.py 2020-01-27 21:45:06.000000000 +0900 @@ -14,6 +14,7 @@ hsz = wx.BoxSizer(wx.HORIZONTAL) for o in lst: flag = wx.LEFT | ( wx.RIGHT if o == lst[-1] else 0 ) + flag |= wx.ALIGN_CENTER_VERTICAL hsz.Add(o, 0, flag, border) flag = wx.TOP | ( wx.BOTTOM if lst == lsts[-1] else 0 ) vsz.Add( hsz, 0, flag, border ) @@ -22,6 +23,13 @@ def set_min_w(o, w): o.SetMinSize((w, -1)) +cls_evt_dic = { + wx.Button: wx.EVT_BUTTON, + wx.ToggleButton: wx.EVT_TOGGLEBUTTON, + wx.CheckBox: wx.EVT_CHECKBOX, + wx.Choice: wx.EVT_CHOICE, +} + def init(app, title): rdr = io_ut.reader_new( sys.stdin, 1, no_buf=True ) @@ -49,30 +57,48 @@ frame = wx.Frame(None, wx.ID_ANY, title) + obj_cls_dic = {} + def wx_new(cls, *args, **kwds): + (k, w) = ('min_w', -1) + if k in kwds: + w = kwds.pop(k) + o = cls( frame, wx.ID_ANY, *args, **kwds ) + if w != -1: + set_min_w(o, w) + obj_cls_dic[o] = cls + return o + + def bind_o(o, hdl): + cls = obj_cls_dic.get(o) + evt = cls_evt_dic.get(cls) + if evt: + frame.Bind(evt, hdl, o) + + def bind_objs(objs, hdl): + for o in objs: + bind_o(o, hdl) + play_lbs = ( ' Play |>', ' Play <|', 'Pause ||' ) - btn_play = wx.ToggleButton( frame, wx.ID_ANY, play_lbs[0] ) + btn_play = wx_new( wx.ToggleButton, play_lbs[0], min_w=104 ) lb_pause = play_lbs[-1] is_play = lambda : btn_play.GetValue() - cbox_reverse = wx.CheckBox( frame, wx.ID_ANY, 'reverse' ) + cbox_reverse = wx_new( wx.CheckBox, 'reverse' ) is_reverse = lambda : cbox_reverse.GetValue() speed_lbs = ('x4', 'x2', 'x1', 'x0.5') - menu_speed = wx.Choice( frame, wx.ID_ANY, choices=speed_lbs ) + menu_speed = wx_new( wx.Choice, choices=speed_lbs ) #menu_speed.SetSelection(2) menu_speed.SetStringSelection('x1') shifts = (2, 1, 0, -1) get_shift = lambda : shifts[ menu_speed.GetSelection() ] - btn_rw = wx.Button( frame, wx.ID_ANY, '<<' ) - set_min_w(btn_rw, 40) - btn_ff = wx.Button( frame, wx.ID_ANY, '>>' ) - set_min_w(btn_ff, 40) + btn_rw = wx_new( wx.Button, '<<', min_w=50 ) + btn_ff = wx_new( wx.Button, '>>', min_w=50 ) - btn_div = wx.Button( frame, wx.ID_ANY, '' ) + btn_div = wx_new( wx.Button, '', min_w=50 ) btn_div.Enable(False) - area = wx.StaticText( frame, wx.ID_ANY,'-/-' ) - set_min_w(area, 40) + area = wx_new( wx.StaticText, '-/-', min_w=50 ) def div_update(): cmd = 'dbg.out( snd.div_join_label() )' @@ -86,14 +112,35 @@ s = comm(cmd, rdr.readline).strip() area.SetLabel(s) - pos = wx.StaticText( frame, wx.ID_ANY,'-' ) - set_min_w(pos, 40) + pos = wx_new( wx.StaticText, '-', min_w=50 ) 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 ) + btn_save = wx_new( wx.Button, 'save', min_w=50 ) + + def save(): + dlg = wx.FileDialog( frame, style=wx.FD_SAVE ) + ret = dlg.ShowModal() + dlg.Destroy() + if ret != wx.ID_OK: + return + + name = dlg.GetPath() + s = area.GetLabel() + s = s.split('/')[0] + i = ( 1 if s == '-' else int(s) ) - 1 + cmd = 'snd.save({}, "{}")'.format(i, name) + + def do_save(): + s = comm(cmd, rdr.readline) # skip 'OK' + frame.Enable(True) + + frame.Enable(False) + wx.CallAfter(do_save) + pos_ev = threading.Event() def th_func(): tmout = 0.2 if is_play() else None @@ -131,6 +178,8 @@ s = 'snd.rw()' elif o == btn_ff: s = 'snd.ff()' + elif o == btn_save: + save() if o in (cbox_reverse, menu_speed, btn_rw, btn_ff) and is_play(): s = '\n'.join( ( 'snd.stop()', s, 'snd.start()' ) ) @@ -146,18 +195,18 @@ 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_BUTTON, hdl, btn_rw ) - frame.Bind( wx.EVT_BUTTON, hdl, btn_ff ) - frame.Bind( wx.EVT_BUTTON, hdl, btn_div ) + objs = ( + btn_rw, btn_play, btn_ff, + cbox_reverse, menu_speed, + btn_div, btn_save, + ) + bind_objs(objs, hdl) frame.Bind( wx.EVT_CLOSE, quit_hdl ) szr = wrap( [ (btn_rw, btn_play, btn_ff), (cbox_reverse, menu_speed), - (pos, btn_div, area), + (pos, btn_div, area, btn_save), ] ) frame.SetSizer(szr) frame.Layout() diff -ur v8/snddiv.py v9/snddiv.py --- v8/snddiv.py 2020-01-26 19:34:56.000000000 +0900 +++ v9/snddiv.py 2020-01-27 21:45:06.000000000 +0900 @@ -101,18 +101,37 @@ lst = get_smp_from_to(sec_f, sec_t) return b''.join(lst) - def save(sec_f, sec_t, name): - dbg.out('save ... ', '') + def save(sec_f, sec_t, name, dbg_out): + (name, ext) = os.path.splitext(name) + if not ext or ext not in ('raw', 'wav', 'mp3'): + ext = 'mp3' + + dbg_out('save {}.raw ... '.format(name), '') dat = get_dat_from_to(sec_f, sec_t) with open( '{}.raw'.format(name), 'wb' ) as f: f.write(dat) + dbg_out('OK') + if ext == 'raw': + return + + dbg_out('save {}.wav ... '.format(name), '') cmd = 'sox {} {}.raw {}.wav'.format( opt.get_raw_opt(), name, name ) cmd_ut.call(cmd) + dbg_out('OK') + if ext == 'wav': + cmd = 'rm -f {}.raw'.format(name) + cmd_ut.call(cmd) + dbg_out('delete {}.raw'.format(name)) + return + + dbg_out('save {}.mp3 ... '.format(name), '') cmd = 'lame {}.wav {}.mp3 > /dev/null 2>&1'.format( name, name ) cmd_ut.call(cmd) + dbg_out('OK') cmd = 'rm -f {}.raw {}.wav'.format( name, name ) cmd_ut.call(cmd) - dbg.out('OK') + dbg_out('delete {}.raw'.format(name)) + dbg_out('delete {}.wav'.format(name)) last_sec = opt.byte_to_sec( len(dat) ) @@ -184,7 +203,7 @@ return empty.to_attr( e, locals() ) -def snd_new(data, sudo_passwd): +def snd_new(data, sudo_passwd, dbg_out): opt = data.opt e = empty.new() @@ -254,7 +273,8 @@ def save(i, name): if 0 <= i and i < len(divs)-1: - data.save( divs[i], divs[i+1], name ) + data.save( divs[i], divs[i+1], name, dbg_out ) + dbg.out('OK') def curr_area(): n = len(divs) - 1 @@ -292,9 +312,9 @@ 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) + snd = snd_new(data, sudo_passwd, dbg_out) rdr = io_ut.reader_new( sys.stdin, 1, no_buf=True ) diff -ur v8/snddiv.sh v9/snddiv.sh --- v8/snddiv.sh 2020-01-26 19:34:56.000000000 +0900 +++ v9/snddiv.sh 2020-01-27 21:45:17.000000000 +0900 @@ -1,5 +1,10 @@ #!/bin/bash -./stdio.sh ./gui.py "./snddiv.py -silent $1" +if [ $# == 0 ]; then + echo Usage: $0 [-S sudo_pass] filename_mp3 + exit 1 +fi + +./stdio.sh ./gui.py "./snddiv.py -silent $*" # EOF diff -ur v8/stdio.sh v9/stdio.sh --- v8/stdio.sh 2020-01-25 00:55:00.000000000 +0900 +++ v9/stdio.sh 2020-01-27 21:45:06.000000000 +0900 @@ -2,8 +2,10 @@ rm -f fifo mkfifo fifo -$1 < fifo | $2 | tee fifo -#$1 < fifo | $2 > fifo +# for debug +#$1 < fifo | $2 | tee fifo + +$1 < fifo | $2 > fifo rm -f fifo # EOF