diff --git a/wavinfo/wave_parser.py b/wavinfo/wave_parser.py index 8f0bdf2..7771b5d 100644 --- a/wavinfo/wave_parser.py +++ b/wavinfo/wave_parser.py @@ -6,10 +6,8 @@ from .wave_ixml_reader import WavIXMLFormat from collections import namedtuple - ListChunkDescriptor = namedtuple('ListChunk' , 'signature children') - class ChunkDescriptor(namedtuple('Chunk', 'ident start length') ): def read_data(self, from_stream): from_stream.seek(self.start) @@ -50,15 +48,6 @@ def parse_chunk(stream): -WavInfoFormat = namedtuple("WavInfoFormat",'audio_format channel_count sample_rate byte_rate block_align bits_per_sample') - -WavBextFormat = namedtuple("WavBextFormat",'description originator originator_ref ' + - 'originator_date originator_time time_reference version umid ' + - 'loudness_value loudness_range max_true_peak max_momentary_loudness max_shortterm_loudness ' + - 'coding_history') - - - diff --git a/wavinfo/wave_reader.py b/wavinfo/wave_reader.py index 17e47c1..9f42636 100644 --- a/wavinfo/wave_reader.py +++ b/wavinfo/wave_reader.py @@ -1,5 +1,18 @@ import struct +from collections import namedtuple + +WavDataDescriptor = namedtuple('WavDataDescriptor','byte_count frame_count') + + +WavInfoFormat = namedtuple("WavInfoFormat",'audio_format channel_count sample_rate byte_rate block_align bits_per_sample') + +WavBextFormat = namedtuple("WavBextFormat",'description originator originator_ref ' + + 'originator_date originator_time time_reference version umid ' + + 'loudness_value loudness_range max_true_peak max_momentary_loudness max_shortterm_loudness ' + + 'coding_history') + + class WavInfoReader(): """ format : WAV format @@ -11,17 +24,37 @@ class WavInfoReader(): with open(path, 'rb') as f: chunks = parse_chunk(f) - main_list = chunks.children + self.main_list = chunks.children f.seek(0) - self.fmt = self._get_format(main_list,f) - self.info = self._get_bext(main_list,f) - self.ixml = self._get_ixml(main_list,f) + self.fmt = self._get_format(self.main_list,f) + self.bext = self._get_bext(self.main_list,f) + self.ixml = self._get_ixml(self.main_list,f) + + self.data = delf._describe_data(self.main_list,f) + + def _find_chunk_data(self, ident, from_stream, default_none=False): + chunk_descriptor = None + if default_none: + chunk_descriptor =next((chunk for chunk in self.main_list if chunk.ident == ident),None) + else: + chunk_descriptor = next((chunk for chunk in self.main_list if chunk.ident == ident)) + + if chunk_descriptor: + return chunk_descriptor.read_data(from_stream) + else: + return None + + + def _describe_data(self,f): + data_chunk = next(c for c in self.main_list if c.ident == b'data') + + return WavDataDescriptor(byte_count= data_chunk.length, frame_count= data_chunk.length / self.fmt.block_align) + def _get_format(self,chunks,f): - fmt_chunk = next(chunk for chunk in chunks if chunk.ident == b'fmt ') - fmt_data = fmt_chunk.read_data(f) + fmt_data = se._find_chunk_data(b'fmt ',f) # The format chunk is # audio_format U16 @@ -30,20 +63,28 @@ class WavInfoReader(): # byte_rate U32 == SampleRate * NumChannels * BitsPerSample/8 # block_align U16 == NumChannels * BitsPerSample/8 # bits_per_sampl U16 - unpacked = struct.unpack("