Subversion Repositories Kolibri OS

Rev

Rev 328 | 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'
281 serge 20
include 'imports.inc'
168 serge 21
 
293 serge 22
FORCE_MMX        equ 0  ;set to 1 to force use mmx or
23
FORCE_MMX_128    equ 0  ;integer sse2 extensions
24
                        ;and reduce driver size
25
;USE_SSE         equ 0
168 serge 26
 
293 serge 27
DEBUG            equ 1
168 serge 28
 
293 serge 29
EVENT_NOTIFY     equ 0x00000200
291 serge 30
 
293 serge 31
OS_BASE          equ 0
32
new_app_base     equ 0x60400000
33
PROC_BASE        equ OS_BASE+0x0080000
168 serge 34
 
293 serge 35
CAPS_SSE2        equ 26
328 serge 36
PG_SW            equ 0x003
293 serge 37
 
38
 
188 serge 39
public START
168 serge 40
public service_proc
227 serge 41
public version
168 serge 42
 
43
SND_CREATE_BUFF     equ 2
44
SND_PLAY            equ 3
45
SND_STOP            equ 4
46
SND_SETBUFF         equ 5
47
SND_DESTROY_BUFF    equ 6
48
 
49
DEV_PLAY            equ 1
50
DEV_STOP            equ 2
51
DEV_CALLBACK        equ 3
52
 
53
struc IOCTL
54
{  .handle           dd ?
55
   .io_code          dd ?
56
   .input            dd ?
57
   .inp_size         dd ?
58
   .output           dd ?
59
   .out_size         dd ?
60
}
61
 
62
virtual at 0
63
  IOCTL IOCTL
64
end virtual
65
 
188 serge 66
section '.flat' code readable align 16
168 serge 67
 
214 serge 68
proc START stdcall, state:dword
69
 
227 serge 70
           cmp [state], 1
71
           jne .exit
72
 
188 serge 73
           stdcall GetService, szSound
168 serge 74
           test eax, eax
75
           jz .fail
76
           mov [hSound], eax
77
 
188 serge 78
           stdcall KernelAlloc, 16*512
168 serge 79
           test eax, eax
80
           jz .out_of_mem
81
           mov [mix_buff], eax
82
 
291 serge 83
           mov eax, str.fd-FD_OFFSET
84
           mov [str.fd], eax
85
           mov [str.bk], eax
168 serge 86
 
293 serge 87
if FORCE_MMX
88
 if FORCE_MMX_128
89
  display 'Use only FORCE_MMX or FORCE_MMX_128 not both together',13,10
90
  stop
91
 end if
92
           mov [mix_2_core], mmx_mix_2
93
           mov [mix_3_core], mmx_mix_3
94
           mov [mix_4_core], mmx_mix_4
95
end if
96
 
97
if FORCE_MMX_128
98
 if FORCE_MMX
99
  display 'Use only FORCE_MMX or FORCE_MMX_128 not both together',13,10
100
  stop
101
 end if
102
           mov [mix_2_core], mmx128_mix_2
103
           mov [mix_3_core], mmx128_mix_3
104
           mov [mix_4_core], mmx128_mix_4
105
end if
106
 
107
if ~(FORCE_MMX or FORCE_MMX_128)  ;autodetect
108
           mov eax, 1
109
           cpuid
110
           bt edx, CAPS_SSE2
111
           jc .mmx128
112
                                           ;old 64-bit mmx
113
           mov [mix_2_core], mmx_mix_2
114
           mov [mix_3_core], mmx_mix_3
115
           mov [mix_4_core], mmx_mix_4
116
           jmp @F
328 serge 117
.mmx128:                                   ;128-bit integer sse2 extensions
293 serge 118
           mov [mix_2_core], mmx128_mix_2
119
           mov [mix_3_core], mmx128_mix_3
120
           mov [mix_4_core], mmx128_mix_4
121
@@:
122
end if
168 serge 123
           stdcall set_handler, [hSound], new_mix
188 serge 124
           stdcall RegService, szInfinity, service_proc
227 serge 125
           ret
168 serge 126
.fail:
127
     if DEBUG
227 serge 128
           mov esi, msgFail
188 serge 129
           call SysMsgBoardStr
168 serge 130
     end if
214 serge 131
.exit:
227 serge 132
           xor eax, eax
133
           ret
168 serge 134
 
135
.out_of_mem:
136
     if DEBUG
137
           mov esi, msgMem
188 serge 138
           call SysMsgBoardStr
168 serge 139
     end if
