forked from KolibriOS/kolibrios
newsdk: fasm mp3 demo programm
git-svn-id: svn://kolibrios.org@3963 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
776c624625
commit
83e0107b4c
693
programs/develop/libraries/newlib/sdk/fasm/mpg123.asm
Normal file
693
programs/develop/libraries/newlib/sdk/fasm/mpg123.asm
Normal file
@ -0,0 +1,693 @@
|
||||
|
||||
STACK_SIZE equ 4096
|
||||
|
||||
include "include/app.inc"
|
||||
|
||||
align 8
|
||||
main:
|
||||
.argc equ ebp+8
|
||||
.argv equ ebp+12
|
||||
.envp equ ebp+16
|
||||
|
||||
; int3
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
push ebx
|
||||
|
||||
mov eax, [.argc]
|
||||
cmp eax, 2
|
||||
jae @F
|
||||
|
||||
call _get_moviefile
|
||||
mov [input_file], eax
|
||||
|
||||
@@:
|
||||
call [mpg123_init]
|
||||
test eax, eax
|
||||
jz @F
|
||||
|
||||
push eax
|
||||
call [mpg123_plain_strerror]
|
||||
|
||||
mov [esp], eax
|
||||
push msg_init_fail
|
||||
call [_printf]
|
||||
add esp, 4
|
||||
jmp .fail
|
||||
@@:
|
||||
push dword error
|
||||
push 0
|
||||
call [mpg123_new]
|
||||
add esp, 8
|
||||
|
||||
mov [mh], eax
|
||||
mov ebx, eax
|
||||
test eax, eax
|
||||
jz .err_1
|
||||
|
||||
push [input_file]
|
||||
push eax
|
||||
call [mpg123_open]
|
||||
add esp, 8
|
||||
|
||||
test eax, eax
|
||||
jnz .err_1
|
||||
|
||||
push encoding
|
||||
push channels
|
||||
push rate
|
||||
push ebx
|
||||
call [mpg123_getformat]
|
||||
add esp, 16
|
||||
|
||||
test eax, eax
|
||||
jnz .err_1
|
||||
|
||||
push ebx
|
||||
call [mpg123_scan]
|
||||
test eax, eax
|
||||
jz @F
|
||||
|
||||
call [mpg123_strerror]
|
||||
mov [esp], eax
|
||||
push msg_print
|
||||
call [_printf]
|
||||
add esp, 8
|
||||
jmp .fail
|
||||
|
||||
@@:
|
||||
call [mpg123_format_none]
|
||||
mov ecx, [encoding]
|
||||
mov [esp], ecx
|
||||
push [channels]
|
||||
push [rate]
|
||||
push ebx
|
||||
call [mpg123_format]
|
||||
add esp, 16
|
||||
|
||||
push error
|
||||
stdcall InitSound
|
||||
test eax, eax
|
||||
jz @F
|
||||
|
||||
cinvoke _printf, msg_sound
|
||||
jmp .fail
|
||||
@@:
|
||||
mov eax, [rate]
|
||||
mov ecx, [channels]
|
||||
|
||||
mov [whdr.riff_id], 0x46464952
|
||||
mov [whdr.riff_format], 0x45564157
|
||||
mov [whdr.wFormatTag], 0x01
|
||||
mov [whdr.nSamplesPerSec], eax
|
||||
mov [whdr.nChannels], cx
|
||||
mov [whdr.wBitsPerSample], 16
|
||||
|
||||
stdcall test_wav, whdr
|
||||
stdcall CreateBuffer, eax, 0, hBuff
|
||||
test eax, eax
|
||||
jz @F
|
||||
|
||||
cinvoke _printf, msg_buffer
|
||||
jmp .fail
|
||||
@@:
|
||||
mov eax, [hBuff]
|
||||
push esi
|
||||
push edi
|
||||
|
||||
mov ecx, 0x40000
|
||||
mov eax, 68
|
||||
mov ebx, 12
|
||||
int 0x40
|
||||
|
||||
push eax ;buffer esp+16
|
||||
push count ;&count esp+12
|
||||
push 0x40000 ;remain esp+8
|
||||
push eax ;outPtr esp+4
|
||||
push [mh] ;mh esp
|
||||
|
||||
xor ebx, ebx ;totalcount
|
||||
|
||||
.inner:
|
||||
call [mpg123_read]
|
||||
test eax, eax
|
||||
jz @F
|
||||
mov [done], eax
|
||||
jmp .check_done
|
||||
@@:
|
||||
mov eax, [count]
|
||||
add [esp+4], eax
|
||||
add ebx, eax
|
||||
sub [esp+8], eax
|
||||
shl eax, 1
|
||||
cmp eax, [esp+8]
|
||||
jb .inner
|
||||
|
||||
.check_done:
|
||||
cmp [done], 0
|
||||
je @F
|
||||
|
||||
cmp ebx, 4096
|
||||
jae .write_out
|
||||
|
||||
mov edi, [esp+16]
|
||||
mov ecx, 4096
|
||||
sub ecx, ebx
|
||||
rep movsb
|
||||
mov ebx, 4096
|
||||
|
||||
jmp .write_out
|
||||
@@:
|
||||
mov [count], 0
|
||||
cmp ebx, 8192
|
||||
jb .inner
|
||||
|
||||
.write_out:
|
||||
|
||||
mov esi, [esp+16]
|
||||
@@:
|
||||
cmp ebx, 4096
|
||||
jb @F
|
||||
|
||||
stdcall WaveOut, [hBuff], esi, 4096
|
||||
sub ebx, 4096
|
||||
add esi, 4096
|
||||
add [esp+8], dword 4096
|
||||
jmp @B
|
||||
@@:
|
||||
mov edi, [esp+16]
|
||||
mov ecx, ebx
|
||||
rep movsb
|
||||
mov [esp+4], edi
|
||||
jmp .inner
|
||||
|
||||
.done:
|
||||
add esp, 20
|
||||
pop edi
|
||||
pop esi
|
||||
|
||||
xor eax, eax
|
||||
pop ebx
|
||||
mov esp, ebp
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
.err_1:
|
||||
test ebx, ebx
|
||||
jnz @F
|
||||
|
||||
push [error]
|
||||
call [mpg123_plain_strerror]
|
||||
jmp .err_2
|
||||
@@:
|
||||
push ebx
|
||||
call [mpg123_strerror]
|
||||
.err_2:
|
||||
mov [esp], eax
|
||||
push msg_trouble
|
||||
call [_printf]
|
||||
add esp, 8
|
||||
.fail:
|
||||
mov eax, -1
|
||||
pop ebx
|
||||
mov esp, ebp
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
align 4
|
||||
getprocaddress:
|
||||
mov edx, [esp + 8] ; hlib
|
||||
xor eax, eax
|
||||
test edx, edx ; If hlib = 0 then goto .end
|
||||
jz .end
|
||||
|
||||
.next:
|
||||
cmp [edx], dword 0 ; If end of export table then goto .end
|
||||
jz .end
|
||||
|
||||
xor eax, eax
|
||||
mov esi, [edx]
|
||||
mov edi, [esp + 4] ; name
|
||||
|
||||
.next_:
|
||||
lodsb
|
||||
scasb
|
||||
jne .fail
|
||||
or al, al
|
||||
jnz .next_
|
||||
jmp .ok
|
||||
.fail:
|
||||
add edx, 8
|
||||
jmp .next
|
||||
|
||||
.ok: ; return address
|
||||
mov eax, [edx + 4]
|
||||
.end:
|
||||
ret 8
|
||||
|
||||
|
||||
align 8
|
||||
_get_moviefile:
|
||||
|
||||
pushad
|
||||
mov eax, 68
|
||||
mov ebx, 19
|
||||
mov ecx, sz_proc_lib
|
||||
int 0x40
|
||||
mov [proclib], eax
|
||||
test eax, eax
|
||||
jz .fail
|
||||
|
||||
push [proclib]
|
||||
push sz_OpenDialog_init
|
||||
call getprocaddress
|
||||
mov [opendialog_init], eax
|
||||
|
||||
push dword[proclib]
|
||||
push sz_OpenDialog_start
|
||||
call getprocaddress
|
||||
mov [opendialog_start], eax
|
||||
|
||||
mov eax, 68
|
||||
mov ebx, 12
|
||||
mov ecx, 4096*3
|
||||
int 0x40
|
||||
|
||||
mov [od.procinfo], eax
|
||||
|
||||
add eax, 1024
|
||||
mov [od.filename_area], eax
|
||||
|
||||
add eax, 3072
|
||||
mov [od.opendir_path], eax
|
||||
|
||||
add eax, 4096
|
||||
mov [od.openfile_path], eax
|
||||
|
||||
push od
|
||||
call [opendialog_init]
|
||||
|
||||
mov eax, [od.openfile_path]
|
||||
mov [eax], byte 0 ; end of ASCIIZ-string(may be don't need?)
|
||||
|
||||
push od
|
||||
call [opendialog_start]
|
||||
|
||||
popad
|
||||
mov eax, [od.openfile_path]; selected filePath
|
||||
|
||||
ret
|
||||
.fail:
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
align 4
|
||||
fake_on_redraw:
|
||||
ret
|
||||
|
||||
|
||||
SRV_GETVERSION equ 0
|
||||
SND_CREATE_BUFF equ 1
|
||||
SND_DESTROY_BUFF equ 2
|
||||
SND_SETFORMAT equ 3
|
||||
SND_GETFORMAT equ 4
|
||||
SND_RESET equ 5
|
||||
SND_SETPOS equ 6
|
||||
SND_GETPOS equ 7
|
||||
SND_SETBUFF equ 8
|
||||
SND_OUT equ 9
|
||||
SND_PLAY equ 10
|
||||
SND_STOP equ 11
|
||||
SND_SETVOLUME equ 12
|
||||
SND_GETVOLUME equ 13
|
||||
SND_SETPAN equ 14
|
||||
SND_GETPAN equ 15
|
||||
SND_GETBUFFSIZE equ 16
|
||||
SND_GETFREESPACE equ 17
|
||||
SND_SETTIMEBASE equ 18
|
||||
SND_GETTIMESTAMP equ 19
|
||||
|
||||
|
||||
align 4
|
||||
InitSound: ;p_ver:dword
|
||||
|
||||
push ebx
|
||||
push ecx
|
||||
|
||||
mov eax, 68
|
||||
mov ebx, 16
|
||||
mov ecx, szInfinity
|
||||
int 0x40
|
||||
mov [hSound], eax
|
||||
test eax, eax
|
||||
jz .fail
|
||||
|
||||
mov eax, 68
|
||||
mov ebx, 16
|
||||
mov ecx, szSound
|
||||
int 0x40
|
||||
mov [hrdwSound], eax
|
||||
|
||||
lea eax, [esp+12] ;p_ver
|
||||
xor ebx, ebx
|
||||
|
||||
push 4 ;.out_size
|
||||
push eax ;.output
|
||||
push ebx ;.inp_size
|
||||
push ebx ;.input
|
||||
push SRV_GETVERSION ;.code
|
||||
push [hSound] ;.handle
|
||||
|
||||
mov eax, 68
|
||||
mov ebx, 17
|
||||
mov ecx, esp ;[handle]
|
||||
int 0x40
|
||||
add esp, 24
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret 4
|
||||
.fail:
|
||||
or eax, -1
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret 4
|
||||
|
||||
|
||||
align 4
|
||||
CreateBuffer: ;format:dword,size:dword,p_str:dword
|
||||
|
||||
push ebx
|
||||
push ecx
|
||||
lea eax, [esp+20] ;p_str
|
||||
lea ebx, [esp+12] ;format
|
||||
|
||||
push 4 ;.out_size
|
||||
push eax ;.output
|
||||
push 8 ;.inp_size
|
||||
push ebx ;.input
|
||||
push SND_CREATE_BUFF;.code
|
||||
push [hSound] ;.handle
|
||||
|
||||
mov eax, 68
|
||||
mov ebx, 17
|
||||
mov ecx, esp
|
||||
int 0x40
|
||||
add esp, 24 ;io_cintrol
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret 12
|
||||
|
||||
align 4
|
||||
proc test_wav stdcall, hdr:dword
|
||||
|
||||
mov eax, [hdr]
|
||||
cmp dword [eax], 0x46464952
|
||||
jne .fail
|
||||
|
||||
cmp dword [eax+8], 0x45564157
|
||||
jne .fail
|
||||
|
||||
cmp word [eax+20], 1
|
||||
jne .fail
|
||||
|
||||
mov ecx, dword [eax+24]
|
||||
mov edx, 22050
|
||||
cmp ecx, edx
|
||||
ja .high
|
||||
je .l_22
|
||||
|
||||
cmp ecx, 8000
|
||||
je .l_8
|
||||
|
||||
cmp ecx, 11025
|
||||
je .l_11
|
||||
|
||||
cmp ecx, 12000
|
||||
je .l_12
|
||||
|
||||
cmp ecx, 16000
|
||||
je .l_16
|
||||
.fail:
|
||||
xor eax, eax
|
||||
ret
|
||||
.high:
|
||||
cmp ecx, 24000
|
||||
je .LN56
|
||||
cmp ecx, 32000
|
||||
je .LN65
|
||||
cmp ecx, 44100
|
||||
je .LN74
|
||||
cmp ecx, 48000
|
||||
jne .fail
|
||||
|
||||
movzx ecx, word [eax+22]
|
||||
dec ecx
|
||||
je .LN79
|
||||
dec ecx
|
||||
jne .LN74
|
||||
|
||||
mov edx, 19
|
||||
jmp .done
|
||||
.LN79:
|
||||
mov edx, 20
|
||||
jmp .done
|
||||
.LN74:
|
||||
movzx ecx, word [eax+22]
|
||||
dec ecx
|
||||
je .LN70
|
||||
dec ecx
|
||||
jne .LN65
|
||||
|
||||
mov edx, 21
|
||||
jmp .done
|
||||
.LN70:
|
||||
mov edx, 22
|
||||
jmp .done
|
||||
.LN65:
|
||||
movzx ecx, word [eax+22]
|
||||
dec ecx
|
||||
je .LN61
|
||||
dec ecx
|
||||
jne .LN56
|
||||
|
||||
mov edx, 23
|
||||
jmp .done
|
||||
.LN61:
|
||||
mov edx, 24
|
||||
jmp .done
|
||||
.LN56:
|
||||
movzx ecx, word [eax+22]
|
||||
dec ecx
|
||||
je .LN52
|
||||
dec ecx
|
||||
je .LN50
|
||||
.l_22:
|
||||
movzx ecx, word [eax+22]
|
||||
dec ecx
|
||||
je .LN43
|
||||
dec ecx
|
||||
je .LN41
|
||||
.l_16:
|
||||
movzx ecx, word [eax+22]
|
||||
dec ecx
|
||||
je .LN34
|
||||
dec ecx
|
||||
je .LN32
|
||||
.l_12:
|
||||
movzx ecx, word [eax+22]
|
||||
dec ecx
|
||||
je .LN25
|
||||
dec ecx
|
||||
je .LN23
|
||||
.l_11:
|
||||
movzx ecx, word [eax+22]
|
||||
dec ecx
|
||||
je .LN16
|
||||
dec ecx
|
||||
je .LN14
|
||||
.l_8:
|
||||
movzx ecx, word [eax+22]
|
||||
dec ecx
|
||||
je .LN7
|
||||
dec ecx
|
||||
jne .fail
|
||||
|
||||
mov edx, 35
|
||||
jmp .done
|
||||
.LN7:
|
||||
mov edx, 36
|
||||
jmp .done
|
||||
.LN14:
|
||||
mov edx, 33
|
||||
jmp .done
|
||||
.LN16:
|
||||
mov edx, 34
|
||||
jmp .done
|
||||
.LN23:
|
||||
mov edx, 31
|
||||
jmp .done
|
||||
.LN25:
|
||||
mov edx, 32
|
||||
jmp .done
|
||||
.LN32:
|
||||
mov edx, 29
|
||||
jmp .done
|
||||
.LN34:
|
||||
mov edx, 30
|
||||
jmp .done
|
||||
.LN41:
|
||||
mov edx, 27
|
||||
jmp .done
|
||||
.LN43:
|
||||
mov edx, 28
|
||||
jmp .done
|
||||
.LN50:
|
||||
mov edx, 25
|
||||
jmp .done
|
||||
.LN52:
|
||||
mov edx, 26
|
||||
.done:
|
||||
xor ecx, ecx
|
||||
cmp word [eax+34], 16
|
||||
setne cl
|
||||
dec ecx
|
||||
and ecx, -18
|
||||
add ecx, edx
|
||||
mov eax, ecx
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
WaveOut: ;str:dword, src:dword, size:dword
|
||||
push ebx
|
||||
push ecx
|
||||
|
||||
xor eax, eax
|
||||
lea ebx, [esp+12] ;[stream]
|
||||
|
||||
push eax ;.out_size
|
||||
push eax ;.output
|
||||
push 12 ;.inp_size
|
||||
push ebx ;.input
|
||||
push SND_OUT ;.code
|
||||
push dword [hSound] ;.handle
|
||||
|
||||
mov eax, 68
|
||||
mov ebx, 17
|
||||
mov ecx, esp
|
||||
int 0x40
|
||||
add esp, 24
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret 12
|
||||
|
||||
align 4
|
||||
hSound dd ?
|
||||
hrdwSound dd ?
|
||||
|
||||
szInfinity db 'INFINITY',0
|
||||
szSound db 'SOUND',0
|
||||
|
||||
align 4
|
||||
od:
|
||||
.mode dd 0
|
||||
.procinfo dd 0
|
||||
.com_area_name dd sz_com_area_name
|
||||
.com_area dd 0
|
||||
.opendir_path dd 0
|
||||
.dir_default_path dd sz_dir_default_path
|
||||
.start_path dd sz_start_path
|
||||
.draw_window dd fake_on_redraw
|
||||
.status dd 0
|
||||
.openfile_path dd 0
|
||||
.filename_area dd 0
|
||||
.filter_area dd filefilter
|
||||
.x_size dw 512
|
||||
.x_start dw 512
|
||||
.y_size dw 512
|
||||
.y_start dw 512
|
||||
|
||||
filefilter:
|
||||
dd filefilter.end - filefilter
|
||||
db 'mp3',0
|
||||
; db 'flv',0
|
||||
; db 'mov',0
|
||||
; db 'mpg',0
|
||||
; db 'mpeg',0
|
||||
; db 'mkv',0
|
||||
; db 'mp4',0
|
||||
; db 'webm',0
|
||||
; db 'wmv',0
|
||||
.end:
|
||||
db 0
|
||||
|
||||
|
||||
|
||||
|
||||
sz_proc_lib db "/rd/1/lib/proc_lib.obj",0
|
||||
sz_OpenDialog_init db "OpenDialog_init",0
|
||||
sz_OpenDialog_start db "OpenDialog_start",0
|
||||
sz_com_area_name db "FFFFFFFF_open_dialog",0
|
||||
sz_dir_default_path db "/rd/1",0
|
||||
sz_start_path db "/rd/1/File managers/opendial",0
|
||||
|
||||
msg_print db '%s',0x0D,0x0A,0
|
||||
msg_init_fail db 'Cannot initialize mpg123 library: %s', 0x0D,0x0A,0
|
||||
msg_trouble db 'Trouble with mpg123: %s', 0x0D,0x0A,0
|
||||
msg_sound db 'Sound service not installed', 0x0D,0x0A,0
|
||||
msg_buffer db 'Unable to create a sound buffer',0x0D,0x0A,0
|
||||
|
||||
align 16
|
||||
__idata_start:
|
||||
|
||||
library libc,'libc.dll', \
|
||||
libmpg123, 'libmpg123.dll'
|
||||
|
||||
include 'include/libc.inc'
|
||||
include 'include/libmpg123.inc'
|
||||
|
||||
__idata_end:
|
||||
__iend:
|
||||
|
||||
align 4
|
||||
whdr:
|
||||
.riff_id rd 1
|
||||
.riff_size rd 1
|
||||
.riff_format rd 1
|
||||
|
||||
.fmt_id rd 1
|
||||
.fmt_size rd 1
|
||||
|
||||
.wFormatTag rw 1
|
||||
.nChannels rw 1
|
||||
.nSamplesPerSec rd 1
|
||||
.nAvgBytesPerSec rd 1
|
||||
.nBlockAlign rw 1
|
||||
.wBitsPerSample rw 1
|
||||
.data_id rd 1
|
||||
.data_size rd 1
|
||||
|
||||
proclib rd 1
|
||||
opendialog_init rd 1
|
||||
opendialog_start rd 1
|
||||
|
||||
input_file rd 1
|
||||
|
||||
mh rd 1
|
||||
encoding rd 1
|
||||
channels rd 1
|
||||
rate rd 1
|
||||
|
||||
hBuff rd 1
|
||||
count rd 1
|
||||
|
||||
done rd 1
|
||||
|
||||
error rd 1
|
||||
|
||||
|
||||
__cmdline: rb 256
|
||||
__pgmname: rb 1024
|
||||
rb 16
|
||||
__stack:
|
||||
__bssend:
|
@ -1,30 +0,0 @@
|
||||
|
||||
STACK_SIZE equ 4096
|
||||
|
||||
include "app.inc"
|
||||
|
||||
align 8
|
||||
main:
|
||||
cinvoke _printf, msg_hello
|
||||
ret
|
||||
|
||||
msg_hello db 'Hello world!',0x0D,0x0A,0
|
||||
|
||||
align 16
|
||||
__idata_start:
|
||||
|
||||
library libc,'libc.dll'
|
||||
|
||||
include 'libc.inc'
|
||||
|
||||
|
||||
|
||||
__idata_end:
|
||||
|
||||
__iend:
|
||||
|
||||
__cmdline: rb 256
|
||||
__pgmname: rb 1024
|
||||
rb 16
|
||||
__stack:
|
||||
__bssend:
|
Loading…
Reference in New Issue
Block a user