Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
168 serge 8
;   (C) copyright Serge 2006
9
;   email: infinity_sound@mail.ru
10
 
378 serge 11
 
431 serge 12
 
168 serge 13
align 4
378 serge 14
 
15
mix_list rq 32
16
 
17
align 4
168 serge 18
proc new_mix stdcall, output:dword
281 serge 19
           locals
378 serge 20
             main_count   rd 1
21
             fpu_state    rb 528   ;512+16
281 serge 22
           endl
168 serge 23
 
378 serge 24
           mov [main_count], 32
281 serge 25
           call prepare_playlist
378 serge 26
           cmp [play_count], 0
27
           je .clear
168 serge 28
 
378 serge 29
           lea eax, [fpu_state+16]
30
           and eax, -16             ;must be 16b aligned
188 serge 31
           call FpuSave
168 serge 32
 
378 serge 33
           call update_stream
34
.mix:
35
           lea eax, [mix_list]
36
           call do_mix_list
37
           test eax, eax
38
           je .done
168 serge 39
 
378 serge 40
           lea ebx, [mix_list]
41
           stdcall mix_all, [output], ebx, eax
168 serge 42
@@:
378 serge 43
           add [output], 512
293 serge 44
           dec [main_count]
378 serge 45
           jnz .mix
46
.exit:
47
           lea eax, [fpu_state+16]
48
           and eax, -16
188 serge 49
           call FpuRestore
281 serge 50
           ret
378 serge 51
.copy:
52
           lea eax, [mix_list]
53
           stdcall copy_mem, [output], [eax]
54
           jmp @B
55
.done:
56
           mov ecx, [main_count]
57
           shl ecx, 7     ;ecx*= 512/4
58
 
281 serge 59
           mov edi, [output]
60
           xor eax, eax
61
           cld
62
           rep stosd
378 serge 63
           jmp .exit
64
.clear:
65
           mov edi, [output]
66
           mov ecx, 4096
67
           xor eax, eax
68
           cld
69
           rep stosd
281 serge 70
           ret
168 serge 71
endp
72
 
73
align 4
74
proc update_stream
281 serge 75
           locals
170 serge 76
             stream_index  dd ?
568 serge 77
             event         rd 6
281 serge 78
           endl
168 serge 79
 
281 serge 80
           mov [stream_index], 0
168 serge 81
.l1:
281 serge 82
           mov edx, [stream_index]
83
           mov esi, [play_list+edx*4]
168 serge 84
 
378 serge 85
           mov eax, [esi+STREAM.out_rp]
86
           cmp eax, [esi+STREAM.out_top]
281 serge 87
           jb @f
328 serge 88
           sub eax, 64*1024
168 serge 89
@@:
378 serge 90
           mov [esi+STREAM.out_rp], eax
168 serge 91
 
378 serge 92
           cmp word [esi+STREAM.format], PCM_2_16_48
281 serge 93
           je .copy
168 serge 94
 
378 serge 95
           cmp [esi+STREAM.out_count], 16384
96
           ja .skip
168 serge 97
 
378 serge 98
           test [esi+STREAM.format], PCM_RING
99
           jnz .ring
168 serge 100
 
281 serge 101
           stdcall refill, esi
378 serge 102
.skip:
281 serge 103
           inc [stream_index]
104
           dec [play_count]
105
           jnz .l1
106
           ret
378 serge 107
 
108
.ring:
109
           stdcall refill_ring, esi
110
           jmp .skip
168 serge 111
.copy:
281 serge 112
           mov ebx, esi
568 serge 113
           mov esi, [ebx+STREAM.in_rp]
378 serge 114
           mov edi, [ebx+STREAM.out_wp]
115
           cmp edi, [ebx+STREAM.out_top]
281 serge 116
           jb @f
328 serge 117
 
118
           sub edi, 64*1024
378 serge 119
           mov [ebx+STREAM.out_wp], edi
168 serge 120
@@:
568 serge 121
           test [ebx+STREAM.format], PCM_RING
122
           jnz .stream
123
 
124
           mov ecx, [ebx+STREAM.in_count]
125
           test ecx, ecx
126
           jz .done
127
 
128
           cmp ecx, 16384
129
           jbe @F
130
           mov ecx, 16386
131
@@:
132
           sub [ebx+STREAM.in_count], ecx
133
.stream:
134
           add [ebx+STREAM.in_free], ecx
135
           add [ebx+STREAM.out_count], ecx
136
 
137
           shr ecx, 2
281 serge 138
           cld
139
           rep movsd
168 serge 140
 
378 serge 141
           mov [ebx+STREAM.out_wp], edi
142
           cmp esi, [ebx+STREAM.in_top]
281 serge 143
           jb @f
168 serge 144
 
568 serge 145
           sub esi, [ebx+STREAM.in_size]
168 serge 146
@@:
378 serge 147
           mov [ebx+STREAM.in_rp], esi
