Subversion Repositories Kolibri OS

Rev

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

Rev 285 Rev 291
Line 17... Line 17...
17
 
17
 
18
include 'proc32.inc'
18
include 'proc32.inc'
19
include 'main.inc'
19
include 'main.inc'
Line -... Line 20...
-
 
20
include 'imports.inc'
-
 
21
 
-
 
22
USE_MMX      equ 0
-
 
23
USE_MMX_128  equ 0
20
include 'imports.inc'
24
USE_SSE      equ 0
Line 21... Line 25...
21
 
25
 
Line 22... Line 26...
22
DEBUG		    equ 1
26
DEBUG               equ 1
Line 69... Line 73...
69
           stdcall KernelAlloc, 16*512
73
           stdcall KernelAlloc, 16*512
70
           test eax, eax
74
           test eax, eax
71
           jz .out_of_mem
75
           jz .out_of_mem
72
           mov [mix_buff], eax
76
           mov [mix_buff], eax
Line 73... Line 77...
73
 
77
 
74
           mov edi, stream_list
-
 
75
           mov ecx, 17
78
           mov eax, str.fd-FD_OFFSET
76
           xor eax, eax
-
 
77
           cld
-
 
78
           rep stosd
-
 
79
 
79
           mov [str.fd], eax
80
           mov edi, stream
-
 
81
           mov ecx, 4*STREAM_SIZE
-
 
82
           rep stosd
-
 
Line 83... Line 80...
83
           mov [stream_count],0
80
           mov [str.bk], eax
84
 
81
 
85
           stdcall set_handler, [hSound], new_mix
82
           stdcall set_handler, [hSound], new_mix
86
           stdcall RegService, szInfinity, service_proc
83
           stdcall RegService, szInfinity, service_proc
Line 151... Line 148...
151
           ret
148
           ret
152
@@:
149
@@:
153
           cmp eax, SND_DESTROY_BUFF
150
           cmp eax, SND_DESTROY_BUFF
154
           jne @F
151
           jne @F
Line 155... Line 152...
155
 
152
 
-
 
153
           mov eax, [edi+input]
156
           mov ebx, [edi+input]
154
           mov eax, [eax]
157
           stdcall DestroyBuffer, [ebx]
155
           call DestroyBuffer    ;eax
158
           ret
156
           ret
159
@@:
157
@@:
160
           xor eax, eax
158
           xor eax, eax
161
           ret
159
           ret
Line 175... Line 173...
175
proc CreateBuffer stdcall, format:dword
173
proc CreateBuffer stdcall, format:dword
176
           locals
174
           locals
177
             str dd ?
175
             str dd ?
178
           endl
176
           endl
Line -... Line 177...
-
 
177
 
-
 
178
           mov ebx, [CURRENT_TASK]      ;hack: direct accsess
-
 
179
           shl ebx, 5                   ;to kernel data
-
 
180
           mov ebx, [0x3000+ebx+4]
-
 
181
           mov eax, STREAM_SIZE
179
 
182
 
180
           call alloc_stream
183
           call CreateObject
181
           and eax, eax
184
           test eax, eax
182
           jz .fail
185
           jz .fail
183
           mov [str], eax
-
 
Line 184... Line 186...
184
           mov edi, eax
186
           mov [str], eax
185
 
187
 
186
           mov edx, [stream_count]
188
           mov [eax+STREAM.magic], 'WAVE'
Line -... Line 189...
-
 
189
           mov [eax+STREAM.destroy], DestroyBuffer.destroy
-
 
190
           mov [eax+STREAM.size], STREAM_SIZE
-
 
191
 
-
 
192
           pushf
-
 
193
           cli
-
 
194
           mov ebx, str.fd-FD_OFFSET
187
           mov [stream_list+edx*4], eax
195
           mov edx, [ebx+STREAM.str_fd]
188
           inc [stream_count]
196
           mov [eax+STREAM.str_fd], edx
-
 
197
           mov [eax+STREAM.str_bk], ebx
Line 189... Line 198...
189
 
