Subversion Repositories Kolibri OS

Rev

Rev 346 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 346 Rev 378
Line 24... Line 24...
24
                        ;and reduce driver size
24
                        ;and reduce driver size
25
;USE_SSE         equ 0
25
;USE_SSE          equ 0
Line 26... Line 26...
26
 
26
 
Line 27... Line -...
27
DEBUG            equ 1
-
 
Line 28... Line 27...
28
 
27
DEBUG             equ 1
29
EVENT_NOTIFY     equ 0x00000200
28
 
30
 
29
 
Line 31... Line 30...
31
OS_BASE          equ 0
30
OS_BASE           equ 0
32
new_app_base     equ 0x60400000
31
new_app_base      equ 0x80000000
Line 33... Line -...
33
PROC_BASE        equ OS_BASE+0x0080000
-
 
34
 
32
PROC_BASE         equ OS_BASE+0x0080000
35
CAPS_SSE2        equ 26
33
 
36
PG_SW            equ 0x003
34
CAPS_SSE2         equ 26
Line -... Line 35...
-
 
35
PG_SW             equ 0x003
37
 
36
 
38
 
37
public START
39
public START
38
public service_proc
-
 
39
public version
40
public service_proc
40
 
-
 
41
RT_INP_EMPTY      equ 0xFF000001
-
 
42
RT_OUT_EMPTY      equ 0xFF000002
41
public version
43
RT_INP_FULL       equ 0xFF000003
Line 42... Line 44...
42
 
44
RT_OUT_FULL       equ 0xFF000004
43
SND_CREATE_BUFF     equ 2
45
 
44
SND_PLAY            equ 3
46
EVENT_WATCHED     equ 0x10000000
Line 102... Line 104...
102
           mov [mix_2_core], mmx128_mix_2
104
           mov [mix_2_core], mmx128_mix_2
103
           mov [mix_3_core], mmx128_mix_3
105
           mov [mix_3_core], mmx128_mix_3
104
           mov [mix_4_core], mmx128_mix_4
106
           mov [mix_4_core], mmx128_mix_4
105
end if
107
end if
Line -... Line 108...
-
 
108
 
-
 
109
if 0
106
 
110
 
107
if ~(FORCE_MMX or FORCE_MMX_128)  ;autodetect
111
if ~(FORCE_MMX or FORCE_MMX_128)  ;autodetect
108
           mov eax, 1
112
           mov eax, 1
109
           cpuid
113
           cpuid
110
           bt edx, CAPS_SSE2
114
           bt edx, CAPS_SSE2
Line 118... Line 122...
118
           mov [mix_2_core], mmx128_mix_2
122
           mov [mix_2_core], mmx128_mix_2
119
           mov [mix_3_core], mmx128_mix_3
123
           mov [mix_3_core], mmx128_mix_3
120
           mov [mix_4_core], mmx128_mix_4
124
           mov [mix_4_core], mmx128_mix_4
121
@@:
125
@@:
122
end if
126
end if
-
 
127
 
-
 
128
end if
123
           stdcall set_handler, [hSound], new_mix
129
           stdcall set_handler, [hSound], new_mix
-
 
130
           mov [eng_state], SND_STOP
124
           stdcall RegService, szInfinity, service_proc
131
           stdcall RegService, szInfinity, service_proc
125
           ret
132
           ret
126
.fail:
133
.fail:
127
     if DEBUG
134
     if DEBUG
128
           mov esi, msgFail
135
           mov esi, msgFail
Line 152... Line 159...
152
proc service_proc stdcall, ioctl:dword
159
proc service_proc stdcall, ioctl:dword
Line 153... Line 160...
153
 
160
 
154
           mov edi, [ioctl]
161
           mov edi, [ioctl]
Line -... Line 162...
-
 
162
           mov eax, [edi+io_code]
-
 
163
 
-
 
164
           cmp eax, SRV_GETVERSION
-
 
165
           jne @F
-
 
166
           mov eax, [edi+output]
-
 
167
           mov eax, [eax]
-
 
168
           mov [eax+new_app_base], dword SOUND_VERSION
-
 
169
           xor eax, eax
155
           mov eax, [edi+io_code]
170
           ret
156
 
171
@@:
157
           cmp eax, SND_CREATE_BUFF
172
           cmp eax, SND_CREATE_BUFF
-
 
173
           jne @F
158
           jne @F
174
           mov ebx, [edi+input]
-
 
175
           push edi
-
 
176
           stdcall CreateBuffer,[ebx],[ebx+4]
-
 
177
           pop edi
-
 
178
           mov ecx, [edi+output]
159
           mov ebx, [edi+input]
179
           mov ecx, [ecx]
160
           stdcall CreateBuffer,[ebx]
180
           mov [ecx+new_app_base], ebx
161
           ret
-
 
162
@@:
-
 
163
           cmp eax, SND_PLAY
-
 
164
           jne @F
181
           ret
165
 
182
@@:
-
 
183
           mov ebx, [edi+input]
-
 
184
           mov edx, [ebx]
-
 
185
 
-
 
186
           cmp [edx+STREAM.magic], 'WAVE'
-
 
187
           jne .fail
-
 
188
 
-
 
189
           cmp [edx+STREAM.size], STREAM_SIZE
-
 
190
           jne .fail
-
 
191
 
-
 
192
           cmp eax, SND_DESTROY_BUFF
-
 
193
           jne @F
166
           mov ebx, [edi+input]
194
           mov eax, edx
167
           stdcall play_buffer, [ebx]
195
           call DestroyBuffer    ;edx= stream
168
           ret
196
           ret
-
 
197
@@:
-
 
198
           cmp eax, SND_SETFORMAT
-
 
199
           jne @F
-
 
200
           stdcall SetFormat,[ebx],[ebx+4]
-
 
201
           ret
169
@@:
202
@@:
Line -... Line 203...
-
 
203
           cmp eax, SND_GETFORMAT
-
 
204
           jne @F
-
 
205
 
-
 
206
           movzx eax, word [edx+STREAM.format]
-
 
207
           mov ecx, [edi+output]
170
           cmp eax, SND_STOP
208
           mov ecx, [ecx]
-
 
209
           mov [ecx+new_app_base], eax
171
           jne @F
210
           xor eax, eax
-
 
211
           ret
-
 
212
@@:
-
 
213
           cmp eax, SND_RESET
-
 
214
           jne @F
172
 
215
           stdcall ResetBuffer,[ebx],[ebx+4]
-
 
216
           ret
-
 
217
@@:
173
;       if DEBUG
218
           cmp eax, SND_SETPOS
174
;          mov esi, msgStop
219
           jne @F
-
 
220
           stdcall SetBufferPos,[ebx],[ebx+4]
-
 
221
           ret
-
 
222
@@:
-
 
223
           cmp eax, SND_GETPOS
-
 
224
           jne @F
175
;          call   [SysMsgBoardStr]
225
           push edi
-
 
226
           stdcall GetBufferPos, [ebx]
176
;       end if
227
           pop edi
177
 
228
           mov ecx, [edi+output]
178
           mov ebx, [edi+input]
229
           mov ecx, [ecx]
179
           stdcall stop_buffer, [ebx]
230
           mov [ecx+new_app_base], ebx
180
           ret
231
           ret
181
@@:
-
 
182
           cmp eax, SND_SETBUFF
-
 
183
           jne @F
232
@@:
184
 
233
           cmp eax, SND_SETBUFF
185
           mov ebx, [edi+input]
234
           jne @F
186
           mov eax, [ebx+4]
235
           mov eax, [ebx+4]
187
           add eax, new_app_base