568 serge 148
           test [ebx+STREAM.format], PCM_RING
149
           jz .done
168 serge 150
 
568 serge 151
           sub esi, [ebx+STREAM.in_base]
152
           sub esi, 128
153
           lea edx, [event]
154
 
155
           mov dword [edx], RT_INP_EMPTY
156
           mov dword [edx+4], 0
157
           mov dword [edx+8], ebx
158
           mov dword [edx+12], esi
159
 
160
           mov eax, [ebx+STREAM.notify_event]
378 serge 161
           test eax, eax
162
           jz .l_end
568 serge 163
 
164
           mov ebx, [ebx+STREAM.notify_id]
165
           xor ecx, ecx
166
           call RaiseEvent   ;eax, ebx, ecx, edx
167
           jmp .l_end
168
.done:
378 serge 169
           mov eax, [ebx+STREAM.notify_event]
568 serge 170
           test eax, eax
171
           jz .l_end
172
 
378 serge 173
           mov ebx, [ebx+STREAM.notify_id]
174
           mov ecx, EVENT_WATCHED
175
           xor edx, edx
176
           call RaiseEvent     ;eax, ebx, ecx, edx
177
.l_end:
281 serge 178
           inc [stream_index]
179
           dec [play_count]
180
           jnz .l1
181
           ret
378 serge 182
endp
183
 
184
align 4
185
proc refill stdcall, str:dword
186
           locals
187
             r_size    rd 1
188
           endl
189
 
190
           mov ebx, [str]
191
           mov edi, [ebx+STREAM.out_wp]
192
           cmp edi, [ebx+STREAM.out_top]
193
           jb @F
194
           sub edi, 0x10000
195
           mov [ebx+STREAM.out_wp], edi
168 serge 196
@@:
378 serge 197
           mov eax, [ebx+STREAM.in_count]
198
           test eax, eax
199
           jz .done
227 serge 200
 
378 serge 201
           mov ecx, [ebx+STREAM.r_size]
202
           cmp eax, ecx
203
           jle @F
204
 
205
           mov eax, ecx
206
@@:
207
           mov ecx, eax
208
           cmp word [ebx+STREAM.format], PCM_1_16_8
209
           ja @F
210
 
211
           shr eax, 1                   ;two channles
212
@@:
213
           test [ebx+STREAM.format], 1  ;even formats mono
214
           jz @F
215
 
216
           shr eax, 1                   ;eax= samples
217
@@:
218
           shl eax, 15    ;eax*=32768 =r_end
219
 
220
           mov [r_size], ecx
221
 
222
           mov esi, [ebx+STREAM.in_rp]
223
           mov edi, [ebx+STREAM.out_wp]
224
 
225
           stdcall [ebx+STREAM.resample], edi, esi, \
226
           [ebx+STREAM.r_dt], ecx, eax
227
 
228
           mov ebx, [str]
229
 
230
           add [ebx+STREAM.out_count], eax;
231
           add [ebx+STREAM.out_wp], eax;
232
 
233
           mov eax, [ebx+STREAM.in_rp]
234
           mov ecx, [r_size]
235
           add eax, ecx
236
           add [ebx+STREAM.in_free], ecx
237
           sub [ebx+STREAM.in_count], ecx
238
 
239
           cmp eax, [ebx+STREAM.in_top]
240
           jb @f
241
 
242
           sub eax, [ebx+STREAM.in_size]
243
@@:
244
           mov [ebx+STREAM.in_rp], eax
245
 
246
.done:
247
           mov eax, [ebx+STREAM.notify_event]
168 serge 248
           test eax, eax
378 serge 249
           jz .exit
227 serge 250
 
378 serge 251
           mov ebx, [ebx+STREAM.notify_id]
252
           mov ecx, EVENT_WATCHED
253
           xor edx, edx
254
           call RaiseEvent   ;eax, ebx, ecx, edx
255
.exit:
281 serge 256
           ret
168 serge 257
endp
258
 
259
align 4
378 serge 260
proc refill_ring stdcall, str:dword
281 serge 261
           locals
378 serge 262
             event     rd 6
281 serge 263
           endl
168 serge 264
 
281 serge 265
           mov ebx, [str]
378 serge 266
           mov edi, [ebx+STREAM.out_wp]
267
           cmp edi, [ebx+STREAM.out_top]
328 serge 268
           jb @F
378 serge 269
           sub edi, 0x10000
270
           mov [ebx+STREAM.out_wp], edi
328 serge 271
@@:
378 serge 272
           mov ecx, [ebx+STREAM.r_size]
273
           mov eax, ecx
274
           cmp word [ebx+STREAM.format], PCM_1_16_8
275
           ja @F
168 serge 276
 
378 serge 277
           shr eax, 1                   ;two channles
278
@@:
279
           test [ebx+STREAM.format], 1  ;even formats mono