198
           mov [ebx+STREAM.str_fd], eax
Line 190... Line 199...
190
           mov [edi+STREAM.magic], 'WAVE'
199
           mov [edx+STREAM.str_bk], eax
191
           mov [edi+STREAM.size], STREAM_SIZE
200
           popf
192
 
201
 
193
           stdcall KernelAlloc, 172*1024
202
           stdcall KernelAlloc, 168*1024
Line 212... Line 221...
212
           mov [edi+STREAM.work_write], eax
221
           mov [edi+STREAM.work_write], eax
213
           mov [edi+STREAM.work_count], 0
222
           mov [edi+STREAM.work_count], 0
214
           add eax, 0x10000
223
           add eax, 0x10000
215
           mov [edi+STREAM.work_top], eax
224
           mov [edi+STREAM.work_top], eax
Line 216... Line -...
216
 
-
 
217
           mov ebx, [CURRENT_TASK]
-
 
218
           shl ebx, 5
-
 
219
           mov eax, [0x3000+ebx+4]
-
 
220
 
-
 
221
           mov [edi+STREAM.notify_task], eax
-
 
222
 
225
 
223
           mov eax, [format]
226
           mov eax, [format]
224
           mov [edi+STREAM.format], eax
227
           mov [edi+STREAM.format], eax
Line 225... Line 228...
225
           mov [edi+STREAM.flags], SND_STOP
228
           mov [edi+STREAM.flags], SND_STOP
Line 292... Line 295...
292
           mov    eax,ecx
295
           mov    eax,ecx
293
           pop    ecx
296
           pop    ecx
294
           pop    ebx
297
           pop    ebx
295
           ret
298
           ret
Line 296... Line 299...
296
 
299
 
297
align 4
300
;param
Line -... Line 301...
-
 
301
; eax= buffer handle
298
proc DestroyBuffer stdcall, str:dword
302
 
Line 299... Line 303...
299
 
303
align 4
300
           mov esi, [str]
304
DestroyBuffer:
Line 301... Line 305...
301
 
305
 
302
           cmp [esi+STREAM.magic], 'WAVE'
306
           cmp [eax+STREAM.magic], 'WAVE'
-
 
307
           jne .fail
-
 
308
 
-
 
309
           cmp [eax+STREAM.size], STREAM_SIZE
-
 
310
           jne .fail
-
 
311
.destroy:
-
 
312
           pushf
-
 
313
           cli
-
 
314
           mov ebx, [eax+STREAM.str_fd]
Line 303... Line -...
303
           jne .fail
-
 
304
 
-
 
305
           cmp [esi+STREAM.size], STREAM_SIZE
-
 
306
           jne .fail
-
 
307
 
-
 
308
           stdcall KernelFree, [esi+STREAM.base]
-
 
309
 
-
 
310
           mov eax, [str]
-
 
311
           call free_stream
-
 
312
 
-
 
313
           mov edi, [str]
-
 
314
           mov ecx, STREAM_SIZE/4
-
 
315
           xor eax, eax
-
 
316
           cld
-
 
317
           rep stosd
-
 
318
 
-
 
319
           mov eax, [str]
-
 
320
           mov esi, stream_list
-
 
321
           mov ecx, 16
315
           mov ecx, [eax+STREAM.str_bk]
322
@@:
-
 
323
           cmp [esi], eax
316
           mov [ebx+STREAM.str_bk], ecx
324
           je .remove
317
           mov [ecx+STREAM.str_fd], ebx
325
           add esi, 4
-
 
326
           dec ecx
-
 
327
           jnz @B
-
 
328
           xor eax, eax
-
 
329
           inc eax
-
 
330
           ret
-
 
331
.remove:
318
           popf
332
           mov edi, esi
-
 
333
           add esi, 4
-
 
334
           cld
319
 
335
           rep movsd
320
           push eax
336
           dec [stream_count]
-
 
337
           xor eax, eax
321
           stdcall KernelFree, [eax+STREAM.base]
338
           inc eax
-
 
