Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
168 serge 1
;
2
;   This file is part of the Infinity sound library.
3
;   (C) copyright Serge 2006
4
;   email: infinity_sound@mail.ru
5
;
6
;   This program is free software; you can redistribute it and/or modify
7
;   it under the terms of the GNU General Public License as published by
8
;   the Free Software Foundation; either version 2 of the License, or
9
;   (at your option) any later version.
10
;
11
;   This program is distributed in the hope that it will be useful,
12
;   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
;   GNU General Public License for more details.
15
 
16
format MS COFF
17
 
18
include 'proc32.inc'
19
include 'main.inc'
20
 
21
DEBUG		    equ 1
22
 
23
EVENT_NOTIFY	    equ 0x00000200
24
 
25
OS_BASE               equ 0;  0x80400000
26
new_app_base          equ 0x60400000;   0x01000000
27
PROC_BASE             equ OS_BASE+0x0080000
28
 
188 serge 29
public START
168 serge 30
public service_proc
227 serge 31
public version
168 serge 32
 
188 serge 33
extrn AttachIntHandler
34
extrn SysMsgBoardStr
35
extrn PciApi
36
extrn PciRead32
37
extrn PciRead8
38
extrn PciWrite8
39
extrn AllocKernelSpace
40
extrn MapPage
41
extrn RegService
42
extrn KernelAlloc
43
extrn KernelFree
44
extrn GetPgAddr
45
extrn GetCurrentTask
46
extrn GetService
47
extrn ServiceHandler
48
extrn FpuSave
49
extrn FpuRestore
227 serge 50
extrn SendEvent
188 serge 51
 
168 serge 52
SND_CREATE_BUFF     equ 2
53
SND_PLAY            equ 3
54
SND_STOP            equ 4
55
SND_SETBUFF         equ 5
56
SND_DESTROY_BUFF    equ 6
57
 
58
DEV_PLAY            equ 1
59
DEV_STOP            equ 2
60
DEV_CALLBACK        equ 3
61
 
62
struc IOCTL
63
{  .handle           dd ?
64
   .io_code          dd ?
65
   .input            dd ?
66
   .inp_size         dd ?
67
   .output           dd ?
68
   .out_size         dd ?
69
}
70
 
71
virtual at 0
72
  IOCTL IOCTL
73
end virtual
74
 
188 serge 75
section '.flat' code readable align 16
168 serge 76
 
214 serge 77
proc START stdcall, state:dword
78
 
227 serge 79
           cmp [state], 1
80
           jne .exit
81
 
188 serge 82
           stdcall GetService, szSound
168 serge 83
           test eax, eax
84
           jz .fail
85
           mov [hSound], eax
86
 
188 serge 87
           stdcall KernelAlloc, 16*512
168 serge 88
           test eax, eax
89
           jz .out_of_mem
90
           mov [mix_buff], eax
91
 
92
           mov edi, stream_list
93
           mov ecx, 17
94
           xor eax, eax
95
           cld
96
           rep stosd
97
 
98
           mov edi, stream
99
           mov ecx, 4*STREAM_SIZE
100
           rep stosd
188 serge 101
           mov [stream_count],0
168 serge 102
 
103
           stdcall set_handler, [hSound], new_mix
188 serge 104
           stdcall RegService, szInfinity, service_proc
227 serge 105
           ret
168 serge 106
.fail:
107
     if DEBUG
227 serge 108
           mov esi, msgFail
188 serge 109
           call SysMsgBoardStr
168 serge 110
     end if
214 serge 111
.exit:
227 serge 112
           xor eax, eax
113
           ret
168 serge 114
 
115
.out_of_mem:
116
     if DEBUG
117
           mov esi, msgMem
188 serge 118
           call SysMsgBoardStr
168 serge 119
     end if
227 serge 120
           xor eax, eax
188 serge 121
           ret
214 serge 122
endp
168 serge 123
 
124
handle     equ  IOCTL.handle
125
io_code    equ  IOCTL.io_code
126
input      equ  IOCTL.input
127
inp_size   equ  IOCTL.inp_size
128
output     equ  IOCTL.output
129
out_size   equ  IOCTL.out_size
130
 
131
align 4
132
proc service_proc stdcall, ioctl:dword
133
 
134
           mov edi, [ioctl]
135
           mov eax, [edi+io_code]
136
 
227 serge 137
           cmp eax, SND_CREATE_BUFF
138
           jne @F
168 serge 139
           mov ebx, [edi+input]