236
           add eax, new_app_base
188
           stdcall set_buffer, [ebx],eax,[ebx+8],[ebx+12]
237
           stdcall set_buffer, [ebx],eax,[ebx+8],[ebx+12]
-
 
238
           ret
-
 
239
@@:
-
 
240
           cmp eax, SND_SETVOLUME
-
 
241
           jne @F
-
 
242
           stdcall SetBufferVol,[ebx],[ebx+4],[ebx+8]
189
           ret
243
           ret
Line 190... Line 244...
190
@@:
244
@@:
191
           cmp eax, SND_DESTROY_BUFF
245
           cmp eax, SND_GETVOLUME
-
 
246
           jne @F
-
 
247
 
-
 
248
           mov eax, [edi+output]
192
           jne @F
249
           mov ecx, [eax]
193
 
250
           mov eax, [eax+4]
194
           mov eax, [edi+input]
251
           add ecx, new_app_base
-
 
252
           add eax, new_app_base
-
 
253
           stdcall GetBufferVol,[ebx],ecx,eax
-
 
254
           ret
-
 
255
@@:
-
 
256
           cmp eax, SND_SETPAN
-
 
257
           jne @F
-
 
258
           stdcall SetBufferPan,[ebx],[ebx+4]
-
 
259
           ret
-
 
260
@@:
-
 
261
           cmp eax, SND_GETPAN
-
 
262
           jne @F
-
 
263
           mov eax, [edx+STREAM.pan]
-
 
264
           mov ebx, [edi+output]
-
 
265
           mov ebx, [ebx]
-
 
266
           mov [ebx+new_app_base], eax
-
 
267
           xor eax, eax
-
 
268
           ret
-
 
269
@@:
-
 
270
           cmp eax, SND_OUT
-
 
271
           jne @F
-
 
272
 
-
 
273
           mov eax, [ebx+4]
-
 
274
           add eax, new_app_base
-
 
275
           stdcall wave_out, [ebx],eax,[ebx+8]
-
 
276
           ret
-
 
277
@@:
-
 
278
           cmp eax, SND_PLAY
-
 
279
           jne @F
-
 
280
 
-
 
281
           stdcall play_buffer, [ebx],[ebx+4]
-
 
282
           ret
-
 
283
@@:
-
 
284
           cmp eax, SND_STOP
-
 
285
           jne @F
-
 
286
 
-
 
287
           stdcall stop_buffer, [ebx]
-
 
288
           ret
-
 
289
@@:
-
 
290
           cmp eax, SND_GETBUFFSIZE
-
 
291
           jne @F
195
           mov eax, [eax]
292
           mov eax, [edx+STREAM.in_size]
196
           call DestroyBuffer    ;eax
293
           mov ecx, [edi+output]
-
 
294
           mov ecx, [ecx]
-
 
295
           mov [ecx+new_app_base], eax
-
 
296
           xor eax, eax
-
 
297
           ret
197
           ret
298
@@:
Line 198... Line 299...
198
@@:
299
.fail:
199
           xor eax, eax
300
           or eax, -1
200
           ret
301
           ret
Line 208... Line 309...
208
restore   out_size
309
restore   out_size
Line 209... Line 310...
209
 
310
 
210
TASK_COUNT    equ 0x0003004
311
TASK_COUNT    equ 0x0003004
Line -... Line 312...
-
 
312
CURRENT_TASK  equ 0x0003000
211
CURRENT_TASK  equ 0x0003000
313
 
212
 
314
 
213
align 4
315
align 4
214
proc CreateBuffer stdcall, format:dword
316
proc CreateBuffer stdcall, format:dword, size:dword
-
 
317
           locals
-
 
318
             str         dd ?
215
           locals
319
             ring_size   dd ?
Line -... Line 320...
-
 
320
             ring_pages  dd ?
-
 
321
           endl
-
 
322
 
-
 
323
           mov eax, [format]
-
 
324
           cmp ax, PCM_1_8_8
-
 
325
           ja .fail
-
 
326
 
-
 
327
           test eax, PCM_OUT
-
 
328
           jnz .test_out
-
 
329
           test eax, PCM_RING
-
 
330
           jnz .test_ring
-
 
331
;staic
-
 
332
           test eax, PCM_OUT+PCM_RING
-
 
333
           jnz .fail
-
 
334
           jmp .test_ok
-
 
335
.test_out:
-
 
336
           test eax, PCM_RING+PCM_STATIC
-
 
337
           jnz .fail
-
 
338
           jmp .test_ok
-
 
339
.test_ring:
216
             str dd ?
340
           test eax, PCM_OUT+PCM_STATIC
217
           endl
341
           jnz .fail
218
 
342
.test_ok:
219
           mov ebx, [CURRENT_TASK]      ;hack: direct accsess
343
           mov ebx, [CURRENT_TASK]      ;hack: direct accsess
Line 220... Line 344...
220
           shl ebx, 5                   ;to kernel data
344
           shl ebx, 5                   ;to kernel data
221
           mov ebx, [0x3000+ebx+4]
345
           mov ebx, [0x3000+ebx+4]
222
           mov eax, STREAM_SIZE
346
           mov eax, STREAM_SIZE
223
 
347
 
Line 224... Line 348...
224
           call CreateObject
348
           call CreateObject
225
           test eax, eax
-
 
226
           jz .fail
349
           test eax, eax
Line 227... Line 350...
227
           mov [str], eax
350
           jz .fail
228
 
351
           mov [str], eax
229
           mov [eax+STREAM.magic], 'WAVE'
352
 
230
           mov [eax+STREAM.destroy], DestroyBuffer.destroy
353
           mov ebx, [format]
231
           mov [eax+STREAM.size], STREAM_SIZE
354
           mov [eax+STREAM.format], ebx
-
 
355
 
232
 
356
           xor ecx, ecx
233
           pushf
-
 
234
           cli
-
 
235
           mov ebx, str.fd-FD_OFFSET
-
 
Line -... Line 357...
-
 
357
           movzx ebx, bx
236
           mov edx, [ebx+STREAM.str_fd]
358
           cmp ebx, 19
Line -... Line 359...
-
 
359
           jb @f
-
 
360
           mov ecx, 0x80808080
-
 
361
@@:
-
 
362
           mov [eax+STREAM.r_silence], ecx
-
 
363
 
-
 
364
           shl ebx, 2
-
 
365
           lea ebx, [ebx+ebx*2]     ;ebx*=12
-
 
366
 
-
 
367
           mov ecx, [resampler_params+ebx]
-
 
368
           mov edx, [resampler_params+ebx+4]
-
 
369
           mov esi, [resampler_params+ebx+8]
-
 
370
 
-
 
371
           mov [eax+STREAM.r_size],ecx
-
 
372
           mov [eax+STREAM.r_dt],  edx
-
 
373
           mov [eax+STREAM.resample], esi
-
 
374
           xor ecx, ecx
-
 
375
           mov [eax+STREAM.l_vol], ecx
-
 
376
           mov [eax+STREAM.r_vol], ecx
-
 
377
           mov dword [eax+STREAM.l_amp], 0x7FFF7FFF
-
 
378
           mov [eax+STREAM.pan], ecx
-
 
379
 
-
 
380
           test [format], PCM_STATIC
-
 
381
           jnz .static
-
 
382
 
-
 
383
; ring and waveout
-
 
384
 
-
 
385
           mov eax, 0x10000
-
 
386
           test [format], PCM_RING
-
 
387
           jz .waveout
-
 
388
 
-
 
389
           mov eax, [eax+STREAM.r_size]
-
 
390
           add eax, 4095
-
 
