class AudioStreamIterable(object):
CHUNK_SIZE = 8096
DECODERS = {
"ogg": ("/usr/bin/oggdec", "-Q", "-o", "-"),
"flac": ("/usr/bin/flac", "-d", "-c", "--totally-silent"),
"mp3": ("/usr/bin/mpg123", "-s", "-q"),
}
ENCODER = "/usr/bin/oggenc"
def __init__(self, filename, decoder, bitrate):
self.filename = filename
self.bitrate = bitrate
self.decoder_cmd = list(self.DECODERS[decoder] + (filename, ))
self.encoder_cmd = [self.ENCODER, "-r", "-Q", "-b", str(bitrate), "-"]
def __iter__(self):
self.p1 = subprocess.Popen(self.decoder_cmd, stdout=subprocess.PIPE)
self.read_fd, self.write_fd = os.pipe()
self.p2 = subprocess.Popen(self.encoder_cmd, stdin=self.p1.stdout, stdout=os.fdopen(self.write_fd, "wb"))
fcntl.fcntl(self.read_fd, fcntl.F_SETFL, os.O_NONBLOCK)