@@ -21,7 +21,7 @@ class CueNameTable(UTFViewer):
2121
2222class 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
5865class 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
283293class ACBBuilder :
284294 """Use this class to build ACB files from an existing ACB object."""
0 commit comments