391
           and eax, -4096
-
 
392
           add eax, eax
-
 
393
.waveout:
-
 
394
           mov [ring_size], eax
-
 
395
           mov ebx, eax
-
 
396
           shr ebx, 12
-
 
397
           mov [ring_pages], ebx
-
 
398
 
-
 
399
           add eax, eax              ;double ring size
-
 
400
           stdcall AllocKernelSpace, eax
-
 
401
 
-
 
402
           mov edi, [str]
-
 
403
           mov ecx, [ring_size]
-
 
404
           mov [edi+STREAM.in_base], eax
-
 
405
           mov [edi+STREAM.in_size], ecx
-
 
406
           add eax, 128
-
 
407
           sub ecx, 128
-
 
408
           mov [edi+STREAM.in_wp], eax
-
 
409
           mov [edi+STREAM.in_rp], eax
237
           mov [eax+STREAM.str_fd], edx
410
           mov [edi+STREAM.in_count], 0
238
           mov [eax+STREAM.str_bk], ebx
411
 
239
           mov [ebx+STREAM.str_fd], eax
412
           mov [edi+STREAM.in_free], ecx
240
           mov [edx+STREAM.str_bk], eax
413
           add eax, ecx
241
           popf
414
           mov [edi+STREAM.in_top], eax
242
 
-
 
243
           stdcall KernelAlloc, dword 72*1024
415
 
244
 
416
           mov ebx, [ring_pages]
245
           mov edi, [str]
417
           stdcall AllocPages, ebx
246
           mov [edi+STREAM.base], eax
418
           mov edi, [str]
247
           add eax, 0x1000
-
 
248
           mov [edi+STREAM.seg_0], eax
419
           mov ebx, [edi+STREAM.in_base]
249
           mov [edi+STREAM.curr_seg], eax
420
           mov ecx, [ring_pages]
250
           mov [edi+STREAM.notify_off1], eax
421
           or eax, PG_SW
Line 251... Line 422...
251
           add eax, 0x8000
422
           push eax
-
 
423
           push ebx
-
 
424
           call CommitPages ;eax, ebx, ecx
-
 
425
           mov ecx, [ring_pages]
-
 
426
           pop ebx
-
 
427
           pop eax
Line -... Line 428...
-
 
428
           add ebx, [ring_size]
-
 
429
           call CommitPages    ;double mapped
-
 
430
 
-
 
431
           jmp .out_buff
-
 
432
.static:
-
 
433
           mov ecx, [size]
-
 
434
           add ecx, 128          ;resampler required
-
 
435
           mov [eax+STREAM.in_size], ecx
-
 
436
           stdcall KernelAlloc, ecx
-
 
437
 
-
 
438
           mov edi, [str]
-
 
439
           mov [edi+STREAM.in_base], eax
252
           mov [edi+STREAM.lim_0], eax
440
           add eax, 128
Line 253... Line 441...
253
           add eax, 0x1000
441
           mov [edi+STREAM.in_wp], eax
254
           mov [edi+STREAM.seg_1], eax
442
           mov [edi+STREAM.in_rp], eax
255
           mov [edi+STREAM.notify_off2], eax
443
           mov ebx, [size]
256
           add eax, 0x8000
444
           mov [edi+STREAM.in_count], ebx
257
           mov [edi+STREAM.limit], eax
445
           mov [edi+STREAM.in_free], ebx
258
           mov [edi+STREAM.lim_1], eax
446
           add eax, ebx
259
 
447
           mov [edi+STREAM.in_top], eax
Line 260... Line 448...
260
; create ring buffer
448
 
261
 
449
.out_buff:
262
           stdcall AllocKernelSpace, dword 128*1024
450
           stdcall AllocKernelSpace, dword 128*1024
263
 
451
 
264
           mov edi, [str]
452
           mov edi, [str]
265
           mov [edi+STREAM.work_buff], eax
453
           mov [edi+STREAM.out_base], eax
266
           mov [edi+STREAM.work_read], eax
454
           mov [edi+STREAM.out_wp], eax
267
           mov [edi+STREAM.work_write], eax
455
           mov [edi+STREAM.out_rp], eax
Line 282... Line 470...
282
           pop eax
470
           pop eax
283
           add ebx, 64*1024
471
           add ebx, 64*1024
284
           call CommitPages    ;double mapped
472
           call CommitPages    ;double mapped
Line 285... Line 473...
285
 
473
 
286
           mov edi, [str]
-
 
287
           mov eax, [format]
-
 
288
           mov [edi+STREAM.format], eax
-
 
289
           mov [edi+STREAM.flags], SND_STOP
-
 
290
 
-
 
291
           xor ebx, ebx
-
 
292
           cmp eax, 19
-
 
293
           jb @f
-
 
294
           mov ebx, 0x80808080
-
 
295
@@:
-
 
296
           mov [edi+STREAM.r_silence], ebx
-
 
297
 
-
 
298
           shl eax, 4
-
 
299
           mov ebx, [resampler_params+eax]
-
 
300
           mov ecx, [resampler_params+eax+4]
-
 
301
           mov edx, [resampler_params+eax+8]
-
 
302
 
-
 
303
           mov [edi+STREAM.r_size],ebx
474
           mov edi, [str]
304
           mov [edi+STREAM.r_end], ecx
-
 
305
           mov [edi+STREAM.r_dt],  edx
-
 
306
 
-
 
307
           mov ebx, [resampler_params+eax+12]
-
 
308
           mov [edi+STREAM.resample], ebx
-
 
309
 
475
           mov ecx, [edi+STREAM.in_top]
310
           mov edx, [edi+STREAM.base]
-
 
311
           lea eax, [edx+0x9000]
-
 
312
           call GetPgAddr  ;eax
-
 
313
           call FreePage   ;eax
-
 
314
 
476
           mov edi, [edi+STREAM.in_base]
315
           mov eax, edx
-
 
316
           lea ebx, [edx+0x9000]
-
 
317
           call GetPgAddr  ;eax
-
 
318
           stdcall MapPage, ebx, eax, dword 3
-
 
319
 
-
 
320
           mov edi, [edi+STREAM.base]
-
 
321
           mov ecx, (72*1024)/4
477
           sub ecx, edi
-
 
478
           xor eax, eax
322
           xor eax, eax
479
           shr ecx, 2
323
           cld
480
           cld
Line 324... Line 481...
324
           rep stosd
481
           rep stosd
325
 
482
 
326
           mov edi, [str]
483
           mov edi, [str]
327
           mov edi, [edi+STREAM.work_buff]
484
           mov edi, [edi+STREAM.out_base]
Line 328... Line 485...
328
           mov ecx, (64*1024)/4
485
           mov ecx, (64*1024)/4
329
           rep stosd
-
 
330
 
-
 
331
           mov eax, [str]
486
           rep stosd
332
           ret
487
 
333
.fail:
-
 
Line -... Line 488...
-
 
488
           xor edx, edx
-
 
489
           mov ebx, MANUAL_DESTROY
-
 
490
           call CreateEvent
334
           xor eax, eax
491
 
-
 
492
           mov ebx, [str]
-
 
493
           mov [ebx+STREAM.notify_event], eax
-
 
494
           mov [ebx+STREAM.notify_id], edx
-
 
495
 
-
 
496
           mov [ebx+STREAM.magic], 'WAVE'
-
 
497
           mov [ebx+STREAM.destroy], DestroyBuffer.destroy
335
           ret
498
           mov [ebx+STREAM.size], STREAM_SIZE
-
 
499
           mov [ebx+STREAM.flags], SND_STOP
-
 
500
 
-
 
501
           pushf
