Subversion Repositories Kolibri OS

Rev

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

Rev 1635 Rev 2010
Line 53... Line 53...
53
MANUAL_DESTROY    equ 0x80000000
53
MANUAL_DESTROY    equ 0x80000000
Line 54... Line 54...
54
 
54
 
55
DEV_PLAY          equ 1
55
DEV_PLAY          equ 1
56
DEV_STOP          equ 2
56
DEV_STOP          equ 2
-
 
57
DEV_CALLBACK      equ 3
Line 57... Line 58...
57
DEV_CALLBACK      equ 3
58
DEV_GET_POS	  equ 9
58
 
59
 
59
struc IOCTL
60
struc IOCTL
60
{  .handle        dd ?
61
{  .handle        dd ?
Line 157... Line 158...
157
input      equ  IOCTL.input
158
input      equ  IOCTL.input
158
inp_size   equ  IOCTL.inp_size
159
inp_size   equ  IOCTL.inp_size
159
output     equ  IOCTL.output
160
output     equ  IOCTL.output
160
out_size   equ  IOCTL.out_size
161
out_size   equ  IOCTL.out_size
Line -... Line 162...
-
 
162
 
-
 
163
 
161
 
164
 
-
 
165
align 4
-
 
166
 
-
 
167
srv_calls  dd service_proc.srv_getversion	; 0
-
 
168
	   dd service_proc.snd_create_buff	; 1
-
 
169
	   dd service_proc.snd_destroy_buff	; 2
-
 
170
	   dd service_proc.snd_setformat	; 3
-
 
171
	   dd service_proc.snd_getformat	; 4
-
 
172
	   dd service_proc.snd_reset		; 5
-
 
173
	   dd service_proc.snd_setpos		; 6
-
 
174
	   dd service_proc.snd_getpos		; 7
-
 
175
	   dd service_proc.snd_setbuff		; 8
-
 
176
	   dd service_proc.snd_out		; 9
-
 
177
	   dd service_proc.snd_play		; 10
-
 
178
	   dd service_proc.snd_stop		; 11
-
 
179
	   dd service_proc.snd_setvolume	; 12
-
 
180
	   dd service_proc.snd_getvolume	; 13
-
 
181
	   dd service_proc.snd_setpan		; 14
-
 
182
	   dd service_proc.snd_getpan		; 15
-
 
183
	   dd service_proc.snd_getbuffsize	; 16
-
 
184
	   dd service_proc.snd_getfreespace	; 17
-
 
185
	   dd service_proc.snd_settimebase	; 18
-
 
186
	   dd service_proc.snd_gettimestamp	; 19
-
 
187
srv_calls_end:
162
align 4
188
 
Line 163... Line 189...
163
proc service_proc stdcall, ioctl:dword
189
proc service_proc stdcall, ioctl:dword
164
 
190
 
Line -... Line 191...
-
 
191
           mov edi, [ioctl]
-
 
192
           mov eax, [edi+io_code]
-
 
193
 
-
 
194
	   cmp eax, (srv_calls_end-srv_calls)/4
-
 
195
	   ja  .fail
-
 
196
 
165
           mov edi, [ioctl]
197
	   cmp eax, SND_DESTROY_BUFF
166
           mov eax, [edi+io_code]
198
	   jb @F
-
 
199
 
-
 
200
;           cmp [edi+inp_size], 4
-
 
201
;           jb .fali
-
 
202
 
-
 
203
	   mov ebx, [edi+input]
-
 
204
	   mov edx, [ebx]
-
 
205
 
-
 
206
	   cmp [edx+STREAM.magic], 'WAVE'
-
 
207
	   jne .fail
-
 
208
 
-
 
209
	   cmp [edx+STREAM.size], STREAM.sizeof
-
 
210
	   jne .fail
-
 
211
 
-
 
212
@@:
-
 
213
	   jmp [srv_calls+eax*4]
-
 
214
 
-
 
215
 
-
 
216
.fail:
-
 
217
	   mov eax, -1
-
 
218
	   ret
167
 
219
 
168
           cmp eax, SRV_GETVERSION
220
align 4
169
           jne @F
221
.srv_getversion:
170
           mov eax, [edi+output]
222
           mov eax, [edi+output]
171
           cmp [edi+out_size], 4
223
           cmp [edi+out_size], 4
172
           jne .fail
224
           jne .fail
173
           mov eax, [eax]
225
           mov eax, [eax]
174
           mov [eax], dword API_VERSION
226
           mov [eax], dword API_VERSION
175
           xor eax, eax
227
           xor eax, eax
176
           ret
228
           ret
177
@@:
229
 
178
           cmp eax, SND_CREATE_BUFF
230
align 4
179
           jne @F
231
.snd_create_buff:
180
           mov ebx, [edi+input]
232
           mov ebx, [edi+input]
181
           stdcall CreateBuffer,[ebx],[ebx+4]
233
           stdcall CreateBuffer,[ebx],[ebx+4]
182
           mov edi, [ioctl]
234
           mov edi, [ioctl]
183
           mov ecx, [edi+output]
235
           mov ecx, [edi+output]
184
           mov ecx, [ecx]
-
 
185
           mov [ecx], ebx
-
 
186
           ret
-
 
187
@@:
-
 
188
           mov ebx, [edi+input]
-
 
189
           mov edx, [ebx]
-
 
190
 
-
 
191
           cmp [edx+STREAM.magic], 'WAVE'
-
 
192
           jne .fail
-
 
Line 193... Line 236...
193
 
236
           mov ecx, [ecx]
194
           cmp [edx+STREAM.size], STREAM_SIZE
237
           mov [ecx], ebx
195
           jne .fail
238
           ret
196
 
239
 
197
           cmp eax, SND_DESTROY_BUFF
240
align 4
198
           jne @F
241
.snd_destroy_buff:
199
           mov eax, edx
242
           mov eax, edx
200
           call DestroyBuffer    ;edx= stream
243
	   call DestroyBuffer
201
           ret
244
           ret
202
@@:
245
 
203
           cmp eax, SND_SETFORMAT
-
 
204
           jne @F
-
 
205
           stdcall SetFormat,edx,[ebx+4]
-
 
Line -... Line 246...
-
 
246
align 4
-
 
247
.snd_setformat:
206
           ret
248
	   stdcall SetFormat, edx,[ebx+4]
207
@@:
249
           ret
208
           cmp eax, SND_GETFORMAT
250
 
209
           jne @F
251
align 4
210
 
252
.snd_getformat:
211
           movzx eax, word [edx+STREAM.format]
253
           movzx eax, word [edx+STREAM.format]
212
           mov ecx, [edi+output]
254
           mov ecx, [edi+output]
213
           mov ecx, [ecx]
255
           mov ecx, [ecx]
214
           mov [ecx], eax
256
           mov [ecx], eax
215
           xor eax, eax
257
           xor eax, eax
216
           ret
258
           ret
217
@@:
259
 
218
           cmp eax, SND_RESET
260
align 4
219
           jne @F
261
.snd_reset:
220
           stdcall ResetBuffer,edx,[ebx+4]
262
           stdcall ResetBuffer,edx,[ebx+4]
221
           ret
263
           ret
222
@@:
264
 
223
           cmp eax, SND_SETPOS
265
align 4
224
           jne @F
266
.snd_setpos:
225
           stdcall SetBufferPos,edx,[ebx+4]
267
           stdcall SetBufferPos,edx,[ebx+4]
226
           ret
268
           ret
227
@@:
269
 
228
           cmp eax, SND_GETPOS
270
align 4
229
           jne @F
271
.snd_getpos:
230
           stdcall GetBufferPos, edx
272
           stdcall GetBufferPos, edx
231
           mov edi, [ioctl]
273
           mov edi, [ioctl]
232
           mov ecx, [edi+output]
274
           mov ecx, [edi+output]
233
           mov ecx, [ecx]
275
           mov ecx, [ecx]
234
           mov [ecx], ebx
276
           mov [ecx], ebx
235
           ret
277
           ret
236
@@:
278
 
237
           cmp eax, SND_SETBUFF
279
align 4
-
 
280
.snd_setbuff:
-
 
281
           mov eax, [ebx+4]
-
 
282
           stdcall set_buffer, edx,eax,[ebx+8],[ebx+12]
238
           jne @F
283
           ret
-
 
284
 
-
 
285
align 4
-
 
286
.snd_out:
-
 
287
	   mov eax, [ebx+4]
-
 
288
	   stdcall wave_out, edx,eax,[ebx+8]
-
 
289
	   ret
-
 
290
 
-
 
291
align 4
-
 
292
.snd_play:
-
 
293
	   stdcall play_buffer, edx,[ebx+4]
-
 
294
	   ret
-
 
295
 
-
 
296
align 4
239
           mov eax, [ebx+4]
297
.snd_stop:
240
           stdcall set_buffer, edx,eax,[ebx+8],[ebx+12]
298
	   stdcall stop_buffer, edx
241
           ret
299
	   ret
242
@@:
-
 
243
           cmp eax, SND_SETVOLUME
-
 
244
           jne @F
-
 
Line -... Line 300...
-
 
300
 
-
 
301
align 4
245
           stdcall SetBufferVol,edx,[ebx+4],[ebx+8]
302
.snd_setvolume:
246
           ret
303
           stdcall SetBufferVol,edx,[ebx+4],[ebx+8]
247
@@:
304
           ret
248
           cmp eax, SND_GETVOLUME
305
 
249
           jne @F
306
align 4
250
 
307
.snd_getvolume:
251
           mov eax, [edi+output]
-
 
252
           mov ecx, [eax]
308
           mov eax, [edi+output]
253
           mov eax, [eax+4]
309
           mov ecx, [eax]
254
           stdcall GetBufferVol,edx,ecx,eax
310
           mov eax, [eax+4]
255
           ret
311
           stdcall GetBufferVol,edx,ecx,eax
256
@@:
312
           ret
257
           cmp eax, SND_SETPAN
313
align 4
258
           jne @F
314
.snd_setpan:
259
           stdcall SetBufferPan,edx,[ebx+4]
315
           stdcall SetBufferPan,edx,[ebx+4]
260
           ret
316
           ret
261
@@:
317
 
262
           cmp eax, SND_GETPAN
318
align 4
263
           jne @F
319
.snd_getpan:
264
           mov eax, [edx+STREAM.pan]
-
 
265
           mov ebx, [edi+output]
-
 
266
           mov ebx, [ebx]
-
 
267
           mov [ebx], eax
-
 
268
           xor eax, eax
-
 
269
           ret
-
 
270
@@:
-
 
271
           cmp eax, SND_OUT
-
 
272
           jne @F
-
 
273
 
-
 
274
           mov eax, [ebx+4]
-
 
275
           stdcall wave_out, edx,eax,[ebx+8]
-
 
276
           ret
-
 
277
@@:
-
 
278
           cmp eax, SND_PLAY
-
 
279
           jne @F
-
 
Line 280... Line -...
280
 
-
 
281
           stdcall play_buffer, edx,[ebx+4]
-
 
282
           ret
320
           mov eax, [edx+STREAM.pan]
283
@@:
-
 
284
           cmp eax, SND_STOP
321
           mov ebx, [edi+output]
285
           jne @F
322
           mov ebx, [ebx]
286
 
323
           mov [ebx], eax
287
           stdcall stop_buffer, edx
324
           xor eax, eax
288
           ret
325
           ret
289
@@:
326
 
290
           cmp eax, SND_GETBUFFSIZE
327
align 4
291
           jne @F
-
 
292
           mov eax, [edx+STREAM.in_size]
-
 
293
           mov ecx, [edi+output]
-
 
Line -... Line 328...
-
 
328
.snd_getbuffsize:
-
 
329
           mov eax, [edx+STREAM.in_size]
294
           mov ecx, [ecx]
330
           mov ecx, [edi+output]
295
           mov [ecx], eax
331
           mov ecx, [ecx]
Line 296... Line 332...
296
           xor eax, eax
332
           mov [ecx], eax
297
           ret
333
           xor eax, eax
298
@@:
334
           ret
299
           cmp eax, SND_GETFREESPACE
335
 
300
           jne @F
336
align 4
-
 
337
.snd_getfreespace:
-
 
338
           test [edx+STREAM.format], PCM_OUT
-
 
339
           jz .fail
-
 
340
 
-
 
341
           mov ebx, [edx+STREAM.in_free]
-
 
342
           mov ecx, [edi+output]
-
 
343
           mov [ecx], ebx
-
 
344
           xor eax, eax
-
 
345
           ret
-
 
346
align 4
-
 
347
.snd_settimebase:
-
 
348
	   cmp [edi+inp_size], 12
-
 
349
	   jne .fail
-
 
350
 
-
 
351
	   mov eax, [ebx]
-
 
352
	   mov ebx, [ebx+4]
-
 
353
	   mov dword [edx+STREAM.time_base], eax
-
 
354
	   mov dword [edx+STREAM.time_base+4], ebx
-
 
355
	   xor eax, eax
-
 
356
	   ret
-
 
357
 
-
 
358
.snd_gettimestamp:
-
 
359
	   cmp [edi+out_size], 8
-
 
360
	   jne .fail
-
 
361
 
-
 
362
	   pushfd
-
 
363
	   cli
-
 
364
 
-
 
365
	   xor ebx, ebx
-
 
366
	   push 48
-
 
367
	   push ebx	       ; local storage
-
 
368
 
-
 
369
	   cmp [edx+STREAM.flags], SND_STOP
-
 
370
	   je @F
-
 
371
 
-
 
372
	   mov eax, esp
-
 
373
 
-
 
374
	   push edx
-
 
375
	   push edi
-
 
376
 
-
 
377
	   push 4	       ;.out_size
-
 
378
	   push eax	       ;.output
-
 
379
	   push ebx	       ;.inp_size
-
 
380
	   push ebx	       ;.input
-
 
381
	   push DEV_GET_POS    ;.code
-
 
382
	   push dword [hSound] ;.handle
-
 
383
	   mov eax, esp
-
 
384
 
-
 
385
	   stdcall ServiceHandler, eax
301
 
386
	   add esp, 6*4
-
 
387
 
-
 
388
	   pop edi
302
           test [edx+STREAM.format], PCM_OUT
389
	   pop edx
-
 
390
 
-
 
391
	   test eax, eax
-
 
392
	   jz @F
-
 
393
 
-
 
394
	   mov dword [esp], 0	; clear offset
-
 
395
@@:
-
 
396
	   mov edi, [edi+output]
-
 
397
 
-
 
398
	   emms
303
           jz .fail
399
	   fild  qword [edx+STREAM.time_stamp]
304
 
400
	   fiadd dword [esp]	; primary buffer offset
305
           mov ebx, [edx+STREAM.in_free]
401
	   fidiv dword [esp+4]	; total_samples / frequency
Line -... Line 402...
-
 
402
	   fadd  qword [edx+STREAM.time_base]
306
           mov ecx, [edi+output]
403
	   fstp  qword [edi]
307
           mov [ecx], ebx
404
	   add esp, 8
308
           xor eax, eax
405
 
309
           ret
406
	   popfd
310
@@:
407
 
Line 350... Line 447...
350
           jnz .fail
447
           jnz .fail
351
.test_ok:
448
.test_ok:
Line 352... Line 449...
352
 
449
 
353
           call GetPid
450
           call GetPid
354
           mov ebx, eax
451
           mov ebx, eax
Line 355... Line 452...
355
           mov eax, STREAM_SIZE
452
	   mov eax, STREAM.sizeof
356
 
453
 
357
           call CreateObject
454
           call CreateObject
358
           test eax, eax
455
           test eax, eax
Line 410... Line 507...
410
           mov edi, [str]
507
           mov edi, [str]
411
           mov ecx, [ring_size]
508
           mov ecx, [ring_size]
412
           mov [edi+STREAM.in_base], eax
509
           mov [edi+STREAM.in_base], eax
413
           mov [edi+STREAM.in_size], ecx
510
           mov [edi+STREAM.in_size], ecx
414
           add eax, 128
511
           add eax, 128
415
        ;   sub ecx, 128
-
 
416
           mov [edi+STREAM.in_wp], eax
512
           mov [edi+STREAM.in_wp], eax
417
           mov [edi+STREAM.in_rp], eax
513
           mov [edi+STREAM.in_rp], eax
418
           mov [edi+STREAM.in_count], 0
514
           mov [edi+STREAM.in_count], 0
Line 419... Line 515...
419
 
515
 
Line 441... Line 537...
441
 
537
 
442
.out_buff:
538
.out_buff:
Line 443... Line 539...
443
           stdcall AllocKernelSpace, dword 128*1024
539
           stdcall AllocKernelSpace, dword 128*1024
-
 
540
 
-
 
541
           mov edi, [str]
444
 
542
	   xor ebx, ebx
445
           mov edi, [str]
543
 
446
           mov [edi+STREAM.out_base], eax
544
           mov [edi+STREAM.out_base], eax
447
           mov [edi+STREAM.out_wp], eax
545
           mov [edi+STREAM.out_wp], eax
448
           mov [edi+STREAM.out_rp], eax
546
           mov [edi+STREAM.out_rp], eax
449
           mov [edi+STREAM.out_count], 0
547
	   mov [edi+STREAM.out_count], ebx
Line -... Line 548...
-
 
548
           add eax, 64*1024
-
 
549
           mov [edi+STREAM.out_top], eax
-
 
550
 
-
 
551
	   mov dword [edi+STREAM.time_base],   ebx
-
 
552
	   mov dword [edi+STREAM.time_base+4], ebx
-
 
553
 
-
 
554
	   mov dword [edi+STREAM.time_stamp],	ebx
450
           add eax, 64*1024
555
	   mov dword [edi+STREAM.time_stamp+4], ebx
451
           mov [edi+STREAM.out_top], eax
556
	   mov dword [edi+STREAM.last_ts], ebx
452
 
557
 
453
           stdcall AllocPages, dword 64/4
558
           stdcall AllocPages, dword 64/4
454
           mov edi, [str]
559
           mov edi, [str]
Line 486... Line 591...
486
           mov [ebx+STREAM.notify_event], eax
591
           mov [ebx+STREAM.notify_event], eax
487
           mov [ebx+STREAM.notify_id], edx
592
           mov [ebx+STREAM.notify_id], edx
Line 488... Line 593...
488
 
593
 
489
           mov [ebx+STREAM.magic], 'WAVE'
594
           mov [ebx+STREAM.magic], 'WAVE'
490
           mov [ebx+STREAM.destroy], DestroyBuffer.destroy
595
           mov [ebx+STREAM.destroy], DestroyBuffer.destroy
491
           mov [ebx+STREAM.size], STREAM_SIZE
596
	   mov [ebx+STREAM.size], STREAM.sizeof
Line 492... Line 597...
492
           mov [ebx+STREAM.flags], SND_STOP
597
           mov [ebx+STREAM.flags], SND_STOP
493
 
598
 
494
           pushf
599
           pushf
Line 855... Line 960...
855
           mov edx, [str]
960
           mov edx, [str]
856
           stdcall set_vol_param,[l_vol],[r_vol],[edx+STREAM.pan]
961
           stdcall set_vol_param,[l_vol],[r_vol],[edx+STREAM.pan]
857
           ret
962
           ret
858
endp
963
endp
Line -... Line 964...
-
 
964
 
-
 
965
 
-
 
966
proc minw stdcall, arg1:dword, arg2:dword
-
 
967
	   mov ax, word [arg1]
-
 
968
	   cmp ax, word [arg2]
-
 
969
	   jle @f
-
 
970
	   mov eax, [arg2]
-
 
971
@@:
-
 
972
	   ret
-
 
973
endp
-
 
974
 
-
 
975
proc maxw stdcall, arg1:dword, arg2:dword
-
 
976
	   mov ax, word [arg1]
-
 
977
	   cmp ax, word [arg2]
-
 
978
	   jge @f
-
 
979
	   mov eax, [arg2]
-
 
980
@@:
-
 
981
	   ret
-
 
982
endp
-
 
983
 
859
 
984
 
860
proc set_vol_param stdcall, l_vol:dword,r_vol:dword,pan:dword
985
proc set_vol_param stdcall, l_vol:dword,r_vol:dword,pan:dword
861
           locals
986
           locals
862
             _600    dd ?
987
             _600    dd ?
863
             _32767  dd ?
988
             _32767  dd ?
Line 868... Line 993...
868
           mov [_32767], 32767
993
           mov [_32767], 32767
Line 869... Line 994...
869
 
994
 
870
           lea ebx, [state]
995
           lea ebx, [state]
Line -... Line 996...
-
 
996
           fnsave [ebx]
871
           fnsave [ebx]
997
 
-
 
998
	   stdcall minw, [l_vol], [vol_max]
-
 
999
	   stdcall maxw, eax, [vol_min]
872
 
1000
	   mov	   [l_vol], eax
873
           movq mm0, qword [l_vol]
1001
	   mov	[edx+STREAM.l_vol], eax
874
           pminsw mm0, qword [vol_max]
1002
	   stdcall minw, [r_vol], [vol_max+4]
875
           pmaxsw mm0, qword [vol_min]
1003
	   stdcall maxw, eax, [vol_min+4]
876
           movq qword [l_vol], mm0
1004
	   mov	   [r_vol], eax
877
           movq qword [edx+STREAM.l_vol], mm0
-
 
878
 
1005
	   mov	[edx+STREAM.r_vol], eax
879
           movd mm1,[pan]
1006
 
880
           pminsw mm1, qword [pan_max]
1007
	   stdcall minw, [pan], [pan_max]
Line 881... Line 1008...
881
           pmaxsw mm1, qword [vol_min]
1008
	   stdcall maxw, eax, [vol_min]
882
           movd [edx+STREAM.pan], mm1
1009
	   mov	[edx+STREAM.pan], eax
Line 883... Line 1010...
883
 
1010
 
-
 
1011
           cmp word [edx+STREAM.pan], 0
884
           cmp word [edx+STREAM.pan], 0
1012
	   jl  @f
885
           jl @F
1013
 
886
 
1014
	   mov ebx, [l_vol]
887
           psubsw mm0,mm1
1015
	   sub ebx, eax
888
           pminsw mm0, qword [vol_max]
1016
	   stdcall minw, ebx, [vol_max]
889
           pmaxsw mm0, qword [vol_min]
1017
	   stdcall maxw, eax, [vol_min]
890
           movd [l_vol],mm0
1018
	   mov [l_vol], eax
891
           jmp .calc_amp
1019
           jmp .calc_amp
892
@@:
1020
@@:
893
           punpckhdq mm0,mm0
1021
	   mov ebx, [r_vol]
894
           paddsw mm0,mm1
1022
	   add ebx, [pan]
895
           pminsw mm0, qword [vol_max]
1023
	   stdcall minw, ebx, [vol_max+4]
896
           pmaxsw mm0, qword [vol_min]
1024
	   stdcall maxw, eax, [vol_min+4]
Line 897... Line 1025...
897
           movd [r_vol], mm0
1025
	   mov [r_vol], eax
Line 933... Line 1061...
933
           fld st0
1061
           fld st0
934
           fimul dword [_32767]
1062
           fimul dword [_32767]
935
           ret 0
1063
           ret 0
936
endp
1064
endp
Line -... Line 1065...
-
 
1065
 
937
 
1066
 
938
align 4
1067
align 4
Line 939... Line 1068...
939
proc GetBufferVol stdcall, str:dword,p_lvol:dword,p_rvol:dword
1068
proc GetBufferVol stdcall, str:dword,p_lvol:dword,p_rvol:dword
940
 
1069
 
Line 1037... Line 1166...
1037
           je .done
1166
           je .done
Line 1038... Line 1167...
1038
 
1167
 
1039
           cmp [ebx+STREAM.magic], 'WAVE'
1168
           cmp [ebx+STREAM.magic], 'WAVE'
Line 1040... Line 1169...
1040
           jne .next
1169
           jne .next
1041
 
1170
 
Line 1042... Line 1171...
1042
           cmp [ebx+STREAM.size], STREAM_SIZE
1171
	   cmp [ebx+STREAM.size], STREAM.sizeof
1043
           jne .next
1172
           jne .next
Line 1106... Line 1235...
1106
           je .done
1235
           je .done
Line 1107... Line 1236...
1107
 
1236
 
1108
           cmp [edi+STREAM.magic], 'WAVE'
1237
           cmp [edi+STREAM.magic], 'WAVE'
Line 1109... Line 1238...
1109
           jne .next
1238
           jne .next
1110
 
1239
 
Line 1111... Line 1240...
1111
           cmp [edi+STREAM.size], STREAM_SIZE
1240
	   cmp [edi+STREAM.size], STREAM.sizeof
1112
           jne .next
1241
           jne .next