Skip to content
This repository was archived by the owner on Feb 6, 2026. It is now read-only.

Commit f085e3b

Browse files
committed
More fixes coming from #3
Possibly breaking. Decoding snippet is available at the posted issue tracker.
1 parent a14bb65 commit f085e3b

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

PyCriCodecsEx/acb.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class CueNameTable(UTFViewer):
2121

2222
class CueTable(UTFViewer):
2323
CueId: int
24-
'''Corresponds to the cue index found in CueNameTable'''
24+
'''Unqiue ID, indexed by WaveformTable'''
2525
Length: int
2626
'''Duration of the cue in milliseconds'''
2727
ReferenceIndex: int
@@ -52,8 +52,15 @@ class WaveformTable(UTFViewer):
5252
NumChannels: int
5353
NumSamples: int
5454
SamplingRate: int
55+
StreamAwbId: int
56+
StreamAwbPortNo: int
5557
Streaming: int
5658

59+
@property
60+
def awb_id(self) -> int:
61+
"""Returns the AWB ID used by this waveform."""
62+
return self.MemoryAwbId if not self.Streaming else self.StreamAwbId
63+
5764

5865
class ACBTable(UTFViewer):
5966
'''ACB Table View'''
@@ -112,7 +119,11 @@ def _waveform_of_sequence(self, index : int):
112119
seq = self.SequenceTable[index]
113120
for i in range(seq.NumTracks):
114121
track_index = int.from_bytes(seq.TrackIndex[i*2:i*2+2], 'big')
115-
yield self.WaveformTable[track_index]
122+
if track_index < len(self.WaveformTable):
123+
yield self.WaveformTable[track_index]
124+
else:
125+
print('FIXME: track index out of range:', track_index)
126+
pass
116127

117128
def _waveform_of_synth(self, index: int):
118129
item_type, item_index = AcbSynthReferenceStruct.unpack(self.SynthTable[index].ReferenceItems)
@@ -132,8 +143,7 @@ def waveform_of(self, index : int) -> List["WaveformTable"]:
132143
"""Retrieves the waveform(s) associated with a cue.
133144
134145
Cues may reference multiple waveforms, which could also be reused."""
135-
cue = next(filter(lambda c: c.CueId == index, self.CueTable), None)
136-
assert cue, "cue of index %d not found" % index
146+
cue = self.CueTable[index]
137147
match cue.ReferenceType:
138148
case 0x01:
139149
return [self.WaveformTable[index]]
@@ -218,11 +228,11 @@ def get_waveforms(self, **kwargs) -> List[HCACodec | ADXCodec | Tuple[AcbEncodeT
218228
wavs = []
219229
for wav in self.view.WaveformTable:
220230
encode = AcbEncodeTypes(wav.EncodeType)
221-
codec = (CODEC_TABLE.get(encode, None))
231+
codec = (CODEC_TABLE.get(encode, None))
222232
if codec:
223-
wavs.append(codec(awb.get_file_at(wav.MemoryAwbId), **kwargs))
233+
wavs.append(codec(awb.get_file_at(wav.awb_id), **kwargs))
224234
else:
225-
wavs.append((encode, wav.NumChannels, wav.NumSamples, wav.SamplingRate, awb.get_file_at(wav.MemoryAwbId)))
235+
wavs.append((encode, wav.NumChannels, wav.NumSamples, wav.SamplingRate, awb.get_file_at(wav.awb_id)))
226236
return wavs
227237

228238
def set_waveforms(self, value: List[HCACodec | ADXCodec | Tuple[AcbEncodeTypes, int, int, int, bytes]]):
@@ -277,8 +287,8 @@ def cues(self) -> Generator[PackedCueItem, None, None]:
277287
To modify cues, use the `view` property instead.
278288
"""
279289
for name, cue in zip(self.view.CueNameTable, self.view.CueTable):
280-
waveforms = self.view.waveform_of(cue.CueId)
281-
yield PackedCueItem(cue.CueId, name.CueName, cue.Length / 1000.0, [waveform.MemoryAwbId for waveform in waveforms])
290+
waveforms = self.view.waveform_of(name.CueIndex)
291+
yield PackedCueItem(name.CueIndex, name.CueName, cue.Length / 1000.0, [waveform.awb_id for waveform in waveforms])
282292

283293
class ACBBuilder:
284294
"""Use this class to build ACB files from an existing ACB object."""

0 commit comments

Comments
 (0)