227 serge 140
           xor eax, eax
188 serge 141
           ret
214 serge 142
endp
168 serge 143
 
144
handle     equ  IOCTL.handle
145
io_code    equ  IOCTL.io_code
146
input      equ  IOCTL.input
147
inp_size   equ  IOCTL.inp_size
148
output     equ  IOCTL.output
149
out_size   equ  IOCTL.out_size
150
 
151
align 4
152
proc service_proc stdcall, ioctl:dword
153
 
154
           mov edi, [ioctl]
155
           mov eax, [edi+io_code]
156
 
227 serge 157
           cmp eax, SND_CREATE_BUFF
158
           jne @F
168 serge 159
           mov ebx, [edi+input]
160
           stdcall CreateBuffer,[ebx]
227 serge 161
           ret
168 serge 162
@@:
227 serge 163
           cmp eax, SND_PLAY
164
           jne @F
168 serge 165
 
166
           mov ebx, [edi+input]
227 serge 167
           stdcall play_buffer, [ebx]
168
           ret
168 serge 169
@@:
227 serge 170
           cmp eax, SND_STOP
171
           jne @F
168 serge 172
 
173
;       if DEBUG
291 serge 174
;          mov esi, msgStop
175
;          call   [SysMsgBoardStr]
168 serge 176
;       end if
177
 
178
           mov ebx, [edi+input]
227 serge 179
           stdcall stop_buffer, [ebx]
180
           ret
168 serge 181
@@:
227 serge 182
           cmp eax, SND_SETBUFF
183
           jne @F
168 serge 184
 
185
           mov ebx, [edi+input]
227 serge 186
           mov eax, [ebx+4]
187
           add eax, new_app_base
188
           stdcall set_buffer, [ebx],eax,[ebx+8],[ebx+12]
189
           ret
168 serge 190
@@:
191
           cmp eax, SND_DESTROY_BUFF
227 serge 192
           jne @F
168 serge 193
 
291 serge 194
           mov eax, [edi+input]
195
           mov eax, [eax]
196
           call DestroyBuffer    ;eax
227 serge 197
           ret
168 serge 198
@@:
227 serge 199
           xor eax, eax
200
           ret
168 serge 201
endp
202
 
203
restore   handle
204
restore   io_code
205
restore   input
206
restore   inp_size
207
restore   output
208
restore   out_size
209
 
210
TASK_COUNT    equ 0x0003004
211
CURRENT_TASK  equ 0x0003000
212
 
328 serge 213
align 4
168 serge 214
proc CreateBuffer stdcall, format:dword
227 serge 215
           locals
216
             str dd ?
217
           endl
168 serge 218
 
291 serge 219
           mov ebx, [CURRENT_TASK]      ;hack: direct accsess
220
           shl ebx, 5                   ;to kernel data
221
           mov ebx, [0x3000+ebx+4]
222
           mov eax, STREAM_SIZE
223
 
224
           call CreateObject
225
           test eax, eax
227 serge 226
           jz .fail
227
           mov [str], eax
168 serge 228
 
291 serge 229
           mov [eax+STREAM.magic], 'WAVE'
230
           mov [eax+STREAM.destroy], DestroyBuffer.destroy
231
           mov [eax+STREAM.size], STREAM_SIZE
168 serge 232
 
291 serge 233
           pushf
234
           cli
235
           mov ebx, str.fd-FD_OFFSET
236
           mov edx, [ebx+STREAM.str_fd]
237
           mov [eax+STREAM.str_fd], edx
238
           mov [eax+STREAM.str_bk], ebx
239
           mov [ebx+STREAM.str_fd], eax
240
           mov [edx+STREAM.str_bk], eax
241
           popf
168 serge 242
 
328 serge 243
           stdcall KernelAlloc, dword 72*1024
168 serge 244
 
227 serge 245
           mov edi, [str]
246
           mov [edi+STREAM.base], eax
285 serge 247
           add eax, 0x1000
281 serge 248
           mov [edi+STREAM.seg_0], eax
227 serge 249
           mov [edi+STREAM.curr_seg], eax
250
           mov [edi+STREAM.notify_off1], eax
285 serge 251
           add eax, 0x8000
281 serge 252
           mov [edi+STREAM.lim_0], eax
285 serge 253
           add eax, 0x1000
281 serge 254
           mov [edi+STREAM.seg_1], eax
227 serge 255
           mov [edi+STREAM.notify_off2], eax
285 serge 256
           add eax, 0x8000
227 serge 257
           mov [edi+STREAM.limit], eax
