forked from KolibriOS/kolibrios
Floating point mixer. Powered by the Dark side. (see USE_SSE2_MIXER. SSE2 required)
git-svn-id: svn://kolibrios.org@694 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
76aa52dd6b
commit
71f27df7b3
@ -1,11 +1,11 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2006-2008. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
; (C) copyright Serge 2006
|
; Serge 2006-2008
|
||||||
; email: infinity_sound@mail.ru
|
; email: infinity_sound@mail.ru
|
||||||
|
|
||||||
format MS COFF
|
format MS COFF
|
||||||
@ -28,8 +28,11 @@ include 'imports.inc'
|
|||||||
FORCE_MMX equ 0 ;set to 1 to force use mmx or
|
FORCE_MMX equ 0 ;set to 1 to force use mmx or
|
||||||
FORCE_MMX_128 equ 0 ;integer sse2 extensions
|
FORCE_MMX_128 equ 0 ;integer sse2 extensions
|
||||||
;and reduce driver size
|
;and reduce driver size
|
||||||
|
|
||||||
;USE_SSE equ 0
|
;USE_SSE equ 0
|
||||||
|
|
||||||
|
USE_SSE2_MIXER equ 0 ;floating point mixer. Disabled by default
|
||||||
|
|
||||||
DEBUG equ 1
|
DEBUG equ 1
|
||||||
|
|
||||||
|
|
||||||
@ -897,6 +900,7 @@ proc set_vol_param stdcall, l_vol:dword,r_vol:dword,pan:dword
|
|||||||
call .calc
|
call .calc
|
||||||
|
|
||||||
fistp word [edx+STREAM.l_amp]
|
fistp word [edx+STREAM.l_amp]
|
||||||
|
fstp dword [edx+STREAM.l_amp_f]
|
||||||
fstp st0
|
fstp st0
|
||||||
|
|
||||||
fild word [r_vol]
|
fild word [r_vol]
|
||||||
@ -904,6 +908,7 @@ proc set_vol_param stdcall, l_vol:dword,r_vol:dword,pan:dword
|
|||||||
call .calc
|
call .calc
|
||||||
|
|
||||||
fistp word [edx+STREAM.r_amp]
|
fistp word [edx+STREAM.r_amp]
|
||||||
|
fstp dword [edx+STREAM.r_amp_f]
|
||||||
fstp st0
|
fstp st0
|
||||||
|
|
||||||
fnclex
|
fnclex
|
||||||
@ -923,6 +928,7 @@ proc set_vol_param stdcall, l_vol:dword,r_vol:dword,pan:dword
|
|||||||
fld1
|
fld1
|
||||||
faddp st1, st0
|
faddp st1, st0
|
||||||
fscale
|
fscale
|
||||||
|
fld st0
|
||||||
fimul dword [_32767]
|
fimul dword [_32767]
|
||||||
ret 0
|
ret 0
|
||||||
endp
|
endp
|
||||||
@ -1064,12 +1070,20 @@ do_mix_list:
|
|||||||
.add_buff:
|
.add_buff:
|
||||||
mov ecx, [ebx+STREAM.out_rp]
|
mov ecx, [ebx+STREAM.out_rp]
|
||||||
mov [eax],ecx
|
mov [eax],ecx
|
||||||
|
|
||||||
|
if USE_SSE2_MIXER
|
||||||
|
mov edi, dword [ebx+STREAM.l_amp_f]
|
||||||
|
mov [eax+4], edi
|
||||||
|
mov edi, dword [ebx+STREAM.r_amp_f]
|
||||||
|
mov [eax+8], edi
|
||||||
|
else
|
||||||
mov edi, dword [ebx+STREAM.l_amp]
|
mov edi, dword [ebx+STREAM.l_amp]
|
||||||
mov [eax+4], edi
|
mov [eax+4], edi
|
||||||
|
end if
|
||||||
add [ebx+STREAM.out_rp], 512
|
add [ebx+STREAM.out_rp], 512
|
||||||
sub [ebx+STREAM.out_count], 512
|
sub [ebx+STREAM.out_count], 512
|
||||||
|
|
||||||
add eax, 8
|
add eax, 12
|
||||||
inc edx
|
inc edx
|
||||||
.next:
|
.next:
|
||||||
mov ebx, [ebx+STREAM.str_fd]
|
mov ebx, [ebx+STREAM.str_fd]
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2006-2008. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
; (C) copyright Serge 2006-2007
|
; Serge 2006-2008
|
||||||
; email: infinity_sound@mail.ru
|
; email: infinity_sound@mail.ru
|
||||||
|
|
||||||
|
|
||||||
@ -111,7 +111,7 @@ struc STREAM
|
|||||||
.out_wp dd ?
|
.out_wp dd ?
|
||||||
.out_rp dd ?
|
.out_rp dd ?
|
||||||
.out_count dd ?
|
.out_count dd ?
|
||||||
.out_top dd ?
|
.out_top dd ? ;16*4
|
||||||
|
|
||||||
.r_size dd ?
|
.r_size dd ?
|
||||||
.r_dt dd ?
|
.r_dt dd ?
|
||||||
@ -122,6 +122,8 @@ struc STREAM
|
|||||||
.l_amp dw ?
|
.l_amp dw ?
|
||||||
.r_amp dw ?
|
.r_amp dw ?
|
||||||
.pan dd ?
|
.pan dd ?
|
||||||
|
.l_amp_f dd ? ;float point left
|
||||||
|
.r_amp_f dd ? ;float point right
|
||||||
|
|
||||||
.in_base dd ?
|
.in_base dd ?
|
||||||
.in_size dd ?
|
.in_size dd ?
|
||||||
@ -135,7 +137,7 @@ struc STREAM
|
|||||||
.notify_id dd ?
|
.notify_id dd ?
|
||||||
}
|
}
|
||||||
|
|
||||||
STREAM_SIZE equ 34*4
|
STREAM_SIZE equ 36*4
|
||||||
FD_OFFSET equ 24
|
FD_OFFSET equ 24
|
||||||
|
|
||||||
virtual at 0
|
virtual at 0
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2006-2008. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
@ -9,10 +9,9 @@
|
|||||||
; email: infinity_sound@mail.ru
|
; email: infinity_sound@mail.ru
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
|
|
||||||
mix_list rq 32
|
mix_list rd 32*3
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc new_mix stdcall, output:dword
|
proc new_mix stdcall, output:dword
|
||||||
@ -252,6 +251,83 @@ proc refill_ring stdcall, str:dword
|
|||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
if USE_SSE2_MIXER
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc mix_all stdcall, dest:dword, list:dword, count:dword
|
||||||
|
|
||||||
|
mov edi, [dest]
|
||||||
|
mov ebx, 32
|
||||||
|
.mix:
|
||||||
|
mov edx, [list]
|
||||||
|
mov ecx, [count]
|
||||||
|
|
||||||
|
mov eax, [edx]
|
||||||
|
|
||||||
|
movdqa xmm1, [eax]
|
||||||
|
movss xmm2, [edx+4]
|
||||||
|
movss xmm3, [edx+8]
|
||||||
|
|
||||||
|
punpcklwd xmm0, xmm1
|
||||||
|
punpckhwd xmm1, xmm1
|
||||||
|
|
||||||
|
shufps xmm2, xmm3, 0
|
||||||
|
shufps xmm2, xmm2, 0x88
|
||||||
|
|
||||||
|
psrad xmm0, 16
|
||||||
|
psrad xmm1, 16
|
||||||
|
cvtdq2ps xmm0, xmm0 ;time to use all power
|
||||||
|
cvtdq2ps xmm1, xmm1 ;of the dark side
|
||||||
|
mulps xmm0, xmm2
|
||||||
|
mulps xmm1, xmm2
|
||||||
|
|
||||||
|
.mix_loop:
|
||||||
|
add dword [edx], 16
|
||||||
|
add edx, 12
|
||||||
|
dec ecx
|
||||||
|
jz @F
|
||||||
|
|
||||||
|
mov eax, [edx]
|
||||||
|
|
||||||
|
movdqa xmm3, [eax]
|
||||||
|
movss xmm4, [edx+4]
|
||||||
|
movss xmm5, [edx+8]
|
||||||
|
|
||||||
|
punpcklwd xmm2, xmm3
|
||||||
|
punpckhwd xmm3, xmm3
|
||||||
|
|
||||||
|
shufps xmm4, xmm5, 0
|
||||||
|
shufps xmm4, xmm4, 0x88
|
||||||
|
|
||||||
|
psrad xmm2, 16
|
||||||
|
psrad xmm3, 16
|
||||||
|
|
||||||
|
cvtdq2ps xmm2, xmm2
|
||||||
|
cvtdq2ps xmm3, xmm3
|
||||||
|
|
||||||
|
mulps xmm2, xmm4
|
||||||
|
mulps xmm3, xmm4
|
||||||
|
addps xmm0, xmm2
|
||||||
|
addps xmm1, xmm3
|
||||||
|
|
||||||
|
jmp .mix_loop
|
||||||
|
@@:
|
||||||
|
cvtps2dq xmm0, xmm0
|
||||||
|
cvtps2dq xmm1, xmm1
|
||||||
|
packssdw xmm0, xmm0
|
||||||
|
packssdw xmm1, xmm1
|
||||||
|
punpcklqdq xmm0, xmm1
|
||||||
|
movntdq [edi], xmm0
|
||||||
|
|
||||||
|
add edi, 16
|
||||||
|
dec ebx
|
||||||
|
jnz .mix
|
||||||
|
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
else ; fixed point mmx version
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc mix_all stdcall, dest:dword, list:dword, count:dword
|
proc mix_all stdcall, dest:dword, list:dword, count:dword
|
||||||
|
|
||||||
@ -262,7 +338,9 @@ proc mix_all stdcall, dest:dword, list:dword, count:dword
|
|||||||
mov ecx, [count]
|
mov ecx, [count]
|
||||||
|
|
||||||
mov eax, [edx]
|
mov eax, [edx]
|
||||||
|
|
||||||
movq mm0, [eax]
|
movq mm0, [eax]
|
||||||
|
|
||||||
movd mm1, [edx+4]
|
movd mm1, [edx+4]
|
||||||
punpckldq mm1,mm1
|
punpckldq mm1,mm1
|
||||||
pmulhw mm0, mm1
|
pmulhw mm0, mm1
|
||||||
@ -270,7 +348,7 @@ proc mix_all stdcall, dest:dword, list:dword, count:dword
|
|||||||
|
|
||||||
.mix_loop:
|
.mix_loop:
|
||||||
add dword [edx], 8
|
add dword [edx], 8
|
||||||
add edx, 8
|
add edx, 12
|
||||||
dec ecx
|
dec ecx
|
||||||
jz @F
|
jz @F
|
||||||
|
|
||||||
@ -291,6 +369,9 @@ proc mix_all stdcall, dest:dword, list:dword, count:dword
|
|||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc resample_1 stdcall, dest:dword,src:dword,\
|
proc resample_1 stdcall, dest:dword,src:dword,\
|
||||||
r_dt:dword, r_size:dword,r_end:dword
|
r_dt:dword, r_size:dword,r_end:dword
|
||||||
|
Loading…
x
Reference in New Issue
Block a user