Subversion Repositories Kolibri OS

Rev

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

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