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: |