def __init__(self, aiff_file, sample_rate, channels, channel_mask, bits_per_sample, chunk_length, process=None): """aiff_file should be rewound to the start of the SSND chunk.""" alignment = AiffAudio.SSND_ALIGN.parse_stream(aiff_file) PCMReader.__init__(self, file=__capped_stream_reader__( aiff_file, chunk_length - AiffAudio.SSND_ALIGN.sizeof()), sample_rate=sample_rate, channels=channels, channel_mask=channel_mask, bits_per_sample=bits_per_sample, process=process, signed=True, big_endian=True) self.ssnd_chunk_length = chunk_length - 8 standard_channel_mask = ChannelMask(self.channel_mask) aiff_channel_mask = AIFFChannelMask(standard_channel_mask) if (channels in (3, 4, 6)): self.channel_order = [aiff_channel_mask.channels().index(channel) for channel in standard_channel_mask.channels()] else: self.channel_order = None
def __init__(self, aiff_file, sample_rate, channels, channel_mask, bits_per_sample, chunk_length, process=None): """aiff_file should be rewound to the start of the SSND chunk.""" alignment = AiffAudio.SSND_ALIGN.parse_stream(aiff_file) PCMReader.__init__(self, file=__capped_stream_reader__( aiff_file, chunk_length - AiffAudio.SSND_ALIGN.sizeof()), sample_rate=sample_rate, channels=channels, channel_mask=channel_mask, bits_per_sample=bits_per_sample, process=process, signed=True, big_endian=True) self.ssnd_chunk_length = chunk_length - 8 standard_channel_mask = ChannelMask(self.channel_mask) aiff_channel_mask = AIFFChannelMask(standard_channel_mask) if (channels in (3, 4, 6)): self.channel_order = [ aiff_channel_mask.channels().index(channel) for channel in standard_channel_mask.channels() ] else: self.channel_order = None
def to_pcm(self): #if mpg123 is available, use that for decoding if (BIN.can_execute(BIN["mpg123"])): sub = subprocess.Popen([BIN["mpg123"],"-qs",self.filename], stdout=subprocess.PIPE, stderr=file(os.devnull,"a")) return PCMReader(sub.stdout, sample_rate=self.sample_rate(), channels=self.channels(), bits_per_sample=16, channel_mask=int(ChannelMask.from_channels(self.channels())), process=sub, big_endian=BIG_ENDIAN) else: #if not, use LAME for decoding if (self.filename.endswith("." + self.SUFFIX)): if (BIG_ENDIAN): endian = ['-x'] else: endian = [] sub = subprocess.Popen([BIN['lame']] + endian + \ ["--decode","-t","--quiet", self.filename,"-"], stdout=subprocess.PIPE) return PCMReader(sub.stdout, sample_rate=self.sample_rate(), channels=self.channels(), bits_per_sample=16, channel_mask=int(ChannelMask.from_channels(self.channels())), process=sub) else: import tempfile from audiotools import TempWaveReader #copy our file to one that ends with .mp3 tempmp3 = tempfile.NamedTemporaryFile(suffix='.' + self.SUFFIX) f = open(self.filename,'rb') transfer_data(f.read,tempmp3.write) f.close() tempmp3.flush() #decode the mp3 file to a WAVE file wave = tempfile.NamedTemporaryFile(suffix='.wav') returnval = subprocess.call([BIN['lame'],"--decode","--quiet", tempmp3.name,wave.name]) tempmp3.close() if (returnval == 0): #return WAVE file as a stream wave.seek(0,0) return TempWaveReader(wave) else: return PCMReaderError(None, sample_rate=self.sample_rate(), channels=self.channels(), bits_per_sample=16)
def __init__(self, reader, tempdir, symlink): PCMReader.__init__(self, None, sample_rate=reader.sample_rate, channels=reader.channels, channel_mask=reader.channel_mask, bits_per_sample=reader.bits_per_sample) self.tempdir = tempdir self.symlink = symlink self.reader = reader self.closed = False
def __init__(self, au_file, data_size, sample_rate, channels, channel_mask, bits_per_sample): """au_file is a file, data_size is an integer byte count. sample_rate, channels, channel_mask and bits_per_sample are ints. """ PCMReader.__init__(self, file=au_file, sample_rate=sample_rate, channels=channels, channel_mask=channel_mask, bits_per_sample=bits_per_sample) self.data_size = data_size
def to_pcm(self): for (chunk_id, chunk_length, chunk_offset) in self.chunks(): if (chunk_id == 'SSND'): f = open(self.filename, 'rb') f.seek(chunk_offset, 0) alignment = self.SSND_ALIGN.parse_stream(f) #FIXME - handle different types of SSND alignment pcmreader = PCMReader(__capped_stream_reader__( f, chunk_length - self.SSND_ALIGN.sizeof()), sample_rate=self.sample_rate(), channels=self.channels(), channel_mask=int(self.channel_mask()), bits_per_sample=self.bits_per_sample(), signed=True, big_endian=True) if (self.channels() <= 2): return pcmreader elif (self.channels() in (3, 4, 6)): #FIXME - handle undefined channel mask standard_channel_mask = self.channel_mask() aiff_channel_mask = AIFFChannelMask(self.channel_mask()) return ReorderedPCMReader(pcmreader, [ aiff_channel_mask.channels().index(channel) for channel in standard_channel_mask.channels() ]) else: return pcmreader else: return PCMReaderError()
def to_pcm(self): sub = subprocess.Popen([ BIN['oggdec'], '-Q', '-b', str(16), '-e', str(0), '-s', str(1), '-R', '-o', '-', self.filename ], stdout=subprocess.PIPE, stderr=file(os.devnull, "a")) pcmreader = PCMReader(sub.stdout, sample_rate=self.sample_rate(), channels=self.channels(), channel_mask=int(self.channel_mask()), bits_per_sample=self.bits_per_sample(), process=sub) if (self.channels() <= 2): return pcmreader elif (self.channels() <= 8): #these mappings transform Vorbis order into ChannelMask order standard_channel_mask = self.channel_mask() vorbis_channel_mask = VorbisChannelMask(self.channel_mask()) return ReorderedPCMReader(pcmreader, [ vorbis_channel_mask.channels().index(channel) for channel in standard_channel_mask.channels() ]) else: return pcmreader
def to_pcm(self): if (self.filename.endswith(".wv")): if ('-r' in WavPackAudio.__wvunpack_help__()): sub = subprocess.Popen([ BIN['wvunpack'], '-q', '-y', self.filename, '-r', '-o', '-' ], stdout=subprocess.PIPE, stderr=file(os.devnull, 'ab')) return PCMReader(sub.stdout, sample_rate=self.sample_rate(), channels=self.channels(), channel_mask=int(self.channel_mask()), bits_per_sample=self.bits_per_sample(), process=sub) else: sub = subprocess.Popen( [BIN['wvunpack'], '-q', '-y', self.filename, '-o', '-'], stdout=subprocess.PIPE, stderr=file(os.devnull, 'ab')) return WaveReader(sub.stdout, sample_rate=self.sample_rate(), channels=self.channels(), channel_mask=int(self.channel_mask()), bits_per_sample=self.bits_per_sample(), process=sub) else: #create a temporary symlink to the current file #rather than rewrite the whole thing (tempdir, symlink) = SymlinkPCMReader.new(self.filename, ".wv") return SymlinkPCMReader( WavPackAudio(symlink).to_pcm(), tempdir, symlink)
def to_pcm(self): f = file(self.filename, 'rb') f.seek(self.__data_offset__, 0) return PCMReader(f, sample_rate=self.sample_rate(), channels=self.channels(), channel_mask=int(self.channel_mask()), bits_per_sample=self.bits_per_sample(), signed=True, big_endian=True)
def to_pcm(self): devnull = file(os.devnull,'ab') sub = subprocess.Popen([BIN['speexdec'],self.filename,'-'], stdout=subprocess.PIPE, stderr=devnull) return PCMReader( sub.stdout, sample_rate=self.sample_rate(), channels=self.channels(), channel_mask=int(ChannelMask.from_channels(self.channels())), bits_per_sample=self.bits_per_sample(), process=sub)