Subversion Repositories Kolibri OS

Rev

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