cli: add zip compression option

This commit is contained in:
Roman Zeyde
2015-01-09 19:50:04 +02:00
parent c2a4bfbd5e
commit 8e8d43b041
2 changed files with 40 additions and 5 deletions

View File

@@ -1,7 +1,12 @@
#!/usr/bin/env python
# PYTHON_ARGCOMPLETE_OK
import os
import sys
import zlib
import logging
import argparse
if sys.version_info.major == 2:
_stdin = sys.stdin
_stdout = sys.stdout
@@ -9,23 +14,47 @@ else:
_stdin = sys.stdin.buffer
_stdout = sys.stdout.buffer
import argparse
try:
import argcomplete
except ImportError:
argcomplete = None
import logging
log = logging.getLogger('__name__')
from amodem import recv, send, calib, audio
from amodem.config import bitrates
import os
bitrate = os.environ.get('BITRATE', 1)
config = bitrates.get(int(bitrate))
class Compressor(object):
def __init__(self, stream):
self.obj = zlib.compressobj()
self.stream = stream
def read(self, size):
data = self.stream.read(size)
if data:
data = self.obj.compress(data)
elif self.obj:
data = self.obj.flush()
self.obj = None
return data
class Decompressor(object):
def __init__(self, stream):
self.obj = zlib.decompressobj()
self.stream = stream
def write(self, data):
self.stream.write(self.obj.decompress(bytes(data)))
def flush(self):
self.stream.write(self.obj.flush())
def FileType(mode, audio_interface=None):
def opener(fname):
assert 'r' in mode or 'w' in mode
@@ -60,6 +89,9 @@ def main():
p = argparse.ArgumentParser(description=description)
subparsers = p.add_subparsers()
def wrap(cls, stream, enable):
return cls(stream) if enable else stream
# Modulator
sender = subparsers.add_parser(
'send', help='modulate binary data into audio signal.')
@@ -73,7 +105,7 @@ def main():
sender.set_defaults(
main=lambda config, args: send.main(
config, src=args.src, dst=args.dst
config, src=wrap(Compressor, args.src, args.zip), dst=args.dst
),
calib=lambda config, args: calib.send(
config, dst=args.dst
@@ -97,7 +129,8 @@ def main():
help='plot results using pylab module')
receiver.set_defaults(
main=lambda config, args: recv.main(
config, src=args.src, dst=args.dst, pylab=args.pylab
config, src=args.src, dst=wrap(Decompressor, args.dst, args.zip),
pylab=args.pylab
),
calib=lambda config, args: calib.recv(
config, src=args.src, verbose=args.verbose
@@ -107,6 +140,7 @@ def main():
)
for sub in subparsers.choices.values():
sub.add_argument('-z', '--zip', default=False, action='store_true')
g = sub.add_mutually_exclusive_group()
g.add_argument('-v', '--verbose', default=0, action='count')
g.add_argument('-q', '--quiet', default=False, action='store_true')

View File

@@ -232,5 +232,6 @@ def main(config, src, dst, pylab=None):
except Exception:
log.exception('Decoding failed')
dst.flush()
receiver.report()
return success