-
 
502
           cli
-
 
503
           mov eax, str.fd-FD_OFFSET
-
 
504
           mov edx, [eax+STREAM.str_fd]
336
endp
505
           mov [ebx+STREAM.str_fd], edx
Line 337... Line -...
337
 
-
 
338
if 0
-
 
339
align 4
-
 
340
pid_to_slot:
-
 
341
 
-
 
342
           push   ebx
-
 
343
           push   ecx
-
 
344
           mov    ebx,[TASK_COUNT]
-
 
345
           shl    ebx,5
-
 
346
           mov    ecx,2*32
-
 
347
.loop:
-
 
348
           cmp    byte [CURRENT_TASK+ecx+0xa],9
-
 
349
           jz     .endloop              ;skip empty slots
-
 
350
           cmp    [CURRENT_TASK+ecx+0x4],eax ;check PID
-
 
351
           jz     .pid_found
-
 
352
.endloop:
-
 
353
           add    ecx,32
506
           mov [ebx+STREAM.str_bk], eax
354
           cmp    ecx,ebx
507
           mov [eax+STREAM.str_fd], ebx
355
           jle    .loop
-
 
356
           pop    ecx
508
           mov [edx+STREAM.str_bk], ebx
357
           pop    ebx
509
           popf
358
           xor    eax,eax
510
 
359
           ret
-
 
360
 
-
 
361
.pid_found:
511
           xor eax, eax
362
           shr    ecx,5
-
 
363
           mov    eax,ecx
512
           ret
Line 364... Line 513...
364
           pop    ecx
513
.fail:
365
           pop    ebx
514
           xor ebx, ebx
Line 366... Line 515...
366
           ret
515
           or eax, -1
367
 
516
           ret
368
end if
517
endp
Line 369... Line 518...
369
 
518
 
370
;param
-
 
371
; eax= buffer handle
-
 
372
 
-
 
373
align 4
-
 
374
DestroyBuffer:
519
;param
375
           .handle  equ esp       ;local
520
; eax= buffer handle
Line 376... Line 521...
376
 
521
 
377
           cmp [eax+STREAM.magic], 'WAVE'
522
align 4
378
           jne .fail
523
DestroyBuffer:
379
 
524
           .handle  equ esp       ;local
380
           cmp [eax+STREAM.size], STREAM_SIZE
525
 
381
           jne .fail
526
           mov [eax+STREAM.flags], SND_STOP
382
.destroy:
527
.destroy:
Line 383... Line 528...
383
           push eax
528
           push eax
384
 
529
 
385
           pushf
530
           pushfd
Line 386... Line 531...
386
           cli
531
           cli
387
           mov ebx, [eax+STREAM.str_fd]
532
           mov ebx, [eax+STREAM.str_fd]
-
 
533
           mov ecx, [eax+STREAM.str_bk]
-
 
534
           mov [ebx+STREAM.str_bk], ecx
388
           mov ecx, [eax+STREAM.str_bk]
535
           mov [ecx+STREAM.str_fd], ebx
-
 
536
           popf
389
           mov [ebx+STREAM.str_bk], ecx
537
 
-
 
538
           stdcall KernelFree, [eax+STREAM.in_base]
Line 390... Line 539...
390
           mov [ecx+STREAM.str_fd], ebx
539
           mov eax, [.handle]
391
           popf
540
           stdcall KernelFree, [eax+STREAM.out_base]
Line 392... Line -...
392
 
-
 
393
           stdcall KernelFree, [eax+STREAM.base]
541
 
394
           mov eax, [.handle]
542
           pop eax               ;restore stack
Line 395... Line 543...
395
           stdcall KernelFree, [eax+STREAM.work_buff]
543
           call DestroyObject    ;eax= stream
396
 
544
           xor eax, eax
Line 397... Line -...
397
           pop eax               ;restore stack
-
 
398
           call DestroyObject    ;eax
-
 
399
.fail:
-
 
400
           ret
-
 
401
 
-
 
402
align 4
-
 
403
proc play_buffer stdcall, str:dword
-
 
404
 
-
 
405
           mov ebx, [str]
-
 
406
           cmp [ebx+STREAM.magic], 'WAVE'
-
 
407
           jne .fail
-
 
408
 
-
 
409
           cmp [ebx+STREAM.size], STREAM_SIZE
-
 
410
           jne .fail
-
 
411
 
545
           ret
412
           mov edi,[ebx+STREAM.work_buff]
-
 
413
           mov [ebx+STREAM.work_read], edi
-
 
414
           mov [ebx+STREAM.work_write], edi
-
 
415
           mov [ebx+STREAM.work_count], 0
-
 
416
 
-
 
417
           mov edx, [ebx+STREAM.base]
-
 
418
           add edx, 0x1000
-
 
419
           mov [ebx+STREAM.seg_0], edx
546
.fail:
Line -... Line 547...
-
 
547
           or eax, -1
420
           mov [ebx+STREAM.curr_seg], edx
548
           ret
421
           add edx, 0x8000
549
restore .handle
-
 
550
 
Line 422... Line 551...
422
           mov [ebx+STREAM.lim_0], edx
551
align 4
-
 
552
proc SetFormat stdcall, str:dword, format:dword
Line 423... Line 553...
423
           add edx, 0x1000
553
 
-
 
554
           cmp word [format], PCM_1_8_8
-
 
555
           ja .fail
-
 
556
 
-
 
557
           mov edx, [str]
424
           mov [ebx+STREAM.seg_1], edx
558
           mov [edx+STREAM.flags], SND_STOP
Line 425... Line 559...
425
           add edx, 0x8000
559
 
426
           mov [ebx+STREAM.lim_1], edx
560
           test [edx+STREAM.format], PCM_RING
Line -... Line 561...
-
 
561
           jnz .fail
-
 
562
 
427
 
563
;           mov eax,[edx+STREAM.out_base]
Line 428... Line 564...
428
           mov edx, [ebx+STREAM.seg_0]
564
;           mov [edx+STREAM.out_wp], eax
429
           mov ecx, -128
565
;           mov [edx+STREAM.out_rp], eax
-
 
566
;           mov [edx+STREAM.out_count], 0
-
 
567
 
430
           mov eax, [ebx+STREAM.r_silence]
568
           movzx eax, word [format]
431
@@:
569
           mov word [edx+STREAM.format], ax
432
           mov [edx+ecx], eax
570
 
433
           add ecx, 4
571
           xor ebx, ebx
434
           jnz @B
572
           cmp eax, 19
435
 
-
 
436
           stdcall [ebx+STREAM.resample], edi, edx,\
-
 
437
           [ebx+STREAM.r_dt],[ebx+STREAM.r_size],[ebx+STREAM.r_end]
573
           jb @f
438
 
-
 
439
           mov ebx, [str]
574
           mov ebx, 0x80808080
440
 
575
@@:
441
           add [ebx+STREAM.work_count], eax
576
           mov [edx+STREAM.r_silence], ebx
442
           add [ebx+STREAM.work_write], eax
577
 
443
 
578
           shl eax, 2
Line 444... Line -...
444
           mov edx, [ebx+STREAM.r_size]
-
 
445
           add [ebx+STREAM.curr_seg], edx
579
           lea eax, [eax+eax*2]     ;eax*=12
446
 
-
 
447
           mov [ebx+STREAM.flags], SND_PLAY
580
 
Line -... Line 581...
-
 
581
           mov edi, [resampler_params+eax]
448
 
582
           mov ecx, [resampler_params+eax+4]
449
           mov eax, [ebx+STREAM.r_silence]
-
 
Line -... Line 583...
-
 
