Rev 695 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 695 | Rev 802 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2006-2008. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2006-2008. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | 7 | ||
8 | ; Serge 2006-2008 |
8 | ; Serge 2006-2008 |
9 | ; email: infinity_sound@mail.ru |
9 | ; email: infinity_sound@mail.ru |
10 | 10 | ||
11 | format MS COFF |
11 | format MS COFF |
- | 12 | ||
- | 13 | DEBUG equ 1 |
|
- | 14 | ||
- | 15 | ||
- | 16 | include 'proc32.inc' |
|
- | 17 | include 'main.inc' |
|
- | 18 | include 'imports.inc' |
|
12 | 19 | ||
13 | 20 | ||
14 | CURRENT_API equ 0x0101 ;1.01 |
21 | CURRENT_API equ 0x0101 ;1.01 |
15 | COMPATIBLE_API equ 0x0100 ;1.00 |
22 | COMPATIBLE_API equ 0x0100 ;1.00 |
16 | 23 | ||
17 | API_VERSION equ (COMPATIBLE_API shl 16) or CURRENT_API |
24 | API_VERSION equ (COMPATIBLE_API shl 16) or CURRENT_API |
18 | SOUND_VERSION equ CURRENT_API |
25 | SOUND_VERSION equ CURRENT_API |
19 | 26 | ||
20 | - | ||
21 | include 'proc32.inc' |
- | |
22 | - | ||
23 | ;include 'system.inc' |
- | |
24 | include 'main.inc' |
- | |
25 | - | ||
26 | include 'imports.inc' |
- | |
27 | 27 | ||
28 | FORCE_MMX equ 0 ;set to 1 to force use mmx or |
28 | FORCE_MMX equ 0 ;set to 1 to force use mmx or |
29 | FORCE_MMX_128 equ 0 ;integer sse2 extensions |
29 | FORCE_MMX_128 equ 0 ;integer sse2 extensions |
30 | ;and reduce driver size |
30 | ;and reduce driver size |
31 | 31 | ||
32 | ;USE_SSE equ 0 |
32 | ;USE_SSE equ 0 |
33 | 33 | ||
34 | USE_SSE2_MIXER equ 0 ;floating point mixer. Disabled by default |
34 | USE_SSE2_MIXER equ 0 ;floating point mixer. Disabled by default |
35 | - | ||
36 | DEBUG equ 1 |
- | |
37 | - | ||
38 | 35 | ||
39 | OS_BASE equ 0x80000000 |
36 | OS_BASE equ 0x80000000 |
40 | 37 | ||
41 | CAPS_SSE2 equ 26 |
38 | CAPS_SSE2 equ 26 |
42 | PG_SW equ 0x003 |
39 | PG_SW equ 0x003 |
43 | 40 | ||
44 | public START |
41 | public START |
45 | public service_proc |
42 | public service_proc |
46 | public version |
43 | public version |
47 | 44 | ||
48 | RT_INP_EMPTY equ 0xFF000001 |
45 | RT_INP_EMPTY equ 0xFF000001 |
49 | RT_OUT_EMPTY equ 0xFF000002 |
46 | RT_OUT_EMPTY equ 0xFF000002 |
50 | RT_INP_FULL equ 0xFF000003 |
47 | RT_INP_FULL equ 0xFF000003 |
51 | RT_OUT_FULL equ 0xFF000004 |
48 | RT_OUT_FULL equ 0xFF000004 |
52 | 49 | ||
53 | EVENT_WATCHED equ 0x10000000 |
50 | EVENT_WATCHED equ 0x10000000 |
54 | EVENT_SIGNALED equ 0x20000000 |
51 | EVENT_SIGNALED equ 0x20000000 |
55 | MANUAL_RESET equ 0x40000000 |
52 | MANUAL_RESET equ 0x40000000 |
56 | MANUAL_DESTROY equ 0x80000000 |
53 | MANUAL_DESTROY equ 0x80000000 |
57 | 54 | ||
58 | DEV_PLAY equ 1 |
55 | DEV_PLAY equ 1 |
59 | DEV_STOP equ 2 |
56 | DEV_STOP equ 2 |
60 | DEV_CALLBACK equ 3 |
57 | DEV_CALLBACK equ 3 |
61 | 58 | ||
62 | struc IOCTL |
59 | struc IOCTL |
63 | { .handle dd ? |
60 | { .handle dd ? |
64 | .io_code dd ? |
61 | .io_code dd ? |
65 | .input dd ? |
62 | .input dd ? |
66 | .inp_size dd ? |
63 | .inp_size dd ? |
67 | .output dd ? |
64 | .output dd ? |
68 | .out_size dd ? |
65 | .out_size dd ? |
69 | } |
66 | } |
70 | 67 | ||
71 | virtual at 0 |
68 | virtual at 0 |
72 | IOCTL IOCTL |
69 | IOCTL IOCTL |
73 | end virtual |
70 | end virtual |
74 | 71 | ||
75 | section '.flat' code readable align 16 |
72 | section '.flat' code readable align 16 |
76 | 73 | ||
77 | proc START stdcall, state:dword |
74 | proc START stdcall, state:dword |
78 | 75 | ||
79 | cmp [state], 1 |
76 | cmp [state], 1 |
80 | jne .exit |
77 | jne .exit |
81 | 78 | ||
82 | stdcall GetService, szSound |
79 | stdcall GetService, szSound |
83 | test eax, eax |
80 | test eax, eax |
84 | jz .fail |
81 | jz .fail |
85 | mov [hSound], eax |
82 | mov [hSound], eax |
86 | 83 | ||
87 | stdcall KernelAlloc, 16*512 |
84 | stdcall KernelAlloc, 16*512 |
88 | test eax, eax |
85 | test eax, eax |
89 | jz .out_of_mem |
86 | jz .out_of_mem |
90 | mov [mix_buff], eax |
87 | mov [mix_buff], eax |
91 | 88 | ||
92 | mov eax, str.fd-FD_OFFSET |
89 | mov eax, str.fd-FD_OFFSET |
93 | mov [str.fd], eax |
90 | mov [str.fd], eax |
94 | mov [str.bk], eax |
91 | mov [str.bk], eax |
95 | 92 | ||
96 | if FORCE_MMX |
93 | if FORCE_MMX |
97 | if FORCE_MMX_128 |
94 | if FORCE_MMX_128 |
98 | display 'Use only FORCE_MMX or FORCE_MMX_128 not both together',13,10 |
95 | display 'Use only FORCE_MMX or FORCE_MMX_128 not both together',13,10 |
99 | stop |
96 | stop |
100 | end if |
97 | end if |
101 | mov [mix_2_core], mmx_mix_2 |
98 | mov [mix_2_core], mmx_mix_2 |
102 | mov [mix_3_core], mmx_mix_3 |
99 | mov [mix_3_core], mmx_mix_3 |
103 | mov [mix_4_core], mmx_mix_4 |
100 | mov [mix_4_core], mmx_mix_4 |
104 | end if |
101 | end if |
105 | 102 | ||
106 | if FORCE_MMX_128 |
103 | if FORCE_MMX_128 |
107 | if FORCE_MMX |
104 | if FORCE_MMX |
108 | display 'Use only FORCE_MMX or FORCE_MMX_128 not both together',13,10 |
105 | display 'Use only FORCE_MMX or FORCE_MMX_128 not both together',13,10 |
109 | stop |
106 | stop |
110 | end if |
107 | end if |
111 | mov [mix_2_core], mmx128_mix_2 |
108 | mov [mix_2_core], mmx128_mix_2 |
112 | mov [mix_3_core], mmx128_mix_3 |
109 | mov [mix_3_core], mmx128_mix_3 |
113 | mov [mix_4_core], mmx128_mix_4 |
110 | mov [mix_4_core], mmx128_mix_4 |
114 | end if |
111 | end if |
115 | 112 | ||
116 | if 0 |
113 | if 0 |
117 | 114 | ||
118 | if ~(FORCE_MMX or FORCE_MMX_128) ;autodetect |
115 | if ~(FORCE_MMX or FORCE_MMX_128) ;autodetect |
119 | mov eax, 1 |
116 | mov eax, 1 |
120 | cpuid |
117 | cpuid |
121 | bt edx, CAPS_SSE2 |
118 | bt edx, CAPS_SSE2 |
122 | jc .mmx128 |
119 | jc .mmx128 |
123 | ;old 64-bit mmx |
120 | ;old 64-bit mmx |
124 | mov [mix_2_core], mmx_mix_2 |
121 | mov [mix_2_core], mmx_mix_2 |
125 | mov [mix_3_core], mmx_mix_3 |
122 | mov [mix_3_core], mmx_mix_3 |
126 | mov [mix_4_core], mmx_mix_4 |
123 | mov [mix_4_core], mmx_mix_4 |
127 | jmp @F |
124 | jmp @F |
128 | .mmx128: ;128-bit integer sse2 extensions |
125 | .mmx128: ;128-bit integer sse2 extensions |
129 | mov [mix_2_core], mmx128_mix_2 |
126 | mov [mix_2_core], mmx128_mix_2 |
130 | mov [mix_3_core], mmx128_mix_3 |
127 | mov [mix_3_core], mmx128_mix_3 |
131 | mov [mix_4_core], mmx128_mix_4 |
128 | mov [mix_4_core], mmx128_mix_4 |
132 | @@: |
129 | @@: |
133 | end if |
130 | end if |
134 | 131 | ||
135 | end if |
132 | end if |
136 | stdcall set_handler, [hSound], new_mix |
133 | stdcall set_handler, [hSound], new_mix |
137 | mov [eng_state], SND_STOP |
134 | mov [eng_state], SND_STOP |
138 | stdcall RegService, szInfinity, service_proc |
135 | stdcall RegService, szInfinity, service_proc |
139 | ret |
136 | ret |
140 | .fail: |
137 | .fail: |
141 | if DEBUG |
138 | if DEBUG |
142 | mov esi, msgFail |
139 | mov esi, msgFail |
143 | call SysMsgBoardStr |
140 | call SysMsgBoardStr |
144 | end if |
141 | end if |
145 | .exit: |
142 | .exit: |
146 | xor eax, eax |
143 | xor eax, eax |
147 | ret |
144 | ret |
148 | 145 | ||
149 | .out_of_mem: |
146 | .out_of_mem: |
150 | if DEBUG |
147 | if DEBUG |
151 | mov esi, msgMem |
148 | mov esi, msgMem |
152 | call SysMsgBoardStr |
149 | call SysMsgBoardStr |
153 | end if |
150 | end if |
154 | xor eax, eax |
151 | xor eax, eax |
155 | ret |
152 | ret |
156 | endp |
153 | endp |
157 | 154 | ||
158 | handle equ IOCTL.handle |
155 | handle equ IOCTL.handle |
159 | io_code equ IOCTL.io_code |
156 | io_code equ IOCTL.io_code |
160 | input equ IOCTL.input |
157 | input equ IOCTL.input |
161 | inp_size equ IOCTL.inp_size |
158 | inp_size equ IOCTL.inp_size |
162 | output equ IOCTL.output |
159 | output equ IOCTL.output |
163 | out_size equ IOCTL.out_size |
160 | out_size equ IOCTL.out_size |
164 | 161 | ||
165 | align 4 |
162 | align 4 |
166 | proc service_proc stdcall, ioctl:dword |
163 | proc service_proc stdcall, ioctl:dword |
167 | 164 | ||
168 | mov edi, [ioctl] |
165 | mov edi, [ioctl] |
169 | mov eax, [edi+io_code] |
166 | mov eax, [edi+io_code] |
170 | 167 | ||
171 | cmp eax, SRV_GETVERSION |
168 | cmp eax, SRV_GETVERSION |
172 | jne @F |
169 | jne @F |
173 | mov eax, [edi+output] |
170 | mov eax, [edi+output] |
174 | cmp [edi+out_size], 4 |
171 | cmp [edi+out_size], 4 |
175 | jne .fail |
172 | jne .fail |
176 | mov eax, [eax] |
173 | mov eax, [eax] |
177 | mov [eax], dword API_VERSION |
174 | mov [eax], dword API_VERSION |
178 | xor eax, eax |
175 | xor eax, eax |
179 | ret |
176 | ret |
180 | @@: |
177 | @@: |
181 | cmp eax, SND_CREATE_BUFF |
178 | cmp eax, SND_CREATE_BUFF |
182 | jne @F |
179 | jne @F |
183 | mov ebx, [edi+input] |
180 | mov ebx, [edi+input] |
184 | stdcall CreateBuffer,[ebx],[ebx+4] |
181 | stdcall CreateBuffer,[ebx],[ebx+4] |
185 | mov edi, [ioctl] |
182 | mov edi, [ioctl] |
186 | mov ecx, [edi+output] |
183 | mov ecx, [edi+output] |
187 | mov ecx, [ecx] |
184 | mov ecx, [ecx] |
188 | mov [ecx], ebx |
185 | mov [ecx], ebx |
189 | ret |
186 | ret |
190 | @@: |
187 | @@: |
191 | mov ebx, [edi+input] |
188 | mov ebx, [edi+input] |
192 | mov edx, [ebx] |
189 | mov edx, [ebx] |
193 | 190 | ||
194 | cmp [edx+STREAM.magic], 'WAVE' |
191 | cmp [edx+STREAM.magic], 'WAVE' |
195 | jne .fail |
192 | jne .fail |
196 | 193 | ||
197 | cmp [edx+STREAM.size], STREAM_SIZE |
194 | cmp [edx+STREAM.size], STREAM_SIZE |
198 | jne .fail |
195 | jne .fail |
199 | 196 | ||
200 | cmp eax, SND_DESTROY_BUFF |
197 | cmp eax, SND_DESTROY_BUFF |
201 | jne @F |
198 | jne @F |
202 | mov eax, edx |
199 | mov eax, edx |
203 | call DestroyBuffer ;edx= stream |
200 | call DestroyBuffer ;edx= stream |
204 | ret |
201 | ret |
205 | @@: |
202 | @@: |
206 | cmp eax, SND_SETFORMAT |
203 | cmp eax, SND_SETFORMAT |
207 | jne @F |
204 | jne @F |
208 | stdcall SetFormat,edx,[ebx+4] |
205 | stdcall SetFormat,edx,[ebx+4] |
209 | ret |
206 | ret |
210 | @@: |
207 | @@: |
211 | cmp eax, SND_GETFORMAT |
208 | cmp eax, SND_GETFORMAT |
212 | jne @F |
209 | jne @F |
213 | 210 | ||
214 | movzx eax, word [edx+STREAM.format] |
211 | movzx eax, word [edx+STREAM.format] |
215 | mov ecx, [edi+output] |
212 | mov ecx, [edi+output] |
216 | mov ecx, [ecx] |
213 | mov ecx, [ecx] |
217 | mov [ecx], eax |
214 | mov [ecx], eax |
218 | xor eax, eax |
215 | xor eax, eax |
219 | ret |
216 | ret |
220 | @@: |
217 | @@: |
221 | cmp eax, SND_RESET |
218 | cmp eax, SND_RESET |
222 | jne @F |
219 | jne @F |
223 | stdcall ResetBuffer,edx,[ebx+4] |
220 | stdcall ResetBuffer,edx,[ebx+4] |
224 | ret |
221 | ret |
225 | @@: |
222 | @@: |
226 | cmp eax, SND_SETPOS |
223 | cmp eax, SND_SETPOS |
227 | jne @F |
224 | jne @F |
228 | stdcall SetBufferPos,edx,[ebx+4] |
225 | stdcall SetBufferPos,edx,[ebx+4] |
229 | ret |
226 | ret |
230 | @@: |
227 | @@: |
231 | cmp eax, SND_GETPOS |
228 | cmp eax, SND_GETPOS |
232 | jne @F |
229 | jne @F |
233 | stdcall GetBufferPos, edx |
230 | stdcall GetBufferPos, edx |
234 | mov edi, [ioctl] |
231 | mov edi, [ioctl] |
235 | mov ecx, [edi+output] |
232 | mov ecx, [edi+output] |
236 | mov ecx, [ecx] |
233 | mov ecx, [ecx] |
237 | mov [ecx], ebx |
234 | mov [ecx], ebx |
238 | ret |
235 | ret |
239 | @@: |
236 | @@: |
240 | cmp eax, SND_SETBUFF |
237 | cmp eax, SND_SETBUFF |
241 | jne @F |
238 | jne @F |
242 | mov eax, [ebx+4] |
239 | mov eax, [ebx+4] |
243 | stdcall set_buffer, edx,eax,[ebx+8],[ebx+12] |
240 | stdcall set_buffer, edx,eax,[ebx+8],[ebx+12] |
244 | ret |
241 | ret |
245 | @@: |
242 | @@: |
246 | cmp eax, SND_SETVOLUME |
243 | cmp eax, SND_SETVOLUME |
247 | jne @F |
244 | jne @F |
248 | stdcall SetBufferVol,edx,[ebx+4],[ebx+8] |
245 | stdcall SetBufferVol,edx,[ebx+4],[ebx+8] |
249 | ret |
246 | ret |
250 | @@: |
247 | @@: |
251 | cmp eax, SND_GETVOLUME |
248 | cmp eax, SND_GETVOLUME |
252 | jne @F |
249 | jne @F |
253 | 250 | ||
254 | mov eax, [edi+output] |
251 | mov eax, [edi+output] |
255 | mov ecx, [eax] |
252 | mov ecx, [eax] |
256 | mov eax, [eax+4] |
253 | mov eax, [eax+4] |
257 | stdcall GetBufferVol,edx,ecx,eax |
254 | stdcall GetBufferVol,edx,ecx,eax |
258 | ret |
255 | ret |
259 | @@: |
256 | @@: |
260 | cmp eax, SND_SETPAN |
257 | cmp eax, SND_SETPAN |
261 | jne @F |
258 | jne @F |
262 | stdcall SetBufferPan,edx,[ebx+4] |
259 | stdcall SetBufferPan,edx,[ebx+4] |
263 | ret |
260 | ret |
264 | @@: |
261 | @@: |
265 | cmp eax, SND_GETPAN |
262 | cmp eax, SND_GETPAN |
266 | jne @F |
263 | jne @F |
267 | mov eax, [edx+STREAM.pan] |
264 | mov eax, [edx+STREAM.pan] |
268 | mov ebx, [edi+output] |
265 | mov ebx, [edi+output] |
269 | mov ebx, [ebx] |
266 | mov ebx, [ebx] |
270 | mov [ebx], eax |
267 | mov [ebx], eax |
271 | xor eax, eax |
268 | xor eax, eax |
272 | ret |
269 | ret |
273 | @@: |
270 | @@: |
274 | cmp eax, SND_OUT |
271 | cmp eax, SND_OUT |
275 | jne @F |
272 | jne @F |
276 | 273 | ||
277 | mov eax, [ebx+4] |
274 | mov eax, [ebx+4] |
278 | stdcall wave_out, edx,eax,[ebx+8] |
275 | stdcall wave_out, edx,eax,[ebx+8] |
279 | ret |
276 | ret |
280 | @@: |
277 | @@: |
281 | cmp eax, SND_PLAY |
278 | cmp eax, SND_PLAY |
282 | jne @F |
279 | jne @F |
283 | 280 | ||
284 | stdcall play_buffer, edx,[ebx+4] |
281 | stdcall play_buffer, edx,[ebx+4] |
285 | ret |
282 | ret |
286 | @@: |
283 | @@: |
287 | cmp eax, SND_STOP |
284 | cmp eax, SND_STOP |
288 | jne @F |
285 | jne @F |
289 | 286 | ||
290 | stdcall stop_buffer, edx |
287 | stdcall stop_buffer, edx |
291 | ret |
288 | ret |
292 | @@: |
289 | @@: |
293 | cmp eax, SND_GETBUFFSIZE |
290 | cmp eax, SND_GETBUFFSIZE |
294 | jne @F |
291 | jne @F |
295 | mov eax, [edx+STREAM.in_size] |
292 | mov eax, [edx+STREAM.in_size] |
296 | mov ecx, [edi+output] |
293 | mov ecx, [edi+output] |
297 | mov ecx, [ecx] |
294 | mov ecx, [ecx] |
298 | mov [ecx], eax |
295 | mov [ecx], eax |
299 | xor eax, eax |
296 | xor eax, eax |
300 | ret |
297 | ret |
301 | @@: |
298 | @@: |
302 | cmp eax, SND_GETFREESPACE |
299 | cmp eax, SND_GETFREESPACE |
303 | jne @F |
300 | jne @F |
304 | 301 | ||
305 | test [edx+STREAM.format], PCM_OUT |
302 | test [edx+STREAM.format], PCM_OUT |
306 | jz .fail |
303 | jz .fail |
307 | 304 | ||
308 | mov ebx, [edx+STREAM.in_free] |
305 | mov ebx, [edx+STREAM.in_free] |
309 | mov ecx, [edi+output] |
306 | mov ecx, [edi+output] |
310 | mov [ecx], ebx |
307 | mov [ecx], ebx |
311 | xor eax, eax |
308 | xor eax, eax |
312 | ret |
309 | ret |
313 | @@: |
310 | @@: |
314 | .fail: |
311 | .fail: |
315 | or eax, -1 |
312 | or eax, -1 |
316 | ret |
313 | ret |
317 | endp |
314 | endp |
318 | 315 | ||
319 | restore handle |
316 | restore handle |
320 | restore io_code |
317 | restore io_code |
321 | restore input |
318 | restore input |
322 | restore inp_size |
319 | restore inp_size |
323 | restore output |
320 | restore output |
324 | restore out_size |
321 | restore out_size |
325 | 322 | ||
326 | align 4 |
323 | align 4 |
327 | proc CreateBuffer stdcall, format:dword, size:dword |
324 | proc CreateBuffer stdcall, format:dword, size:dword |
328 | locals |
325 | locals |
329 | str dd ? |
326 | str dd ? |
330 | ring_size dd ? |
327 | ring_size dd ? |
331 | ring_pages dd ? |
328 | ring_pages dd ? |
332 | endl |
329 | endl |
333 | 330 | ||
334 | mov eax, [format] |
331 | mov eax, [format] |
335 | cmp ax, PCM_1_8_8 |
332 | cmp ax, PCM_1_8_8 |
336 | ja .fail |
333 | ja .fail |
337 | 334 | ||
338 | test eax, PCM_OUT |
335 | test eax, PCM_OUT |
339 | jnz .test_out |
336 | jnz .test_out |
340 | test eax, PCM_RING |
337 | test eax, PCM_RING |
341 | jnz .test_ring |
338 | jnz .test_ring |
342 | ;staic |
339 | ;staic |
343 | test eax, PCM_STATIC |
340 | test eax, PCM_STATIC |
344 | jz .test_out ;use PCM_OUT as default format |
341 | jz .test_out ;use PCM_OUT as default format |
345 | jmp .test_ok |
342 | jmp .test_ok |
346 | .test_out: |
343 | .test_out: |
347 | test eax, PCM_RING+PCM_STATIC |
344 | test eax, PCM_RING+PCM_STATIC |
348 | jnz .fail |
345 | jnz .fail |
349 | or [format], PCM_OUT ;force set |
346 | or [format], PCM_OUT ;force set |
350 | jmp .test_ok |
347 | jmp .test_ok |
351 | .test_ring: |
348 | .test_ring: |
352 | test eax, PCM_OUT+PCM_STATIC |
349 | test eax, PCM_OUT+PCM_STATIC |
353 | jnz .fail |
350 | jnz .fail |
354 | .test_ok: |
351 | .test_ok: |
355 | 352 | ||
356 | call GetPid |
353 | call GetPid |
357 | mov ebx, eax |
354 | mov ebx, eax |
358 | mov eax, STREAM_SIZE |
355 | mov eax, STREAM_SIZE |
359 | 356 | ||
360 | call CreateObject |
357 | call CreateObject |
361 | test eax, eax |
358 | test eax, eax |
362 | jz .fail |
359 | jz .fail |
363 | mov [str], eax |
360 | mov [str], eax |
364 | 361 | ||
365 | mov ebx, [format] |
362 | mov ebx, [format] |
366 | mov [eax+STREAM.format], ebx |
363 | mov [eax+STREAM.format], ebx |
367 | 364 | ||
368 | xor ecx, ecx |
365 | xor ecx, ecx |
369 | movzx ebx, bx |
366 | movzx ebx, bx |
370 | cmp ebx, 19 |
367 | cmp ebx, 19 |
371 | jb @f |
368 | jb @f |
372 | mov ecx, 0x80808080 |
369 | mov ecx, 0x80808080 |
373 | @@: |
370 | @@: |
374 | mov [eax+STREAM.r_silence], ecx |
371 | mov [eax+STREAM.r_silence], ecx |
375 | 372 | ||
376 | shl ebx, 2 |
373 | shl ebx, 2 |
377 | lea ebx, [ebx+ebx*2] ;ebx*=12 |
374 | lea ebx, [ebx+ebx*2] ;ebx*=12 |
378 | 375 | ||
379 | mov ecx, [resampler_params+ebx] |
376 | mov ecx, [resampler_params+ebx] |
380 | mov edx, [resampler_params+ebx+4] |
377 | mov edx, [resampler_params+ebx+4] |
381 | mov esi, [resampler_params+ebx+8] |
378 | mov esi, [resampler_params+ebx+8] |
382 | 379 | ||
383 | mov [eax+STREAM.r_size],ecx |
380 | mov [eax+STREAM.r_size],ecx |
384 | mov [eax+STREAM.r_dt], edx |
381 | mov [eax+STREAM.r_dt], edx |
385 | mov [eax+STREAM.resample], esi |
382 | mov [eax+STREAM.resample], esi |
386 | xor ecx, ecx |
383 | xor ecx, ecx |
387 | mov [eax+STREAM.l_vol], ecx |
384 | mov [eax+STREAM.l_vol], ecx |
388 | mov [eax+STREAM.r_vol], ecx |
385 | mov [eax+STREAM.r_vol], ecx |
389 | mov dword [eax+STREAM.l_amp], 0x7FFF7FFF |
386 | mov dword [eax+STREAM.l_amp], 0x7FFF7FFF |
390 | mov [eax+STREAM.pan], ecx |
387 | mov [eax+STREAM.pan], ecx |
391 | 388 | ||
392 | test [format], PCM_STATIC |
389 | test [format], PCM_STATIC |
393 | jnz .static |
390 | jnz .static |
394 | 391 | ||
395 | ; ring and waveout |
392 | ; ring and waveout |
396 | 393 | ||
397 | mov ebx, 0x10000 |
394 | mov ebx, 0x10000 |
398 | test [format], PCM_RING |
395 | test [format], PCM_RING |
399 | jz .waveout |
396 | jz .waveout |
400 | 397 | ||
401 | mov ebx, [eax+STREAM.r_size] |
398 | mov ebx, [eax+STREAM.r_size] |
402 | add ebx, 4095 |
399 | add ebx, 4095 |
403 | and ebx, -4096 |
400 | and ebx, -4096 |
404 | add ebx, ebx |
401 | add ebx, ebx |
405 | .waveout: |
402 | .waveout: |
406 | mov [ring_size], ebx |
403 | mov [ring_size], ebx |
407 | mov eax, ebx |
404 | mov eax, ebx |
408 | shr ebx, 12 |
405 | shr ebx, 12 |
409 | mov [ring_pages], ebx |
406 | mov [ring_pages], ebx |
410 | 407 | ||
411 | stdcall CreateRingBuffer, eax, PG_SW |
408 | stdcall CreateRingBuffer, eax, PG_SW |
412 | 409 | ||
413 | mov edi, [str] |
410 | mov edi, [str] |
414 | mov ecx, [ring_size] |
411 | mov ecx, [ring_size] |
415 | mov [edi+STREAM.in_base], eax |
412 | mov [edi+STREAM.in_base], eax |
416 | mov [edi+STREAM.in_size], ecx |
413 | mov [edi+STREAM.in_size], ecx |
417 | add eax, 128 |
414 | add eax, 128 |
418 | ; sub ecx, 128 |
415 | ; sub ecx, 128 |
419 | mov [edi+STREAM.in_wp], eax |
416 | mov [edi+STREAM.in_wp], eax |
420 | mov [edi+STREAM.in_rp], eax |
417 | mov [edi+STREAM.in_rp], eax |
421 | mov [edi+STREAM.in_count], 0 |
418 | mov [edi+STREAM.in_count], 0 |
422 | 419 | ||
423 | mov [edi+STREAM.in_free], ecx |
420 | mov [edi+STREAM.in_free], ecx |
424 | add eax, ecx |
421 | add eax, ecx |
425 | mov [edi+STREAM.in_top], eax |
422 | mov [edi+STREAM.in_top], eax |
426 | 423 | ||
427 | jmp .out_buff |
424 | jmp .out_buff |
428 | .static: |
425 | .static: |
429 | mov ecx, [size] |
426 | mov ecx, [size] |
430 | add ecx, 128 ;resampler required |
427 | add ecx, 128 ;resampler required |
431 | mov [eax+STREAM.in_size], ecx |
428 | mov [eax+STREAM.in_size], ecx |
432 | stdcall KernelAlloc, ecx |
429 | stdcall KernelAlloc, ecx |
433 | 430 | ||
434 | mov edi, [str] |
431 | mov edi, [str] |
435 | mov [edi+STREAM.in_base], eax |
432 | mov [edi+STREAM.in_base], eax |
436 | add eax, 128 |
433 | add eax, 128 |
437 | mov [edi+STREAM.in_wp], eax |
434 | mov [edi+STREAM.in_wp], eax |
438 | mov [edi+STREAM.in_rp], eax |
435 | mov [edi+STREAM.in_rp], eax |
439 | mov ebx, [size] |
436 | mov ebx, [size] |
440 | mov [edi+STREAM.in_count], ebx |
437 | mov [edi+STREAM.in_count], ebx |
441 | mov [edi+STREAM.in_free], ebx |
438 | mov [edi+STREAM.in_free], ebx |
442 | add eax, ebx |
439 | add eax, ebx |
443 | mov [edi+STREAM.in_top], eax |
440 | mov [edi+STREAM.in_top], eax |
444 | 441 | ||
445 | .out_buff: |
442 | .out_buff: |
446 | stdcall AllocKernelSpace, dword 128*1024 |
443 | stdcall AllocKernelSpace, dword 128*1024 |
447 | 444 | ||
448 | mov edi, [str] |
445 | mov edi, [str] |
449 | mov [edi+STREAM.out_base], eax |
446 | mov [edi+STREAM.out_base], eax |
450 | mov [edi+STREAM.out_wp], eax |
447 | mov [edi+STREAM.out_wp], eax |
451 | mov [edi+STREAM.out_rp], eax |
448 | mov [edi+STREAM.out_rp], eax |
452 | mov [edi+STREAM.out_count], 0 |
449 | mov [edi+STREAM.out_count], 0 |
453 | add eax, 64*1024 |
450 | add eax, 64*1024 |
454 | mov [edi+STREAM.out_top], eax |
451 | mov [edi+STREAM.out_top], eax |
455 | 452 | ||
456 | stdcall AllocPages, dword 64/4 |
453 | stdcall AllocPages, dword 64/4 |
457 | mov edi, [str] |
454 | mov edi, [str] |
458 | mov ebx, [edi+STREAM.out_base] |
455 | mov ebx, [edi+STREAM.out_base] |
459 | mov ecx, 16 |
456 | mov ecx, 16 |
460 | or eax, PG_SW |
457 | or eax, PG_SW |
461 | push eax |
458 | push eax |
462 | push ebx |
459 | push ebx |
463 | call CommitPages ;eax, ebx, ecx |
460 | call CommitPages ;eax, ebx, ecx |
464 | mov ecx, 16 |
461 | mov ecx, 16 |
465 | pop ebx |
462 | pop ebx |
466 | pop eax |
463 | pop eax |
467 | add ebx, 64*1024 |
464 | add ebx, 64*1024 |
468 | call CommitPages ;double mapped |
465 | call CommitPages ;double mapped |
469 | 466 | ||
470 | mov edi, [str] |
467 | mov edi, [str] |
471 | mov ecx, [edi+STREAM.in_top] |
468 | mov ecx, [edi+STREAM.in_top] |
472 | mov edi, [edi+STREAM.in_base] |
469 | mov edi, [edi+STREAM.in_base] |
473 | sub ecx, edi |
470 | sub ecx, edi |
474 | xor eax, eax |
471 | xor eax, eax |
475 | shr ecx, 2 |
472 | shr ecx, 2 |
476 | cld |
473 | cld |
477 | rep stosd |
474 | rep stosd |
478 | 475 | ||
479 | mov edi, [str] |
476 | mov edi, [str] |
480 | mov edi, [edi+STREAM.out_base] |
477 | mov edi, [edi+STREAM.out_base] |
481 | mov ecx, (64*1024)/4 |
478 | mov ecx, (64*1024)/4 |
482 | rep stosd |
479 | rep stosd |
483 | 480 | ||
484 | xor edx, edx |
481 | xor edx, edx |
485 | mov ebx, MANUAL_DESTROY |
482 | mov ebx, MANUAL_DESTROY |
486 | call CreateEvent |
483 | call CreateEvent |
487 | 484 | ||
488 | mov ebx, [str] |
485 | mov ebx, [str] |
489 | mov [ebx+STREAM.notify_event], eax |
486 | mov [ebx+STREAM.notify_event], eax |
490 | mov [ebx+STREAM.notify_id], edx |
487 | mov [ebx+STREAM.notify_id], edx |
491 | 488 | ||
492 | mov [ebx+STREAM.magic], 'WAVE' |
489 | mov [ebx+STREAM.magic], 'WAVE' |
493 | mov [ebx+STREAM.destroy], DestroyBuffer.destroy |
490 | mov [ebx+STREAM.destroy], DestroyBuffer.destroy |
494 | mov [ebx+STREAM.size], STREAM_SIZE |
491 | mov [ebx+STREAM.size], STREAM_SIZE |
495 | mov [ebx+STREAM.flags], SND_STOP |
492 | mov [ebx+STREAM.flags], SND_STOP |
496 | 493 | ||
497 | pushf |
494 | pushf |
498 | cli |
495 | cli |
499 | mov eax, str.fd-FD_OFFSET |
496 | mov eax, str.fd-FD_OFFSET |
500 | mov edx, [eax+STREAM.str_fd] |
497 | mov edx, [eax+STREAM.str_fd] |
501 | mov [ebx+STREAM.str_fd], edx |
498 | mov [ebx+STREAM.str_fd], edx |
502 | mov [ebx+STREAM.str_bk], eax |
499 | mov [ebx+STREAM.str_bk], eax |
503 | mov [eax+STREAM.str_fd], ebx |
500 | mov [eax+STREAM.str_fd], ebx |
504 | mov [edx+STREAM.str_bk], ebx |
501 | mov [edx+STREAM.str_bk], ebx |
505 | popf |
502 | popf |
506 | 503 | ||
507 | xor eax, eax |
504 | xor eax, eax |
508 | ret |
505 | ret |
509 | .fail: |
506 | .fail: |
510 | xor ebx, ebx |
507 | xor ebx, ebx |
511 | or eax, -1 |
508 | or eax, -1 |
512 | ret |
509 | ret |
513 | endp |
510 | endp |
514 | 511 | ||
515 | ;param |
512 | ;param |
516 | ; eax= buffer handle |
513 | ; eax= buffer handle |
517 | 514 | ||
518 | align 4 |
515 | align 4 |
519 | DestroyBuffer: |
516 | DestroyBuffer: |
520 | .handle equ esp ;local |
517 | .handle equ esp ;local |
521 | 518 | ||
522 | mov [eax+STREAM.flags], SND_STOP |
519 | mov [eax+STREAM.flags], SND_STOP |
523 | .destroy: |
520 | .destroy: |
524 | push eax |
521 | push eax |
525 | 522 | ||
526 | pushfd |
523 | pushfd |
527 | cli |
524 | cli |
528 | mov ebx, [eax+STREAM.str_fd] |
525 | mov ebx, [eax+STREAM.str_fd] |
529 | mov ecx, [eax+STREAM.str_bk] |
526 | mov ecx, [eax+STREAM.str_bk] |
530 | mov [ebx+STREAM.str_bk], ecx |
527 | mov [ebx+STREAM.str_bk], ecx |
531 | mov [ecx+STREAM.str_fd], ebx |
528 | mov [ecx+STREAM.str_fd], ebx |
532 | popf |
529 | popf |
533 | 530 | ||
534 | stdcall KernelFree, [eax+STREAM.in_base] |
531 | stdcall KernelFree, [eax+STREAM.in_base] |
535 | mov eax, [.handle] |
532 | mov eax, [.handle] |
536 | stdcall KernelFree, [eax+STREAM.out_base] |
533 | stdcall KernelFree, [eax+STREAM.out_base] |
537 | 534 | ||
538 | pop eax ;restore stack |
535 | pop eax ;restore stack |
539 | call DestroyObject ;eax= stream |
536 | call DestroyObject ;eax= stream |
540 | xor eax, eax |
537 | xor eax, eax |
541 | ret |
538 | ret |
542 | .fail: |
539 | .fail: |
543 | or eax, -1 |
540 | or eax, -1 |
544 | ret |
541 | ret |
545 | restore .handle |
542 | restore .handle |
546 | 543 | ||
547 | align 4 |
544 | align 4 |
548 | proc SetFormat stdcall, str:dword, format:dword |
545 | proc SetFormat stdcall, str:dword, format:dword |
549 | 546 | ||
550 | cmp word [format], PCM_1_8_8 |
547 | cmp word [format], PCM_1_8_8 |
551 | ja .fail |
548 | ja .fail |
552 | 549 | ||
553 | mov edx, [str] |
550 | mov edx, [str] |
554 | mov [edx+STREAM.flags], SND_STOP |
551 | mov [edx+STREAM.flags], SND_STOP |
555 | 552 | ||
556 | test [edx+STREAM.format], PCM_RING |
553 | test [edx+STREAM.format], PCM_RING |
557 | jnz .fail |
554 | jnz .fail |
558 | 555 | ||
559 | ; mov eax,[edx+STREAM.out_base] |
556 | ; mov eax,[edx+STREAM.out_base] |
560 | ; mov [edx+STREAM.out_wp], eax |
557 | ; mov [edx+STREAM.out_wp], eax |
561 | ; mov [edx+STREAM.out_rp], eax |
558 | ; mov [edx+STREAM.out_rp], eax |
562 | ; mov [edx+STREAM.out_count], 0 |
559 | ; mov [edx+STREAM.out_count], 0 |
563 | 560 | ||
564 | movzx eax, word [format] |
561 | movzx eax, word [format] |
565 | mov word [edx+STREAM.format], ax |
562 | mov word [edx+STREAM.format], ax |
566 | 563 | ||
567 | xor ebx, ebx |
564 | xor ebx, ebx |
568 | cmp eax, 19 |
565 | cmp eax, 19 |
569 | jb @f |
566 | jb @f |
570 | mov ebx, 0x80808080 |
567 | mov ebx, 0x80808080 |
571 | @@: |
568 | @@: |
572 | mov [edx+STREAM.r_silence], ebx |
569 | mov [edx+STREAM.r_silence], ebx |
573 | 570 | ||
574 | shl eax, 2 |
571 | shl eax, 2 |
575 | lea eax, [eax+eax*2] ;eax*=12 |
572 | lea eax, [eax+eax*2] ;eax*=12 |
576 | 573 | ||
577 | mov edi, [resampler_params+eax] |
574 | mov edi, [resampler_params+eax] |
578 | mov ecx, [resampler_params+eax+4] |
575 | mov ecx, [resampler_params+eax+4] |
579 | mov ebx, [resampler_params+eax+8] |
576 | mov ebx, [resampler_params+eax+8] |
580 | 577 | ||
581 | mov [edx+STREAM.r_size],edi |
578 | mov [edx+STREAM.r_size],edi |
582 | mov [edx+STREAM.r_dt], ecx |
579 | mov [edx+STREAM.r_dt], ecx |
583 | mov [edx+STREAM.resample], ebx |
580 | mov [edx+STREAM.resample], ebx |
584 | 581 | ||
585 | mov edi, [edx+STREAM.in_base] |
582 | mov edi, [edx+STREAM.in_base] |
586 | mov ecx, 128/4 |
583 | mov ecx, 128/4 |
587 | mov eax, [edx+STREAM.r_silence] |
584 | mov eax, [edx+STREAM.r_silence] |
588 | cld |
585 | cld |
589 | rep stosd |
586 | rep stosd |
590 | xor eax, eax |
587 | xor eax, eax |
591 | ret |
588 | ret |
592 | .fail: |
589 | .fail: |
593 | or eax, -1 |
590 | or eax, -1 |
594 | ret |
591 | ret |
595 | endp |
592 | endp |
596 | 593 | ||
597 | ; for static buffers only |
594 | ; for static buffers only |
598 | ; use waveout for streams |
595 | ; use waveout for streams |
599 | 596 | ||
600 | align 4 |
597 | align 4 |
601 | proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword |
598 | proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword |
602 | 599 | ||
603 | mov edx, [str] |
600 | mov edx, [str] |
604 | test [edx+STREAM.format], PCM_OUT |
601 | test [edx+STREAM.format], PCM_OUT |
605 | jnz .fail |
602 | jnz .fail |
606 | 603 | ||
607 | mov esi, [src] |
604 | mov esi, [src] |
608 | mov edi, [offs] |
605 | mov edi, [offs] |
609 | add edi, [edx+STREAM.in_base] |
606 | add edi, [edx+STREAM.in_base] |
610 | add edi, 128 |
607 | add edi, 128 |
611 | 608 | ||
612 | cmp edi, [edx+STREAM.in_top] |
609 | cmp edi, [edx+STREAM.in_top] |
613 | jae .fail |
610 | jae .fail |
614 | 611 | ||
615 | mov ecx, [size] |
612 | mov ecx, [size] |
616 | lea ebx, [ecx+edi] |
613 | lea ebx, [ecx+edi] |
617 | sub ebx, [edx+STREAM.in_top] |
614 | sub ebx, [edx+STREAM.in_top] |
618 | jb @F |
615 | jb @F |
619 | sub ecx, ebx |
616 | sub ecx, ebx |
620 | @@: |
617 | @@: |
621 | shr ecx, 2 |
618 | shr ecx, 2 |
622 | cld |
619 | cld |
623 | rep movsd |
620 | rep movsd |
624 | xor eax,eax |
621 | xor eax,eax |
625 | ret |
622 | ret |
626 | .fail: |
623 | .fail: |
627 | or eax, -1 |
624 | or eax, -1 |
628 | ret |
625 | ret |
629 | endp |
626 | endp |
630 | 627 | ||
631 | ; for stream buffers only |
628 | ; for stream buffers only |
632 | 629 | ||
633 | align 4 |
630 | align 4 |
634 | proc wave_out stdcall, str:dword,src:dword,size:dword |
631 | proc wave_out stdcall, str:dword,src:dword,size:dword |
635 | locals |
632 | locals |
636 | state_saved dd ? |
633 | state_saved dd ? |
637 | fpu_state rb 528 |
634 | fpu_state rb 528 |
638 | endl |
635 | endl |
639 | 636 | ||
640 | mov edx, [str] |
637 | mov edx, [str] |
641 | mov eax, [edx+STREAM.format] |
638 | mov eax, [edx+STREAM.format] |
642 | test eax, PCM_OUT |
639 | test eax, PCM_OUT |
643 | jz .fail |
640 | jz .fail |
644 | 641 | ||
645 | cmp ax, PCM_ALL |
642 | cmp ax, PCM_ALL |
646 | je .fail |
643 | je .fail |
647 | 644 | ||
648 | mov esi,[src] |
645 | mov esi,[src] |
649 | test esi, esi |
646 | test esi, esi |
650 | jz .fail |
647 | jz .fail |
651 | 648 | ||
652 | cmp esi, OS_BASE |
649 | cmp esi, OS_BASE |
653 | jae .fail |
650 | jae .fail |
654 | 651 | ||
655 | mov [state_saved], 0 |
652 | mov [state_saved], 0 |
656 | 653 | ||
657 | .main_loop: |
654 | .main_loop: |
658 | mov edx, [str] |
655 | mov edx, [str] |
659 | 656 | ||
660 | mov ebx, [size] |
657 | mov ebx, [size] |
661 | test ebx, ebx |
658 | test ebx, ebx |
662 | jz .done |
659 | jz .done |
663 | 660 | ||
664 | cmp [edx+STREAM.flags], SND_STOP |
661 | cmp [edx+STREAM.flags], SND_STOP |
665 | jne .fill |
662 | jne .fill |
666 | 663 | ||
667 | mov edi, [edx+STREAM.in_base] |
664 | mov edi, [edx+STREAM.in_base] |
668 | mov ecx, 128/4 |
665 | mov ecx, 128/4 |
669 | mov eax, [edx+STREAM.r_silence] |
666 | mov eax, [edx+STREAM.r_silence] |
670 | cld |
667 | cld |
671 | rep stosd |
668 | rep stosd |
672 | 669 | ||
673 | mov ecx, [edx+STREAM.in_size] |
670 | mov ecx, [edx+STREAM.in_size] |
674 | sub ecx, 128 |
671 | sub ecx, 128 |
675 | mov [edx+STREAM.in_wp], edi |
672 | mov [edx+STREAM.in_wp], edi |
676 | mov [edx+STREAM.in_rp], edi |
673 | mov [edx+STREAM.in_rp], edi |
677 | mov [edx+STREAM.in_count], 0 |
674 | mov [edx+STREAM.in_count], 0 |
678 | mov [edx+STREAM.in_free], ecx |
675 | mov [edx+STREAM.in_free], ecx |
679 | 676 | ||
680 | mov eax,[edx+STREAM.out_base] |
677 | mov eax,[edx+STREAM.out_base] |
681 | mov [edx+STREAM.out_wp], eax |
678 | mov [edx+STREAM.out_wp], eax |
682 | mov [edx+STREAM.out_rp], eax |
679 | mov [edx+STREAM.out_rp], eax |
683 | mov [edx+STREAM.out_count], 0 |
680 | mov [edx+STREAM.out_count], 0 |
684 | .fill: |
681 | .fill: |
685 | mov ecx, [edx+STREAM.in_free] |
682 | mov ecx, [edx+STREAM.in_free] |
686 | test ecx, ecx |
683 | test ecx, ecx |
687 | jz .wait |
684 | jz .wait |
688 | 685 | ||
689 | cmp ecx, ebx |
686 | cmp ecx, ebx |
690 | jbe @F |
687 | jbe @F |
691 | 688 | ||
692 | mov ecx, ebx |
689 | mov ecx, ebx |
693 | @@: |
690 | @@: |
694 | sub [size], ecx |
691 | sub [size], ecx |
695 | add [edx+STREAM.in_count], ecx |
692 | add [edx+STREAM.in_count], ecx |
696 | sub [edx+STREAM.in_free], ecx |
693 | sub [edx+STREAM.in_free], ecx |
697 | 694 | ||
698 | shr ecx, 2 |
695 | shr ecx, 2 |
699 | mov edi, [edx+STREAM.in_wp] |
696 | mov edi, [edx+STREAM.in_wp] |
700 | mov esi, [src] |
697 | mov esi, [src] |
701 | cld |
698 | cld |
702 | rep movsd |
699 | rep movsd |
703 | 700 | ||
704 | mov [src], esi |
701 | mov [src], esi |
705 | cmp edi, [edx+STREAM.in_top] |
702 | cmp edi, [edx+STREAM.in_top] |
706 | jb @F |
703 | jb @F |
707 | sub edi, [edx+STREAM.in_size] |
704 | sub edi, [edx+STREAM.in_size] |
708 | @@: |
705 | @@: |
709 | mov [edx+STREAM.in_wp], edi |
706 | mov [edx+STREAM.in_wp], edi |
710 | 707 | ||
711 | cmp [edx+STREAM.out_count], 32768 |
708 | cmp [edx+STREAM.out_count], 32768 |
712 | jae .skip |
709 | jae .skip |
713 | 710 | ||
714 | cmp [state_saved], 0 |
711 | cmp [state_saved], 0 |
715 | jne @F |
712 | jne @F |
716 | lea eax, [fpu_state+15] |
713 | lea eax, [fpu_state+15] |
717 | and eax, -16 |
714 | and eax, -16 |
718 | call FpuSave |
715 | call FpuSave |
719 | mov [state_saved], 1 |
716 | mov [state_saved], 1 |
720 | @@: |
717 | @@: |
721 | stdcall refill, edx |
718 | stdcall refill, edx |
722 | .skip: |
719 | .skip: |
723 | mov edx, [str] |
720 | mov edx, [str] |
724 | mov [edx+STREAM.flags], SND_PLAY |
721 | mov [edx+STREAM.flags], SND_PLAY |
725 | cmp [eng_state], SND_PLAY |
722 | cmp [eng_state], SND_PLAY |
726 | je .main_loop |
723 | je .main_loop |
727 | 724 | ||
728 | stdcall dev_play, [hSound] |
725 | stdcall dev_play, [hSound] |
729 | mov [eng_state], SND_PLAY |
726 | mov [eng_state], SND_PLAY |
730 | jmp .main_loop |
727 | jmp .main_loop |
731 | .wait: |
728 | .wait: |
732 | mov edx, [str] |
729 | mov edx, [str] |
733 | mov eax, [edx+STREAM.notify_event] |
730 | mov eax, [edx+STREAM.notify_event] |
734 | mov ebx, [edx+STREAM.notify_id] |
731 | mov ebx, [edx+STREAM.notify_id] |
735 | call WaitEvent ;eax ebx |
732 | call WaitEvent ;eax ebx |
736 | jmp .main_loop |
733 | jmp .main_loop |
737 | .done: |
734 | .done: |
738 | cmp [state_saved], 1 |
735 | cmp [state_saved], 1 |
739 | jne @F |
736 | jne @F |
740 | 737 | ||
741 | lea eax, [fpu_state+15] |
738 | lea eax, [fpu_state+15] |
742 | and eax, -16 |
739 | and eax, -16 |
743 | call FpuRestore |
740 | call FpuRestore |
744 | @@: |
741 | @@: |
745 | xor eax, eax |
742 | xor eax, eax |
746 | ret |
743 | ret |
747 | .fail: |
744 | .fail: |
748 | or eax, -1 |
745 | or eax, -1 |
749 | ret |
746 | ret |
750 | endp |
747 | endp |
751 | 748 | ||
752 | ; both static and stream |
749 | ; both static and stream |
753 | ; reset all but not clear buffers |
750 | ; reset all but not clear buffers |
754 | 751 | ||
755 | 752 | ||
756 | ; flags reserved |
753 | ; flags reserved |
757 | ; RESET_INPUT equ 1 ;reserved reset and clear input buffer |
754 | ; RESET_INPUT equ 1 ;reserved reset and clear input buffer |
758 | ; RESET_OUTPUT equ 2 ;reserved reset and clear output buffer |
755 | ; RESET_OUTPUT equ 2 ;reserved reset and clear output buffer |
759 | ; RESET_ALL equ 3 |
756 | ; RESET_ALL equ 3 |
760 | 757 | ||
761 | 758 | ||
762 | align 4 |
759 | align 4 |
763 | proc ResetBuffer stdcall, str:dword, flags:dword |
760 | proc ResetBuffer stdcall, str:dword, flags:dword |
764 | 761 | ||
765 | mov edx, [str] |
762 | mov edx, [str] |
766 | mov [edx+STREAM.flags], SND_STOP |
763 | mov [edx+STREAM.flags], SND_STOP |
767 | 764 | ||
768 | mov edi, [edx+STREAM.in_base] |
765 | mov edi, [edx+STREAM.in_base] |
769 | mov ecx, 128/4 |
766 | mov ecx, 128/4 |
770 | mov eax, [edx+STREAM.r_silence] |
767 | mov eax, [edx+STREAM.r_silence] |
771 | cld |
768 | cld |
772 | rep stosd |
769 | rep stosd |
773 | 770 | ||
774 | mov [edx+STREAM.in_wp], edi |
771 | mov [edx+STREAM.in_wp], edi |
775 | mov [edx+STREAM.in_rp], edi |
772 | mov [edx+STREAM.in_rp], edi |
776 | 773 | ||
777 | test [edx+STREAM.flags], PCM_STATIC |
774 | test [edx+STREAM.flags], PCM_STATIC |
778 | jnz .static |
775 | jnz .static |
779 | mov [edx+STREAM.in_count], 0 |
776 | mov [edx+STREAM.in_count], 0 |
780 | jmp @F |
777 | jmp @F |
781 | .static: |
778 | .static: |
782 | mov eax, [edx+STREAM.in_size] |
779 | mov eax, [edx+STREAM.in_size] |
783 | mov [edx+STREAM.in_count], eax |
780 | mov [edx+STREAM.in_count], eax |
784 | @@: |
781 | @@: |
785 | 782 | ||
786 | mov eax, [edx+STREAM.in_size] |
783 | mov eax, [edx+STREAM.in_size] |
787 | sub eax, 128 |
784 | sub eax, 128 |
788 | mov [edx+STREAM.in_free], eax |
785 | mov [edx+STREAM.in_free], eax |
789 | 786 | ||
790 | xor eax, eax |
787 | xor eax, eax |
791 | mov ebx,[edx+STREAM.out_base] |
788 | mov ebx,[edx+STREAM.out_base] |
792 | mov [edx+STREAM.out_wp], ebx |
789 | mov [edx+STREAM.out_wp], ebx |
793 | mov [edx+STREAM.out_rp], ebx |
790 | mov [edx+STREAM.out_rp], ebx |
794 | mov [edx+STREAM.out_count], eax |
791 | mov [edx+STREAM.out_count], eax |
795 | ret |
792 | ret |
796 | .fail: |
793 | .fail: |
797 | or eax, -1 |
794 | or eax, -1 |
798 | ret |
795 | ret |
799 | endp |
796 | endp |
800 | 797 | ||
801 | ; for static buffers only |
798 | ; for static buffers only |
802 | 799 | ||
803 | align 4 |
800 | align 4 |
804 | proc SetBufferPos stdcall, str:dword, pos:dword |
801 | proc SetBufferPos stdcall, str:dword, pos:dword |
805 | 802 | ||
806 | mov edx, [str] |
803 | mov edx, [str] |
807 | test [edx+STREAM.format], PCM_STATIC |
804 | test [edx+STREAM.format], PCM_STATIC |
808 | jz .fail |
805 | jz .fail |
809 | 806 | ||
810 | mov [edx+STREAM.flags], SND_STOP |
807 | mov [edx+STREAM.flags], SND_STOP |
811 | 808 | ||
812 | mov eax, [pos] |
809 | mov eax, [pos] |
813 | add eax, [edx+STREAM.in_base] |
810 | add eax, [edx+STREAM.in_base] |
814 | mov ebx, [edx+STREAM.in_top] |
811 | mov ebx, [edx+STREAM.in_top] |
815 | add eax, 128 |
812 | add eax, 128 |
816 | 813 | ||
817 | cmp eax, ebx |
814 | cmp eax, ebx |
818 | jae .fail |
815 | jae .fail |
819 | 816 | ||
820 | mov [edx+STREAM.in_rp], eax |
817 | mov [edx+STREAM.in_rp], eax |
821 | sub ebx, eax |
818 | sub ebx, eax |
822 | mov [edx+STREAM.in_count], ebx |
819 | mov [edx+STREAM.in_count], ebx |
823 | xor eax, eax |
820 | xor eax, eax |
824 | ret |
821 | ret |
825 | .fail: |
822 | .fail: |
826 | or eax, -1 |
823 | or eax, -1 |
827 | ret |
824 | ret |
828 | endp |
825 | endp |
829 | 826 | ||
830 | align 4 |
827 | align 4 |
831 | proc GetBufferPos stdcall, str:dword |
828 | proc GetBufferPos stdcall, str:dword |
832 | 829 | ||
833 | mov edx, [str] |
830 | mov edx, [str] |
834 | test [edx+STREAM.format], PCM_STATIC |
831 | test [edx+STREAM.format], PCM_STATIC |
835 | jz .fail |
832 | jz .fail |
836 | 833 | ||
837 | mov ebx, [edx+STREAM.in_rp] |
834 | mov ebx, [edx+STREAM.in_rp] |
838 | sub ebx, [edx+STREAM.in_base] |
835 | sub ebx, [edx+STREAM.in_base] |
839 | sub ebx, 128 |
836 | sub ebx, 128 |
840 | xor eax, eax |
837 | xor eax, eax |
841 | ret |
838 | ret |
842 | .fail: |
839 | .fail: |
843 | xor ebx,ebx |
840 | xor ebx,ebx |
844 | or eax, -1 |
841 | or eax, -1 |
845 | ret |
842 | ret |
846 | endp |
843 | endp |
847 | 844 | ||
848 | ; both |
845 | ; both |
849 | 846 | ||
850 | align 4 |
847 | align 4 |
851 | proc SetBufferVol stdcall, str:dword,l_vol:dword,r_vol:dword |
848 | proc SetBufferVol stdcall, str:dword,l_vol:dword,r_vol:dword |
852 | 849 | ||
853 | mov edx, [str] |
850 | mov edx, [str] |
854 | stdcall set_vol_param,[l_vol],[r_vol],[edx+STREAM.pan] |
851 | stdcall set_vol_param,[l_vol],[r_vol],[edx+STREAM.pan] |
855 | ret |
852 | ret |
856 | endp |
853 | endp |
857 | 854 | ||
858 | proc set_vol_param stdcall, l_vol:dword,r_vol:dword,pan:dword |
855 | proc set_vol_param stdcall, l_vol:dword,r_vol:dword,pan:dword |
859 | locals |
856 | locals |
860 | _600 dd ? |
857 | _600 dd ? |
861 | _32767 dd ? |
858 | _32767 dd ? |
862 | state rb 108 |
859 | state rb 108 |
863 | endl |
860 | endl |
864 | 861 | ||
865 | mov [_600], 0x44160000 ;600.0 |
862 | mov [_600], 0x44160000 ;600.0 |
866 | mov [_32767], 32767 |
863 | mov [_32767], 32767 |
867 | 864 | ||
868 | lea ebx, [state] |
865 | lea ebx, [state] |
869 | fnsave [ebx] |
866 | fnsave [ebx] |
870 | 867 | ||
871 | movq mm0, qword [l_vol] |
868 | movq mm0, qword [l_vol] |
872 | pminsw mm0, qword [vol_max] |
869 | pminsw mm0, qword [vol_max] |
873 | pmaxsw mm0, qword [vol_min] |
870 | pmaxsw mm0, qword [vol_min] |
874 | movq qword [l_vol], mm0 |
871 | movq qword [l_vol], mm0 |
875 | movq qword [edx+STREAM.l_vol], mm0 |
872 | movq qword [edx+STREAM.l_vol], mm0 |
876 | 873 | ||
877 | movd mm1,[pan] |
874 | movd mm1,[pan] |
878 | pminsw mm1, qword [pan_max] |
875 | pminsw mm1, qword [pan_max] |
879 | pmaxsw mm1, qword [vol_min] |
876 | pmaxsw mm1, qword [vol_min] |
880 | movd [edx+STREAM.pan], mm1 |
877 | movd [edx+STREAM.pan], mm1 |
881 | 878 | ||
882 | cmp word [edx+STREAM.pan], 0 |
879 | cmp word [edx+STREAM.pan], 0 |
883 | jl @F |
880 | jl @F |
884 | 881 | ||
885 | psubsw mm0,mm1 |
882 | psubsw mm0,mm1 |
886 | pminsw mm0, qword [vol_max] |
883 | pminsw mm0, qword [vol_max] |
887 | pmaxsw mm0, qword [vol_min] |
884 | pmaxsw mm0, qword [vol_min] |
888 | movd [l_vol],mm0 |
885 | movd [l_vol],mm0 |
889 | jmp .calc_amp |
886 | jmp .calc_amp |
890 | @@: |
887 | @@: |
891 | punpckhdq mm0,mm0 |
888 | punpckhdq mm0,mm0 |
892 | paddsw mm0,mm1 |
889 | paddsw mm0,mm1 |
893 | pminsw mm0, qword [vol_max] |
890 | pminsw mm0, qword [vol_max] |
894 | pmaxsw mm0, qword [vol_min] |
891 | pmaxsw mm0, qword [vol_min] |
895 | movd [r_vol], mm0 |
892 | movd [r_vol], mm0 |
896 | .calc_amp: |
893 | .calc_amp: |
897 | emms |
894 | emms |
898 | fild word [l_vol] |
895 | fild word [l_vol] |
899 | 896 | ||
900 | call .calc |
897 | call .calc |
901 | 898 | ||
902 | fistp word [edx+STREAM.l_amp] |
899 | fistp word [edx+STREAM.l_amp] |
903 | fstp dword [edx+STREAM.l_amp_f] |
900 | fstp dword [edx+STREAM.l_amp_f] |
904 | fstp st0 |
901 | fstp st0 |
905 | 902 | ||
906 | fild word [r_vol] |
903 | fild word [r_vol] |
907 | 904 | ||
908 | call .calc |
905 | call .calc |
909 | 906 | ||
910 | fistp word [edx+STREAM.r_amp] |
907 | fistp word [edx+STREAM.r_amp] |
911 | fstp dword [edx+STREAM.r_amp_f] |
908 | fstp dword [edx+STREAM.r_amp_f] |
912 | fstp st0 |
909 | fstp st0 |
913 | 910 | ||
914 | fnclex |
911 | fnclex |
915 | lea ebx, [state] |
912 | lea ebx, [state] |
916 | frstor [ebx] |
913 | frstor [ebx] |
917 | 914 | ||
918 | xor eax, eax |
915 | xor eax, eax |
919 | inc eax |
916 | inc eax |
920 | ret |
917 | ret |
921 | .calc: |
918 | .calc: |
922 | fdiv dword [_600] |
919 | fdiv dword [_600] |
923 | fld st0 |
920 | fld st0 |
924 | frndint |
921 | frndint |
925 | fxch st1 |
922 | fxch st1 |
926 | fsub st, st1 |
923 | fsub st, st1 |
927 | f2xm1 |
924 | f2xm1 |
928 | fld1 |
925 | fld1 |
929 | faddp st1, st0 |
926 | faddp st1, st0 |
930 | fscale |
927 | fscale |
931 | fld st0 |
928 | fld st0 |
932 | fimul dword [_32767] |
929 | fimul dword [_32767] |
933 | ret 0 |
930 | ret 0 |
934 | endp |
931 | endp |
935 | 932 | ||
936 | align 4 |
933 | align 4 |
937 | proc GetBufferVol stdcall, str:dword,p_lvol:dword,p_rvol:dword |
934 | proc GetBufferVol stdcall, str:dword,p_lvol:dword,p_rvol:dword |
938 | 935 | ||
939 | mov edx, [str] |
936 | mov edx, [str] |
940 | mov eax, [p_lvol] |
937 | mov eax, [p_lvol] |
941 | movsx ecx, word [edx+STREAM.l_vol] |
938 | movsx ecx, word [edx+STREAM.l_vol] |
942 | mov [eax], ecx |
939 | mov [eax], ecx |
943 | 940 | ||
944 | mov eax, [p_rvol] |
941 | mov eax, [p_rvol] |
945 | movsx ecx, word [edx+STREAM.r_vol] |
942 | movsx ecx, word [edx+STREAM.r_vol] |
946 | mov [eax], ecx |
943 | mov [eax], ecx |
947 | xor eax, eax |
944 | xor eax, eax |
948 | ret |
945 | ret |
949 | endp |
946 | endp |
950 | 947 | ||
951 | align 4 |
948 | align 4 |
952 | proc SetBufferPan stdcall, str:dword,pan:dword |
949 | proc SetBufferPan stdcall, str:dword,pan:dword |
953 | 950 | ||
954 | mov edx, [str] |
951 | mov edx, [str] |
955 | stdcall set_vol_param,[edx+STREAM.l_vol],\ |
952 | stdcall set_vol_param,[edx+STREAM.l_vol],\ |
956 | [edx+STREAM.r_vol],[pan] |
953 | [edx+STREAM.r_vol],[pan] |
957 | ret |
954 | ret |
958 | endp |
955 | endp |
959 | 956 | ||
960 | ; for static and ring buffers only |
957 | ; for static and ring buffers only |
961 | 958 | ||
962 | align 4 |
959 | align 4 |
963 | proc play_buffer stdcall, str:dword, flags:dword |
960 | proc play_buffer stdcall, str:dword, flags:dword |
964 | 961 | ||
965 | mov ebx, [str] |
962 | mov ebx, [str] |
966 | mov eax, [ebx+STREAM.format] |
963 | mov eax, [ebx+STREAM.format] |
967 | test eax, PCM_OUT |
964 | test eax, PCM_OUT |
968 | jnz .fail |
965 | jnz .fail |
969 | 966 | ||
970 | cmp ax, PCM_ALL |
967 | cmp ax, PCM_ALL |
971 | je .fail |
968 | je .fail |
972 | 969 | ||
973 | mov [ebx+STREAM.flags], SND_PLAY |
970 | mov [ebx+STREAM.flags], SND_PLAY |
974 | cmp [eng_state], SND_PLAY |
971 | cmp [eng_state], SND_PLAY |
975 | je .done |
972 | je .done |
976 | 973 | ||
977 | stdcall dev_play, [hSound] |
974 | stdcall dev_play, [hSound] |
978 | mov [eng_state], SND_PLAY |
975 | mov [eng_state], SND_PLAY |
979 | .done: |
976 | .done: |
980 | test [flags], PLAY_SYNC |
977 | test [flags], PLAY_SYNC |
981 | jz @F |
978 | jz @F |
982 | 979 | ||
983 | mov edx, [str] |
980 | mov edx, [str] |
984 | .wait: |
981 | .wait: |
985 | mov eax, [edx+STREAM.notify_event] |
982 | mov eax, [edx+STREAM.notify_event] |
986 | mov ebx, [edx+STREAM.notify_id] |
983 | mov ebx, [edx+STREAM.notify_id] |
987 | call WaitEvent ;eax ebx |
984 | call WaitEvent ;eax ebx |
988 | 985 | ||
989 | mov edx, [str] |
986 | mov edx, [str] |
990 | cmp [edx+STREAM.flags], SND_STOP |
987 | cmp [edx+STREAM.flags], SND_STOP |
991 | jne .wait |
988 | jne .wait |
992 | @@: |
989 | @@: |
993 | xor eax, eax |
990 | xor eax, eax |
994 | ret |
991 | ret |
995 | .fail: |
992 | .fail: |
996 | or eax, -1 |
993 | or eax, -1 |
997 | ret |
994 | ret |
998 | endp |
995 | endp |
999 | 996 | ||
1000 | ; for static and ring buffers only |
997 | ; for static and ring buffers only |
1001 | 998 | ||
1002 | align 4 |
999 | align 4 |
1003 | proc stop_buffer stdcall, str:dword |
1000 | proc stop_buffer stdcall, str:dword |
1004 | 1001 | ||
1005 | mov edx, [str] |
1002 | mov edx, [str] |
1006 | test [edx+STREAM.format], PCM_STATIC+PCM_RING |
1003 | test [edx+STREAM.format], PCM_STATIC+PCM_RING |
1007 | jz .fail |
1004 | jz .fail |
1008 | 1005 | ||
1009 | mov [edx+STREAM.flags], SND_STOP |
1006 | mov [edx+STREAM.flags], SND_STOP |
1010 | 1007 | ||
1011 | ; stdcall [ServiceHandler], [hSound], dword DEV_STOP, 0 |
1008 | ; stdcall [ServiceHandler], [hSound], dword DEV_STOP, 0 |
1012 | 1009 | ||
1013 | mov eax, [edx+STREAM.notify_event] |
1010 | mov eax, [edx+STREAM.notify_event] |
1014 | mov ebx, [edx+STREAM.notify_id] |
1011 | mov ebx, [edx+STREAM.notify_id] |
1015 | call ClearEvent ;eax ebx |
1012 | call ClearEvent ;eax ebx |
1016 | 1013 | ||
1017 | xor eax, eax |
1014 | xor eax, eax |
1018 | ret |
1015 | ret |
1019 | .fail: |
1016 | .fail: |
1020 | or eax, -1 |
1017 | or eax, -1 |
1021 | ret |
1018 | ret |
1022 | endp |
1019 | endp |
1023 | 1020 | ||
1024 | ; param |
1021 | ; param |
1025 | ; eax= mix_list |
1022 | ; eax= mix_list |
1026 | 1023 | ||
1027 | align 4 |
1024 | align 4 |
1028 | do_mix_list: |
1025 | do_mix_list: |
1029 | 1026 | ||
1030 | xor edx, edx |
1027 | xor edx, edx |
1031 | mov esi, str.fd-FD_OFFSET |
1028 | mov esi, str.fd-FD_OFFSET |
1032 | mov ebx, [esi+STREAM.str_fd] |
1029 | mov ebx, [esi+STREAM.str_fd] |
1033 | @@: |
1030 | @@: |
1034 | cmp ebx, esi |
1031 | cmp ebx, esi |
1035 | je .done |
1032 | je .done |
1036 | 1033 | ||
1037 | cmp [ebx+STREAM.magic], 'WAVE' |
1034 | cmp [ebx+STREAM.magic], 'WAVE' |
1038 | jne .next |
1035 | jne .next |
1039 | 1036 | ||
1040 | cmp [ebx+STREAM.size], STREAM_SIZE |
1037 | cmp [ebx+STREAM.size], STREAM_SIZE |
1041 | jne .next |
1038 | jne .next |
1042 | 1039 | ||
1043 | cmp [ebx+STREAM.flags], SND_PLAY; |
1040 | cmp [ebx+STREAM.flags], SND_PLAY; |
1044 | jne .next |
1041 | jne .next |
1045 | 1042 | ||
1046 | mov ecx, [ebx+STREAM.out_count] |
1043 | mov ecx, [ebx+STREAM.out_count] |
1047 | test ecx, ecx |
1044 | test ecx, ecx |
1048 | jnz .l1 |
1045 | jnz .l1 |
1049 | 1046 | ||
1050 | test [ebx+STREAM.format], PCM_RING |
1047 | test [ebx+STREAM.format], PCM_RING |
1051 | jnz .next |
1048 | jnz .next |
1052 | mov [ebx+STREAM.flags], SND_STOP |
1049 | mov [ebx+STREAM.flags], SND_STOP |
1053 | jmp .next |
1050 | jmp .next |
1054 | .l1: |
1051 | .l1: |
1055 | cmp ecx, 512 |
1052 | cmp ecx, 512 |
1056 | jae .add_buff |
1053 | jae .add_buff |
1057 | 1054 | ||
1058 | mov edi, [ebx+STREAM.out_rp] |
1055 | mov edi, [ebx+STREAM.out_rp] |
1059 | add edi, ecx |
1056 | add edi, ecx |
1060 | sub ecx, 512 |
1057 | sub ecx, 512 |
1061 | neg ecx |
1058 | neg ecx |
1062 | push eax |
1059 | push eax |
1063 | xor eax, eax |
1060 | xor eax, eax |
1064 | cld |
1061 | cld |
1065 | rep stosb |
1062 | rep stosb |
1066 | pop eax |
1063 | pop eax |
1067 | 1064 | ||
1068 | mov [ebx+STREAM.out_count], 512 |
1065 | mov [ebx+STREAM.out_count], 512 |
1069 | 1066 | ||
1070 | .add_buff: |
1067 | .add_buff: |
1071 | mov ecx, [ebx+STREAM.out_rp] |
1068 | mov ecx, [ebx+STREAM.out_rp] |
1072 | mov [eax],ecx |
1069 | mov [eax],ecx |
1073 | 1070 | ||
1074 | if USE_SSE2_MIXER |
1071 | if USE_SSE2_MIXER |
1075 | mov edi, dword [ebx+STREAM.l_amp_f] |
1072 | mov edi, dword [ebx+STREAM.l_amp_f] |
1076 | mov [eax+4], edi |
1073 | mov [eax+4], edi |
1077 | mov edi, dword [ebx+STREAM.r_amp_f] |
1074 | mov edi, dword [ebx+STREAM.r_amp_f] |
1078 | mov [eax+8], edi |
1075 | mov [eax+8], edi |
1079 | else |
1076 | else |
1080 | mov edi, dword [ebx+STREAM.l_amp] |
1077 | mov edi, dword [ebx+STREAM.l_amp] |
1081 | mov [eax+4], edi |
1078 | mov [eax+4], edi |
1082 | end if |
1079 | end if |
1083 | add [ebx+STREAM.out_rp], 512 |
1080 | add [ebx+STREAM.out_rp], 512 |
1084 | sub [ebx+STREAM.out_count], 512 |
1081 | sub [ebx+STREAM.out_count], 512 |
1085 | 1082 | ||
1086 | add eax, 12 |
1083 | add eax, 12 |
1087 | inc edx |
1084 | inc edx |
1088 | .next: |
1085 | .next: |
1089 | mov ebx, [ebx+STREAM.str_fd] |
1086 | mov ebx, [ebx+STREAM.str_fd] |
1090 | jmp @B |
1087 | jmp @B |
1091 | .done: |
1088 | .done: |
1092 | mov eax, edx |
1089 | mov eax, edx |
1093 | ret |
1090 | ret |
1094 | 1091 | ||
1095 | align 4 |
1092 | align 4 |
1096 | prepare_playlist: |
1093 | prepare_playlist: |
1097 | 1094 | ||
1098 | xor edx, edx |
1095 | xor edx, edx |
1099 | mov [play_count], edx |
1096 | mov [play_count], edx |
1100 | mov esi, str.fd-FD_OFFSET |
1097 | mov esi, str.fd-FD_OFFSET |
1101 | mov edi, [esi+STREAM.str_fd] |
1098 | mov edi, [esi+STREAM.str_fd] |
1102 | @@: |
1099 | @@: |
1103 | cmp edi, esi |
1100 | cmp edi, esi |
1104 | je .done |
1101 | je .done |
1105 | 1102 | ||
1106 | cmp [edi+STREAM.magic], 'WAVE' |
1103 | cmp [edi+STREAM.magic], 'WAVE' |
1107 | jne .next |
1104 | jne .next |
1108 | 1105 | ||
1109 | cmp [edi+STREAM.size], STREAM_SIZE |
1106 | cmp [edi+STREAM.size], STREAM_SIZE |
1110 | jne .next |
1107 | jne .next |
1111 | 1108 | ||
1112 | cmp [edi+STREAM.flags], SND_PLAY; |
1109 | cmp [edi+STREAM.flags], SND_PLAY; |
1113 | jne .next |
1110 | jne .next |
1114 | 1111 | ||
1115 | mov [play_list+edx], edi |
1112 | mov [play_list+edx], edi |
1116 | inc [play_count] |
1113 | inc [play_count] |
1117 | add edx, 4 |
1114 | add edx, 4 |
1118 | .next: |
1115 | .next: |
1119 | mov edi, [edi+STREAM.str_fd] |
1116 | mov edi, [edi+STREAM.str_fd] |
1120 | jmp @B |
1117 | jmp @B |
1121 | .done: |
1118 | .done: |
1122 | ret |
1119 | ret |
1123 | 1120 | ||
1124 | align 4 |
1121 | align 4 |
1125 | proc set_handler stdcall, hsrv:dword, handler_proc:dword |
1122 | proc set_handler stdcall, hsrv:dword, handler_proc:dword |
1126 | locals |
1123 | locals |
1127 | handler dd ? |
1124 | handler dd ? |
1128 | io_code dd ? |
1125 | io_code dd ? |
1129 | input dd ? |
1126 | input dd ? |
1130 | inp_size dd ? |
1127 | inp_size dd ? |
1131 | output dd ? |
1128 | output dd ? |
1132 | out_size dd ? |
1129 | out_size dd ? |
1133 | val dd ? |
1130 | val dd ? |
1134 | endl |
1131 | endl |
1135 | 1132 | ||
1136 | mov eax, [hsrv] |
1133 | mov eax, [hsrv] |
1137 | lea ecx, [handler_proc] |
1134 | lea ecx, [handler_proc] |
1138 | xor ebx, ebx |
1135 | xor ebx, ebx |
1139 | 1136 | ||
1140 | mov [handler], eax |
1137 | mov [handler], eax |
1141 | mov [io_code], DEV_CALLBACK |
1138 | mov [io_code], DEV_CALLBACK |
1142 | mov [input], ecx |
1139 | mov [input], ecx |
1143 | mov [inp_size], 4 |
1140 | mov [inp_size], 4 |
1144 | mov [output], ebx |
1141 | mov [output], ebx |
1145 | mov [out_size], 0 |
1142 | mov [out_size], 0 |
1146 | 1143 | ||
1147 | lea eax, [handler] |
1144 | lea eax, [handler] |
1148 | stdcall ServiceHandler, eax |
1145 | stdcall ServiceHandler, eax |
1149 | ret |
1146 | ret |
1150 | endp |
1147 | endp |
1151 | 1148 | ||
1152 | align 4 |
1149 | align 4 |
1153 | proc dev_play stdcall, hsrv:dword |
1150 | proc dev_play stdcall, hsrv:dword |
1154 | locals |
1151 | locals |
1155 | handle dd ? |
1152 | handle dd ? |
1156 | io_code dd ? |
1153 | io_code dd ? |
1157 | input dd ? |
1154 | input dd ? |
1158 | inp_size dd ? |
1155 | inp_size dd ? |
1159 | output dd ? |
1156 | output dd ? |
1160 | out_size dd ? |
1157 | out_size dd ? |
1161 | val dd ? |
1158 | val dd ? |
1162 | endl |
1159 | endl |
1163 | 1160 | ||
1164 | mov eax, [hsrv] |
1161 | mov eax, [hsrv] |
1165 | xor ebx, ebx |
1162 | xor ebx, ebx |
1166 | 1163 | ||
1167 | mov [handle], eax |
1164 | mov [handle], eax |
1168 | mov [io_code], DEV_PLAY |
1165 | mov [io_code], DEV_PLAY |
1169 | mov [input], ebx |
1166 | mov [input], ebx |
1170 | mov [inp_size], ebx |
1167 | mov [inp_size], ebx |
1171 | mov [output], ebx |
1168 | mov [output], ebx |
1172 | mov [out_size], ebx |
1169 | mov [out_size], ebx |
1173 | 1170 | ||
1174 | lea eax, [handle] |
1171 | lea eax, [handle] |
1175 | stdcall ServiceHandler, eax |
1172 | stdcall ServiceHandler, eax |
1176 | ret |
1173 | ret |
1177 | endp |
1174 | endp |
1178 | 1175 | ||
1179 | if 0 |
1176 | if 0 |
1180 | align 4 |
1177 | align 4 |
1181 | dword2str: |
1178 | dword2str: |
1182 | mov esi, hex_buff |
1179 | mov esi, hex_buff |
1183 | mov ecx, -8 |
1180 | mov ecx, -8 |
1184 | @@: |
1181 | @@: |
1185 | rol eax, 4 |
1182 | rol eax, 4 |
1186 | mov ebx, eax |
1183 | mov ebx, eax |
1187 | and ebx, 0x0F |
1184 | and ebx, 0x0F |
1188 | mov bl, [ebx+hexletters] |
1185 | mov bl, [ebx+hexletters] |
1189 | mov [8+esi+ecx], bl |
1186 | mov [8+esi+ecx], bl |
1190 | inc ecx |
1187 | inc ecx |
1191 | jnz @B |
1188 | jnz @B |
1192 | ret |
1189 | ret |
1193 | 1190 | ||
1194 | hexletters db '0123456789ABCDEF' |
1191 | hexletters db '0123456789ABCDEF' |
1195 | hex_buff db 8 dup(0),13,10,0 |
1192 | hex_buff db 8 dup(0),13,10,0 |
1196 | 1193 | ||
1197 | end if |
1194 | end if |
1198 | 1195 | ||
1199 | include 'mixer.asm' |
1196 | include 'mixer.asm' |
1200 | include 'mix_mmx.inc' |
1197 | include 'mix_mmx.inc' |
1201 | include 'mix_sse2.inc' |
1198 | include 'mix_sse2.inc' |
1202 | 1199 | ||
1203 | ;if USE_SSE |
1200 | ;if USE_SSE |
1204 | ; include 'mix_sse.inc' |
1201 | ; include 'mix_sse.inc' |
1205 | ;end if |
1202 | ;end if |
1206 | 1203 | ||
1207 | align 16 |
1204 | align 16 |
1208 | resampler_params: |
1205 | resampler_params: |
1209 | ;r_size r_dt resampler_func |
1206 | ;r_size r_dt resampler_func |
1210 | dd 0,0,0 ; 0 PCM_ALL |
1207 | dd 0,0,0 ; 0 PCM_ALL |
1211 | dd 16384, 0, copy_stream ; 1 PCM_2_16_48 |
1208 | dd 16384, 0, copy_stream ; 1 PCM_2_16_48 |
1212 | dd 16384, 0, m16_stereo ; 2 PCM_1_16_48 |
1209 | dd 8192, 0, m16_stereo ; 2 PCM_1_16_48 |
1213 | 1210 | ||
1214 | dd 16384, 30109, resample_2 ; 3 PCM_2_16_44 |
1211 | dd 16384, 30109, resample_2 ; 3 PCM_2_16_44 |
1215 | dd 8192, 30109, resample_1 ; 4 PCM_1_16_44 |
1212 | dd 8192, 30109, resample_1 ; 4 PCM_1_16_44 |
1216 | 1213 | ||
1217 | dd 16384, 21846, resample_2 ; 5 PCM_2_16_32 |
1214 | dd 16384, 21846, resample_2 ; 5 PCM_2_16_32 |
1218 | dd 8192, 21846, resample_1 ; 6 PCM_1_16_32 |
1215 | dd 8192, 21846, resample_1 ; 6 PCM_1_16_32 |
1219 | 1216 | ||
1220 | dd 16384, 16384, resample_2 ; 7 PCM_2_16_24 |
1217 | dd 16384, 16384, resample_2 ; 7 PCM_2_16_24 |
1221 | dd 8192, 16384, resample_1 ; 8 PCM_1_16_24 |
1218 | dd 8192, 16384, resample_1 ; 8 PCM_1_16_24 |
1222 | 1219 | ||
1223 | dd 8192, 15052, resample_2 ; 9 PCM_2_16_22 |
1220 | dd 8192, 15052, resample_2 ; 9 PCM_2_16_22 |
1224 | dd 4096, 15052, resample_1 ;10 PCM_1_16_22 |
1221 | dd 4096, 15052, resample_1 ;10 PCM_1_16_22 |
1225 | 1222 | ||
1226 | dd 8192, 10923, resample_2 ;11 PCM_2_16_16 |
1223 | dd 8192, 10923, resample_2 ;11 PCM_2_16_16 |
1227 | dd 4096, 10923, resample_1 ;12 PCM_1_16_16 |
1224 | dd 4096, 10923, resample_1 ;12 PCM_1_16_16 |
1228 | 1225 | ||
1229 | dd 8192, 8192, resample_2 ;13 PCM_2_16_12 |
1226 | dd 8192, 8192, resample_2 ;13 PCM_2_16_12 |
1230 | dd 4096, 8192, resample_1 ;14 PCM_1_16_12 |
1227 | dd 4096, 8192, resample_1 ;14 PCM_1_16_12 |
1231 | 1228 | ||
1232 | dd 4096, 7527, resample_2 ;15 PCM_2_16_11 |
1229 | dd 4096, 7527, resample_2 ;15 PCM_2_16_11 |
1233 | dd 2048, 7527, resample_1 ;16 PCM_1_16_11 |
1230 | dd 2048, 7527, resample_1 ;16 PCM_1_16_11 |
1234 | 1231 | ||
1235 | dd 4096, 5462, resample_2 ;17 PCM_2_16_8 |
1232 | dd 4096, 5462, resample_2 ;17 PCM_2_16_8 |
1236 | dd 2048, 5462, resample_1 ;18 PCM_1_16_8 |
1233 | dd 2048, 5462, resample_1 ;18 PCM_1_16_8 |
1237 | 1234 | ||
1238 | dd 16384, 0, s8_stereo ;19 PCM_2_8_48 |
1235 | dd 16384, 0, s8_stereo ;19 PCM_2_8_48 |
1239 | dd 8192, 0, m8_stereo ;20 PCM_1_8_48 |
1236 | dd 8192, 0, m8_stereo ;20 PCM_1_8_48 |
1240 | 1237 | ||
1241 | dd 8192, 30109, resample_28 ;21 PCM_2_8_44 |
1238 | dd 8192, 30109, resample_28 ;21 PCM_2_8_44 |
1242 | dd 4096, 30109, resample_18 ;22 PCM_1_8_44 |
1239 | dd 4096, 30109, resample_18 ;22 PCM_1_8_44 |
1243 | 1240 | ||
1244 | dd 8192, 21846, resample_28 ;23 PCM_2_8_32 |
1241 | dd 8192, 21846, resample_28 ;23 PCM_2_8_32 |
1245 | dd 4096, 21846, resample_18 ;24 PCM_1_8_32 |
1242 | dd 4096, 21846, resample_18 ;24 PCM_1_8_32 |
1246 | 1243 | ||
1247 | dd 8192, 16384, resample_28 ;25 PCM_2_8_24 |
1244 | dd 8192, 16384, resample_28 ;25 PCM_2_8_24 |
1248 | dd 4096, 16384, resample_18 ;26 PCM_1_8_24 |
1245 | dd 4096, 16384, resample_18 ;26 PCM_1_8_24 |
1249 | 1246 | ||
1250 | dd 4096, 15052, resample_28 ;27 PCM_2_8_22 |
1247 | dd 4096, 15052, resample_28 ;27 PCM_2_8_22 |
1251 | dd 2048, 15052, resample_18 ;28 PCM_1_8_22 |
1248 | dd 2048, 15052, resample_18 ;28 PCM_1_8_22 |
1252 | 1249 | ||
1253 | dd 4096, 10923, resample_28 ;29 PCM_2_8_16 |
1250 | dd 4096, 10923, resample_28 ;29 PCM_2_8_16 |
1254 | dd 2048, 10923, resample_18 ;30 PCM_1_8_16 |
1251 | dd 2048, 10923, resample_18 ;30 PCM_1_8_16 |
1255 | 1252 | ||
1256 | dd 4096, 8192, resample_28 ;31 PCM_2_8_12 |
1253 | dd 4096, 8192, resample_28 ;31 PCM_2_8_12 |
1257 | dd 2048, 8192, resample_18 ;32 PCM_1_8_12 |
1254 | dd 2048, 8192, resample_18 ;32 PCM_1_8_12 |
1258 | 1255 | ||
1259 | dd 2048, 7527, resample_28 ;33 PCM_2_8_11 |
1256 | dd 2048, 7527, resample_28 ;33 PCM_2_8_11 |
1260 | dd 1024, 7527, resample_18 ;34 PCM_1_8_11 |
1257 | dd 1024, 7527, resample_18 ;34 PCM_1_8_11 |
1261 | 1258 | ||
1262 | dd 2048, 5462, resample_28 ;35 PCM_2_8_8 |
1259 | dd 2048, 5462, resample_28 ;35 PCM_2_8_8 |
1263 | dd 1024, 5462, resample_18 ;36 PCM_1_8_8 |
1260 | dd 1024, 5462, resample_18 ;36 PCM_1_8_8 |
1264 | 1261 | ||
1265 | m7 dw 0x8000,0x8000,0x8000,0x8000 |
1262 | m7 dw 0x8000,0x8000,0x8000,0x8000 |
1266 | mm80 dq 0x8080808080808080 |
1263 | mm80 dq 0x8080808080808080 |
1267 | mm_mask dq 0xFF00FF00FF00FF00 |
1264 | mm_mask dq 0xFF00FF00FF00FF00 |
1268 | 1265 | ||
1269 | vol_max dd 0x00000000,0x00000000 |
1266 | vol_max dd 0x00000000,0x00000000 |
1270 | vol_min dd 0x0000D8F0,0x0000D8F0 |
1267 | vol_min dd 0x0000D8F0,0x0000D8F0 |
1271 | pan_max dd 0x00002710,0x00002710 |
1268 | pan_max dd 0x00002710,0x00002710 |
1272 | 1269 | ||
1273 | ;stream_map dd 0xFFFF ; 16 |
1270 | ;stream_map dd 0xFFFF ; 16 |
1274 | version dd (5 shl 16) or SOUND_VERSION |
1271 | version dd (5 shl 16) or SOUND_VERSION |
1275 | 1272 | ||
1276 | szInfinity db 'INFINITY',0 |
1273 | szInfinity db 'INFINITY',0 |
1277 | szSound db 'SOUND',0 |
1274 | szSound db 'SOUND',0 |
1278 | 1275 | ||
1279 | if DEBUG |
1276 | if DEBUG |
1280 | msgFail db 'Sound service not loaded',13,10,0 |
1277 | msgFail db 'Sound service not loaded',13,10,0 |
1281 | msgPlay db 'Play buffer',13,10,0 |
1278 | msgPlay db 'Play buffer',13,10,0 |
1282 | msgStop db 'Stop',13,10,0 |
1279 | msgStop db 'Stop',13,10,0 |
1283 | msgUser db 'User callback',13,10,0 |
1280 | msgUser db 'User callback',13,10,0 |
1284 | msgMem db 'Not enough memory',13,10,0 |
1281 | msgMem db 'Not enough memory',13,10,0 |
1285 | msgDestroy db 'Destroy sound buffer', 13,10,0 |
1282 | msgDestroy db 'Destroy sound buffer', 13,10,0 |
1286 | msgWaveout db 'Play waveout', 13,10,0 |
1283 | msgWaveout db 'Play waveout', 13,10,0 |
1287 | msgSetVolume db 'Set volume',13,10,0 |
1284 | msgSetVolume db 'Set volume',13,10,0 |
1288 | end if |
1285 | end if |
1289 | 1286 | ||
1290 | section '.data' data readable writable align 16 |
1287 | section '.data' data readable writable align 16 |
1291 | 1288 | ||
1292 | play_list rd 16 |
1289 | play_list rd 16 |
1293 | mix_input rd 16 |
1290 | mix_input rd 16 |
1294 | play_count rd 1 |
1291 | play_count rd 1 |
1295 | hSound rd 1 |
1292 | hSound rd 1 |
1296 | eng_state rd 1 |
1293 | eng_state rd 1 |
1297 | mix_buff rd 1 |
1294 | mix_buff rd 1 |
1298 | mix_buff_map rd 1 |
1295 | mix_buff_map rd 1 |
1299 | str.fd rd 1 |
1296 | str.fd rd 1 |
1300 | str.bk rd 1 |
1297 | str.bk rd 1 |
1301 | 1298 | ||
1302 | mix_2_core rd 1 |
1299 | mix_2_core rd 1 |
1303 | mix_3_core rd 1 |
1300 | mix_3_core rd 1 |
1304 | mix_4_core rd 1 |
1301 | mix_4_core rd 1 |