280
           jz @F
281
 
282
           shr eax, 1                   ;eax= samples
283
@@:
284
           shl eax, 15    ;eax*=32768 =r_end
285
 
286
           mov esi, [ebx+STREAM.in_rp]
287
           mov edi, [ebx+STREAM.out_wp]
288
 
285 serge 289
           stdcall [ebx+STREAM.resample], edi, esi, \
378 serge 290
           [ebx+STREAM.r_dt], ecx, eax
168 serge 291
 
281 serge 292
           mov ebx, [str]
168 serge 293
 
378 serge 294
           add [ebx+STREAM.out_count], eax;
295
           add [ebx+STREAM.out_wp], eax;
168 serge 296
 
378 serge 297
           mov eax, [ebx+STREAM.in_rp]
298
           mov ecx, [ebx+STREAM.r_size]
299
           add eax, ecx
300
           add [ebx+STREAM.in_free], ecx
301
           sub [ebx+STREAM.in_count], ecx
302
 
303
           cmp eax, [ebx+STREAM.in_top]
281 serge 304
           jb @f
305
 
378 serge 306
           sub eax, [ebx+STREAM.in_size]
168 serge 307
@@:
378 serge 308
           mov [ebx+STREAM.in_rp], eax
168 serge 309
 
378 serge 310
           sub eax, [ebx+STREAM.in_base]
311
           sub eax, 128
312
           lea edx, [event]
313
 
314
           mov dword [edx], RT_INP_EMPTY
315
           mov dword [edx+4], 0
316
           mov dword [edx+8], ebx
317
           mov dword [edx+12], eax
318
 
319
           mov eax, [ebx+STREAM.notify_event]
320
           test eax, eax
321
           jz .exit
322
 
323
           mov ebx, [ebx+STREAM.notify_id]
281 serge 324
           xor ecx, ecx
378 serge 325
           call RaiseEvent   ;eax, ebx, ecx, edx
326
.exit:
327
           ret
328
endp
168 serge 329
 
378 serge 330
align 4
331
proc mix_all stdcall, dest:dword, list:dword, count:dword
332
 
333
           mov edi, [dest]
334
           mov ebx, 64
335
.mix:
336
           mov edx, [list]
337
           mov ecx, [count]
338
 
339
           mov eax, [edx]
340
           movq mm0, [eax]
341
           movd mm1, [edx+4]
342
           punpckldq mm1,mm1
343
           pmulhw mm0, mm1
344
           psllw  mm0, 1
345
 
346
.mix_loop:
347
           add dword [edx], 8
348
           add edx, 8
349
           dec ecx
350
           jz @F
351
 
352
           mov eax, [edx]
353
           movq mm1, [eax]
354
           movd mm2, [edx+4]
355
           punpckldq mm2,mm2
356
           pmulhw mm1, mm2
357
           psllw  mm1, 1
358
           paddsw mm0, mm1
359
           jmp .mix_loop
168 serge 360
@@:
378 serge 361
           movq [edi], mm0
362
           add edi, 8
363
           dec ebx
364
           jnz .mix
227 serge 365
 
291 serge 366
           ret
168 serge 367
endp
368
 
369
align 4
285 serge 370
proc resample_1 stdcall, dest:dword,src:dword,\
291 serge 371
                       r_dt:dword, r_size:dword,r_end:dword
168 serge 372
 
285 serge 373
; dest equ esp+8
374
; src  equ esp+12
375
; r_dt equ esp+16
376
; r_size equ esp+20
378 serge 377
; r_end equ esp+24
168 serge 378
 
285 serge 379
           mov edi, [dest]
380
           mov edx, [src]
381
           sub edx, 32*2
382
           mov eax, 16
168 serge 383
 
378 serge 384
align 4
168 serge 385
.l1:
291 serge 386
           mov ecx, eax
387
           mov esi, eax
388
           and ecx, 0x7FFF
389
           shr esi, 15
390
           lea esi, [edx+esi*2]
168 serge 391
 
291 serge 392
           movsx ebp, word [esi]
393
           movsx esi, word [esi+2]
394
           mov ebx, 32768
395
           imul esi, ecx
396
           sub ebx, ecx
397
           imul ebx, ebp
398
           lea ecx, [ebx+esi+16384]
399
           sar ecx, 15
400
           cmp ecx, 32767         ; 00007fffH
401
           jle @f
402
           mov ecx, 32767         ; 00007fffH
403
           jmp .write
168 serge 404
@@:
291 serge 405
           cmp ecx, -32768        ; ffff8000H
406
           jge .write
407
           mov ecx, -32768        ; ffff8000H
168 serge 408
.write:
291 serge 409
           mov ebx, ecx
410
           shl ebx, 16
411
           mov bx, cx
412
           mov [edi], ebx
413
           add edi, 4
168 serge 414
 
