forked from KolibriOS/kolibrios
added commit_pages()
ring buffer for resamplers git-svn-id: svn://kolibrios.org@328 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
dfe81eb28d
commit
5a467f60e3
@ -260,7 +260,7 @@ proc free_page
|
|||||||
mov ebx, sys_pgmap
|
mov ebx, sys_pgmap
|
||||||
bts [ebx], eax ;that's all!
|
bts [ebx], eax ;that's all!
|
||||||
cmc
|
cmc
|
||||||
adc [pg_data.pages_free], 0
|
adc [pg_data.pages_free], 0
|
||||||
shr eax, 3
|
shr eax, 3
|
||||||
and eax, not 3 ;dword offset from page_map
|
and eax, not 3 ;dword offset from page_map
|
||||||
add eax, ebx
|
add eax, ebx
|
||||||
@ -275,16 +275,36 @@ proc free_page
|
|||||||
endp
|
endp
|
||||||
|
|
||||||
; param
|
; param
|
||||||
; eax= page base
|
; eax= page base + page flags
|
||||||
; ebx= liear address
|
; ebx= liear address
|
||||||
; ecx= count
|
; ecx= count
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
commit_pages: ;not implemented
|
commit_pages:
|
||||||
|
|
||||||
|
test ecx, ecx
|
||||||
|
jz .fail
|
||||||
|
|
||||||
|
mov edi, ebx
|
||||||
|
mov ebx, pg_data.pg_mutex
|
||||||
|
call wait_mutex ;ebx
|
||||||
|
|
||||||
|
mov edx, 0x1000
|
||||||
|
mov ebx, edi
|
||||||
|
shr ebx, 12
|
||||||
|
@@:
|
||||||
|
mov [pages_tab+ebx*4], eax
|
||||||
|
invlpg [edi]
|
||||||
|
add edi, edx
|
||||||
|
add eax, edx
|
||||||
|
inc ebx
|
||||||
|
dec ecx
|
||||||
|
jnz @B
|
||||||
|
mov [pg_data.pg_mutex],ecx
|
||||||
|
.fail:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
; param
|
; param
|
||||||
; eax= base
|
; eax= base
|
||||||
; ecx= count
|
; ecx= count
|
||||||
@ -301,8 +321,8 @@ release_pages:
|
|||||||
|
|
||||||
shr esi, 10
|
shr esi, 10
|
||||||
add esi, pages_tab
|
add esi, pages_tab
|
||||||
|
|
||||||
mov ebp, [pg_data.pages_free]
|
mov ebp, [pg_data.pages_free]
|
||||||
mov ebx, [page_start]
|
mov ebx, [page_start]
|
||||||
mov edx, sys_pgmap
|
mov edx, sys_pgmap
|
||||||
@@:
|
@@:
|
||||||
@ -316,7 +336,7 @@ release_pages:
|
|||||||
shr eax, 12
|
shr eax, 12
|
||||||
bts [edx], eax
|
bts [edx], eax
|
||||||
cmc
|
cmc
|
||||||
adc ebp, 0
|
adc ebp, 0
|
||||||
shr eax, 3
|
shr eax, 3
|
||||||
and eax, -4
|
and eax, -4
|
||||||
add eax, edx
|
add eax, edx
|
||||||
@ -329,7 +349,7 @@ release_pages:
|
|||||||
add esi, 4
|
add esi, 4
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz @B
|
jnz @B
|
||||||
mov [pg_data.pages_free], ebp
|
mov [pg_data.pages_free], ebp
|
||||||
and [pg_data.pg_mutex],0
|
and [pg_data.pg_mutex],0
|
||||||
popad
|
popad
|
||||||
ret
|
ret
|
||||||
@ -1416,15 +1436,15 @@ align 16
|
|||||||
sys_page_map rd 1
|
sys_page_map rd 1
|
||||||
endg
|
endg
|
||||||
|
|
||||||
|
if 0
|
||||||
; push eax
|
push eax
|
||||||
; push edx
|
push edx
|
||||||
; mov edx, 0x400 ;bocsh
|
mov edx, 0x400 ;bocsh
|
||||||
; mov al,0xff ;bocsh
|
mov al,0xff ;bocsh
|
||||||
; out dx, al ;bocsh
|
out dx, al ;bocsh
|
||||||
; pop edx
|
pop edx
|
||||||
; pop eax
|
pop eax
|
||||||
|
end if
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
k_strrchr:
|
k_strrchr:
|
||||||
|
@ -33,6 +33,7 @@ new_app_base equ 0x60400000
|
|||||||
PROC_BASE equ OS_BASE+0x0080000
|
PROC_BASE equ OS_BASE+0x0080000
|
||||||
|
|
||||||
CAPS_SSE2 equ 26
|
CAPS_SSE2 equ 26
|
||||||
|
PG_SW equ 0x003
|
||||||
|
|
||||||
|
|
||||||
public START
|
public START
|
||||||
@ -113,7 +114,7 @@ if ~(FORCE_MMX or FORCE_MMX_128) ;autodetect
|
|||||||
mov [mix_3_core], mmx_mix_3
|
mov [mix_3_core], mmx_mix_3
|
||||||
mov [mix_4_core], mmx_mix_4
|
mov [mix_4_core], mmx_mix_4
|
||||||
jmp @F
|
jmp @F
|
||||||
.mmx128: ;new 128-bit sse2 extensions
|
.mmx128: ;128-bit integer sse2 extensions
|
||||||
mov [mix_2_core], mmx128_mix_2
|
mov [mix_2_core], mmx128_mix_2
|
||||||
mov [mix_3_core], mmx128_mix_3
|
mov [mix_3_core], mmx128_mix_3
|
||||||
mov [mix_4_core], mmx128_mix_4
|
mov [mix_4_core], mmx128_mix_4
|
||||||
@ -209,7 +210,7 @@ restore out_size
|
|||||||
TASK_COUNT equ 0x0003004
|
TASK_COUNT equ 0x0003004
|
||||||
CURRENT_TASK equ 0x0003000
|
CURRENT_TASK equ 0x0003000
|
||||||
|
|
||||||
align 8
|
align 4
|
||||||
proc CreateBuffer stdcall, format:dword
|
proc CreateBuffer stdcall, format:dword
|
||||||
locals
|
locals
|
||||||
str dd ?
|
str dd ?
|
||||||
@ -239,7 +240,7 @@ proc CreateBuffer stdcall, format:dword
|
|||||||
mov [edx+STREAM.str_bk], eax
|
mov [edx+STREAM.str_bk], eax
|
||||||
popf
|
popf
|
||||||
|
|
||||||
stdcall KernelAlloc, 168*1024
|
stdcall KernelAlloc, dword 72*1024
|
||||||
|
|
||||||
mov edi, [str]
|
mov edi, [str]
|
||||||
mov [edi+STREAM.base], eax
|
mov [edi+STREAM.base], eax
|
||||||
@ -256,13 +257,33 @@ proc CreateBuffer stdcall, format:dword
|
|||||||
mov [edi+STREAM.limit], eax
|
mov [edi+STREAM.limit], eax
|
||||||
mov [edi+STREAM.lim_1], eax
|
mov [edi+STREAM.lim_1], eax
|
||||||
|
|
||||||
|
; create ring buffer
|
||||||
|
|
||||||
|
stdcall AllocKernelSpace, dword 128*1024
|
||||||
|
|
||||||
|
mov edi, [str]
|
||||||
mov [edi+STREAM.work_buff], eax
|
mov [edi+STREAM.work_buff], eax
|
||||||
mov [edi+STREAM.work_read], eax
|
mov [edi+STREAM.work_read], eax
|
||||||
mov [edi+STREAM.work_write], eax
|
mov [edi+STREAM.work_write], eax
|
||||||
mov [edi+STREAM.work_count], 0
|
mov [edi+STREAM.work_count], 0
|
||||||
add eax, 0x10000
|
add eax, 64*1024
|
||||||
mov [edi+STREAM.work_top], eax
|
mov [edi+STREAM.work_top], eax
|
||||||
|
|
||||||
|
stdcall AllocPages, dword 64/4
|
||||||
|
mov edi, [str]
|
||||||
|
mov ebx, [edi+STREAM.work_buff]
|
||||||
|
mov ecx, 16
|
||||||
|
or eax, PG_SW
|
||||||
|
push eax
|
||||||
|
push ebx
|
||||||
|
call CommitPages ;eax, ebx, ecx
|
||||||
|
mov ecx, 16
|
||||||
|
pop ebx
|
||||||
|
pop eax
|
||||||
|
add ebx, 64*1024
|
||||||
|
call CommitPages ;double mapped
|
||||||
|
|
||||||
|
mov edi, [str]
|
||||||
mov eax, [format]
|
mov eax, [format]
|
||||||
mov [edi+STREAM.format], eax
|
mov [edi+STREAM.format], eax
|
||||||
mov [edi+STREAM.flags], SND_STOP
|
mov [edi+STREAM.flags], SND_STOP
|
||||||
@ -297,8 +318,14 @@ proc CreateBuffer stdcall, format:dword
|
|||||||
stdcall MapPage, ebx, eax, dword 3
|
stdcall MapPage, ebx, eax, dword 3
|
||||||
|
|
||||||
mov edi, [edi+STREAM.base]
|
mov edi, [edi+STREAM.base]
|
||||||
mov ecx, (168*1024)/4
|
mov ecx, (72*1024)/4
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
|
cld
|
||||||
|
rep stosd
|
||||||
|
|
||||||
|
mov edi, [str]
|
||||||
|
mov edi, [edi+STREAM.work_buff]
|
||||||
|
mov ecx, (64*1024)/4
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
mov eax, [str]
|
mov eax, [str]
|
||||||
@ -308,6 +335,7 @@ proc CreateBuffer stdcall, format:dword
|
|||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
if 0
|
||||||
align 4
|
align 4
|
||||||
pid_to_slot:
|
pid_to_slot:
|
||||||
|
|
||||||
@ -337,11 +365,14 @@ pid_to_slot:
|
|||||||
pop ebx
|
pop ebx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
;param
|
;param
|
||||||
; eax= buffer handle
|
; eax= buffer handle
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
DestroyBuffer:
|
DestroyBuffer:
|
||||||
|
.handle equ esp ;local
|
||||||
|
|
||||||
cmp [eax+STREAM.magic], 'WAVE'
|
cmp [eax+STREAM.magic], 'WAVE'
|
||||||
jne .fail
|
jne .fail
|
||||||
@ -349,6 +380,8 @@ DestroyBuffer:
|
|||||||
cmp [eax+STREAM.size], STREAM_SIZE
|
cmp [eax+STREAM.size], STREAM_SIZE
|
||||||
jne .fail
|
jne .fail
|
||||||
.destroy:
|
.destroy:
|
||||||
|
push eax
|
||||||
|
|
||||||
pushf
|
pushf
|
||||||
cli
|
cli
|
||||||
mov ebx, [eax+STREAM.str_fd]
|
mov ebx, [eax+STREAM.str_fd]
|
||||||
@ -357,11 +390,12 @@ DestroyBuffer:
|
|||||||
mov [ecx+STREAM.str_fd], ebx
|
mov [ecx+STREAM.str_fd], ebx
|
||||||
popf
|
popf
|
||||||
|
|
||||||
push eax
|
|
||||||
stdcall KernelFree, [eax+STREAM.base]
|
stdcall KernelFree, [eax+STREAM.base]
|
||||||
pop eax
|
mov eax, [.handle]
|
||||||
|
stdcall KernelFree, [eax+STREAM.work_buff]
|
||||||
|
|
||||||
|
pop eax ;restore stack
|
||||||
call DestroyObject ;eax
|
call DestroyObject ;eax
|
||||||
ret
|
|
||||||
.fail:
|
.fail:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -526,13 +560,6 @@ prepare_playlist:
|
|||||||
cmp [edi+STREAM.size], STREAM_SIZE
|
cmp [edi+STREAM.size], STREAM_SIZE
|
||||||
jne .next
|
jne .next
|
||||||
|
|
||||||
; mov eax,[edi+STREAM.pid]
|
|
||||||
; cmp eax, -1
|
|
||||||
; je .next
|
|
||||||
; call pid_to_slot
|
|
||||||
; test eax, eax
|
|
||||||
; jz .next
|
|
||||||
|
|
||||||
cmp [edi+STREAM.flags], SND_PLAY;
|
cmp [edi+STREAM.flags], SND_PLAY;
|
||||||
jne .next
|
jne .next
|
||||||
cmp [edi+STREAM.work_count], 16384
|
cmp [edi+STREAM.work_count], 16384
|
||||||
@ -673,7 +700,7 @@ mm80 dq 0x8080808080808080
|
|||||||
mm_mask dq 0xFF00FF00FF00FF00
|
mm_mask dq 0xFF00FF00FF00FF00
|
||||||
|
|
||||||
;stream_map dd 0xFFFF ; 16
|
;stream_map dd 0xFFFF ; 16
|
||||||
version dd 0x00030003
|
version dd 0x00030004
|
||||||
|
|
||||||
szInfinity db 'INFINITY',0
|
szInfinity db 'INFINITY',0
|
||||||
szSound db 'SOUND',0
|
szSound db 'SOUND',0
|
||||||
|
@ -123,7 +123,7 @@ proc update_stream
|
|||||||
mov eax, [esi+STREAM.work_read]
|
mov eax, [esi+STREAM.work_read]
|
||||||
cmp eax, [esi+STREAM.work_top]
|
cmp eax, [esi+STREAM.work_top]
|
||||||
jb @f
|
jb @f
|
||||||
mov eax, [esi+STREAM.work_buff]
|
sub eax, 64*1024
|
||||||
@@:
|
@@:
|
||||||
mov [esi+STREAM.work_read], eax
|
mov [esi+STREAM.work_read], eax
|
||||||
|
|
||||||
@ -146,7 +146,8 @@ proc update_stream
|
|||||||
mov edi, [ebx+STREAM.work_write]
|
mov edi, [ebx+STREAM.work_write]
|
||||||
cmp edi, [ebx+STREAM.work_top]
|
cmp edi, [ebx+STREAM.work_top]
|
||||||
jb @f
|
jb @f
|
||||||
mov edi, [ebx+STREAM.work_buff]
|
|
||||||
|
sub edi, 64*1024
|
||||||
mov [ebx+STREAM.work_write], edi
|
mov [ebx+STREAM.work_write], edi
|
||||||
@@:
|
@@:
|
||||||
mov esi, [ebx+STREAM.curr_seg]
|
mov esi, [ebx+STREAM.curr_seg]
|
||||||
@ -210,17 +211,12 @@ proc refill stdcall, str:dword
|
|||||||
endl
|
endl
|
||||||
|
|
||||||
mov ebx, [str]
|
mov ebx, [str]
|
||||||
mov ecx, [ebx+STREAM.work_write]
|
mov edi, [ebx+STREAM.work_write]
|
||||||
cmp ecx, [ebx+STREAM.work_top]
|
cmp edi, [ebx+STREAM.work_top]
|
||||||
jbe .m2
|
jb @F
|
||||||
mov esi, [ebx+STREAM.work_top]
|
sub edi, 64*1024
|
||||||
sub ecx, esi
|
|
||||||
mov edi, [ebx+STREAM.work_buff]
|
|
||||||
shr ecx, 2
|
|
||||||
rep movsd ;call memcpy
|
|
||||||
|
|
||||||
mov [ebx+STREAM.work_write], edi
|
mov [ebx+STREAM.work_write], edi
|
||||||
.m2:
|
@@:
|
||||||
mov esi, [ebx+STREAM.curr_seg]
|
mov esi, [ebx+STREAM.curr_seg]
|
||||||
mov edi, [ebx+STREAM.work_write]
|
mov edi, [ebx+STREAM.work_write]
|
||||||
|
|
||||||
|
@ -464,7 +464,7 @@ proc ac97_irq
|
|||||||
; end if
|
; end if
|
||||||
|
|
||||||
mov edx, PCM_OUT_CR_REG
|
mov edx, PCM_OUT_CR_REG
|
||||||
mov al, 0x14
|
mov al, 0x10; 0x10
|
||||||
call [ctrl.ctrl_write8]
|
call [ctrl.ctrl_write8]
|
||||||
|
|
||||||
mov ax, 0x1c
|
mov ax, 0x1c
|
||||||
@ -487,7 +487,7 @@ proc ac97_irq
|
|||||||
call [ctrl.ctrl_write8]
|
call [ctrl.ctrl_write8]
|
||||||
|
|
||||||
mov edx, PCM_OUT_CR_REG
|
mov edx, PCM_OUT_CR_REG
|
||||||
mov ax, 0x1D
|
mov ax, 0x11 ;0x1D
|
||||||
call [ctrl.ctrl_write8]
|
call [ctrl.ctrl_write8]
|
||||||
|
|
||||||
mov eax, [civ_val]
|
mov eax, [civ_val]
|
||||||
@ -504,7 +504,7 @@ proc ac97_irq
|
|||||||
|
|
||||||
.skip:
|
.skip:
|
||||||
mov edx, PCM_OUT_CR_REG
|
mov edx, PCM_OUT_CR_REG
|
||||||
mov ax, 0x1D
|
mov ax, 0x11 ;0x1D
|
||||||
call [ctrl.ctrl_write8]
|
call [ctrl.ctrl_write8]
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
Loading…
Reference in New Issue
Block a user