Line 339... Line 322...
339
           ret
322
           pop eax
340
.fail:
323
           call DestroyObject    ;eax
Line 341... Line 324...
341
           xor eax, eax
324
           ret
Line 485... Line 468...
485
           xor eax, eax
468
           xor eax, eax
486
           ret
469
           ret
487
endp
470
endp
Line 488... Line 471...
488
 
471
 
489
align 4
472
align 4
490
proc alloc_stream
-
 
491
 
-
 
492
           mov esi, stream_map
-
 
493
 
-
 
494
           pushf
-
 
Line 495... Line -...
495
           cli
-
 
496
 
-
 
497
           bsf eax, [esi]
-
 
498
           jnz .find
-
 
499
           popf
-
 
500
           xor eax, eax
-
 
501
           ret
-
 
502
.find:
-
 
503
           btr [esi], eax
-
 
504
           popf
-
 
505
           mov ebx, STREAM_SIZE
-
 
506
           mul ebx
-
 
507
           add eax, stream
-
 
508
           ret
-
 
509
endp
-
 
510
 
-
 
511
align 4
-
 
512
proc free_stream
-
 
513
           sub eax, stream
-
 
514
           mov ebx, STREAM_SIZE
-
 
515
           xor edx, edx
-
 
516
           div ebx
-
 
517
 
-
 
518
           and edx, edx
-
 
519
           jnz .err
-
 
520
 
-
 
521
           bts [stream_map], eax
-
 
522
           ret
-
 
523
.err:
-
 
524
           xor eax, eax
-
 
525
           ret
-
 
526
endp
-
 
527
 
-
 
528
align 4
-
 
529
proc prepare_playlist
-
 
530
 
-
 
531
.restart:
473
prepare_playlist:
532
           xor ebx, ebx
474
 
533
           xor edx, edx
475
           xor edx, edx
534
           mov [play_count], 0
476
           mov [play_count], edx
535
           mov ecx, [stream_count]
477
           mov esi, str.fd-FD_OFFSET
536
           jcxz .exit
-
 
537
.l1:
478
           mov edi, [esi+STREAM.str_fd]
538
           mov esi, [stream_list+ebx]
479
@@:
Line 539... Line 480...
539
           test esi, esi
480
           cmp edi, esi
540
           jz .next
481
           je .done
Line 541... Line 482...
541
 
482
 
542
           cmp [esi+STREAM.magic], 'WAVE'
483
           cmp [edi+STREAM.magic], 'WAVE'
Line 543... Line 484...
543
           jne .next
484
           jne .next
544
 
485
 
545
           cmp [esi+STREAM.size], STREAM_SIZE
486
           cmp [edi+STREAM.size], STREAM_SIZE
-
 
487
           jne .next
-
 
488
 
-
 
489
;           mov eax,[edi+STREAM.pid]
Line 546... Line -...
546
           jne .next
-
 
547
 
-
 
548
           mov eax,[esi+STREAM.notify_task]
-
 
549
           cmp eax, -1
-
 
550
           je .fail
490
;           cmp eax, -1
551
 
491
;           je .next
552
           call pid_to_slot
492
;           call pid_to_slot
553
           test eax, eax
493
;           test eax, eax
Line 554... Line 494...
554
           jz .fail
494
;           jz .next
555
 
-
 
556
           cmp [esi+STREAM.flags], SND_PLAY;
-
 
557
           jne .next
-
 
558
           cmp [esi+STREAM.work_count], 16384
-
 
559
           jb .next
-
 
560
 
-
 
561
           mov [play_list+edx], esi
-
 
562
           inc [play_count]
-
 
563
           add edx, 4
-
 
564
.next:
-
 
565
           add ebx, 4
-
 
566
           loop .l1
-
 
567
.exit:
-
 
568
           ret
-
 
569
.fail:
-
 
570
           stdcall DestroyBuffer, esi
-
 
571
           jmp .restart
-
 
572
endp
-
 
573
 
-
 
574
align 4
-
 
575
proc prepare_updatelist
-
 
576
 