293 serge 415
           add eax, [esp+16]
416
           cmp eax, [esp+24]
291 serge 417
           jb .l1
168 serge 418
 
291 serge 419
           mov ebp, esp
168 serge 420
 
291 serge 421
           sub edi, [dest]
422
           mov eax, edi
423
           ret
168 serge 424
endp
425
 
426
align 4
285 serge 427
proc resample_18 stdcall, dest:dword,src:dword,\
291 serge 428
                       r_dt:dword, r_size:dword,r_end:dword
168 serge 429
 
430
 
291 serge 431
           mov edi, [dest]
285 serge 432
           mov edx, [src]
433
           sub edx, 32
434
 
291 serge 435
           mov esi, 16
168 serge 436
 
378 serge 437
align 4
168 serge 438
.l1:
291 serge 439
           mov ecx, esi
440
           mov eax, esi
441
           and ecx, 0x7FFF
442
           shr eax, 15
443
           lea eax, [edx+eax]
168 serge 444
 
291 serge 445
           mov bx, word [eax]
446
           sub bh, 0x80
447
           sub bl, 0x80
448
           movsx eax, bh
449
           shl eax,8
450
           movsx ebp, bl
451
           shl ebp,8
452
           mov ebx, 32768
453
           imul eax, ecx
454
           sub ebx, ecx
455
           imul ebx, ebp
456
           lea ecx, [ebx+eax+16384]
457
           sar ecx, 15
458
           cmp ecx, 32767         ; 00007fffH
459
           jle @f
460
           mov ecx, 32767         ; 00007fffH
461
           jmp .write
168 serge 462
@@:
291 serge 463
           cmp ecx, -32768        ; ffff8000H
464
           jge .write
465
           mov ecx, -32768        ; ffff8000H
168 serge 466
.write:
291 serge 467
           mov ebx, ecx
468
           shl ebx, 16
469
           mov bx, cx
470
           mov [edi], ebx
471
           add edi, 4
168 serge 472
 
293 serge 473
           add esi, [esp+16]
474
           cmp esi, [esp+24]
291 serge 475
           jb .l1
168 serge 476
 
291 serge 477
           mov ebp, esp
478
           sub edi, [dest]
479
           mov eax, edi
480
           ret
168 serge 481
endp
482
 
483
align 4
285 serge 484
proc copy_stream stdcall, dest:dword,src:dword,\
291 serge 485
                       r_dt:dword, r_size:dword,r_end:dword
168 serge 486
 
281 serge 487
           mov ecx, [r_size]
488
           mov eax, ecx
489
           shr ecx, 2
490
           mov esi, [src]
491
           mov edi, [dest]
492
           rep movsd
493
           mov eax, 16384
494
           ret
168 serge 495
endp
496
 
497
align 4
285 serge 498
proc resample_2 stdcall, dest:dword,src:dword,\
291 serge 499
                       r_dt:dword, r_size:dword,r_end:dword
168 serge 500
 
285 serge 501
           mov edx, [src]
502
           sub edx, 32*4
503
           mov edi, [dest]
504
           mov ebx, [r_dt]
505
           mov eax, 16
506
           emms
168 serge 507
 
378 serge 508
align 4
168 serge 509
.l1:
285 serge 510
           mov ecx, eax
511
           mov esi, eax
512
           and ecx, 0x7FFF
513
           shr esi, 15
514
           lea esi, [edx+esi*4]
168 serge 515
 
285 serge 516
           movq mm0, [esi]
517
           movq mm1, mm0
168 serge 518
 
285 serge 519
           movd mm2, ecx
520
           punpcklwd mm2, mm2
521
           movq mm3, qword [m7]    ;0x8000
168 serge 522
 
285 serge 523
           psubw mm3, mm2 ;        ;0x8000 - iconst
524
           punpckldq mm3, mm2
168 serge 525
 
285 serge 526
           pmulhw mm0, mm3
527
           pmullw mm1, mm3
168 serge 528
 
285 serge 529
           movq mm4, mm1
530
           punpcklwd mm1, mm0
531
           punpckhwd mm4, mm0
532
           paddd mm1, mm4
533
           psrad  mm1, 15
534
           packssdw mm1, mm1
535
           movd [edi], mm1
536
           add edi, 4
168 serge 537
 
285 serge 538
           add eax, ebx
539
           cmp eax, [r_end]
540
           jb .l1
541
           emms
168 serge 542
 
285 serge 543
           sub edi, [dest]
544
           mov eax, edi
545
           ret
168 serge 546
endp
547
 
548
align 4
285 serge 549
proc resample_28 stdcall, dest:dword,src:dword,\
291 serge 550
                       r_dt:dword, r_size:dword,r_end:dword
168 serge 551
 
285 serge 552
           mov edx, [src]
553
           sub edx, 32*2
554
           mov edi, [dest]
555
           mov ebx, [r_dt]
