Only in v13: snd_ut.py diff -ur v12/snddiv.py v13/snddiv.py --- v12/snddiv.py 2020-09-23 20:59:26.000000000 +0900 +++ v13/snddiv.py 2022-05-02 18:32:46.842678228 +0900 @@ -10,15 +10,16 @@ import dbg import arg -def play_new(dat, inf, sudo_passwd='', r_rate=1.0): +#nc_out = lambda s: cmd_ut.call( 'echo {} | nc -N localhost 7075'.format( s ) ) + +def play_new( load_div, inf, sudo_passwd='', r_rate=1.0 ): e = empty.new() - e.dat = dat e.run = False e.sec = 0 e.rbuf = '' e.evt = thr.event_new() - last_sec = inf.byte_to_sec( len(dat) ) + last_sec = load_div.all_sec def proc_new(): cmd = 'play {} -'.format( inf.get_raw_opt(r_rate) ) @@ -50,10 +51,14 @@ update(s) def wfunc(f): - try: - f.write(dat) - except: - pass + while True: + b = load_div.get_dat() + if not b: + break + try: + f.write( b ) + except: + break f.close() proc = proc_new() @@ -76,15 +81,27 @@ return empty.to_attr( e, locals() ) -def snd_new(data, sudo_passwd): +def snd_new( data, sudo_passwd, cache ): inf = data.inf last_sec = inf.smp_to_sec( inf.smp_n ) dbg.out( 'last_sec={}'.format( last_sec ) ) - b = data.get_bytes() n = inf.byte_per_smp - smp_lst = list( map( lambda i: b[i*n:i*n+n], range( inf.smp_n ) ) ) - smp_rlst = smp_lst[::-1] + b = None + smp_lst = None + smp_rlst = None + + def bytes_to_smp( b ): + smp_n = len( b ) // n + return list( map( lambda i: b[ i * n : i * n + n ], range( smp_n ) ) ) + + def smp_to_bytes( lst ): + return b''.join( lst ) + + if cache: + b = data.get_bytes() + smp_lst = bytes_to_smp( b ) + smp_rlst = smp_lst[::-1] e = empty.new() e.sec = 0 @@ -102,16 +119,23 @@ lst = get_smp_sec(sec, reverse) if shift > 0: lst = lst[:: 2**shift ] - return b''.join(lst) + return smp_to_bytes( lst ) def get_smp_from_to(sec_f, sec_t): - f = inf.smp_sec(sec_f) - t = inf.smp_sec(sec_t) - return smp_lst[f:t] + if cache: + f = inf.smp_sec(sec_f) + t = inf.smp_sec(sec_t) + return smp_lst[f:t] + + b = get_dat_from_to( sec_f, sec_t ) + return bytes_to_smp( b ) def get_dat_from_to(sec_f, sec_t): - lst = get_smp_from_to(sec_f, sec_t) - return b''.join(lst) + if cache: + lst = get_smp_from_to(sec_f, sec_t) + return smp_to_bytes( lst ) + + return data.get_bytes( sec_f, sec_t, cache=False ) def get_sec(): add = 0 @@ -121,13 +145,59 @@ add = -add return e.sec + add + def load_div_new( sec, reverse, shift ): + e = empty.new() + e.fin = False + e.sec = sec + + all_sec = ( sec if reverse else last_sec - sec ) + + def get_dat(): + if e.fin: + #if e.sec <= fin_sec if reverse else e.sec >= fin_sec: + return None + + if cache: + e.fin = True + return get_dat_sec( e.sec, reverse, shift ) + + step_sec = 5.0 + + if reverse: + sec_t = e.sec + sec_f = max( e.sec - step_sec, 0 ) + b = get_dat_from_to( sec_f, sec_t ) + e.sec = sec_f + e.fin = ( e.sec <= 0 ) + else: + sec_f = e.sec + sec_t = min( e.sec + step_sec, fin_sec ) + b = get_dat_from_to( sec_f, sec_t ) + e.sec = sec_t + e.fin = ( e.sec >= last_sec ) + + if not reverse and shift == 0: + return b + + lst = bytes_to_smp( b ) + + if reverse: + lst = lst[ :: -1 ] + + if shift > 0: + lst = lst[ :: 2 ** shift ] + + return smp_to_bytes( lst ) + + return empty.add( e, locals() ) + def start(): if e.play: stop() - dat = get_dat_sec( e.sec, e.reverse, max(e.shift, 0) ) + load_div = load_div_new( e.sec, e.reverse, max( e.shift, 0 ) ) - e.play = play_new( dat, inf, sudo_passwd, min(2**e.shift, 1.0) ) + e.play = play_new( load_div, inf, sudo_passwd, min(2**e.shift, 1.0) ) e.play.start() def stop(): @@ -203,6 +273,7 @@ sudo_passwd = a.pop_str('-S') silent = a.is_pop('-silent') + cache = a.is_pop( '-cache' ) filename_mp3 = a.pop() if not filename_mp3: dbg.help_exit( '[-g] [-S sudo_passwd] [-silent] filename_mp3' ) @@ -212,7 +283,7 @@ data = snd_ut.data_new(filename_mp3) - snd = snd_new(data, sudo_passwd) + snd = snd_new( data, sudo_passwd, cache ) rdr = io_ut.reader_new( sys.stdin, 1, no_buf=True )