140
           stdcall CreateBuffer,[ebx]
227 serge 141
           ret
168 serge 142
@@:
227 serge 143
           cmp eax, SND_PLAY
144
           jne @F
168 serge 145
 
146
           mov ebx, [edi+input]
227 serge 147
           stdcall play_buffer, [ebx]
148
           ret
168 serge 149
@@:
227 serge 150
           cmp eax, SND_STOP
151
           jne @F
168 serge 152
 
153
;       if DEBUG
154
;	   mov esi, msgStop
155
;	   call   [SysMsgBoardStr]
156
;       end if
157
 
158
           mov ebx, [edi+input]
227 serge 159
           stdcall stop_buffer, [ebx]
160
           ret
168 serge 161
@@:
227 serge 162
           cmp eax, SND_SETBUFF
163
           jne @F
168 serge 164
 
165
           mov ebx, [edi+input]
227 serge 166
           mov eax, [ebx+4]
167
           add eax, new_app_base
168
           stdcall set_buffer, [ebx],eax,[ebx+8],[ebx+12]
169
           ret
168 serge 170
@@:
171
           cmp eax, SND_DESTROY_BUFF
227 serge 172
           jne @F
168 serge 173
 
174
           mov ebx, [edi+input]
175
           stdcall DestroyBuffer, [ebx]
227 serge 176
           ret
168 serge 177
@@:
227 serge 178
           xor eax, eax
179
           ret
168 serge 180
endp
181
 
182
restore   handle
183
restore   io_code
184
restore   input
185
restore   inp_size
186
restore   output
187
restore   out_size
188
 
189
TASK_COUNT    equ 0x0003004
190
CURRENT_TASK  equ 0x0003000
191
 
192
align 8
193
proc CreateBuffer stdcall, format:dword
227 serge 194
           locals
195
             str dd ?
196
           endl
168 serge 197
 
227 serge 198
           call alloc_stream
199
           and eax, eax
200
           jz .fail
201
           mov [str], eax
168 serge 202
           mov edi, eax
203
 
227 serge 204
           mov edx, [stream_count]
205
           mov [stream_list+edx*4], eax
206
           inc [stream_count]
168 serge 207
 
227 serge 208
           mov [edi+STREAM.magic], 'WAVE'
209
           mov [edi+STREAM.size], STREAM_SIZE
168 serge 210
 
188 serge 211
           stdcall KernelAlloc, 180*1024
168 serge 212
 
227 serge 213
           mov edi, [str]
214
           mov [edi+STREAM.base], eax
215
           mov [edi+STREAM.curr_seg], eax
216
           mov [edi+STREAM.notify_off1], eax
217
           add eax, 0x8000
218
           mov [edi+STREAM.notify_off2], eax
219
           add eax, 0x7FFF
220
           mov [edi+STREAM.limit], eax
168 serge 221
 
227 serge 222
           inc eax
168 serge 223
 
227 serge 224
           mov [edi+STREAM.work_buff], eax
225
           mov [edi+STREAM.work_read], eax
226
           mov [edi+STREAM.work_write], eax
227
           mov [edi+STREAM.work_count], 0
228
           add eax, 0x10000
229
           mov [edi+STREAM.work_top], eax
230
           add eax, 1024*32
231
           mov [edi+STREAM.r_buff], eax
168 serge 232
 
227 serge 233
           mov ebx, [CURRENT_TASK]
168 serge 234
           shl ebx, 5
235
           mov eax, [0x3000+ebx+4]
236
 
227 serge 237
           mov [edi+STREAM.notify_task], eax
168 serge 238
 
227 serge 239
           mov eax, [format]
240
           mov [edi+STREAM.format], eax
241
           mov [edi+STREAM.flags], SND_STOP
168 serge 242
 
243
           xor ebx, ebx
244
           cmp eax, 19
245
           jb @f
246
           mov ebx, 0x80808080
247
@@:
248
           mov [edi+STREAM.r_silence], ebx
249
 
227 serge 250
           shl eax, 4
168 serge 251
           mov ebx, [resampler_params+eax]
252
           mov ecx, [resampler_params+eax+4]
253
           mov edx, [resampler_params+eax+8]
254
 
255
           mov [edi+STREAM.r_size],ebx
256
           mov [edi+STREAM.r_end], ecx
257
           mov [edi+STREAM.r_dt],  edx
258
 
227 serge 259
           mov ebx, [resampler_params+eax+12]
260
           mov [edi+STREAM.resample], ebx