556
           mov eax, 16
557
           emms
558
           movq mm7,[mm80]
559
           movq mm6,[mm_mask]
168 serge 560
 
378 serge 561
align 4
168 serge 562
.l1:
291 serge 563
           mov ecx, eax
564
           mov esi, eax
565
           and ecx, 0x7FFF
566
           shr esi, 15
567
           lea esi, [edx+esi*2]
168 serge 568
 
291 serge 569
           movq mm0, [esi]
570
           psubb mm0,mm7
571
           punpcklbw mm0,mm0
572
           pand mm0,mm6
168 serge 573
 
291 serge 574
           movq mm1, mm0
168 serge 575
 
291 serge 576
           movd mm2, ecx
577
           punpcklwd mm2, mm2
578
           movq mm3, qword [m7] ;                  // 0x8000
168 serge 579
 
291 serge 580
           psubw mm3, mm2       ;         // 0x8000 - iconst
581
           punpckldq mm3, mm2
168 serge 582
 
291 serge 583
           pmulhw mm0, mm3
584
           pmullw mm1, mm3
168 serge 585
 
291 serge 586
           movq mm4, mm1
587
           punpcklwd mm1, mm0
588
           punpckhwd mm4, mm0
589
           paddd mm1, mm4
590
           psrad  mm1, 15
591
           packssdw mm1, mm1
592
           movd [edi], mm1
593
           add edi, 4
168 serge 594
 
291 serge 595
           add eax, ebx
596
           cmp eax, [r_end]
597
           jb .l1
598
           emms
168 serge 599
 
600
 
291 serge 601
           sub edi, [dest]
602
           mov eax, edi
603
           ret
168 serge 604
endp
605
 
606
 
285 serge 607
proc m16_stereo stdcall, dest:dword,src:dword,\
291 serge 608
                       r_dt:dword, r_size:dword,r_end:dword
168 serge 609
 
291 serge 610
           mov esi, [src]
611
           mov edi, [dest]
612
           mov ecx, [r_size]
613
           shr ecx,8
168 serge 614
@@:
291 serge 615
           call m16_s_mmx
616
           add edi, 128
617
           add esi, 64
618
           call m16_s_mmx
619
           add edi, 128
620
           add esi, 64
621
           call m16_s_mmx
622
           add edi, 128
623
           add esi, 64
624
           call m16_s_mmx
625
           add edi, 128
626
           add esi, 64
627
           dec ecx
628
           jnz @b
168 serge 629
 
291 serge 630
           mov eax, [r_size]
631
           add eax, eax
632
           ret
168 serge 633
endp
634
 
635
align 4
285 serge 636
proc s8_stereo stdcall, dest:dword,src:dword,\
291 serge 637
                       r_dt:dword, r_size:dword,r_end:dword
168 serge 638
 
281 serge 639
           mov esi, [src]
640
           mov edi, [dest]
641
           mov ecx, [r_size]
642
           shr ecx, 7
168 serge 643
 
281 serge 644
           movq mm7, [mm80]
645
           movq mm6, [mm_mask]
168 serge 646
@@:
281 serge 647
           call s8_s_mmx
648
           add edi, 64
649
           add esi, 32
650
           call s8_s_mmx
651
           add edi, 64
652
           add esi, 32
653
           call s8_s_mmx
654
           add edi, 64
655
           add esi, 32
656
           call s8_s_mmx
657
           add edi, 64
658
           add esi, 32
168 serge 659
           dec ecx
281 serge 660
           jnz @b
168 serge 661
 
281 serge 662
           mov eax, [r_size]
663
           add eax, eax
664
           ret
168 serge 665
endp
666
 
285 serge 667
proc m8_stereo stdcall, dest:dword,src:dword,\
291 serge 668
                       r_dt:dword, r_size:dword,r_end:dword
168 serge 669
 
281 serge 670
           mov esi, [src]
671
           mov edi, [dest]
672
           mov ecx, [r_size]
673
           shr ecx, 6
168 serge 674
 
281 serge 675
           movq mm7, [mm80]
676
           movq mm6, [mm_mask]
168 serge 677
@@:
281 serge 678
           call m8_s_mmx
679
           add edi, 64
680
           add esi, 16
681
           call m8_s_mmx
682
           add edi, 64
683
           add esi, 16
684
           call m8_s_mmx
685
           add edi, 64
686
           add esi, 16
687
           call m8_s_mmx
688
           add edi, 64
689
           add esi, 16
690
                  dec ecx
691
           jnz @b
168 serge 692
 
281 serge 693
           mov eax, [r_size]
694
           add eax, eax
695
           add eax, eax
696
           ret
168 serge 697
endp
698
 
699
align 4
700
proc alloc_mix_buff
701
 
281 serge 702
           bsf eax, [mix_buff_map]
703
           jnz .find
704
           xor eax, eax
705
           ret