583
           mov ebx, [resampler_params+eax+8]
450
           mov edi, [ebx+STREAM.work_write]
584
 
451
           mov ecx, [ebx+STREAM.work_top]
585
           mov [edx+STREAM.r_size],edi
Line -... Line 586...
-
 
586
           mov [edx+STREAM.r_dt],  ecx
-
 
587
           mov [edx+STREAM.resample], ebx
452
           sub ecx, edi
588
 
-
 
589
           mov edi, [edx+STREAM.in_base]
Line 453... Line 590...
453
           shr ecx, 2
590
           mov ecx, 128/4
-
 
591
           mov eax, [edx+STREAM.r_silence]
Line -... Line 592...
-
 
592
           cld
-
 
593
           rep stosd
-
 
594
           xor eax, eax
-
 
595
           ret
-
 
596
.fail:
-
 
597
           or eax, -1
-
 
598
           ret
-
 
599
endp
-
 
600
 
454
           cld
601
; for static buffers only
455
           rep stosd
-
 
456
 
602
; use waveout for streams
457
           stdcall  dev_play, [hSound]
603
 
458
           xor eax, eax
604
align 4
459
           inc eax
605
proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword
460
           ret
606
 
Line -... Line 607...
-
 
607
           mov edx, [str]
-
 
608
           test [edx+STREAM.format], PCM_OUT
461
.fail:
609
           jnz .fail
462
           xor eax, eax
610
 
-
 
611
           mov esi, [src]
-
 
612
           mov edi, [offs]
-
 
613
           add edi, [edx+STREAM.in_base]
-
 
614
           add edi, 128
Line 463... Line 615...
463
           ret
615
 
-
 
616
           cmp edi, [edx+STREAM.in_top]
464
endp
617
           jae .fail
465
 
618
 
Line 466... Line -...
466
align 4
-
 
467
proc stop_buffer stdcall, str:dword
619
           mov ecx, [size]
468
 
-
 
469
           mov edi, [str]
-
 
470
 
620
           lea ebx, [ecx+edi]
Line 471... Line 621...
471
           cmp [edi+STREAM.magic], 'WAVE'
621
           sub ebx, [edx+STREAM.in_top]
472
           jne .fail
622
           jb @F
473
 
623
           sub ecx, ebx
Line 474... Line 624...
474
           cmp [edi+STREAM.size], STREAM_SIZE
624
@@:
475
           jne .fail
625
           shr ecx, 2
Line 476... Line -...
476
 
-
 
477
           mov [edi+STREAM.flags], SND_STOP
626
           cld
Line -... Line 627...
-
 
627
           rep movsd
-
 
628
           xor eax,eax
-
 
629
           ret
-
 
630
.fail:
478
 
631
           or eax, -1
479
;           stdcall [ServiceHandler], [hSound], dword DEV_STOP, 0
632
           ret
Line -... Line 633...
-
 
633
endp
-
 
634
 
-
 
635
; for stream buffers only
-
 
636
 
-
 
637
align 4
-
 
638
proc wave_out stdcall, str:dword,src:dword,size:dword
-
 
639
           locals
-
 
640
             state_saved  dd ?
-
 
641
             fpu_state    rb 528
-
 
642
           endl
-
 
643
 
-
 
644
           mov edx, [str]
-
 
645
           mov eax, [edx+STREAM.format]
-
 
646
           test eax, PCM_STATIC+PCM_RING
-
 
647
           jnz .fail
-
 
648
 
-
 
649
           cmp ax, PCM_ALL
-
 
650
           je .fail
-
 
651
 
-
 
652
           mov esi,[src]
-
 
653
           test esi, esi
-
 
654
           jz .fail
-
 
655
 
-
 
656
           cmp esi, new_app_base
-
 
657
           jb .fail
-
 
658
 
-
 
659
           mov [state_saved], 0
-
 
660
 
-
 
661
.main_loop:
-
 
662
           mov edx, [str]
480
 
663
 
-
 
664
           mov ebx, [size]
481
           xor eax, eax
665
           test ebx, ebx
Line 482... Line -...
482
           inc eax
-
 
483
           ret
-
 
484
.fail:
666
           jz .done
-
 
667
 
-
 
668
           cmp [edx+STREAM.flags], SND_STOP
485
           xor eax, eax
669
           jne .fill
486
           ret
670
 
-
 
671
           mov edi, [edx+STREAM.in_base]
487
endp
672
           mov ecx, 128/4
488
 
-
 
489
align 4
673
           mov eax, [edx+STREAM.r_silence]
490
proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword
674
           cld
-
 
675
           rep stosd
491
 
676
 
492
           mov edx, [str]
-
 
493
           test edx, edx
677
           mov ecx, [edx+STREAM.in_size]
494
           jz .fail
-
 
495
 
-
 
496
           cmp [edx+STREAM.magic], 'WAVE'
-
 
497
           jne .fail
-
 
Line -... Line 678...
-
 
678
           sub ecx, 128
-
 
679
           mov [edx+STREAM.in_wp], edi
-
 
680
           mov [edx+STREAM.in_rp], edi
-
 
681
           mov [edx+STREAM.in_count], 0
-
 
682
           mov [edx+STREAM.in_free], ecx
-
 
683
 
498
 
684
           mov eax,[edx+STREAM.out_base]
-
 
685
           mov [edx+STREAM.out_wp], eax
-
 
686
           mov [edx+STREAM.out_rp], eax
-
 
687
           mov [edx+STREAM.out_count], 0
-
 
688
.fill:
-
 
689
           mov ecx, [edx+STREAM.in_free]
-
 
690
           test ecx, ecx
-
 
691
           jz .wait
-
 
692
 
-
 
693
           cmp ecx, ebx
-
 
694
           jbe @F
-
 
695
 
-
 
696
           mov ecx, ebx
-
 
697
@@:
-
 
698
           sub [size], ecx
-
 
699
           add [edx+STREAM.in_count], ecx
-
 
700
           sub [edx+STREAM.in_free], ecx
-
 
701
 
-
 
702
           shr ecx, 2
499
           cmp [edx+STREAM.size], STREAM_SIZE
703
           mov edi, [edx+STREAM.in_wp]
500
           jne .fail
704
           mov esi, [src]
-
 
705
           cld
-
 
706
           rep movsd
-
 
707
 
-
 
708
           mov [src], esi
-
 
709
           cmp edi, [edx+STREAM.in_top]
-
 
710
           jb @F
-
 
711
           sub edi, [edx+STREAM.in_size]
-
 
712
@@:
-
 
713
           mov [edx+STREAM.in_wp], edi
-
 
714
 
-
 
715
           cmp [edx+STREAM.out_count], 32768
-
 
716
           jae .skip
-
 
717
 
-
 
718
           cmp [state_saved], 0
-
 
719
           jne @F
-
 
720
           lea eax, [fpu_state+15]
-
 
721
           and eax, -16
-
 
722
           call FpuSave
-
 
723
           mov [state_saved], 1
-
 
724
@@:
-
 
725
           stdcall refill, edx
-
 
726
.skip:
-
 
727
           mov ebx, [str]
-
 
728
           mov [ebx+STREAM.flags], SND_PLAY
-
 
729
           cmp [eng_state], SND_PLAY
-
 
730
           je .main_loop
-
 
731
 
-
 
732
           stdcall dev_play, [hSound]
-
 
733
           mov [eng_state], SND_PLAY
-
 
734
           jmp .main_loop
-
 
735
.wait:
-
 
736
           mov edx, [str]
-
 
737
           mov eax, [edx+STREAM.notify_event]
-
 
