mirror of
https://github.com/romanz/amodem.git
synced 2026-02-07 01:18:02 +08:00
67 lines
1.8 KiB
Python
Executable File
67 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
import os
|
|
import signal
|
|
import subprocess as sp
|
|
import logging
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
import config
|
|
Fs = int(config.Fs) # sampling rate
|
|
|
|
bits_per_sample = 16
|
|
bytes_per_sample = bits_per_sample / 8.0
|
|
bytes_per_second = bytes_per_sample * Fs
|
|
|
|
audio_format = 'S{}_LE'.format(bits_per_sample) # PCM signed little endian
|
|
|
|
|
|
def play(fname, **kwargs):
|
|
args = ['aplay', fname, '-q', '-f', audio_format, '-c', '1', '-r', Fs]
|
|
return launch(*args, **kwargs)
|
|
|
|
|
|
def record(fname, **kwargs):
|
|
args = ['arecord', fname, '-q', '-f', audio_format, '-c', '1', '-r', Fs]
|
|
return launch(*args, **kwargs)
|
|
|
|
|
|
def launch(*args, **kwargs):
|
|
args = map(str, args)
|
|
log.debug('$ %s', ' '.join(args))
|
|
p = sp.Popen(args=args, **kwargs)
|
|
p.stop = lambda: os.kill(p.pid, signal.SIGKILL)
|
|
return p
|
|
|
|
if __name__ == '__main__':
|
|
import logging
|
|
logging.basicConfig(level=logging.DEBUG, format='%(message)s')
|
|
import argparse
|
|
parser = argparse.ArgumentParser()
|
|
subparsers = parser.add_subparsers()
|
|
fmt = 'a raw audio file (16 bits at {:.1f} kHz)'.format(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=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=play)
|
|
|
|
args = parser.parse_args()
|
|
p = args.func(args.filename)
|
|
|
|
import sys
|
|
exitcode = 0
|
|
try:
|
|
exitcode = p.wait()
|
|
except KeyboardInterrupt:
|
|
p.kill()
|
|
exitcode = p.wait()
|
|
|
|
sys.exit(exitcode)
|