168 serge 706
.find:
281 serge 707
           btr [mix_buff_map], eax
708
           shl eax, 9
709
           add eax, [mix_buff]
710
           ret
168 serge 711
endp
712
 
293 serge 713
align 4
168 serge 714
proc m16_s_mmx
715
 
291 serge 716
           movq    mm0, [esi]
717
           movq    mm1, mm0
718
           punpcklwd mm0, mm0
719
           punpckhwd mm1, mm1
720
           movq    [edi], mm0
721
           movq    [edi+8], mm1
168 serge 722
 
291 serge 723
           movq    mm0, [esi+8]
724
           movq    mm1, mm0
725
           punpcklwd mm0, mm0
726
           punpckhwd mm1, mm1
727
           movq    [edi+16], mm0
728
           movq    [edi+24], mm1
168 serge 729
 
291 serge 730
           movq    mm0, [esi+16]
731
           movq    mm1, mm0
732
           punpcklwd mm0, mm0
733
           punpckhwd mm1, mm1
734
           movq    [edi+32], mm0
735
           movq    [edi+40], mm1
168 serge 736
 
291 serge 737
           movq    mm0, [esi+24]
738
           movq    mm1, mm0
739
           punpcklwd mm0, mm0
740
           punpckhwd mm1, mm1
741
           movq    [edi+48], mm0
742
           movq    [edi+56], mm1
168 serge 743
 
291 serge 744
           movq    mm0, [esi+32]
745
           movq    mm1, mm0
746
           punpcklwd mm0, mm0
747
           punpckhwd mm1, mm1
748
           movq    [edi+64], mm0
749
           movq    [edi+72], mm1
168 serge 750
 
291 serge 751
           movq    mm0, [esi+40]
752
           movq    mm1, mm0
753
           punpcklwd mm0, mm0
754
           punpckhwd mm1, mm1
755
           movq    [edi+80], mm0
756
           movq    [edi+88], mm1
168 serge 757
 
758
 
291 serge 759
           movq    mm0, [esi+48]
760
           movq    mm1, mm0
761
           punpcklwd mm0, mm0
762
           punpckhwd mm1, mm1
763
           movq    [edi+96], mm0
764
           movq    [edi+104], mm1
168 serge 765
 
291 serge 766
           movq    mm0, [esi+56]
767
           movq    mm1, mm0
768
           punpcklwd mm0, mm0
769
           punpckhwd mm1, mm1
770
           movq    [edi+112], mm0
771
           movq    [edi+120], mm1
168 serge 772
 
291 serge 773
           ret
168 serge 774
endp
775
 
776
align 4
777
proc s8_s_mmx
778
 
281 serge 779
           movq    mm0, [esi]
780
           psubb   mm0, mm7
781
           movq    mm1, mm0
782
           punpcklbw mm0, mm0
783
           pand mm0, mm6
784
           punpckhbw mm1, mm1
785
           pand mm1, mm6
786
           movq    [edi], mm0
787
           movq    [edi+8], mm1
168 serge 788
 
281 serge 789
           movq    mm0, [esi+8]
790
           psubb   mm0, mm7
791
           movq    mm1, mm0
792
           punpcklbw mm0, mm0
793
           pand mm0, mm6
794
           punpckhbw mm1, mm1
795
           pand mm1, mm6
796
           movq    [edi+16], mm0
797
           movq    [edi+24], mm1
168 serge 798
 
281 serge 799
           movq    mm0, [esi+16]
800
           psubb   mm0, mm7
801
           movq    mm1, mm0
802
           punpcklbw mm0, mm0
803
           pand mm0, mm6
804
           punpckhbw mm1, mm1
805
           pand mm1, mm6
806
           movq    [edi+32], mm0
807
           movq    [edi+40], mm1
168 serge 808
 
281 serge 809
           movq    mm0, [esi+24]
810
           psubb   mm0, mm7
811
           movq    mm1, mm0
812
           punpcklbw mm0, mm0
813
           pand    mm0, mm6
814
           punpckhbw mm1, mm1
815
           pand    mm1, mm6
816
           movq    [edi+48], mm0
817
           movq    [edi+56], mm1
168 serge 818
 
281 serge 819
           ret
168 serge 820
 
821
endp
822
 
823
align 4
824
proc m8_s_mmx
825
 
281 serge 826
           movq    mm0, [esi]
827
           psubb   mm0, mm7
828
           movq    mm1, mm0
829
           punpcklbw mm0, mm0
830
           pand mm0, mm6
831
           punpckhbw mm1, mm1
832
           pand mm1, mm6
833
           movq mm2, mm0
834
           punpcklwd mm0, mm0
835
           punpckhwd mm2, mm2
168 serge 836
 
281 serge 837
           movq mm3, mm1
838
           punpcklwd mm1, mm1
839
           punpckhwd mm3, mm3
168 serge 840
 
