Почта nnov.ruУлица Дьяконова и высотные здания

Сегодня программировал.

Сделал много. По сути, сделал полный шаг в сторону рабочей программы.
Этот шаг - универсальный алгоритм по заполнению информации о микшерах в системе в массив.
То есть, собирает всю информацию о микшерах и заносит её в массив.
Потом с ним можно работать, обрабатывая информацию о микшерах.
Вот основная подпрограмма:

;----------------------------------------------------------
; Открывает указанный микшер и заполняет структуру о этом микшере
;
; IN -> Номер микшера;
;
; OUT=> Адрес структуры с информацией об открытом микшере;
;
proc Mixer_Load
ARG @@uMixerID :dword
USES esi,edi,ebx
LOCAL @@MixerCaps :MIXERCAPS, @@mlDest :MIXERLINE,\
@@mlSrc :MIXERLINE, @@dwDestination :dword, @@arrMixer :dword,\
@@phmx0 :dword, @@arrMixer_size :dword
;--
Call GlobalAlloc, GPTR, 4 + (size MIXERCAPS) + 4 + 4 + 4
or eax, eax
jz @@exit_err



mov [@@arrMixer], eax
xchg edi, eax
;--
Call mixerGetNumDevs
or eax, eax
jz @@exit_err

cmp eax, [@@uMixerID]
jna @@exit_err

lea eax, [@@phmx0]
Call mixerOpen, eax, [@@uMixerID], [hWndMain], 0, CALLBACK_WINDOW
cmp eax, MMSYSERR_NOERROR
jz @@o20
;!!
jmp @@exit_err

@@o20:
mov eax, [@@phmx0]
lea esi, [@@MixerCaps]
stosd
;--
mov eax, 4*4 + size MIXERCAPS
stosd
stosd ;
stosd ;
;--
mov ecx, size MIXERCAPS
push ecx
Call mixerGetDevCapsA, [@@phmx0], esi, ecx
cmp eax, MMSYSERR_NOERROR
pop ecx
jz @@o21
;!!
jmp @@exit_err

@@o21:
push esi
rep movsb
pop esi
;==
mov eax, [(t MIXERCAPS esi).cDestinations]
or eax, eax
jz @@exit_err
imul eax, size MIXERLINE
add eax, 4 + size MIXERCAPS + 4 + 4 + 4

mov [@@arrMixer_size], eax
Call GlobalReAlloc, [@@arrMixer], eax, GMEM_MOVEABLE
or eax, eax
jz @@exit_err

mov [@@arrMixer], eax
add eax, 4 + size MIXERCAPS + 4 + 4 + 4
xchg edi, eax
;==
sub eax, eax
mov ebx, eax
mov [@@dwDestination], eax
@@m10:
mov ecx, size MIXERLINE
sub al, al
push ecx edi
rep stosb
pop edi

pop [(t MIXERLINE edi).cbStruct]
mov eax, [@@dwDestination]
mov [(t MIXERLINE edi).dwDestination], eax

Call mixerGetLineInfoA, [@@phmx0], edi, MIXER_GETLINEINFOF_DESTINATION
cmp eax, MMSYSERR_NOERROR
jz @@o22
;!!
jmp @@exit_err

@@o22:
add ebx, [(t MIXERLINE edi).cConnections]

mov eax, [@@dwDestination]
add edi, size MIXERLINE
inc eax
mov [@@dwDestination], eax

cmp eax, [(t MIXERCAPS @@MixerCaps).cDestinations]
jc @@m10
;==
sub edi, [@@arrMixer]
;-
mov eax, [@@arrMixer]
mov [eax+8], edi
mov [eax+8+4], ebx
;-
xchg eax, ebx
or eax, eax
jz @@exit_err ;!!
imul eax, size MIXERLINE
add eax, [@@arrMixer_size]

mov [@@arrMixer_size], eax
Call GlobalReAlloc, [@@arrMixer], eax, GMEM_MOVEABLE
or eax, eax
jz @@exit_err

mov [@@arrMixer], eax
lea ebx, [eax+4+size MIXERCAPS+8+4]
add edi, eax
;==
mov esi, [@@dwDestination]
sub eax, eax
mov [@@dwDestination], eax
@@m23:
push esi
sub esi, esi
@@o24:
sub al, al
mov ecx, size MIXERLINE
push ecx edi
rep stosb
pop edi

pop [(t MIXERLINE edi).cbStruct]
mov eax, [@@dwDestination]
mov [(t MIXERLINE edi).dwDestination], eax

mov [(t MIXERLINE edi).dwSource], esi

Call mixerGetLineInfoA, [@@phmx0], edi, MIXER_GETLINEINFOF_SOURCE
cmp eax, MMSYSERR_NOERROR
jnz @@exit_err_0

inc esi
add edi, size MIXERLINE
cmp esi, [(t MIXERLINE ebx).cConnections]
jc @@o24

pop esi
add ebx, size MIXERLINE
inc [@@dwDestination]
dec esi
jnz @@m23

@@exit_ok:
mov eax, [@@arrMixer]
@@ret:
ret

@@exit_err_0:
pop eax
@@exit_err:
sub eax, eax
jmp @@ret
endp

А вот алгоритм установки движков, основанный на этом массиве и подпрограммах.
Заметьте, как всё просто обрабатывается, быстро и универсально!

call Mixer_new
or eax, eax
jz @@exit1
mov [arrMixers], eax
;===
mov eax, [arrMixers]
mov eax, [eax+4]

mov esi, [eax]
mov ecx, [eax+12]
add eax, [eax+8]
xchg edi, eax
@@n10:
cmp [(t MIXERLINE edi).dwComponentType], \
MIXERLINE_COMPONENTTYPE_SRC_ANALOG
jnz @@o28_0

call InitSlider, esi, [hwnd1], [(t MIXERLINE edi).dwLineID],\
MIXERCONTROL_CONTROLTYPE_VOLUME
@@o28_0:
cmp [(t MIXERLINE edi).dwComponentType], MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT
jnz @@o28

call InitSlider, esi, [hwnd0], [(t MIXERLINE edi).dwLineID],\
MIXERCONTROL_CONTROLTYPE_VOLUME

@@o28:
add edi, size MIXERLINE
dec ecx
jnz @@n10