Exemplo n.º 1
0
    def __init__(self, data=None, filename=None, audio_engine=None):
        self.audio_engine = audio_engine

        # open in little endian initially
        stream = BinaryStream(data=data, filename=filename)
        del data

        # check sig to find actual endianess
        h_sig = stream.peek(len(SB_L_SIGNATURE))
        if h_sig == SB_L_SIGNATURE:
            big_endian = False
        elif h_sig == SB_B_SIGNATURE:
            big_endian = True
        else:
            raise ValueError("bad sig: {!r}".format(h_sig))

        # switch stream to correct endianess
        stream.set_endian(big_endian)
        (h_sig, self.version, self.header_version, self.crc, buildtime_raw_low,
         buildtime_raw_high, self.platform, h_simple_cue_count,
         h_complex_cue_count, h_unknown_count, h_cue_name_hash_count,
         h_wave_bank_count, h_sound_count, h_cue_names_length,
         simple_cue_offset_raw, complex_cue_offset_raw, cue_name_offset_raw,
         unknown_offset_raw, variation_offset_raw, transition_offset_raw,
         wave_bank_offset_raw, cue_name_hash_offset_raw,
         cue_name_table_offset_raw, sound_offset_raw,
         h_name_raw) = stream.unpack(_SB_HEADER)
        h_simple_cue_offset = fix_offset(simple_cue_offset_raw)
        h_complex_cue_offset = fix_offset(complex_cue_offset_raw)
        h_cue_name_offset = fix_offset(cue_name_offset_raw)
        h_unknown_offset = fix_offset(unknown_offset_raw)
        h_variation_offset = fix_offset(variation_offset_raw)
        h_transition_offset = fix_offset(transition_offset_raw)
        h_wave_bank_offset = fix_offset(wave_bank_offset_raw)
        h_cue_name_hash_offset = fix_offset(cue_name_hash_offset_raw)
        h_cue_name_table_offset = fix_offset(cue_name_table_offset_raw)
        h_sound_offset = fix_offset(sound_offset_raw)
        self.name = h_name_raw.rstrip(b'\x00').decode('iso8859-1')
        del h_name_raw
        self.buildtime = filetime_to_datetime(buildtime_raw_low,
                                              buildtime_raw_high)

        self.wave_banks = []
        if h_wave_bank_count and h_wave_bank_offset:
            stream.seek(h_wave_bank_offset)
            self.wave_banks = [
                stream.read(64).rstrip(b'\x00').decode('iso8859-1')
                for _ in range(h_wave_bank_count)
            ]
        else:
            raise ReaderError("No wave banks found in sound bank")

        cue_name_hash = []
        if h_cue_name_hash_count and h_cue_name_hash_offset:
            stream.seek(h_cue_name_hash_offset)
            cue_name_hash = [
                stream.read_int16() for _ in range(h_cue_name_hash_count)
            ]
        cue_name_hash_entry = []
        if h_cue_names_length and h_cue_name_table_offset:
            stream.seek(h_cue_name_table_offset)
            cue_name_hash_entry = [
                (stream.read_int32(), stream.read_int16())
                for _ in range(h_simple_cue_count + h_complex_cue_count)
            ]
        cue_names = []
        for (name_offset, _) in cue_name_hash_entry:
            stream.seek(name_offset)
            cue_names.append(stream.read_cstring())

        self.cues = []
        self.cues_name = OrderedDict()
        if h_simple_cue_count and h_simple_cue_offset:
            stream.seek(h_simple_cue_offset)
            for i in range(h_simple_cue_count):
                cue_name = None
                if cue_names:
                    cue_name = cue_names[i]
                cue = Cue(cue_name, stream)
                self.cues.append(cue)
                if cue_name:
                    self.cues_name[cue_name] = cue
        if h_complex_cue_count and h_complex_cue_offset:
            stream.seek(h_complex_cue_offset)
            for i in range(h_complex_cue_count):
                cue_name = None
                if cue_names:
                    cue_name = cue_names[h_simple_cue_count + i]
                cue = Cue(cue_name, stream, is_complex=True)
                self.cues.append(cue)
                if cue_name:
                    self.cues_name[cue_name] = cue