281 serge 841
           movq    [edi], mm0
842
           movq    [edi+8], mm2
843
           movq    [edi+16], mm1
844
           movq    [edi+24], mm3
168 serge 845
 
281 serge 846
           movq    mm0, [esi+8]
847
           psubb   mm0, mm7
848
           movq    mm1, mm0
849
           punpcklbw mm0, mm0
850
           pand mm0, mm6
851
           punpckhbw mm1, mm1
852
           pand mm1, mm6
853
           movq mm2, mm0
854
           punpcklwd mm0, mm0
855
           punpckhwd mm2, mm2
168 serge 856
 
281 serge 857
           movq mm3, mm1
858
           punpcklwd mm1, mm1
859
           punpckhwd mm3, mm3
168 serge 860
 
281 serge 861
           movq    [edi+32], mm0
862
           movq    [edi+40], mm2
863
           movq    [edi+48], mm1
864
           movq    [edi+56], mm3
168 serge 865
 
281 serge 866
           ret
168 serge 867
endp
868
 
869
align 4
870
proc mix_2_1 stdcall, output:dword, str0:dword, str1:dword
871
 
281 serge 872
           mov edi, [output]
293 serge 873
           mov eax, [str0]
874
           mov ebx, [str1]
875
           mov esi, 128
876
           call [mix_2_core]   ;edi, eax, ebx
168 serge 877
 
293 serge 878
           add edi, esi
879
           add eax, esi
880
           add ebx, esi
881
           call [mix_2_core]   ;edi, eax, ebx
168 serge 882
 
293 serge 883
           add edi, esi
884
           add eax, esi
885
           add ebx, esi
886
           call [mix_2_core]   ;edi, eax, ebx
887
 
888
           add edi, esi
889
           add eax, esi
890
           add ebx, esi
891
           call [mix_2_core]   ;edi, eax, ebx
281 serge 892
           ret
168 serge 893
endp
894
 
895
align 4
896
proc mix_3_1 stdcall, output:dword, str0:dword, str1:dword, str2:dword
897
 
291 serge 898
           mov edi, [output]
293 serge 899
           mov eax, [str0]
900
           mov ebx, [str1]
901
           mov ecx, [str2]
902
           mov esi, 128
903
           call [mix_3_core]
168 serge 904
 
293 serge 905
           add edi, esi
906
           add eax, esi
907
           add ebx, esi
908
           add ecx, esi
909
           call [mix_3_core]
168 serge 910
 
293 serge 911
           add edi, esi
912
           add eax, esi
913
           add ebx, esi
914
           add ecx, esi
915
           call [mix_3_core]
916
 
917
           add edi, esi
918
           add eax, esi
919
           add ebx, esi
920
           add ecx, esi
921
           call [mix_3_core]
291 serge 922
           ret
168 serge 923
endp
924
 
925
align 4
926
proc mix_4_1 stdcall, str0:dword, str1:dword,\
291 serge 927
                      str2:dword, str3:dword
168 serge 928
 
291 serge 929
           local output:DWORD
168 serge 930
 
291 serge 931
           call alloc_mix_buff
932
           and eax, eax
933
           jz .err
168 serge 934
 
378 serge 935
           mov [output], eax
936
 
291 serge 937
           mov edi, eax
293 serge 938
           mov eax, [str0]
939
           mov ebx, [str1]
940
           mov ecx, [str2]
941
           mov edx, [str3]
942
           mov esi, 128
943
           call [mix_4_core]  ;edi, eax, ebx, ecx, edx
168 serge 944
 
293 serge 945
           add edi, esi
946
           add eax, esi
947
           add ebx, esi
948
           add ecx, esi
949
           add edx, esi
950
           call [mix_4_core]  ;edi, eax, ebx, ecx, edx
951
 
952
           add edi, esi
953
           add eax, esi
954
           add ebx, esi
955
           add ecx, esi
956
           add edx, esi
957
           call [mix_4_core]  ;edi, eax, ebx, ecx, edx
958
 
959
           add edi, esi
960
           add eax, esi
961
           add ebx, esi
962
           add ecx, esi
963
           add edx, esi
964
           call [mix_4_core]  ;edi, eax, ebx, ecx, edx
291 serge 965
           mov eax, [output]
966
           ret
168 serge 967
.err:
291 serge 968
           xor eax, eax
969
           ret
168 serge 970
endp
971
 
972
 
973
align 4
974
proc final_mix stdcall, output:dword, str0:dword, str1:dword,\
291 serge 975
                        str2:dword, str3:dword
168 serge 976
 
291 serge 977
           mov edi, [output]
168 serge 978
 
281 serge 979
           mov eax, [str0]
980
           mov ebx, [str1]
981
           mov ecx, [str2]
293 serge 982
           mov edx, [str3]
983
           mov esi, 128
984
           call [mix_4_core]  ;edi, eax, ebx, ecx, edx