281 serge 258
           mov [edi+STREAM.lim_1], eax
168 serge 259
 
328 serge 260
; create ring buffer
261
 
262
           stdcall AllocKernelSpace, dword 128*1024
263
 
264
           mov edi, [str]
227 serge 265
           mov [edi+STREAM.work_buff], eax
266
           mov [edi+STREAM.work_read], eax
267
           mov [edi+STREAM.work_write], eax
268
           mov [edi+STREAM.work_count], 0
328 serge 269
           add eax, 64*1024
227 serge 270
           mov [edi+STREAM.work_top], eax
168 serge 271
 
328 serge 272
           stdcall AllocPages, dword 64/4
273
           mov edi, [str]
274
           mov ebx, [edi+STREAM.work_buff]
275
           mov ecx, 16
276
           or eax, PG_SW
277
           push eax
278
           push ebx
279
           call CommitPages ;eax, ebx, ecx
280
           mov ecx, 16
281
           pop ebx
282
           pop eax
283
           add ebx, 64*1024
284
           call CommitPages    ;double mapped
285
 
286
           mov edi, [str]
227 serge 287
           mov eax, [format]
288
           mov [edi+STREAM.format], eax
289
           mov [edi+STREAM.flags], SND_STOP
168 serge 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
 
227 serge 298
           shl eax, 4
168 serge 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
304
           mov [edi+STREAM.r_end], ecx
305
           mov [edi+STREAM.r_dt],  edx
306
 
227 serge 307
           mov ebx, [resampler_params+eax+12]
308
           mov [edi+STREAM.resample], ebx
168 serge 309
 
285 serge 310
           mov edx, [edi+STREAM.base]
311
           lea eax, [edx+0x9000]
312
           call GetPgAddr  ;eax
313
           call FreePage   ;eax
314
 
315
           mov eax, edx
316
           lea ebx, [edx+0x9000]
317
           call GetPgAddr  ;eax
318
           stdcall MapPage, ebx, eax, dword 3
319
 
227 serge 320
           mov edi, [edi+STREAM.base]
328 serge 321
           mov ecx, (72*1024)/4
227 serge 322
           xor eax, eax
328 serge 323
           cld
227 serge 324
           rep stosd
168 serge 325
 
328 serge 326
           mov edi, [str]
327
           mov edi, [edi+STREAM.work_buff]
328
           mov ecx, (64*1024)/4
329
           rep stosd
330
 
227 serge 331
           mov eax, [str]
332
           ret
168 serge 333
.fail:
227 serge 334
           xor eax, eax
335
           ret
168 serge 336
endp
337
 
328 serge 338
if 0
168 serge 339
align 4
340
pid_to_slot:
341
 
227 serge 342
           push   ebx
343
           push   ecx
344
           mov    ebx,[TASK_COUNT]
345
           shl    ebx,5
346
           mov    ecx,2*32
168 serge 347
.loop:
227 serge 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
168 serge 352
.endloop:
227 serge 353
           add    ecx,32
354
           cmp    ecx,ebx
355
           jle    .loop
356
           pop    ecx
357
           pop    ebx
358
           xor    eax,eax
359
           ret
168 serge 360
 
361
.pid_found:
227 serge 362
           shr    ecx,5
363
           mov    eax,ecx
364
           pop    ecx
365
           pop    ebx
366
           ret
168 serge 367
 
328 serge 368
end if
369
 
291 serge 370
;param
371
; eax= buffer handle
372
 
168 serge 373
align 4
291 serge 374
DestroyBuffer:
328 serge 375
           .handle  equ esp       ;local
168 serge 376
 
291 serge 377
           cmp [eax+STREAM.magic], 'WAVE'
227 serge 378
           jne .fail
168 serge 379
 
291 serge 380
           cmp [eax+STREAM.size], STREAM_SIZE
227 serge 381
           jne .fail
291 serge 382
.destroy:
328 serge 383
           push eax
384
 
291 serge 385
           pushf
386
           cli
387
           mov ebx, [eax+STREAM.str_fd]
388
           mov ecx, [eax+STREAM.str_bk]
389
           mov [ebx+STREAM.str_bk], ecx
390
           mov [ecx+STREAM.str_fd], ebx
391
           popf
168 serge 392
 
291 serge 393
           stdcall KernelFree, [eax+STREAM.base]
328 serge 394
           mov eax, [.handle]
395
           stdcall KernelFree, [eax+STREAM.work_buff]
396
 
397
           pop eax               ;restore stack