Exemplo n.º 2
0
    def __init__(self, data=None, filename=None, audio_engine=None):
        self.audio_engine = audio_engine

        # open in little endian initially
        stream = BinaryStream(data=data, filename=filename)
        del data

        # check sig to find actual endianess
        h_sig = stream.peek(len(SB_L_SIGNATURE))
        if h_sig == SB_L_SIGNATURE:
            big_endian = False
        elif h_sig == SB_B_SIGNATURE:
            big_endian = True
        else:
            raise ValueError("bad sig: {!r}".format(h_sig))

        # switch stream to correct endianess
        stream.set_endian(big_endian)
        (h_sig, self.version, self.header_version, self.crc, buildtime_raw_low, buildtime_raw_high,
         self.platform, h_simple_cue_count, h_complex_cue_count, h_unknown_count, h_cue_name_hash_count,
         h_wave_bank_count, h_sound_count, h_cue_names_length, simple_cue_offset_raw, complex_cue_offset_raw,
         cue_name_offset_raw, unknown_offset_raw, variation_offset_raw, transition_offset_raw, wave_bank_offset_raw,
         cue_name_hash_offset_raw, cue_name_table_offset_raw, sound_offset_raw, h_name_raw) = stream.unpack(_SB_HEADER)
        h_simple_cue_offset = fix_offset(simple_cue_offset_raw)
        h_complex_cue_offset = fix_offset(complex_cue_offset_raw)
        h_cue_name_offset = fix_offset(cue_name_offset_raw)
        h_unknown_offset = fix_offset(unknown_offset_raw)
        h_variation_offset = fix_offset(variation_offset_raw)
        h_transition_offset = fix_offset(transition_offset_raw)
        h_wave_bank_offset = fix_offset(wave_bank_offset_raw)
        h_cue_name_hash_offset = fix_offset(cue_name_hash_offset_raw)
        h_cue_name_table_offset = fix_offset(cue_name_table_offset_raw)
        h_sound_offset = fix_offset(sound_offset_raw)
        self.name = h_name_raw.rstrip(b'\x00').decode('iso8859-1')
        del h_name_raw
        self.buildtime = filetime_to_datetime(buildtime_raw_low, buildtime_raw_high)

        self.wave_banks = []
        if h_wave_bank_count and h_wave_bank_offset:
            stream.seek(h_wave_bank_offset)
            self.wave_banks = [stream.read(64).rstrip(b'\x00').decode('iso8859-1') for _ in range(h_wave_bank_count)]
        else:
            raise ReaderError("No wave banks found in sound bank")

        cue_name_hash = []
        if h_cue_name_hash_count and h_cue_name_hash_offset:
            stream.seek(h_cue_name_hash_offset)
            cue_name_hash = [stream.read_int16() for _ in range(h_cue_name_hash_count)]
        cue_name_hash_entry = []
        if h_cue_names_length and h_cue_name_table_offset:
            stream.seek(h_cue_name_table_offset)
            cue_name_hash_entry = [(stream.read_int32(), stream.read_int16())
                                   for _ in range(h_simple_cue_count + h_complex_cue_count)]
        cue_names = []
        for (name_offset, _) in cue_name_hash_entry:
            stream.seek(name_offset)
            cue_names.append(stream.read_cstring())

        self.cues = []
        self.cues_name = OrderedDict()
        if h_simple_cue_count and h_simple_cue_offset:
            stream.seek(h_simple_cue_offset)
            for i in range(h_simple_cue_count):
                cue_name = None
                if cue_names:
                    cue_name = cue_names[i]
                cue = Cue(cue_name, stream)
                self.cues.append(cue)
                if cue_name:
                    self.cues_name[cue_name] = cue
        if h_complex_cue_count and h_complex_cue_offset:
            stream.seek(h_complex_cue_offset)
            for i in range(h_complex_cue_count):
                cue_name = None
                if cue_names:
                    cue_name = cue_names[h_simple_cue_count + i]
                cue = Cue(cue_name, stream, is_complex=True)
                self.cues.append(cue)
                if cue_name:
                    self.cues_name[cue_name] = cue