168 serge 261
 
227 serge 262
           mov edi, [edi+STREAM.base]
263
           mov ecx, 180*1024/4
264
           xor eax, eax
265
           rep stosd
168 serge 266
 
227 serge 267
           mov eax, [str]
268
           ret
168 serge 269
 
270
.fail:
227 serge 271
           xor eax, eax
272
           ret
168 serge 273
endp
274
 
275
align 4
276
pid_to_slot:
277
 
227 serge 278
           push   ebx
279
           push   ecx
280
           mov    ebx,[TASK_COUNT]
281
           shl    ebx,5
282
           mov    ecx,2*32
168 serge 283
.loop:
227 serge 284
           cmp    byte [CURRENT_TASK+ecx+0xa],9
285
           jz     .endloop              ;skip empty slots
286
           cmp    [CURRENT_TASK+ecx+0x4],eax ;check PID
287
           jz     .pid_found
168 serge 288
.endloop:
227 serge 289
           add    ecx,32
290
           cmp    ecx,ebx
291
           jle    .loop
292
           pop    ecx
293
           pop    ebx
294
           xor    eax,eax
295
           ret
168 serge 296
 
297
.pid_found:
227 serge 298
           shr    ecx,5
299
           mov    eax,ecx
300
           pop    ecx
301
           pop    ebx
302
           ret
168 serge 303
 
304
align 4
305
proc DestroyBuffer stdcall, str:dword
306
 
307
           mov esi, [str]
308
 
309
           cmp [esi+STREAM.magic], 'WAVE'
227 serge 310
           jne .fail
168 serge 311
 
312
           cmp [esi+STREAM.size], STREAM_SIZE
227 serge 313
           jne .fail
168 serge 314
 
188 serge 315
           stdcall KernelFree, [esi+STREAM.base]
168 serge 316
 
317
           mov eax, [str]
227 serge 318
           call free_stream
168 serge 319
 
320
           mov edi, [str]
321
           mov ecx, STREAM_SIZE/4
322
           xor eax, eax
323
           cld
324
           rep stosd
325
 
326
           mov eax, [str]
327
           mov esi, stream_list
328
           mov ecx, 16
329
@@:
330
           cmp [esi], eax
331
           je .remove
332
           add esi, 4
333
           dec ecx
334
           jnz @B
335
           xor eax, eax
227 serge 336
           inc eax
337
           ret
168 serge 338
.remove:
339
           mov edi, esi
340
           add esi, 4
341
           cld
342
           rep movsd
343
           dec [stream_count]
344
           xor eax, eax
227 serge 345
           inc eax
346
           ret
168 serge 347
.fail:
227 serge 348
           xor eax, eax
349
           ret
168 serge 350
endp
351
 
352
align 4
353
proc play_buffer stdcall, str:dword
354
 
227 serge 355
           mov ebx, [str]
168 serge 356
 
227 serge 357
           cmp [ebx+STREAM.magic], 'WAVE'
358
           jne .fail
168 serge 359
 
227 serge 360
           cmp [ebx+STREAM.size], STREAM_SIZE
361
           jne .fail
168 serge 362
 
227 serge 363
           mov [ebx+STREAM.flags], SND_PLAY
168 serge 364
 
227 serge 365
           mov eax,[ebx+STREAM.work_buff]
366
           mov [ebx+STREAM.work_read], eax
367
           mov [ebx+STREAM.work_write], eax
368
           mov [ebx+STREAM.work_count], 0
168 serge 369
 
227 serge 370
           mov eax, [ebx+STREAM.base]
371
           mov [ebx+STREAM.curr_seg], eax
168 serge 372
 
227 serge 373
           mov esi, [ebx+STREAM.curr_seg]
374
           mov edi, [ebx+STREAM.work_write]
375
           mov edx, [ebx+STREAM.r_buff]
168 serge 376
 
227 serge 377
           mov ecx, 32
168 serge 378
           mov eax, [ebx+STREAM.r_silence]
379
@@:
227 serge 380
           mov [edx], eax
381
           add edx, 4
382
           dec ecx
383
           jnz @B
168 serge 384
 
227 serge 385
           mov edx, [ebx+STREAM.r_buff]
168 serge 386
 
227 serge 387
           stdcall [ebx+STREAM.resample], edi, esi, edx,\
388
           [ebx+STREAM.r_dt],[ebx+STREAM.r_size],[ebx+STREAM.r_end]
168 serge 389
 
227 serge 390
           mov ebx, [str]