291 serge 398
           call DestroyObject    ;eax
168 serge 399
.fail:
227 serge 400
           ret
168 serge 401
 
402
align 4
403
proc play_buffer stdcall, str:dword
404
 
227 serge 405
           mov ebx, [str]
406
           cmp [ebx+STREAM.magic], 'WAVE'
407
           jne .fail
168 serge 408
 
227 serge 409
           cmp [ebx+STREAM.size], STREAM_SIZE
410
           jne .fail
168 serge 411
 
285 serge 412
           mov edi,[ebx+STREAM.work_buff]
413
           mov [ebx+STREAM.work_read], edi
414
           mov [ebx+STREAM.work_write], edi
227 serge 415
           mov [ebx+STREAM.work_count], 0
168 serge 416
 
285 serge 417
           mov edx, [ebx+STREAM.base]
418
           add edx, 0x1000
419
           mov [ebx+STREAM.seg_0], edx
420
           mov [ebx+STREAM.curr_seg], edx
421
           add edx, 0x8000
422
           mov [ebx+STREAM.lim_0], edx
423
           add edx, 0x1000
424
           mov [ebx+STREAM.seg_1], edx
425
           add edx, 0x8000
426
           mov [ebx+STREAM.lim_1], edx
168 serge 427
 
285 serge 428
           mov edx, [ebx+STREAM.seg_0]
429
           mov ecx, -128
168 serge 430
           mov eax, [ebx+STREAM.r_silence]
431
@@:
285 serge 432
           mov [edx+ecx], eax
433
           add ecx, 4
227 serge 434
           jnz @B
168 serge 435
 
285 serge 436
           stdcall [ebx+STREAM.resample], edi, edx,\
227 serge 437
           [ebx+STREAM.r_dt],[ebx+STREAM.r_size],[ebx+STREAM.r_end]
168 serge 438
 
227 serge 439
           mov ebx, [str]
168 serge 440
 
285 serge 441
           add [ebx+STREAM.work_count], eax
442
           add [ebx+STREAM.work_write], eax
168 serge 443
 
285 serge 444
           mov edx, [ebx+STREAM.r_size]
445
           add [ebx+STREAM.curr_seg], edx
168 serge 446
 
285 serge 447
           mov [ebx+STREAM.flags], SND_PLAY
168 serge 448
 
285 serge 449
           mov eax, [ebx+STREAM.r_silence]
450
           mov edi, [ebx+STREAM.work_write]
451
           mov ecx, [ebx+STREAM.work_top]
452
           sub ecx, edi
453
           shr ecx, 2
454
           cld
455
           rep stosd
456
 
227 serge 457
           stdcall  dev_play, [hSound]
458
           xor eax, eax
459
           inc eax
460
           ret
168 serge 461
.fail:
227 serge 462
           xor eax, eax
463
           ret
168 serge 464
endp
465
 
466
align 4
467
proc stop_buffer stdcall, str:dword
468
 
227 serge 469
           mov edi, [str]
168 serge 470
 
227 serge 471
           cmp [edi+STREAM.magic], 'WAVE'
472
           jne .fail
168 serge 473
 
227 serge 474
           cmp [edi+STREAM.size], STREAM_SIZE
475
           jne .fail
168 serge 476
 
227 serge 477
           mov [edi+STREAM.flags], SND_STOP
168 serge 478
 
479
;           stdcall [ServiceHandler], [hSound], dword DEV_STOP, 0
480
 
227 serge 481
           xor eax, eax
482
           inc eax
483
           ret
168 serge 484
.fail:
227 serge 485
           xor eax, eax
486
           ret
168 serge 487
endp
488
 
489
align 4
490
proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword
491
 
227 serge 492
           mov edx, [str]
493
           test edx, edx
494
           jz .fail
168 serge 495
 
227 serge 496
           cmp [edx+STREAM.magic], 'WAVE'
497
           jne .fail
168 serge 498
 
227 serge 499
           cmp [edx+STREAM.size], STREAM_SIZE
500
           jne .fail
168 serge 501
 
227 serge 502
           mov esi,[src]
503
           test esi, esi
504
           jz .fail
168 serge 505
 
506
           cmp esi, new_app_base
507
           jb .fail
508
 
285 serge 509
           mov edi, [offs]
510
           mov ecx, 0x8000
168 serge 511
 
285 serge 512
           sub ecx, edi
513
           jbe .seg_1
168 serge 514
 
285 serge 515
           sub [size], ecx
168 serge 516
           jb .fail
517
 