168 serge 985
 
293 serge 986
           add edi, esi
987
           add eax, esi
988
           add ebx, esi
989
           add ecx, esi
990
           add edx, esi
991
           call [mix_4_core]  ;edi, eax, ebx, ecx, edx
168 serge 992
 
293 serge 993
           add edi, esi
994
           add eax, esi
995
           add ebx, esi
996
           add ecx, esi
997
           add edx, esi
998
           call [mix_4_core]  ;edi, eax, ebx, ecx, edx
168 serge 999
 
293 serge 1000
           add edi, esi
1001
           add eax, esi
1002
           add ebx, esi
1003
           add ecx, esi
1004
           add edx, esi
1005
           call [mix_4_core]  ;edi, eax, ebx, ecx, edx
281 serge 1006
           ret
168 serge 1007
endp
1008
 
1009
align 4
1010
proc copy_mem stdcall, output:dword, input:dword
1011
 
291 serge 1012
           mov edi, [output]
1013
           mov esi, [input]
1014
           mov ecx, 0x80
168 serge 1015
.l1:
291 serge 1016
           mov eax, [esi]
1017
           mov [edi], eax
1018
           add esi, 4
1019
           add edi, 4
1020
           loop .l1
168 serge 1021
 
291 serge 1022
           ret
168 serge 1023
endp
1024
 
1025
proc memcpy
1026
@@:
291 serge 1027
           mov eax, [esi]
1028
           mov [edi], eax
1029
           add esi, 4
1030
           add edi, 4
1031
           dec ecx
1032
           jnz @B
1033
           ret
168 serge 1034
endp
1035
 
378 serge 1036
if 0
168 serge 1037
 
378 serge 1038
align 4
1039
proc new_mix stdcall, output:dword
1040
           locals
1041
             mixCounter  dd ?
1042
             mixIndex  dd ?
1043
             streamIndex dd ?
1044
             inputCount  dd ?
1045
             main_count  dd ?
1046
             blockCount  dd ?
1047
             mix_out  dd ?
1048
           endl
1049
 
1050
           call prepare_playlist
1051
 
1052
           cmp [play_count], 0
1053
           je .exit
1054
           call FpuSave
1055
           mov [main_count], 32;
1056
.l00:
1057
           mov [mix_buff_map], 0x0000FFFF;
1058
           xor eax, eax
1059
           mov [mixCounter], eax
1060
           mov [mixIndex],eax
1061
           mov [streamIndex], eax;
1062
           mov ebx, [play_count]
1063
           mov [inputCount], ebx
1064
.l0:
1065
           mov ecx, 4
1066
.l1:
1067
           mov ebx, [streamIndex]
1068
           mov esi, [play_list+ebx*4]
1069
           mov eax, [esi+STREAM.work_read]
1070
           add [esi+STREAM.work_read], 512
1071
 
1072
           mov ebx, [mixIndex]
1073
           mov [mix_input+ebx*4], eax
1074
           inc [mixCounter]
1075
           inc [mixIndex]
1076
           inc [streamIndex]
1077
           dec [inputCount]
1078
           jz .m2
1079
 
1080
           dec ecx
1081
           jnz .l1
1082
 
1083
           cmp [mixCounter], 4
1084
           jnz .m2
1085
 
1086
           stdcall mix_4_1, [mix_input],[mix_input+4],[mix_input+8],[mix_input+12]
1087
           sub [mixIndex],4
1088
           mov ebx, [mixIndex]
1089
           mov [mix_input+ebx*4], eax
1090
           inc [mixIndex]
1091
           mov [mixCounter], 0
1092
 
1093
           cmp [inputCount], 0
1094
           jnz .l0
1095
.m2:
1096
           cmp [mixIndex], 1
1097
           jne @f
1098
           stdcall copy_mem, [output], [mix_input]
1099
           jmp .m3
1100
@@:
1101
           cmp [mixIndex], 2
1102
           jne @f
1103
           stdcall mix_2_1, [output], [mix_input], [mix_input+4]
1104
           jmp .m3
1105
@@:
1106
           cmp [mixIndex], 3
1107
           jne @f
1108
           stdcall mix_3_1, [output],[mix_input],[mix_input+4],[mix_input+8]
1109
           jmp .m3
1110
@@:
1111
           stdcall final_mix, [output],[mix_input],[mix_input+4],[mix_input+8], [mix_input+12]
1112
.m3:
1113
           add [output],512
1114
 
1115
           dec [main_count]
1116
           jnz .l00
1117
 
1118
           call update_stream
1119
           emms
1120
           call FpuRestore
1121
           ret
1122
.exit:
1123
           mov edi, [output]
1124
           mov ecx, 0x1000
1125
           xor eax, eax
1126
           cld
1127
           rep stosd
1128
           ret
1129
endp
1130
 
1131
end if
1132