168 serge 391
 
227 serge 392
           add [ebx+STREAM.work_count], eax;
393
           add [ebx+STREAM.work_write], eax;
168 serge 394
 
227 serge 395
           mov eax, [ebx+STREAM.r_size]
396
           add [ebx+STREAM.curr_seg], eax
168 serge 397
 
398
;       if DEBUG
399
;	   mov esi, msgPlay
400
;	   call   [SysMsgBoardStr]
401
;       end if
402
 
227 serge 403
           stdcall  dev_play, [hSound]
404
           xor eax, eax
405
           inc eax
406
           ret
168 serge 407
.fail:
227 serge 408
           xor eax, eax
409
           ret
168 serge 410
endp
411
 
412
align 4
413
proc stop_buffer stdcall, str:dword
414
 
227 serge 415
           mov edi, [str]
168 serge 416
 
227 serge 417
           cmp [edi+STREAM.magic], 'WAVE'
418
           jne .fail
168 serge 419
 
227 serge 420
           cmp [edi+STREAM.size], STREAM_SIZE
421
           jne .fail
168 serge 422
 
227 serge 423
           mov [edi+STREAM.flags], SND_STOP
168 serge 424
 
425
;           stdcall [ServiceHandler], [hSound], dword DEV_STOP, 0
426
 
227 serge 427
           xor eax, eax
428
           inc eax
429
           ret
168 serge 430
.fail:
227 serge 431
           xor eax, eax
432
           ret
168 serge 433
endp
434
 
435
align 4
436
proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword
437
 
227 serge 438
           mov edx, [str]
439
           test edx, edx
440
           jz .fail
168 serge 441
 
227 serge 442
           cmp [edx+STREAM.magic], 'WAVE'
443
           jne .fail
168 serge 444
 
227 serge 445
           cmp [edx+STREAM.size], STREAM_SIZE
446
           jne .fail
168 serge 447
 
227 serge 448
           mov esi,[src]
449
           test esi, esi
450
           jz .fail
168 serge 451
 
452
           cmp esi, new_app_base
453
           jb .fail
454
 
227 serge 455
           mov ecx, [size]
456
           test ecx, ecx
457
           jz .fail
168 serge 458
 
227 serge 459
           mov eax, [edx+STREAM.base]
460
           add eax, [offs]
168 serge 461
 
462
           cmp eax, [edx+STREAM.base]
463
           jb .fail
464
 
227 serge 465
           mov edi, eax
466
           add eax, ecx
467
           sub eax, 1
168 serge 468
 
227 serge 469
           cmp eax, [edx+STREAM.limit]
168 serge 470
           ja .fail
471
 
227 serge 472
           shr ecx, 2
168 serge 473
           cld
227 serge 474
           rep movsd
168 serge 475
 
227 serge 476
           xor eax, eax
477
           inc eax
478
           ret
168 serge 479
.fail:
227 serge 480
           xor eax, eax
481
           ret
168 serge 482
endp
483
 
484
align 4
485
proc alloc_stream
486
 
227 serge 487
           mov esi, stream_map
168 serge 488
 
227 serge 489
           pushf
490
           cli
168 serge 491
 
227 serge 492
           bsf eax, [esi]
493
           jnz .find
494
           popf
495
           xor eax, eax
496
           ret
497
.find:
498
           btr [esi], eax
499
           popf
500
           mov ebx, STREAM_SIZE
501
           mul ebx
502
           add eax, stream
503
           ret
168 serge 504
endp
505
 
506
align 4
507
proc free_stream
227 serge 508
           sub eax, stream
168 serge 509
           mov ebx, STREAM_SIZE
227 serge 510
           xor edx, edx
511
           div ebx
168 serge 512
 
227 serge 513
           and edx, edx
168 serge 514
           jnz .err
515
 
227 serge 516
           bts [stream_map], eax
517
           ret
168 serge 518
.err:
519
           xor eax, eax
227 serge 520
           ret
168 serge 521
endp
522
 
523
align 4
524
proc check_stream
525
 
227 serge 526
           xor edx, edx
527
           mov ecx, [play_count]
168 serge 528
.l1:
227 serge 529
           mov esi, [play_list+edx]
168 serge 530
 
227 serge 531
           mov eax, [esi+STR.curr_seg]
532
           cmp eax, [esi+STR.limit]
533
           jb .next
168 serge 534
 
227 serge 535
.m1:
536
           mov eax,[esi+STR.base]
537
           mov [esi+STR.curr_seg], eax