285 serge 518
           add edi, [edx+STREAM.base]
519
           add edi, 0x1000
520
           shr ecx, 2
521
           cld
522
           rep movsd
523
           jmp @F
524
.seg_1:
525
           add edi, [edx+STREAM.base]
526
           add edi, 0x1000
527
@@:
528
           add edi, 0x1000
529
           mov ecx, [size]
530
           test ecx, ecx
531
           jz .done
532
           cmp ecx, 0x8000
168 serge 533
           ja .fail
534
 
227 serge 535
           shr ecx, 2
536
           rep movsd
285 serge 537
.done:
227 serge 538
           xor eax, eax
539
           inc eax
540
           ret
168 serge 541
.fail:
227 serge 542
           xor eax, eax
543
           ret
168 serge 544
endp
545
 
546
align 4
291 serge 547
prepare_playlist:
168 serge 548
 
227 serge 549
           xor edx, edx
291 serge 550
           mov [play_count], edx
551
           mov esi, str.fd-FD_OFFSET
552
           mov edi, [esi+STREAM.str_fd]
553
@@:
554
           cmp edi, esi
555
           je .done
168 serge 556
 
291 serge 557
           cmp [edi+STREAM.magic], 'WAVE'
168 serge 558
           jne .next
559
 
291 serge 560
           cmp [edi+STREAM.size], STREAM_SIZE
168 serge 561
           jne .next
562
 
291 serge 563
           cmp [edi+STREAM.flags], SND_PLAY;
227 serge 564
           jne .next
291 serge 565
           cmp [edi+STREAM.work_count], 16384
168 serge 566
           jb .next
567
 
291 serge 568
           mov [play_list+edx], edi
227 serge 569
           inc [play_count]
570
           add edx, 4
168 serge 571
.next:
291 serge 572
           mov edi, [edi+STREAM.str_fd]
573
           jmp @B
574
.done:
227 serge 575
           ret
168 serge 576
 
577
align 4
578
proc set_handler stdcall, hsrv:dword, handler_proc:dword
579
           locals
580
             handler    dd ?
581
             io_code    dd ?
582
             input      dd ?
583
             inp_size   dd ?
584
             output     dd ?
585
             out_size   dd ?
586
             val        dd ?
587
           endl
588
 
589
           mov eax, [hsrv]
590
           lea ecx, [handler_proc]
591
           xor ebx, ebx
592
 
593
           mov [handler], eax
594
           mov [io_code], DEV_CALLBACK
595
           mov [input], ecx
596
           mov [inp_size], 4
597
           mov [output], ebx
598
           mov [out_size], 0
599
 
600
           lea eax, [handler]
188 serge 601
           stdcall ServiceHandler, eax
168 serge 602
           ret
603
endp
604
 
605
align 4
606
proc dev_play stdcall, hsrv:dword
607
           locals
608
             handle     dd ?
609
             io_code    dd ?
610
             input      dd ?
611
             inp_size   dd ?
612
             output     dd ?
613
             out_size   dd ?
614
             val        dd ?
615
           endl
616
 
617
           mov eax, [hsrv]
618
           xor ebx, ebx
619
 
620
           mov [handle], eax
621
           mov [io_code], DEV_PLAY
622
           mov [input], ebx
623
           mov [inp_size], ebx
624
           mov [output], ebx
625
           mov [out_size], ebx
626
 
627
           lea eax, [handle]
188 serge 628
           stdcall ServiceHandler, eax
168 serge 629
           ret
630
endp
631
 
632
include 'mixer.asm'
293 serge 633
include 'mix_mmx.inc'
634
include 'mix_sse2.inc'
168 serge 635
 
291 serge 636
;if USE_SSE
637
; include 'mix_sse.inc'
638
;end if
639
 
168 serge 640
align 16
641
resampler_params:
642
     ;r_size    r_end   r_dt   resampler_func
643
     dd 0,0,0,0                                  ; 0  PCM_ALL
644
     dd 16384,          0,     0, copy_stream    ; 1  PCM_2_16_48
645
     dd 16384,          0,     0, m16_stereo     ; 2  PCM_1_16_48
646
 
647
     dd 16384, 0x08000000, 30109, resample_2     ; 3  PCM_2_16_44
648
     dd  8192, 0x08000000, 30109, resample_1     ; 4  PCM_1_16_44
649
 
650
     dd 16384, 0x08000000, 21846, resample_2     ; 5  PCM_2_16_32
651
     dd  8192, 0x08000000, 21846, resample_1     ; 6  PCM_1_16_32
