def __init__(self, header, data, dpds=None, seek=None, needs_swap=False): self.header_raw = header self.data_raw = data self.dpds_raw = dpds self.seek_raw = seek self.needs_swap = needs_swap h_s = BinaryStream(data=self.header_raw, big_endian=needs_swap) waveformatex_size = h_s.calc_size(self._waveformatex) (self.h_format_tag, self.h_channels, self.h_samples_per_sec, self.h_avg_bytes_per_sec, self.h_block_align, self.h_bits_per_sample) = h_s.unpack(self._waveformatex) header_size = waveformatex_size # do we have a WAVEFORMATEX self.h_size = None if len(self.header_raw) >= waveformatex_size + 2: self.h_size = h_s.read_uint16() header_size += 2 if self.h_format_tag == WAVE_FORMAT_XMA2: waveformat_xma2_size = h_s.calc_size(self._waveformat_xma2) if self.h_size != waveformat_xma2_size: raise ReaderError( "Unknown cbSize for XMA2WAVEFORMATEX: {}".format( self.h_size)) (self.hx_num_streams, self.hx_channel_mask, self.hx_samples_encoded, self.hx_bytes_per_block, self.hx_play_begin, self.hx_play_length, self.hx_loop_begin, self.hx_loop_length, self.hx_loop_count, self.hx_encoder_version, self.hx_block_count) = h_s.unpack(self._waveformat_xma2) header_size += waveformat_xma2_size elif self.h_format_tag == WAVE_FORMAT_EXTENSIBLE: waveformat_extensible_size = h_s.calc_size( self._waveformat_extensible) if self.h_size < waveformat_extensible_size: raise ReaderError( "Invalid cbSize for WAVEFORMATEXTENSIBLE: {}".format( self.h_size)) (self.he_valid_bits_per_sample, self.he_channel_mask, he_subformat_bytes) = h_s.unpack(self._waveformat_extensible) self.he_subformat = UUID(bytes_le=he_subformat_bytes) header_size += waveformat_extensible_size self.he_remainder = None if self.h_size > waveformat_extensible_size: self.he_remainder = h_s.read(self.h_size - waveformat_extensible_size) header_size += self.h_size - waveformat_extensible_size raise ReaderError( "Extra bytes in WAVEFORMATEXTENSIBLE: {}".format( len(self.he_remainder))) self.h_remainder = h_s.read() if len(self.h_remainder): header_size += len(self.h_remainder) if header_size != len(self.header_raw): raise ReaderError("Header size mismatch: {} != {}".format( header_size, len(self.header_raw)))
def __init__(self, header, data, dpds=None, seek=None, needs_swap=False): self.header_raw = header self.data_raw = data self.dpds_raw = dpds self.seek_raw = seek self.needs_swap = needs_swap h_s = BinaryStream(data=self.header_raw, big_endian=needs_swap) waveformatex_size = h_s.calc_size(self._waveformatex) (self.h_format_tag, self.h_channels, self.h_samples_per_sec, self.h_avg_bytes_per_sec, self.h_block_align, self.h_bits_per_sample) = h_s.unpack(self._waveformatex) header_size = waveformatex_size # do we have a WAVEFORMATEX self.h_size = None if len(self.header_raw) >= waveformatex_size + 2: self.h_size = h_s.read_uint16() header_size += 2 if self.h_format_tag == WAVE_FORMAT_XMA2: waveformat_xma2_size = h_s.calc_size(self._waveformat_xma2) if self.h_size != waveformat_xma2_size: raise ReaderError("Unknown cbSize for XMA2WAVEFORMATEX: {}".format(self.h_size)) (self.hx_num_streams, self.hx_channel_mask, self.hx_samples_encoded, self.hx_bytes_per_block, self.hx_play_begin, self.hx_play_length, self.hx_loop_begin, self.hx_loop_length, self.hx_loop_count, self.hx_encoder_version, self.hx_block_count) = h_s.unpack(self._waveformat_xma2) header_size += waveformat_xma2_size elif self.h_format_tag == WAVE_FORMAT_EXTENSIBLE: waveformat_extensible_size = h_s.calc_size(self._waveformat_extensible) if self.h_size < waveformat_extensible_size: raise ReaderError("Invalid cbSize for WAVEFORMATEXTENSIBLE: {}".format(self.h_size)) (self.he_valid_bits_per_sample, self.he_channel_mask, he_subformat_bytes) = h_s.unpack(self._waveformat_extensible) self.he_subformat = UUID(bytes_le=he_subformat_bytes) header_size += waveformat_extensible_size self.he_remainder = None if self.h_size > waveformat_extensible_size: self.he_remainder = h_s.read(self.h_size - waveformat_extensible_size) header_size += self.h_size - waveformat_extensible_size raise ReaderError("Extra bytes in WAVEFORMATEXTENSIBLE: {}".format(len(self.he_remainder))) self.h_remainder = h_s.read() if len(self.h_remainder): header_size += len(self.h_remainder) if header_size != len(self.header_raw): raise ReaderError("Header size mismatch: {} != {}".format(header_size, len(self.header_raw)))