159,14 → 159,61 |
output equ IOCTL.output |
out_size equ IOCTL.out_size |
|
|
|
align 4 |
|
srv_calls dd service_proc.srv_getversion ; 0 |
dd service_proc.snd_create_buff ; 1 |
dd service_proc.snd_destroy_buff ; 2 |
dd service_proc.snd_setformat ; 3 |
dd service_proc.snd_getformat ; 4 |
dd service_proc.snd_reset ; 5 |
dd service_proc.snd_setpos ; 6 |
dd service_proc.snd_getpos ; 7 |
dd service_proc.snd_setbuff ; 8 |
dd service_proc.snd_out ; 9 |
dd service_proc.snd_play ; 10 |
dd service_proc.snd_stop ; 11 |
dd service_proc.snd_setvolume ; 12 |
dd service_proc.snd_getvolume ; 13 |
dd service_proc.snd_setpan ; 14 |
dd service_proc.snd_getpan ; 15 |
dd service_proc.snd_getbuffsize ; 16 |
dd service_proc.snd_getfreespace ; 17 |
dd service_proc.snd_settimebase ; 18 |
dd service_proc.snd_gettimestamp ; 19 |
srv_calls_end: |
|
proc service_proc stdcall, ioctl:dword |
|
mov edi, [ioctl] |
mov eax, [edi+io_code] |
|
cmp eax, SRV_GETVERSION |
jne @F |
cmp eax, (srv_calls_end-srv_calls)/4 |
ja .fail |
|
cmp eax, SND_CREATE_BUFF |
ja @F |
|
jmp [srv_calls+eax*4] |
@@: |
mov ebx, [edi+input] |
mov edx, [ebx] |
|
cmp [edx+STREAM.magic], 'WAVE' |
jne .fail |
|
cmp [edx+STREAM.size], STREAM.sizeof |
jne .fail |
|
jmp [srv_calls+eax*4] |
.fail: |
mov eax, -1 |
ret |
|
align 4 |
.srv_getversion: |
mov eax, [edi+output] |
cmp [edi+out_size], 4 |
jne .fail |
174,9 → 221,9 |
mov [eax], dword API_VERSION |
xor eax, eax |
ret |
@@: |
cmp eax, SND_CREATE_BUFF |
jne @F |
|
align 4 |
.snd_create_buff: |
mov ebx, [edi+input] |
stdcall CreateBuffer,[ebx],[ebx+4] |
mov edi, [ioctl] |
184,30 → 231,20 |
mov ecx, [ecx] |
mov [ecx], ebx |
ret |
@@: |
mov ebx, [edi+input] |
mov edx, [ebx] |
|
cmp [edx+STREAM.magic], 'WAVE' |
jne .fail |
|
cmp [edx+STREAM.size], STREAM_SIZE |
jne .fail |
|
cmp eax, SND_DESTROY_BUFF |
jne @F |
align 4 |
.snd_destroy_buff: |
mov eax, edx |
call DestroyBuffer ;edx= stream |
call DestroyBuffer |
ret |
@@: |
cmp eax, SND_SETFORMAT |
jne @F |
|
align 4 |
.snd_setformat: |
stdcall SetFormat,edx,[ebx+4] |
ret |
@@: |
cmp eax, SND_GETFORMAT |
jne @F |
|
align 4 |
.snd_getformat: |
movzx eax, word [edx+STREAM.format] |
mov ecx, [edi+output] |
mov ecx, [ecx] |
214,19 → 251,19 |
mov [ecx], eax |
xor eax, eax |
ret |
@@: |
cmp eax, SND_RESET |
jne @F |
|
align 4 |
.snd_reset: |
stdcall ResetBuffer,edx,[ebx+4] |
ret |
@@: |
cmp eax, SND_SETPOS |
jne @F |
|
align 4 |
.snd_setpos: |
stdcall SetBufferPos,edx,[ebx+4] |
ret |
@@: |
cmp eax, SND_GETPOS |
jne @F |
|
align 4 |
.snd_getpos: |
stdcall GetBufferPos, edx |
mov edi, [ioctl] |
mov ecx, [edi+output] |
233,34 → 270,48 |
mov ecx, [ecx] |
mov [ecx], ebx |
ret |
@@: |
cmp eax, SND_SETBUFF |
jne @F |
|
align 4 |
.snd_setbuff: |
mov eax, [ebx+4] |
stdcall set_buffer, edx,eax,[ebx+8],[ebx+12] |
ret |
@@: |
cmp eax, SND_SETVOLUME |
jne @F |
|
align 4 |
.snd_out: |
mov eax, [ebx+4] |
stdcall wave_out, edx,eax,[ebx+8] |
ret |
|
align 4 |
.snd_play: |
stdcall play_buffer, edx,[ebx+4] |
ret |
|
align 4 |
.snd_stop: |
stdcall stop_buffer, edx |
ret |
|
align 4 |
.snd_setvolume: |
stdcall SetBufferVol,edx,[ebx+4],[ebx+8] |
ret |
@@: |
cmp eax, SND_GETVOLUME |
jne @F |
|
align 4 |
.snd_getvolume: |
mov eax, [edi+output] |
mov ecx, [eax] |
mov eax, [eax+4] |
stdcall GetBufferVol,edx,ecx,eax |
ret |
@@: |
cmp eax, SND_SETPAN |
jne @F |
align 4 |
.snd_setpan: |
stdcall SetBufferPan,edx,[ebx+4] |
ret |
@@: |
cmp eax, SND_GETPAN |
jne @F |
|
align 4 |
.snd_getpan: |
mov eax, [edx+STREAM.pan] |
mov ebx, [edi+output] |
mov ebx, [ebx] |
267,28 → 318,9 |
mov [ebx], eax |
xor eax, eax |
ret |
@@: |
cmp eax, SND_OUT |
jne @F |
|
mov eax, [ebx+4] |
stdcall wave_out, edx,eax,[ebx+8] |
ret |
@@: |
cmp eax, SND_PLAY |
jne @F |
|
stdcall play_buffer, edx,[ebx+4] |
ret |
@@: |
cmp eax, SND_STOP |
jne @F |
|
stdcall stop_buffer, edx |
ret |
@@: |
cmp eax, SND_GETBUFFSIZE |
jne @F |
align 4 |
.snd_getbuffsize: |
mov eax, [edx+STREAM.in_size] |
mov ecx, [edi+output] |
mov ecx, [ecx] |
295,10 → 327,9 |
mov [ecx], eax |
xor eax, eax |
ret |
@@: |
cmp eax, SND_GETFREESPACE |
jne @F |
|
align 4 |
.snd_getfreespace: |
test [edx+STREAM.format], PCM_OUT |
jz .fail |
|
307,12 → 338,38 |
mov [ecx], ebx |
xor eax, eax |
ret |
@@: |
.fail: |
or eax, -1 |
align 4 |
.snd_settimebase: |
cmp [edi+inp_size], 8 |
jne .fail |
|
mov edi, [edi+input] |
mov eax, [edi] |
mov ebx, [edi+4] |
mov dword [edx+STREAM.time_base], eax |
mov dword [edx+STREAM.time_base+4], ebx |
xor eax, eax |
ret |
|
.snd_gettimestamp: |
cmp [edi+out_size], 8 |
jne .fail |
|
mov edi, [edi+output] |
|
push 48 |
emms |
fild qword [edx+STREAM.time_stamp] |
fidiv dword [esp] |
fadd qword [edx+STREAM.time_base] |
fstp qword [edi] |
add esp, 4 |
|
xor eax, eax |
ret |
endp |
|
|
restore handle |
restore io_code |
restore input |
352,7 → 409,7 |
|
call GetPid |
mov ebx, eax |
mov eax, STREAM_SIZE |
mov eax, STREAM.sizeof |
|
call CreateObject |
test eax, eax |
412,7 → 469,6 |
mov [edi+STREAM.in_base], eax |
mov [edi+STREAM.in_size], ecx |
add eax, 128 |
; sub ecx, 128 |
mov [edi+STREAM.in_wp], eax |
mov [edi+STREAM.in_rp], eax |
mov [edi+STREAM.in_count], 0 |
443,13 → 499,21 |
stdcall AllocKernelSpace, dword 128*1024 |
|
mov edi, [str] |
xor ebx, ebx |
|
mov [edi+STREAM.out_base], eax |
mov [edi+STREAM.out_wp], eax |
mov [edi+STREAM.out_rp], eax |
mov [edi+STREAM.out_count], 0 |
mov [edi+STREAM.out_count], ebx |
add eax, 64*1024 |
mov [edi+STREAM.out_top], eax |
|
mov dword [edi+STREAM.time_base], ebx |
mov dword [edi+STREAM.time_base+4], ebx |
|
mov dword [edi+STREAM.time_stamp], ebx |
mov dword [edi+STREAM.time_stamp+4], ebx |
|
stdcall AllocPages, dword 64/4 |
mov edi, [str] |
mov ebx, [edi+STREAM.out_base] |
488,7 → 552,7 |
|
mov [ebx+STREAM.magic], 'WAVE' |
mov [ebx+STREAM.destroy], DestroyBuffer.destroy |
mov [ebx+STREAM.size], STREAM_SIZE |
mov [ebx+STREAM.size], STREAM.sizeof |
mov [ebx+STREAM.flags], SND_STOP |
|
pushf |
1039,7 → 1103,7 |
cmp [ebx+STREAM.magic], 'WAVE' |
jne .next |
|
cmp [ebx+STREAM.size], STREAM_SIZE |
cmp [ebx+STREAM.size], STREAM.sizeof |
jne .next |
|
cmp [ebx+STREAM.flags], SND_PLAY; |
1108,7 → 1172,7 |
cmp [edi+STREAM.magic], 'WAVE' |
jne .next |
|
cmp [edi+STREAM.size], STREAM_SIZE |
cmp [edi+STREAM.size], STREAM.sizeof |
jne .next |
|
cmp [edi+STREAM.flags], SND_PLAY; |