Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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)
Пример #4
0
 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
Пример #5
0
    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
Пример #6
0
    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
Пример #7
0
 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()
Пример #8
0
    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
Пример #9
0
    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)
Пример #10
0
    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)
Пример #11
0
 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)