diff --git a/scripts/amodem b/scripts/amodem index 0ee4503..b988c8d 100755 --- a/scripts/amodem +++ b/scripts/amodem @@ -11,11 +11,12 @@ 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 +from amodem import recv +from amodem import send +from amodem import wave import argparse +from functools import partial def FileType(mode, process=None): def opener(fname): @@ -24,8 +25,8 @@ def FileType(mode, process=None): fname = '-' 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 + if 'r' in mode: return process(stdout=wave.sp.PIPE).stdout + if 'w' in mode: return process(stdin=wave.sp.PIPE).stdin if fname == '-': if 'r' in mode: return _stdin @@ -38,41 +39,70 @@ def FileType(mode, process=None): def main(): p = argparse.ArgumentParser() - sub = p.add_subparsers() + subparsers = p.add_subparsers() - send = sub.add_parser('send') - send.add_argument('-i', '--input', help='input file (use "-" for stdin).') - send.add_argument('-o', '--output', help='output file (use "-" for stdout).' + # Modulator + sender = subparsers.add_parser('send', help='modulate binary data into audio signal.') + sender.add_argument('-i', '--input', help='input file (use "-" for stdin).') + sender.add_argument('-o', '--output', help='output file (use "-" for stdout).' ' if not specified, `aplay` tool will be used.') - send.add_argument('--silence-start', type=float, default=1.0, + sender.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, + sender.add_argument('--silence-stop', type=float, default=1.0, help='seconds of silence after transmission stops') - send.set_defaults(main=amodem.send.main, + sender.set_defaults(main=send.main, input_type=FileType('rb'), - output_type=FileType('wb', amodem.wave.play) + output_type=FileType('wb', wave.play) ) - recv = sub.add_parser('recv') - recv.add_argument('-i', '--input', help='input file (use "-" for stdin).' + # Demodulator + receiver = subparsers.add_parser('recv', help='demodulate audio signal into binary data.') + receiver.add_argument('-i', '--input', help='input file (use "-" for stdin).' ' if not specified, `arecord` tool will be used.') - recv.add_argument('-o', '--output', help='output file (use "-" for stdout).') - recv.add_argument('--skip', type=int, default=128, + receiver.add_argument('-o', '--output', help='output file (use "-" for stdout).') + receiver.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, + receiver.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), + receiver.set_defaults(main=recv.main, + input_type=FileType('rb', wave.record), output_type=FileType('wb') ) + # Audio recording tool + fmt = 'a raw audio file (16 bits at {:.1f} kHz)'.format(wave.Fs / 1e3) + recorder = subparsers.add_parser('record', help='record ' + fmt) + recorder.add_argument( + 'filename', default='-', + help='path to the audio file to record (otherwise, use stdout)') + recorder.set_defaults(main=partial(run, process=wave.record)) + + # Audio playing tool + player = subparsers.add_parser('play', help='play ' + fmt) + player.add_argument( + 'filename', default='-', + help='path to the audio file to play (otherwise, use stdin)') + player.set_defaults(main=partial(run, process=wave.play)) + + # Parsing and execution args = p.parse_args() - args.input = args.input_type(args.input) - args.output = args.output_type(args.output) + if hasattr(args, 'input_type'): + args.input = args.input_type(args.input) + if hasattr(args, 'output_type'): + args.output = args.output_type(args.output) args.main(args) +def run(args, process): + p = process(fname=args.filename) + exitcode = 0 + try: + exitcode = p.wait() + except KeyboardInterrupt: + p.kill() + exitcode = p.wait() + sys.exit(exitcode) if __name__ == '__main__': main() diff --git a/scripts/audio b/scripts/audio deleted file mode 100755 index d4e4a48..0000000 --- a/scripts/audio +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python -import logging -logging.basicConfig(level=logging.DEBUG, format='%(message)s') - -from amodem import wave - -import argparse -parser = argparse.ArgumentParser() -subparsers = parser.add_subparsers() -fmt = 'a raw audio file (16 bits at {:.1f} kHz)'.format(wave.Fs / 1e3) -recorder = subparsers.add_parser('record', help='record ' + fmt) -recorder.add_argument( - 'filename', default='-', - help='path to the audio file to record (otherwise, use stdout)') -recorder.set_defaults(func=wave.record) - -player = subparsers.add_parser('play', help='play ' + fmt) -player.add_argument( - 'filename', default='-', - help='path to the audio file to play (otherwise, use stdin)') -player.set_defaults(func=wave.play) - -args = parser.parse_args() -p = args.func(fname=args.filename) - -import sys -exitcode = 0 -try: - exitcode = p.wait() -except KeyboardInterrupt: - p.kill() - exitcode = p.wait() - -sys.exit(exitcode)