mirror of
https://github.com/romanz/amodem.git
synced 2026-04-21 05:36:42 +08:00
amodem: refactor calibration and audio I/O into main script
This commit is contained in:
@@ -7,9 +7,8 @@ else:
|
|||||||
_stdin = sys.stdin.buffer
|
_stdin = sys.stdin.buffer
|
||||||
_stdout = sys.stdout.buffer
|
_stdout = sys.stdout.buffer
|
||||||
|
|
||||||
|
import argparse
|
||||||
import logging
|
import logging
|
||||||
format = '%(asctime)s %(levelname)-10s %(message)-100s %(filename)s:%(lineno)d'
|
|
||||||
logging.basicConfig(level=logging.DEBUG, format=format)
|
|
||||||
|
|
||||||
log = logging.getLogger('__name__')
|
log = logging.getLogger('__name__')
|
||||||
|
|
||||||
@@ -17,9 +16,8 @@ from amodem import config
|
|||||||
from amodem import recv
|
from amodem import recv
|
||||||
from amodem import send
|
from amodem import send
|
||||||
from amodem import wave
|
from amodem import wave
|
||||||
|
from amodem import calib
|
||||||
|
|
||||||
import argparse
|
|
||||||
from functools import partial
|
|
||||||
|
|
||||||
null = open('/dev/null', 'wb')
|
null = open('/dev/null', 'wb')
|
||||||
|
|
||||||
@@ -47,17 +45,6 @@ def FileType(mode, process=None):
|
|||||||
return opener
|
return opener
|
||||||
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
p = argparse.ArgumentParser()
|
p = argparse.ArgumentParser()
|
||||||
subparsers = p.add_subparsers()
|
subparsers = p.add_subparsers()
|
||||||
@@ -70,7 +57,10 @@ def main():
|
|||||||
sender.add_argument(
|
sender.add_argument(
|
||||||
'-o', '--output', help='output file (use "-" for stdout).'
|
'-o', '--output', help='output file (use "-" for stdout).'
|
||||||
' if not specified, `aplay` tool will be used.')
|
' if not specified, `aplay` tool will be used.')
|
||||||
|
sender.add_argument(
|
||||||
|
'-c', '--calibrate', default=False, action='store_true')
|
||||||
|
sender.add_argument(
|
||||||
|
'-w', '--wave', default=False, action='store_true')
|
||||||
sender.add_argument(
|
sender.add_argument(
|
||||||
'--silence-start', type=float, default=1.0,
|
'--silence-start', type=float, default=1.0,
|
||||||
help='seconds of silence before transmission starts')
|
help='seconds of silence before transmission starts')
|
||||||
@@ -79,7 +69,7 @@ def main():
|
|||||||
help='seconds of silence after transmission stops')
|
help='seconds of silence after transmission stops')
|
||||||
|
|
||||||
sender.set_defaults(
|
sender.set_defaults(
|
||||||
main=send.main,
|
main=run_send,
|
||||||
input_type=FileType('rb'),
|
input_type=FileType('rb'),
|
||||||
output_type=FileType('wb', wave.play)
|
output_type=FileType('wb', wave.play)
|
||||||
)
|
)
|
||||||
@@ -92,6 +82,10 @@ def main():
|
|||||||
' if not specified, `arecord` tool will be used.')
|
' if not specified, `arecord` tool will be used.')
|
||||||
receiver.add_argument(
|
receiver.add_argument(
|
||||||
'-o', '--output', help='output file (use "-" for stdout).')
|
'-o', '--output', help='output file (use "-" for stdout).')
|
||||||
|
receiver.add_argument(
|
||||||
|
'-c', '--calibrate', default=False, action='store_true')
|
||||||
|
receiver.add_argument(
|
||||||
|
'-w', '--wave', default=False, action='store_true')
|
||||||
receiver.add_argument(
|
receiver.add_argument(
|
||||||
'--skip', type=int, default=128,
|
'--skip', type=int, default=128,
|
||||||
help='skip initial N samples, due to spurious spikes')
|
help='skip initial N samples, due to spurious spikes')
|
||||||
@@ -99,39 +93,55 @@ def main():
|
|||||||
'--plot', dest='plt', action='store_true', default=False,
|
'--plot', dest='plt', action='store_true', default=False,
|
||||||
help='plot results using pylab module')
|
help='plot results using pylab module')
|
||||||
receiver.set_defaults(
|
receiver.set_defaults(
|
||||||
main=recv.main,
|
main=run_recv,
|
||||||
input_type=FileType('rb', wave.record),
|
input_type=FileType('rb', wave.record),
|
||||||
output_type=FileType('wb')
|
output_type=FileType('wb')
|
||||||
)
|
)
|
||||||
|
|
||||||
# Audio recording tool
|
args = p.parse_args()
|
||||||
fmt = 'a raw audio file (16 bits at {:.1f} kHz)'.format(wave.Fs / 1e3)
|
logging.basicConfig(
|
||||||
recorder = subparsers.add_parser('record', help='record ' + fmt)
|
level='DEBUG', filename='amodem.log',
|
||||||
recorder.add_argument(
|
format=('%(asctime)s %(levelname)-10s %(message)-100s '
|
||||||
'filename', default='-',
|
'%(filename)s:%(lineno)d'))
|
||||||
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
|
# Parsing and execution
|
||||||
args = p.parse_args()
|
|
||||||
if hasattr(args, 'input_type'):
|
|
||||||
args.input = args.input_type(args.input)
|
|
||||||
if hasattr(args, 'output_type'):
|
|
||||||
args.output = args.output_type(args.output)
|
|
||||||
if getattr(args, 'plt', 'None'):
|
|
||||||
import pylab
|
|
||||||
args.plt = pylab
|
|
||||||
|
|
||||||
log.debug('MODEM settings: %r', config.settings)
|
log.debug('MODEM settings: %r', config.settings)
|
||||||
args.main(args)
|
args.main(args)
|
||||||
|
|
||||||
|
|
||||||
|
def join_process(process):
|
||||||
|
exitcode = 0
|
||||||
|
try:
|
||||||
|
exitcode = process.wait()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
process.kill()
|
||||||
|
exitcode = process.wait()
|
||||||
|
sys.exit(exitcode)
|
||||||
|
|
||||||
|
|
||||||
|
def run_modem(args, func):
|
||||||
|
args.input = args.input_type(args.input)
|
||||||
|
args.output = args.output_type(args.output)
|
||||||
|
func(args)
|
||||||
|
|
||||||
|
|
||||||
|
def run_send(args):
|
||||||
|
if args.calibrate:
|
||||||
|
calib.send()
|
||||||
|
elif args.wave:
|
||||||
|
join_process(wave.play(fname=args.input))
|
||||||
|
else:
|
||||||
|
run_modem(args, send.main)
|
||||||
|
|
||||||
|
|
||||||
|
def run_recv(args):
|
||||||
|
if args.calibrate:
|
||||||
|
calib.recv()
|
||||||
|
elif args.wave:
|
||||||
|
join_process(wave.record(fname=args.output))
|
||||||
|
else:
|
||||||
|
run_modem(args, recv.main)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|||||||
Reference in New Issue
Block a user