Subversion Repositories Kolibri OS

Rev

Rev 2991 | Rev 5273 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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