652
 
653
     dd 16384, 0x08000000, 16384, resample_2     ; 7  PCM_2_16_24
654
     dd  8192, 0x08000000, 16384, resample_1     ; 8  PCM_1_16_24
655
 
656
     dd  8192, 0x04000000, 15052, resample_2     ; 9  PCM_2_16_22
657
     dd  4096, 0x04000000, 15052, resample_1     ;10  PCM_1_16_22
658
 
659
     dd  8192, 0x04000000, 10923, resample_2     ;11  PCM_2_16_16
660
     dd  4096, 0x04000000, 10923, resample_1     ;12  PCM_1_16_16
661
 
662
     dd  8192, 0x04000000,  8192, resample_2     ;13  PCM_2_16_12
663
     dd  4096, 0x04000000,  8192, resample_1     ;14  PCM_1_16_12
664
 
665
     dd  4096, 0x02000000,  7527, resample_2     ;15  PCM_2_16_11
666
     dd  2048, 0x02000000,  7527, resample_1     ;16  PCM_1_16_11
667
 
668
     dd  4096, 0x02000000,  5462, resample_2     ;17  PCM_2_16_8
669
     dd  2048, 0x02000000,  5462, resample_1     ;18  PCM_1_16_8
670
 
671
     dd 16384,          0,     0, s8_stereo      ;19  PCM_2_8_48
672
     dd  8192,          0,     0, m8_stereo      ;20  PCM_1_8_48
673
 
674
     dd  8192, 0x08000000, 30109, resample_28    ;21  PCM_2_8_44
675
     dd  4096, 0x08000000, 30109, resample_18    ;22  PCM_1_8_44
676
 
677
     dd  8192, 0x08000000, 21846, resample_28    ;23  PCM_2_8_32
678
     dd  4096, 0x08000000, 21846, resample_18    ;24  PCM_1_8_32
679
 
680
     dd  8192, 0x08000000, 16384, resample_28    ;25  PCM_2_8_24
681
     dd  4096, 0x08000000, 16384, resample_18    ;26  PCM_1_8_24
682
 
683
     dd  4096, 0x04000000, 15052, resample_28    ;27  PCM_2_8_22
684
     dd  2048, 0x04000000, 15052, resample_18    ;28  PCM_1_8_22
685
 
686
     dd  4096, 0x04000000, 10923, resample_28    ;29  PCM_2_8_16
687
     dd  2048, 0x04000000, 10923, resample_18    ;30  PCM_1_8_16
688
 
689
     dd  4096, 0x04000000,  8192, resample_28    ;31  PCM_2_8_12
690
     dd  2048, 0x04000000,  8192, resample_18    ;32  PCM_1_8_12
691
 
692
     dd  2048, 0x02000000,  7527, resample_28    ;33  PCM_2_8_11
693
     dd  1024, 0x02000000,  7527, resample_18    ;34  PCM_1_8_11
694
 
695
     dd  2048, 0x02000000,  5462, resample_28    ;35  PCM_2_8_8
696
     dd  1024, 0x02000000,  5462, resample_18    ;36  PCM_1_8_8
697
 
281 serge 698
m7            dw 0x8000,0x8000,0x8000,0x8000
699
mm80          dq 0x8080808080808080
700
mm_mask       dq 0xFF00FF00FF00FF00
168 serge 701
 
291 serge 702
;stream_map    dd 0xFFFF       ; 16
346 diamond 703
version       dd 0x00030003
168 serge 704
 
281 serge 705
szInfinity    db 'INFINITY',0
706
szSound       db 'SOUND',0
168 serge 707
 
708
if DEBUG
281 serge 709
msgFail       db 'Sound service not loaded',13,10,0
710
msgPlay       db 'Play buffer',13,10,0
711
msgStop       db 'Stop',13,10,0
712
msgUser       db 'User callback',13,10,0
713
msgMem        db 'Not enough memory',13,10,0
291 serge 714
msgDestroy    db 'Destroy sound buffer', 13,10,0
168 serge 715
end if
188 serge 716
 
717
section '.data' data readable writable align 16
718
 
281 serge 719
play_list     rd 16
720
mix_input     rd 16
721
play_count    rd 1
722
hSound        rd 1
723
mix_buff      rd 1
724
mix_buff_map  rd 1
291 serge 725
str.fd        rd 1
726
str.bk        rd 1
188 serge 727
 
293 serge 728
mix_2_core    rd 1
729
mix_3_core    rd 1
730
mix_4_core    rd 1
291 serge 731