Files
amodem/wave.py
2014-07-22 14:20:04 +03:00

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)