168 serge 538
.next:
227 serge 539
           add edx, 4
540
           loop .l1
541
           ret
168 serge 542
endp
543
 
544
 
545
align 4
546
proc prepare_playlist
547
 
548
.restart:
549
           xor ebx, ebx
227 serge 550
           xor edx, edx
551
           mov [play_count], 0
552
           mov ecx, [stream_count]
168 serge 553
           jcxz .exit
554
.l1:
555
           mov esi, [stream_list+ebx]
556
           test esi, esi
557
           jz .next
558
 
559
           cmp [esi+STREAM.magic], 'WAVE'
560
           jne .next
561
 
562
           cmp [esi+STREAM.size], STREAM_SIZE
563
           jne .next
564
 
565
           mov eax,[esi+STREAM.notify_task]
566
           cmp eax, -1
567
           je .fail
568
 
569
           call pid_to_slot
570
           test eax, eax
571
           jz .fail
572
 
573
           cmp [esi+STREAM.flags], SND_PLAY;
227 serge 574
           jne .next
168 serge 575
           cmp [esi+STREAM.work_count], 16384
576
           jb .next
577
 
578
           mov [play_list+edx], esi
227 serge 579
           inc [play_count]
580
           add edx, 4
168 serge 581
.next:
227 serge 582
           add ebx, 4
583
           loop .l1
168 serge 584
.exit:
227 serge 585
           ret
168 serge 586
.fail:
587
           stdcall DestroyBuffer, esi
588
           jmp .restart
589
endp
590
 
591
align 4
592
proc prepare_updatelist
593
 
227 serge 594
           xor ebx, ebx
595
           xor edx, edx
596
           mov [play_count], 0
597
           mov ecx, [stream_count]
168 serge 598
           jcxz .exit
599
.l1:
227 serge 600
           mov eax, [stream_list+ebx]
168 serge 601
           test eax, eax
602
           jz .next
227 serge 603
           cmp [eax+STREAM.flags], SND_PLAY
604
           jne .next
168 serge 605
 
227 serge 606
           mov [play_list+edx], eax
607
           inc [play_count]
608
           add edx, 4
168 serge 609
.next:
227 serge 610
           add ebx, 4
611
           loop .l1
168 serge 612
.exit:
227 serge 613
           ret
168 serge 614
endp
615
 
616
align 4
617
proc set_handler stdcall, hsrv:dword, handler_proc:dword
618
           locals
619
             handler    dd ?
620
             io_code    dd ?
621
             input      dd ?
622
             inp_size   dd ?
623
             output     dd ?
624
             out_size   dd ?
625
             val        dd ?
626
           endl
627
 
628
           mov eax, [hsrv]
629
           lea ecx, [handler_proc]
630
           xor ebx, ebx
631
 
632
           mov [handler], eax
633
           mov [io_code], DEV_CALLBACK
634
           mov [input], ecx
635
           mov [inp_size], 4
636
           mov [output], ebx
637
           mov [out_size], 0
638
 
639
           lea eax, [handler]
188 serge 640
           stdcall ServiceHandler, eax
168 serge 641
           ret
642
endp
643
 
644
align 4
645
proc dev_play stdcall, hsrv:dword
646
           locals
647
             handle     dd ?
648
             io_code    dd ?
649
             input      dd ?
650
             inp_size   dd ?
651
             output     dd ?
652
             out_size   dd ?
653
             val        dd ?
654
           endl
655
 
656
           mov eax, [hsrv]
657
           xor ebx, ebx
658
 
659
           mov [handle], eax
660
           mov [io_code], DEV_PLAY
661
           mov [input], ebx
662
           mov [inp_size], ebx
663
           mov [output], ebx
664
           mov [out_size], ebx
665
 
666
           lea eax, [handle]
188 serge 667
           stdcall ServiceHandler, eax
168 serge 668
           ret
669
endp
670
 
671
include 'mixer.asm'
672
 
673
align 16
674
resampler_params:
675
     ;r_size    r_end   r_dt   resampler_func
676
     dd 0,0,0,0                                  ; 0  PCM_ALL
677
     dd 16384,          0,     0, copy_stream    ; 1  PCM_2_16_48
678
     dd 16384,          0,     0, m16_stereo     ; 2  PCM_1_16_48
679
 
680
     dd 16384, 0x08000000, 30109, resample_2     ; 3  PCM_2_16_44
681
     dd  8192, 0x08000000, 30109, resample_1     ; 4  PCM_1_16_44
