PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
vs_vh.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include "libsnd2_internal.h"
12
13s16 gVabOffet[16];
14
15static int VsGetAddr(unsigned int size_in_bytes, int mode, s16 vab_id);
16
17s16 SsVabOpenHeadSticky(u8 *addr, s16 vab_id, unsigned int sbaddr)
18{
19 return _SsVabOpenHeadWithMode(addr, vab_id, VsGetAddr, sbaddr);
20}
21
22s16 SsVabFakeHead(u8 *addr, s16 vab_id, unsigned int sbaddr)
23{
24 return _SsVabOpenHeadWithMode(addr, vab_id, VsGetAddr, sbaddr);
25}
26
27static int VsGetAddr(unsigned int size_in_bytes, int mode, s16 vab_id)
28{
29 (void)size_in_bytes;
30 (void)vab_id;
31
32 return mode;
33}
34
35int _SsVabOpenHeadWithMode(u8 *addr, int vab_id, libsnd2_vab_allocate_callback alloc_fn, int mode)
36{
37 int vab_id_tmp;
38 const VabHdr *vab_hdr_ptr;
39 unsigned int form_chk;
40 ProgAtr *prog_atr_ptr;
41 s16 maxPrograms;
42 VagAtr *vag_attr_ptr1;
43 int v21;
44 ProgAtr *v24;
45 int v27;
46 VagAtr *vag_attr_ptr2;
47 int v31;
48 int v32;
49 int vag_idx;
50 int vag_lens[256];
51
52 vab_id_tmp = 16;
53 if ( _spu_getInTransfer() == 1 )
54 return -1;
55 _spu_setInTransfer(1);
56 if ( (s16)vab_id < 16 )
57 {
58 if ( (s16)vab_id == -1 )
59 {
60 int v11;
61
62 for ( v11 = 0; v11 < 16; v11 += 1 )
63 {
64 if ( _svm_vab_used[v11] == 0 )
65 {
66 _svm_vab_used[v11] = 1;
67 vab_id_tmp = v11;
68 _svm_vab_count += 1;
69 break;
70 }
71 }
72 }
73 else
74 {
75 if ( _svm_vab_used[(s16)vab_id] == 0 )
76 {
77 _svm_vab_used[(s16)vab_id] = 1;
78 vab_id_tmp = vab_id;
79 _svm_vab_count += 1;
80 }
81 }
82 }
83 if ( vab_id_tmp >= 16 )
84 {
85 _spu_setInTransfer(0);
86 return -1;
87 }
88 _svm_vab_count += 1;
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);
94 maxPrograms = 64;
95 for ( ;; )
96 {
97 int fake_prog_idx;
98 int total_vags_size;
99 unsigned int rounded_size;
100 unsigned int spu_alloc_mem;
101 int total_vag_size_1;
102
103 if ( form_chk >> 8 != 0x564142 )
104 {
105 break;
106 }
107 if ( (u8)form_chk == 112 )
108 {
109 if ( *((int *)addr + 1) >= 5 )
110 maxPrograms = 128;
111 }
112 kMaxPrograms = maxPrograms;
113 if ( maxPrograms < (int)*((u16 *)addr + 9) )
114 {
115 break;
116 }
117 _svm_vab_pg[vab_id_tmp] = prog_atr_ptr;
118 vag_attr_ptr1 = (VagAtr *)&prog_atr_ptr[maxPrograms];
119 fake_prog_idx = 0;
120 for ( v21 = 0; v21 < maxPrograms; v21 += 1 )
121 {
122 v24 = &prog_atr_ptr[v21];
123 v24->m_fake_prog_idx = fake_prog_idx;
124 if ( v24->tones )
125 fake_prog_idx += 1;
126 }
127 total_vags_size = 0;
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 )
131 {
132 if ( vab_hdr_ptr->vs >= v27 )
133 {
134 v31 = *(u16 *)&vag_attr_ptr2->prior;
135 v32 = 4 * v31;
136 if ( vab_hdr_ptr->ver >= 5 )
137 v32 = 8 * v31;
138 vag_lens[v27] = v32;
139 total_vags_size += vag_lens[v27];
140 }
141 vag_attr_ptr2 = (VagAtr *)((char *)vag_attr_ptr2 + 2);
142 }
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 )
146 {
147 return -1;
148 }
149 gVabOffet[(s16)vab_id_tmp] = spu_alloc_mem > 0xFFFFF;
150 if ( spu_alloc_mem + rounded_size > 0x1FAFF0 )
151 {
152 break;
153 }
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 )
157 {
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;
161 else
162 prog_atr_ptr[vag_idx / 2].m_vag_spu_addr_hi = (spu_alloc_mem + total_vag_size_1) >> 4;
163 }
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;
167 }
168 _svm_vab_used[vab_id_tmp] = 0;
169 _spu_setInTransfer(0);
170 _svm_vab_count -= 1;
171 return -1;
172}