738
           mov ebx, [edx+STREAM.notify_id]
-
 
739
           call WaitEvent   ;eax ebx
-
 
740
           jmp .main_loop
-
 
741
.done:
-
 
742
           cmp [state_saved], 1
-
 
743
           jne @F
-
 
744
 
-
 
745
           lea eax, [fpu_state+15]
-
 
746
           and eax, -16
-
 
747
           call FpuRestore
-
 
748
@@:
-
 
749
           xor eax, eax
-
 
750
           ret
-
 
751
.fail:
-
 
752
           or eax, -1
-
 
753
           ret
-
 
754
endp
-
 
755
 
-
 
756
; both static and stream
-
 
757
; reset all but not clear buffers
-
 
758
 
-
 
759
 
-
 
760
; flags reserved
-
 
761
;  RESET_INPUT  equ 1   ;reserved reset and clear input buffer
-
 
762
;  RESET_OUTPUT equ 2   ;reserved reset and clear output buffer
-
 
763
;  RESET_ALL    equ 3
-
 
764
 
-
 
765
 
-
 
766
align 4
-
 
767
proc ResetBuffer stdcall, str:dword, flags:dword
-
 
768
 
-
 
769
           mov edx, [str]
-
 
770
           mov [edx+STREAM.flags], SND_STOP
-
 
771
 
-
 
772
           mov edi, [edx+STREAM.in_base]
-
 
773
           mov ecx, 128/4
-
 
774
           mov eax, [edx+STREAM.r_silence]
-
 
775
           cld
-
 
776
           rep stosd
-
 
777
 
-
 
778
           mov [edx+STREAM.in_wp], edi
-
 
779
           mov [edx+STREAM.in_rp], edi
-
 
780
 
-
 
781
           mov [edx+STREAM.in_count], 0
-
 
782
           mov eax, [edx+STREAM.in_size]
-
 
783
           sub eax, 128
-
 
784
           mov [edx+STREAM.in_free], eax
-
 
785
 
-
 
786
           xor eax, eax
-
 
787
           mov ebx,[edx+STREAM.out_base]
-
 
788
           mov [edx+STREAM.out_wp], ebx
-
 
789
           mov [edx+STREAM.out_rp], ebx
-
 
790
           mov [edx+STREAM.out_count], eax
-
 
791
           ret
-
 
792
.fail:
-
 
793
           or eax, -1
-
 
794
           ret
-
 
795
endp
-
 
796
 
-
 
797
; for static buffers only
-
 
798
 
-
 
799
align 4
-
 
800
proc SetBufferPos stdcall, str:dword, pos:dword
-
 
801
 
-
 
802
           mov edx, [str]
-
 
803
           test [edx+STREAM.format], PCM_OUT+PCM_RING
-
 
804
           jnz .fail
-
 
805
 
-
 
806
           mov [edx+STREAM.flags], SND_STOP
-
 
807
 
-
 
808
           mov eax, [pos]
-
 
809
           add eax, [edx+STREAM.in_base]
-
 
810
           mov ebx, [edx+STREAM.in_top]
-
 
811
           add eax, 128
-
 
812
 
-
 
813
           cmp eax, ebx
-
 
814
           jae .fail
-
 
815
 
-
 
816
           mov [edx+STREAM.in_rp], eax
-
 
817
           sub ebx, eax
-
 
818
           mov [edx+STREAM.in_count], ebx
-
 
819
           xor eax, eax
-
 
820
           ret
-
 
821
.fail:
-
 
822
           or eax, -1
-
 
823
           ret
-
 
824
endp
-
 
825
 
-
 
826
align 4
-
 
827
proc GetBufferPos stdcall, str:dword
-
 
828
 
-
 
829
           mov edx, [str]
-
 
830
           test [edx+STREAM.format], PCM_OUT+PCM_RING
-
 
831
           jnz .fail
-
 
832
 
-
 
833
           mov ebx, [edx+STREAM.in_rp]
-
 
834
           xor eax, eax
-
 
835
           ret
-
 
836
.fail:
-
 
837
           xor ebx,ebx
-
 
838
           or eax, -1
-
 
839
           ret
-
 
840
endp
-
 
841
 
-
 
842
; both
-
 
843
 
-
 
844
align 4
-
 
845
proc SetBufferVol stdcall, str:dword,l_vol:dword,r_vol:dword
-
 
846
 
-
 
847
           mov edx, [str]
-
 
848
           stdcall set_vol_param,[l_vol],[r_vol],[edx+STREAM.pan]
-
 
849
           ret
-
 
850
endp
-
 
851
 
-
 
852
proc set_vol_param stdcall, l_vol:dword,r_vol:dword,pan:dword
-
 
853
           locals
-
 
854
             _600    dd ?
-
 
855
             _32767  dd ?
-
 
856
             state   rb 108
-
 
857
           endl
-
 
858
 
-
 
859
           mov [_600], 0x44160000   ;600.0
-
 
860
           mov [_32767], 32767
-
 
861
 
-
 
862
           lea ebx, [state]
-
 
863
           fnsave [ebx]
-
 
864
 
-
 
865
           movq mm0, qword [l_vol]
-
 
866
           pminsw mm0, qword [vol_max]
-
 
867
           pmaxsw mm0, qword [vol_min]
-
 
868
           movq qword [l_vol], mm0
-
 
869
           movq qword [edx+STREAM.l_vol], mm0
-
 
870
 
-
 
871
           movd mm1,[pan]
-
 
872
           pminsw mm1, qword [pan_max]
501
 
873
           pmaxsw mm1, qword [vol_min]
502
           mov esi,[src]
874
           movd [edx+STREAM.pan], mm1
503
           test esi, esi
875
 
-
 
876
           cmp word [edx+STREAM.pan], 0
-
 
877
           jl @F
-
 
878
 
-
 
879
           psubsw mm0,mm1
-
 
880
           pminsw mm0, qword [vol_max]
-
 
881
           pmaxsw mm0, qword [vol_min]
-
 
882
           movd [l_vol],mm0
-
 
883
           jmp .calc_amp
-
 
884
@@:
-
 
885
           punpckhdq mm0,mm0
-
 
886
           paddsw mm0,mm1
-
 
887
           pminsw mm0, qword [vol_max]
-
 
888
           pmaxsw mm0, qword [vol_min]
-
 
889
           movd [r_vol], mm0
-
 
890
.calc_amp:
-
 
891
           emms
-
 
892
           fild word [l_vol]
-
 
893
 
-
 
894
           call .calc
-
 
895
 
-
 
896
           fistp word [edx+STREAM.l_amp]
-
 
897
           fstp st0
-
 
898
 
-
 
899
           fild word [r_vol]
-
 
900
 
-
 
901
           call .calc
-
 
902
 
-
 
903
           fistp word [edx+STREAM.r_amp]
-
 
904
           fstp st0
-
 
905
 
-
 
906
           fnclex
-
 
907
           lea ebx, [state]
-
 
908
           frstor [ebx]
-
 
909
 
-
 
910
           xor eax, eax
-
 
911
           inc eax
-
 
912
           ret
-
 
913
.calc:
-
 
914
           fdiv dword [_600]
-
 
915
           fld st0
-
 
916
           frndint
-
 
917
           fxch st1
-
 
918
           fsub st, st1
-
 
919
           f2xm1
-
 
920
           fld1
-
 
921
           faddp st1, st0
-
 
922
           fscale
-
 
923
           fimul dword [_32767]
-
 
924
           ret 0
-
 
925
endp
-
 
926
 
-
 
927
align 4
-
 
928
proc GetBufferVol stdcall, str:dword,p_lvol:dword,p_rvol:dword
-
 