-
 
577
           xor ebx, ebx
-
 
578
           xor edx, edx
-
 
579
           mov [play_count], 0
-
 
580
           mov ecx, [stream_count]
-
 
581
           jcxz .exit
-
 
582
.l1:
-
 
583
           mov eax, [stream_list+ebx]
495
 
584
           test eax, eax
496
           cmp [edi+STREAM.flags], SND_PLAY;
585
           jz .next
497
           jne .next
586
           cmp [eax+STREAM.flags], SND_PLAY
498
           cmp [edi+STREAM.work_count], 16384
587
           jne .next
499
           jb .next
588
 
500
 
589
           mov [play_list+edx], eax
501
           mov [play_list+edx], edi
590
           inc [play_count]
-
 
Line 591... Line 502...
591
           add edx, 4
502
           inc [play_count]
592
.next:
503
           add edx, 4
593
           add ebx, 4
504
.next:
594
           loop .l1
505
           mov edi, [edi+STREAM.str_fd]
Line 651... Line 562...
651
           ret
562
           ret
652
endp
563
endp
Line 653... Line 564...
653
 
564
 
Line -... Line 565...
-
 
565
include 'mixer.asm'
-
 
566
 
-
 
567
;if USE_MMX
-
 
568
; include 'mix_mmx.inc'
-
 
569
;end if
-
 
570
 
-
 
571
if USE_MMX_128
-
 
572
 include 'mix_sse2.inc'
-
 
573
end if
-
 
574
 
-
 
575
;if USE_SSE
-
 
576
; include 'mix_sse.inc'
654
include 'mixer.asm'
577
;end if
655
 
578
 
656
align 16
579
align 16
657
resampler_params:
580
resampler_params:
658
     ;r_size    r_end   r_dt   resampler_func
581
     ;r_size    r_end   r_dt   resampler_func
Line 713... Line 636...
713
 
636
 
714
m7            dw 0x8000,0x8000,0x8000,0x8000
637
m7            dw 0x8000,0x8000,0x8000,0x8000
715
mm80          dq 0x8080808080808080
638
mm80          dq 0x8080808080808080
Line 716... Line 639...
716
mm_mask       dq 0xFF00FF00FF00FF00
639
mm_mask       dq 0xFF00FF00FF00FF00
717
 
640
 
Line 718... Line 641...
718
stream_map    dd 0xFFFF       ; 16
641
;stream_map    dd 0xFFFF       ; 16
719
version       dd 0x00030003
642
version       dd 0x00030003
Line 725... Line 648...
725
msgFail       db 'Sound service not loaded',13,10,0
648
msgFail       db 'Sound service not loaded',13,10,0
726
msgPlay       db 'Play buffer',13,10,0
649
msgPlay       db 'Play buffer',13,10,0
727
msgStop       db 'Stop',13,10,0
650
msgStop       db 'Stop',13,10,0
728
msgUser       db 'User callback',13,10,0
651
msgUser       db 'User callback',13,10,0
729
msgMem        db 'Not enough memory',13,10,0
652
msgMem        db 'Not enough memory',13,10,0
-
 
653
msgDestroy    db 'Destroy sound buffer', 13,10,0
730
end if
654
end if
Line 731... Line 655...
731
 
655
 
Line 732... Line -...
732
section '.data' data readable writable align 16
-
 
733
 
-
 
734
stream        rb STREAM_SIZE*16
656
section '.data' data readable writable align 16
735
 
657
 
736
play_list     rd 16
-
 
737
mix_input     rd 16
-
 
738
 
658
play_list     rd 16
739
stream_list   rd 17
-
 
740
play_count    rd 1
659
mix_input     rd 16
741
stream_count  rd 1
660
play_count    rd 1
742
hSound        rd 1
661
hSound        rd 1
-
 
662
mix_buff      rd 1
-
 
663
mix_buff_map  rd 1
-
 
664
str.fd        rd 1
-
 
665
str.bk        rd 1
-
 
666
 
-
 
667
mix_2_1.core  rd 1