@@ -16,26 +16,37 @@ static inline u32 SwapU32(u32 v) { return __builtin_bswap32(v); }
1616static inline s16 SwapS16 (s16 v) { return static_cast <s16>(__builtin_bswap16 (static_cast <u16 >(v))); }
1717
1818void CAudioGroupSet::SwapProjectEndian () {
19- // Project data is a linked list of GROUP_DATA structures
20- // Each GROUP_DATA contains offsets to sub-tables within the project
2119 u8 * base = m_proj;
2220 u32 offset = 0 ;
2321
24- while (offset < m_projLen) {
22+ while (offset + sizeof ( u32 ) <= m_projLen) {
2523 GROUP_DATA* g = reinterpret_cast <GROUP_DATA*>(base + offset);
2624
27- // Swap GROUP_DATA fields
2825 g->nextOff = SwapU32 (g->nextOff );
26+ if (g->nextOff == 0xFFFFFFFF ) {
27+ break ;
28+ }
29+
30+ // Swap GROUP_DATA fields
2931 g->id = SwapU16 (g->id );
3032 g->type = SwapU16 (g->type );
3133 g->macroOff = SwapU32 (g->macroOff );
3234 g->sampleOff = SwapU32 (g->sampleOff );
3335 g->curveOff = SwapU32 (g->curveOff );
3436 g->keymapOff = SwapU32 (g->keymapOff );
3537 g->layerOff = SwapU32 (g->layerOff );
36- g->data .song .normpageOff = SwapU32 (g->data .song .normpageOff );
37- g->data .song .drumpageOff = SwapU32 (g->data .song .drumpageOff );
38- g->data .song .midiSetupOff = SwapU32 (g->data .song .midiSetupOff );
38+ switch (g->type ) {
39+ case 0 :
40+ g->data .song .normpageOff = SwapU32 (g->data .song .normpageOff );
41+ g->data .song .drumpageOff = SwapU32 (g->data .song .drumpageOff );
42+ g->data .song .midiSetupOff = SwapU32 (g->data .song .midiSetupOff );
43+ break ;
44+ case 1 :
45+ g->data .fx .tableOff = SwapU32 (g->data .fx .tableOff );
46+ break ;
47+ default :
48+ break ;
49+ }
3950
4051 // Swap the ID reference lists (u16 lists terminated by 0xFFFF)
4152 // macroOff points to a list of u16 macro IDs
@@ -85,8 +96,8 @@ void CAudioGroupSet::SwapProjectEndian() {
8596 }
8697
8798 // Swap FX table if type == 1 (FX group)
88- if (g->type == 1 && g->data .song . normpageOff < m_projLen) {
89- FX_DATA* fxData = reinterpret_cast <FX_DATA*>(base + g->data .song . normpageOff );
99+ if (g->type == 1 && g->data .fx . tableOff < m_projLen) {
100+ FX_DATA* fxData = reinterpret_cast <FX_DATA*>(base + g->data .fx . tableOff );
90101 fxData->num = SwapU16 (fxData->num );
91102 fxData->reserverd = SwapU16 (fxData->reserverd );
92103 u16 numFx = fxData->num ;
@@ -98,8 +109,6 @@ void CAudioGroupSet::SwapProjectEndian() {
98109 }
99110 }
100111
101- if (g->nextOff == 0xFFFFFFFF )
102- break ;
103112 offset = g->nextOff ;
104113 }
105114}
0 commit comments