929
 
-
 
930
           mov edx, [str]
-
 
931
           mov eax, [p_lvol]
-
 
932
           movsx ecx, word [edx+STREAM.l_vol]
-
 
933
           mov [eax], ecx
-
 
934
 
-
 
935
           mov eax, [p_rvol]
-
 
936
           movsx ecx, word [edx+STREAM.r_vol]
-
 
937
           mov [eax], ecx
-
 
938
           xor eax, eax
-
 
939
           ret
-
 
940
endp
-
 
941
 
-
 
942
align 4
-
 
943
proc SetBufferPan stdcall, str:dword,pan:dword
-
 
944
 
-
 
945
           mov edx, [str]
-
 
946
           stdcall set_vol_param,[edx+STREAM.l_vol],\
-
 
947
                                 [edx+STREAM.r_vol],[pan]
-
 
948
           ret
-
 
949
endp
-
 
950
 
-
 
951
; for static and ring buffers only
504
           jz .fail
952
 
-
 
953
align 4
-
 
954
proc play_buffer stdcall, str:dword, flags:dword
-
 
955
           locals
-
 
956
             fpu_state   rb 528
-
 
957
           endl
-
 
958
 
-
 
959
           mov ebx, [str]
-
 
960
           mov eax, [ebx+STREAM.format]
-
 
961
           test eax, PCM_OUT
-
 
962
           jnz .fail
-
 
963
 
-
 
964
           cmp ax, PCM_ALL
-
 
965
           je .fail
-
 
966
 
-
 
967
           mov [ebx+STREAM.flags], SND_PLAY
-
 
968
           cmp [eng_state], SND_PLAY
-
 
969
           je .done
-
 
970
 
-
 
971
           stdcall  dev_play, [hSound]
-
 
972
           mov [eng_state], SND_PLAY
-
 
973
.done:
505
 
974
           test [flags], PLAY_SYNC
506
           cmp esi, new_app_base
975
           jz @F
-
 
976
 
-
 
977
           mov edx, [str]
-
 
978
.wait:
507
           jb .fail
979
           mov eax, [edx+STREAM.notify_event]
Line -... Line 980...
-
 
980
           mov ebx, [edx+STREAM.notify_id]
-
 
981
           call WaitEvent   ;eax ebx
-
 
982
 
-
 
983
           mov edx, [str]
-
 
984
           cmp [edx+STREAM.flags], SND_STOP
-
 
985
           jne .wait
-
 
986
@@:
-
 
987
           xor eax, eax
-
 
988
           ret
-
 
989
.fail:
-
 
990
           or eax, -1
-
 
991
           ret
-
 
992
endp
-
 
993
 
-
 
994
; for static buffers only
-
 
995
 
-
 
996
align 4
-
 
997
proc stop_buffer stdcall, str:dword
-
 
998
 
-
 
999
           mov edx, [str]
-
 
1000
           test [edx+STREAM.format], PCM_STATIC+PCM_RING
-
 
1001
           jz .fail
-
 
1002
 
-
 
1003
           mov [edx+STREAM.flags], SND_STOP
-
 
1004
 
-
 
1005
;           stdcall [ServiceHandler], [hSound], dword DEV_STOP, 0
-
 
1006
 
-
 
1007
           mov eax, [edx+STREAM.notify_event]
-
 
1008
           mov ebx, [edx+STREAM.notify_id]
-
 
1009
           call ClearEvent   ;eax ebx
-
 
1010
 
-
 
1011
           xor eax, eax
-
 
1012
           ret
-
 
1013
.fail:
-
 
1014
           or eax, -1
-
 
1015
           ret
-
 
1016
endp
-
 
1017
 
-
 
1018
; parm
-
 
1019
;  eax= mix_list
-
 
1020
 
-
 
1021
align 4
-
 
1022
do_mix_list:
-
 
1023
 
-
 
1024
           xor edx, edx
-
 
1025
           mov esi, str.fd-FD_OFFSET
-
 
1026
           mov ebx, [esi+STREAM.str_fd]
-
 
1027
@@:
-
 
1028
           cmp ebx, esi
-
 
1029
           je .done
-
 
1030
 
-
 
1031
           cmp [ebx+STREAM.magic], 'WAVE'
-
 
1032
           jne .next
-
 
1033
 
-
 
1034
           cmp [ebx+STREAM.size], STREAM_SIZE
-
 
1035
           jne .next
-
 
1036
 
-
 
1037
           cmp [ebx+STREAM.flags], SND_PLAY;
-
 
1038
           jne .next
-
 
1039
 
-
 
1040
           mov ecx, [ebx+STREAM.out_count]
-
 
1041
           test ecx, ecx
-
 
1042
           jnz .l1
508
 
1043
 
509
           mov edi, [offs]
1044
           test [ebx+STREAM.format], PCM_RING
Line 510... Line 1045...
510
           mov ecx, 0x8000
1045
           jnz .next
511
 
1046
           mov [ebx+STREAM.flags], SND_STOP
Line 560... Line 1095...
560
           cmp [edi+STREAM.size], STREAM_SIZE
1095
           cmp [edi+STREAM.size], STREAM_SIZE
561
           jne .next
1096
           jne .next
Line 562... Line 1097...
562
 
1097
 
563
           cmp [edi+STREAM.flags], SND_PLAY;
1098
           cmp [edi+STREAM.flags], SND_PLAY;
564
           jne .next
-
 
565
           cmp [edi+STREAM.work_count], 16384
-
 
Line 566... Line 1099...
566
           jb .next
1099
           jne .next
567
 
1100
 
568
           mov [play_list+edx], edi
1101
           mov [play_list+edx], edi
569
           inc [play_count]
1102
           inc [play_count]
Line 627... Line 1160...
627
           lea eax, [handle]
1160
           lea eax, [handle]
628
           stdcall ServiceHandler, eax
1161
           stdcall ServiceHandler, eax
629
           ret
1162
           ret
630
endp
1163
endp
Line -... Line 1164...
-
 
1164
 
-
 
1165
if 0
-
 
1166
align 4
-
 
1167
dword2str:
-
 
1168
      mov  esi, hex_buff
-
 
1169
      mov ecx, -8
-
 
1170
@@:
-
 
1171
      rol eax, 4
-
 
1172
      mov ebx, eax
-
 
1173
      and ebx, 0x0F
-
 
1174
      mov bl, [ebx+hexletters]
-
 
1175
      mov [8+esi+ecx], bl
-
 
1176
      inc ecx
-
 
1177
      jnz @B
-
 
1178
      ret
-
 
1179
 
-
 
1180
hexletters   db '0123456789ABCDEF'
-
 
1181
hex_buff     db 8 dup(0),13,10,0
-
 
1182
 
-
 
1183
end if
631
 
1184
 
632
include 'mixer.asm'
1185
include 'mixer.asm'
633
include 'mix_mmx.inc'
1186
include 'mix_mmx.inc'
Line 634... Line 1187...
634
include 'mix_sse2.inc'
1187
include 'mix_sse2.inc'
635
 
1188
 
636
;if USE_SSE
1189
;if USE_SSE
Line 637... Line 1190...
637
; include 'mix_sse.inc'
1190
; include 'mix_sse.inc'
638
;end if
1191
;end if
639
 
1192
 
640
align 16
1193
align 16
641
resampler_params:
1194
resampler_params:
642
     ;r_size    r_end   r_dt   resampler_func
1195
     ;r_size    r_dt   resampler_func
Line 643... Line 1196...
643
     dd 0,0,0,0                                  ; 0  PCM_ALL
