From 6a01602df90db6f777d2364676e22900b2c2015f Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Tue, 2 Sep 2014 09:48:50 +0300 Subject: [PATCH] Use wave.play and wave.record in modem script --- amodem/wave.py | 2 +- scripts/modem.py | 70 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 55 insertions(+), 17 deletions(-) diff --git a/amodem/wave.py b/amodem/wave.py index d272a55..ad9f931 100644 --- a/amodem/wave.py +++ b/amodem/wave.py @@ -18,7 +18,7 @@ audio_format = 'S{}_LE'.format(bits_per_sample) # PCM signed little endian def launch(tool, fname='-', **kwargs): args = [tool, fname, '-q', '-f', audio_format, '-c', '1', '-r', str(Fs)] - log.debug('running: %r', args) + log.debug('Running: %r', args) p = sp.Popen(args=args, **kwargs) p.stop = lambda: os.kill(p.pid, signal.SIGKILL) return p diff --git a/scripts/modem.py b/scripts/modem.py index 1080fe5..cde2330 100755 --- a/scripts/modem.py +++ b/scripts/modem.py @@ -6,31 +6,69 @@ if sys.version_info.major == 2: else: _stdin = sys.stdin.buffer _stdout = sys.stdout.buffer + import logging format = '%(asctime)s %(levelname)-10s %(message)-100s %(filename)s:%(lineno)d' logging.basicConfig(level=logging.DEBUG, format=format) import amodem.recv import amodem.send +import amodem.wave import argparse -p = argparse.ArgumentParser() -p.add_argument('-i', '--input', type=argparse.FileType('rb'), default=_stdin) -p.add_argument('-o', '--output', type=argparse.FileType('wb'), default=_stdout) -sub = p.add_subparsers() +def FileType(mode, process=None): + def opener(fname): + assert 'r' in mode or 'w' in mode + if process is None and fname is None: + fname = '-' -send = sub.add_parser('send') -send.add_argument('--silence-start', type=float, default=1.0) -send.add_argument('--silence-stop', type=float, default=1.0) -send.set_defaults(func=amodem.send.main) + if fname is None: + if 'r' in mode: return process(stdout=amodem.wave.sp.PIPE).stdout + if 'w' in mode: return process(stdin=amodem.wave.sp.PIPE).stdin -recv = sub.add_parser('recv') -recv.add_argument('--skip', type=int, default=128, - help='skip initial N samples, due to spurious spikes') -recv.add_argument('--plot', dest='plt', action='store_true', default=False, - help='plot results using pylab module') -recv.set_defaults(func=amodem.recv.main) + if fname == '-': + if 'r' in mode: return _stdin + if 'w' in mode: return _stdout -args = p.parse_args() -args.func(args) + return open(fname, mode) + + return opener + + +def main(): + p = argparse.ArgumentParser() + p.add_argument('-i', '--input') + p.add_argument('-o', '--output') + + sub = p.add_subparsers() + + send = sub.add_parser('send') + send.add_argument('--silence-start', type=float, default=1.0, + help='seconds of silence before transmission starts') + send.add_argument('--silence-stop', type=float, default=1.0, + help='seconds of silence after transmission stops') + + send.set_defaults(main=amodem.send.main, + input_type=FileType('rb'), + output_type=FileType('wb', amodem.wave.play) + ) + + recv = sub.add_parser('recv') + recv.add_argument('--skip', type=int, default=128, + help='skip initial N samples, due to spurious spikes') + recv.add_argument('--plot', dest='plt', action='store_true', default=False, + help='plot results using pylab module') + recv.set_defaults(main=amodem.recv.main, + input_type=FileType('rb', amodem.wave.record), + output_type=FileType('wb') + ) + + args = p.parse_args() + args.input = args.input_type(args.input) + args.output = args.output_type(args.output) + args.main(args) + + +if __name__ == '__main__': + main()