Subversion Repositories Kolibri OS

Rev

Rev 2455 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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