1196
     dd 0,0,0                                  ; 0  PCM_ALL
644
     dd 16384,          0,     0, copy_stream    ; 1  PCM_2_16_48
1197
     dd 16384,      0, copy_stream    ; 1  PCM_2_16_48
Line 645... Line 1198...
645
     dd 16384,          0,     0, m16_stereo     ; 2  PCM_1_16_48
1198
     dd 16384,      0, m16_stereo     ; 2  PCM_1_16_48
646
 
1199
 
Line 647... Line 1200...
647
     dd 16384, 0x08000000, 30109, resample_2     ; 3  PCM_2_16_44
1200
     dd 16384,  30109, resample_2     ; 3  PCM_2_16_44
648
     dd  8192, 0x08000000, 30109, resample_1     ; 4  PCM_1_16_44
1201
     dd  8192,  30109, resample_1     ; 4  PCM_1_16_44
Line 649... Line 1202...
649
 
1202
 
650
     dd 16384, 0x08000000, 21846, resample_2     ; 5  PCM_2_16_32
1203
     dd 16384,  21846, resample_2     ; 5  PCM_2_16_32
Line 651... Line 1204...
651
     dd  8192, 0x08000000, 21846, resample_1     ; 6  PCM_1_16_32
1204
     dd  8192,  21846, resample_1     ; 6  PCM_1_16_32
652
 
1205
 
Line 653... Line 1206...
653
     dd 16384, 0x08000000, 16384, resample_2     ; 7  PCM_2_16_24
1206
     dd 16384,  16384, resample_2     ; 7  PCM_2_16_24
654
     dd  8192, 0x08000000, 16384, resample_1     ; 8  PCM_1_16_24
1207
     dd  8192,  16384, resample_1     ; 8  PCM_1_16_24
Line 655... Line 1208...
655
 
1208
 
656
     dd  8192, 0x04000000, 15052, resample_2     ; 9  PCM_2_16_22
1209
     dd  8192,  15052, resample_2     ; 9  PCM_2_16_22
Line 657... Line 1210...
657
     dd  4096, 0x04000000, 15052, resample_1     ;10  PCM_1_16_22
1210
     dd  4096,  15052, resample_1     ;10  PCM_1_16_22
658
 
1211
 
Line 659... Line 1212...
659
     dd  8192, 0x04000000, 10923, resample_2     ;11  PCM_2_16_16
1212
     dd  8192,  10923, resample_2     ;11  PCM_2_16_16
660
     dd  4096, 0x04000000, 10923, resample_1     ;12  PCM_1_16_16
1213
     dd  4096,  10923, resample_1     ;12  PCM_1_16_16
Line 661... Line 1214...
661
 
1214
 
662
     dd  8192, 0x04000000,  8192, resample_2     ;13  PCM_2_16_12
1215
     dd  8192,   8192, resample_2     ;13  PCM_2_16_12
Line 663... Line 1216...
663
     dd  4096, 0x04000000,  8192, resample_1     ;14  PCM_1_16_12
1216
     dd  4096,   8192, resample_1     ;14  PCM_1_16_12
664
 
1217
 
Line 665... Line 1218...
665
     dd  4096, 0x02000000,  7527, resample_2     ;15  PCM_2_16_11
1218
     dd  4096,   7527, resample_2     ;15  PCM_2_16_11
666
     dd  2048, 0x02000000,  7527, resample_1     ;16  PCM_1_16_11
1219
     dd  2048,   7527, resample_1     ;16  PCM_1_16_11
Line 667... Line 1220...
667
 
1220
 
668
     dd  4096, 0x02000000,  5462, resample_2     ;17  PCM_2_16_8
1221
     dd  4096,   5462, resample_2     ;17  PCM_2_16_8
Line 669... Line 1222...
669
     dd  2048, 0x02000000,  5462, resample_1     ;18  PCM_1_16_8
1222
     dd  2048,   5462, resample_1     ;18  PCM_1_16_8
670
 
1223
 
Line 671... Line 1224...
671
     dd 16384,          0,     0, s8_stereo      ;19  PCM_2_8_48
1224
     dd 16384,      0, s8_stereo      ;19  PCM_2_8_48
672
     dd  8192,          0,     0, m8_stereo      ;20  PCM_1_8_48
1225
     dd  8192,      0, m8_stereo      ;20  PCM_1_8_48
Line 673... Line 1226...
673
 
1226
 
674
     dd  8192, 0x08000000, 30109, resample_28    ;21  PCM_2_8_44
1227
     dd  8192,  30109, resample_28    ;21  PCM_2_8_44
Line 675... Line 1228...
675
     dd  4096, 0x08000000, 30109, resample_18    ;22  PCM_1_8_44
1228
     dd  4096,  30109, resample_18    ;22  PCM_1_8_44
676
 
1229
 
Line 677... Line 1230...
677
     dd  8192, 0x08000000, 21846, resample_28    ;23  PCM_2_8_32
1230
     dd  8192,  21846, resample_28    ;23  PCM_2_8_32
678
     dd  4096, 0x08000000, 21846, resample_18    ;24  PCM_1_8_32
1231
     dd  4096,  21846, resample_18    ;24  PCM_1_8_32
679
 
1232
 
Line -... Line 1233...
-
 
1233
     dd  8192,  16384, resample_28    ;25  PCM_2_8_24
-
 
1234
     dd  4096,  16384, resample_18    ;26  PCM_1_8_24
-
 
1235
 
-
 
1236
     dd  4096,  15052, resample_28    ;27  PCM_2_8_22
680
     dd  8192, 0x08000000, 16384, resample_28    ;25  PCM_2_8_24
1237
     dd  2048,  15052, resample_18    ;28  PCM_1_8_22
681
     dd  4096, 0x08000000, 16384, resample_18    ;26  PCM_1_8_24
1238
 
Line 682... Line 1239...
682
 
1239
     dd  4096,  10923, resample_28    ;29  PCM_2_8_16
683
     dd  4096, 0x04000000, 15052, resample_28    ;27  PCM_2_8_22
1240
     dd  2048,  10923, resample_18    ;30  PCM_1_8_16
Line 684... Line 1241...
684
     dd  2048, 0x04000000, 15052, resample_18    ;28  PCM_1_8_22
1241
 
Line 710... Line 1267...
710
msgPlay       db 'Play buffer',13,10,0
1267
msgPlay       db 'Play buffer',13,10,0
711
msgStop       db 'Stop',13,10,0
1268
msgStop       db 'Stop',13,10,0
712
msgUser       db 'User callback',13,10,0
1269
msgUser       db 'User callback',13,10,0
713
msgMem        db 'Not enough memory',13,10,0
1270
msgMem        db 'Not enough memory',13,10,0
714
msgDestroy    db 'Destroy sound buffer', 13,10,0
1271
msgDestroy    db 'Destroy sound buffer', 13,10,0
-
 
1272
msgWaveout    db 'Play waveout', 13,10,0
-
 
1273
msgSetVolume  db 'Set volume',13,10,0
715
end if
1274
end if
Line 716... Line 1275...
716
 
1275
 
Line 717... Line 1276...
717
section '.data' data readable writable align 16
1276
section '.data' data readable writable align 16
718
 
1277
 
719
play_list     rd 16
1278
play_list     rd 16
720
mix_input     rd 16
1279
mix_input     rd 16
-
 
1280
play_count    rd 1
721
play_count    rd 1
1281
hSound        rd 1
722
hSound        rd 1
1282
eng_state     rd 1
723
mix_buff      rd 1
1283
mix_buff      rd 1
724
mix_buff_map  rd 1
1284
mix_buff_map  rd 1