682
 
683
     dd 16384, 0x08000000, 21846, resample_2     ; 5  PCM_2_16_32
684
     dd  8192, 0x08000000, 21846, resample_1     ; 6  PCM_1_16_32
685
 
686
     dd 16384, 0x08000000, 16384, resample_2     ; 7  PCM_2_16_24
687
     dd  8192, 0x08000000, 16384, resample_1     ; 8  PCM_1_16_24
688
 
689
     dd  8192, 0x04000000, 15052, resample_2     ; 9  PCM_2_16_22
690
     dd  4096, 0x04000000, 15052, resample_1     ;10  PCM_1_16_22
691
 
692
     dd  8192, 0x04000000, 10923, resample_2     ;11  PCM_2_16_16
693
     dd  4096, 0x04000000, 10923, resample_1     ;12  PCM_1_16_16
694
 
695
     dd  8192, 0x04000000,  8192, resample_2     ;13  PCM_2_16_12
696
     dd  4096, 0x04000000,  8192, resample_1     ;14  PCM_1_16_12
697
 
698
     dd  4096, 0x02000000,  7527, resample_2     ;15  PCM_2_16_11
699
     dd  2048, 0x02000000,  7527, resample_1     ;16  PCM_1_16_11
700
 
701
     dd  4096, 0x02000000,  5462, resample_2     ;17  PCM_2_16_8
702
     dd  2048, 0x02000000,  5462, resample_1     ;18  PCM_1_16_8
703
 
704
     dd 16384,          0,     0, s8_stereo      ;19  PCM_2_8_48
705
     dd  8192,          0,     0, m8_stereo      ;20  PCM_1_8_48
706
 
707
     dd  8192, 0x08000000, 30109, resample_28    ;21  PCM_2_8_44
708
     dd  4096, 0x08000000, 30109, resample_18    ;22  PCM_1_8_44
709
 
710
     dd  8192, 0x08000000, 21846, resample_28    ;23  PCM_2_8_32
711
     dd  4096, 0x08000000, 21846, resample_18    ;24  PCM_1_8_32
712
 
713
     dd  8192, 0x08000000, 16384, resample_28    ;25  PCM_2_8_24
714
     dd  4096, 0x08000000, 16384, resample_18    ;26  PCM_1_8_24
715
 
716
     dd  4096, 0x04000000, 15052, resample_28    ;27  PCM_2_8_22
717
     dd  2048, 0x04000000, 15052, resample_18    ;28  PCM_1_8_22
718
 
719
     dd  4096, 0x04000000, 10923, resample_28    ;29  PCM_2_8_16
720
     dd  2048, 0x04000000, 10923, resample_18    ;30  PCM_1_8_16
721
 
722
     dd  4096, 0x04000000,  8192, resample_28    ;31  PCM_2_8_12
723
     dd  2048, 0x04000000,  8192, resample_18    ;32  PCM_1_8_12
724
 
725
     dd  2048, 0x02000000,  7527, resample_28    ;33  PCM_2_8_11
726
     dd  1024, 0x02000000,  7527, resample_18    ;34  PCM_1_8_11
727
 
728
     dd  2048, 0x02000000,  5462, resample_28    ;35  PCM_2_8_8
729
     dd  1024, 0x02000000,  5462, resample_18    ;36  PCM_1_8_8
730
 
731
m7	     dw 0x8000,0x8000,0x8000,0x8000
732
mm80	     dq 0x8080808080808080
733
mm_mask      dq 0xFF00FF00FF00FF00
734
 
735
stream_map   dd 0xFFFF	      ; 16
227 serge 736
version      dd 0x00010001
168 serge 737
 
738
szInfinity   db 'INFINITY',0
739
szSound      db 'SOUND',0
740
 
741
if DEBUG
214 serge 742
msgFail      db 'Sound service not loaded',13,10,0
168 serge 743
msgPlay      db 'Play buffer',13,10,0
744
msgStop      db 'Stop',13,10,0
745
msgUser      db 'User callback',13,10,0
746
msgMem       db 'Not enough memory',13,10,0
747
end if
188 serge 748
 
749
section '.data' data readable writable align 16
750
 
751
stream       rb STREAM_SIZE*16
752
 
753
play_list    rd 16
754
mix_input    rd 16
755
 
756
stream_list  rd 17
757
play_count   rd 1
758
stream_count rd 1
759
hSound       rd 1
760
mix_buff     rd 1
761
mix_buff_map rd 1
762