11#include "libsnd2_internal.h"
15static int VsGetAddr(
unsigned int size_in_bytes,
int mode, s16 vab_id);
17s16 SsVabOpenHeadSticky(u8 *addr, s16 vab_id,
unsigned int sbaddr)
19 return _SsVabOpenHeadWithMode(addr, vab_id, VsGetAddr, sbaddr);
22s16 SsVabFakeHead(u8 *addr, s16 vab_id,
unsigned int sbaddr)
24 return _SsVabOpenHeadWithMode(addr, vab_id, VsGetAddr, sbaddr);
27static int VsGetAddr(
unsigned int size_in_bytes,
int mode, s16 vab_id)
35int _SsVabOpenHeadWithMode(u8 *addr,
int vab_id, libsnd2_vab_allocate_callback alloc_fn,
int mode)
39 unsigned int form_chk;
53 if ( _spu_getInTransfer() == 1 )
55 _spu_setInTransfer(1);
56 if ( (s16)vab_id < 16 )
58 if ( (s16)vab_id == -1 )
62 for ( v11 = 0; v11 < 16; v11 += 1 )
64 if ( _svm_vab_used[v11] == 0 )
66 _svm_vab_used[v11] = 1;
75 if ( _svm_vab_used[(s16)vab_id] == 0 )
77 _svm_vab_used[(s16)vab_id] = 1;
83 if ( vab_id_tmp >= 16 )
85 _spu_setInTransfer(0);
89 _svm_vab_vh[vab_id_tmp] = (
VabHdr *)addr;
90 vab_hdr_ptr = (
VabHdr *)addr;
91 form_chk = *(u32 *)addr;
92 _svm_vab_not_send_size = 0;
93 prog_atr_ptr = (
ProgAtr *)(addr + 32);
99 unsigned int rounded_size;
100 unsigned int spu_alloc_mem;
101 int total_vag_size_1;
103 if ( form_chk >> 8 != 0x564142 )
107 if ( (u8)form_chk == 112 )
109 if ( *((
int *)addr + 1) >= 5 )
112 kMaxPrograms = maxPrograms;
113 if ( maxPrograms < (
int)*((u16 *)addr + 9) )
117 _svm_vab_pg[vab_id_tmp] = prog_atr_ptr;
118 vag_attr_ptr1 = (
VagAtr *)&prog_atr_ptr[maxPrograms];
120 for ( v21 = 0; v21 < maxPrograms; v21 += 1 )
122 v24 = &prog_atr_ptr[v21];
123 v24->m_fake_prog_idx = fake_prog_idx;
128 _svm_vab_tn[vab_id_tmp] = vag_attr_ptr1;
129 vag_attr_ptr2 = &vag_attr_ptr1[16 * vab_hdr_ptr->ps];
130 for ( v27 = 0; v27 < 256; v27 += 1 )
132 if ( vab_hdr_ptr->vs >= v27 )
134 v31 = *(u16 *)&vag_attr_ptr2->prior;
136 if ( vab_hdr_ptr->ver >= 5 )
139 total_vags_size += vag_lens[v27];
141 vag_attr_ptr2 = (
VagAtr *)((
char *)vag_attr_ptr2 + 2);
143 rounded_size = (total_vags_size + 63) & ~63;
144 spu_alloc_mem = alloc_fn(rounded_size, mode, (s16)vab_id_tmp);
145 if ( spu_alloc_mem == 0xFFFFFFFF )
149 gVabOffet[(s16)vab_id_tmp] = spu_alloc_mem > 0xFFFFF;
150 if ( spu_alloc_mem + rounded_size > 0x1FAFF0 )
154 _svm_vab_start[(s16)vab_id_tmp] = spu_alloc_mem;
155 total_vag_size_1 = 0;
156 for ( vag_idx = 0; vag_idx <= vab_hdr_ptr->vs; vag_idx += 1 )
158 total_vag_size_1 += vag_lens[vag_idx];
159 if ( (vag_idx & 1) != 0 )
160 prog_atr_ptr[vag_idx / 2].m_vag_spu_addr_lo = (spu_alloc_mem + total_vag_size_1) >> 4;
162 prog_atr_ptr[vag_idx / 2].m_vag_spu_addr_hi = (spu_alloc_mem + total_vag_size_1) >> 4;
164 _svm_vab_total[(s16)vab_id_tmp] = total_vag_size_1;
165 _svm_vab_used[(s16)vab_id_tmp] = 2;
166 return (s16)vab_id_tmp;
168 _svm_vab_used[vab_id_tmp] = 0;
169 _spu_setInTransfer(0);