forked from KolibriOS/kolibrios
HDA: Use another codec when no AFG found if possible
git-svn-id: svn://kolibrios.org@4324 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
d24c668030
commit
6b3f1e224c
@ -13,15 +13,15 @@ proc make_codec_cmd stdcall, nid:dword, direct:dword, verb:dword, parm:dword
|
||||
shl eax, 28
|
||||
mov ebx, [direct]
|
||||
shl ebx, 27
|
||||
or eax, ebx
|
||||
or eax, ebx
|
||||
mov ebx, [nid]
|
||||
shl ebx, 20
|
||||
or eax, ebx
|
||||
or eax, ebx
|
||||
mov ebx, [verb]
|
||||
shl ebx, 8
|
||||
or eax, ebx
|
||||
or eax, ebx
|
||||
mov ebx, [parm]
|
||||
or eax, ebx
|
||||
or eax, ebx
|
||||
pop ebx
|
||||
ret
|
||||
.err:
|
||||
@ -32,11 +32,11 @@ endp
|
||||
|
||||
;; Send and receive a verb
|
||||
proc codec_exec_verb stdcall, cmd:dword;, res:dword <- returned in eax
|
||||
push ebx edx
|
||||
push ebx edx
|
||||
mov ebx, [cmd]
|
||||
cmp ebx, -1
|
||||
jne @f
|
||||
pop edx ebx
|
||||
pop edx ebx
|
||||
mov eax, -1
|
||||
ret
|
||||
@@:
|
||||
@ -61,7 +61,7 @@ proc codec_exec_verb stdcall, cmd:dword;, res:dword <- returned in eax
|
||||
mov edx, eax
|
||||
if FDEBUG
|
||||
test edx, edx
|
||||
jz .end_debug
|
||||
jz .end_debug
|
||||
push eax esi
|
||||
mov esi, msgVerbAnswer
|
||||
call SysMsgBoardStr
|
||||
@ -80,10 +80,10 @@ proc codec_exec_verb stdcall, cmd:dword;, res:dword <- returned in eax
|
||||
|
||||
mov eax, [ctrl.rirb_error]
|
||||
test eax, eax
|
||||
jz .l1
|
||||
jz .l1
|
||||
|
||||
mov eax, [ctrl.response_reset]
|
||||
jz @f
|
||||
jz @f
|
||||
|
||||
if DEBUG
|
||||
push esi
|
||||
@ -101,7 +101,7 @@ proc codec_exec_verb stdcall, cmd:dword;, res:dword <- returned in eax
|
||||
@@:
|
||||
mov eax, edx
|
||||
|
||||
pop edx ebx
|
||||
pop edx ebx
|
||||
ret
|
||||
endp
|
||||
|
||||
@ -163,7 +163,7 @@ proc snd_hda_sequence_write stdcall, seq:dword
|
||||
;jnz @b
|
||||
;______________________________________
|
||||
cmp dword [esi], 0
|
||||
je .out
|
||||
je .out
|
||||
movzx ecx, word [esi] ; NID
|
||||
movzx ebx, word [esi+2] ; verb
|
||||
and bx, 0x0FFF
|
||||
@ -192,7 +192,7 @@ macro snd_hda_param_read nid, param
|
||||
;; Returns the number of sub-nodes.
|
||||
;;
|
||||
proc snd_hda_get_sub_nodes stdcall, nid:dword;, start_id:dword <- returned in upper word of eax
|
||||
snd_hda_param_read [nid], AC_PAR_NODE_COUNT
|
||||
snd_hda_param_read [nid], AC_PAR_NODE_COUNT
|
||||
|
||||
cmp eax, -1
|
||||
jne @f
|
||||
@ -217,20 +217,20 @@ endp
|
||||
;;
|
||||
proc snd_hda_get_connections stdcall, nid:dword, conn_list:dword, max_conns:dword ;Asper: Complete translation!
|
||||
locals
|
||||
parm dd ?
|
||||
parm dd ?
|
||||
conn_len dd ?
|
||||
conns dd 0
|
||||
shift db 8
|
||||
conns dd 0
|
||||
shift db 8
|
||||
num_elements dd 4
|
||||
mask dd 0x7F
|
||||
wcaps dd ?
|
||||
mask dd 0x7F
|
||||
wcaps dd ?
|
||||
prev_nid dw 1 ;Asper: Hmm.. Probably ALSA bug that it isn't initialized. I suppose to init it with 1.
|
||||
endl
|
||||
|
||||
push ebx ecx edx edi esi
|
||||
mov edi, [conn_list]
|
||||
test edi, edi
|
||||
jz .err_out
|
||||
jz .err_out
|
||||
mov ecx, [max_conns]
|
||||
cmp ecx, 0
|
||||
jle .err_out
|
||||
@ -241,7 +241,7 @@ proc snd_hda_get_connections stdcall, nid:dword, conn_list:dword, max_conns:dwo
|
||||
mov [wcaps], eax
|
||||
stdcall get_wcaps_type, ebx
|
||||
cmp eax, AC_WID_VOL_KNB
|
||||
je .conn_list_ok
|
||||
je .conn_list_ok
|
||||
test ebx, AC_WCAP_CONN_LIST
|
||||
jnz .conn_list_ok
|
||||
if DEBUG
|
||||
@ -256,11 +256,11 @@ proc snd_hda_get_connections stdcall, nid:dword, conn_list:dword, max_conns:dwo
|
||||
jmp .out
|
||||
.conn_list_ok:
|
||||
|
||||
snd_hda_param_read [nid], AC_PAR_CONNLIST_LEN
|
||||
snd_hda_param_read [nid], AC_PAR_CONNLIST_LEN
|
||||
mov [parm], eax
|
||||
|
||||
test eax, AC_CLIST_LONG
|
||||
jz @f
|
||||
jz @f
|
||||
; long form
|
||||
mov [shift], 16
|
||||
mov [num_elements], 2
|
||||
@ -268,7 +268,7 @@ proc snd_hda_get_connections stdcall, nid:dword, conn_list:dword, max_conns:dwo
|
||||
@@:
|
||||
and eax, AC_CLIST_LENGTH
|
||||
test eax, eax
|
||||
jz .out ; no connection
|
||||
jz .out ; no connection
|
||||
|
||||
mov [conn_len], eax
|
||||
cmp eax, 1
|
||||
@ -300,7 +300,7 @@ proc snd_hda_get_connections stdcall, nid:dword, conn_list:dword, max_conns:dwo
|
||||
mov eax, ecx
|
||||
.mod:
|
||||
cmp eax, edx
|
||||
jl .mod_counted
|
||||
jl .mod_counted
|
||||
sub eax, edx
|
||||
jmp .mod
|
||||
.mod_counted:
|
||||
@ -360,13 +360,13 @@ proc snd_hda_get_connections stdcall, nid:dword, conn_list:dword, max_conns:dwo
|
||||
pop ecx
|
||||
|
||||
test ebx, ebx
|
||||
jz .range_zero
|
||||
jz .range_zero
|
||||
; ranges between the previous and this one
|
||||
movzx esi, word [prev_nid]
|
||||
test esi, esi
|
||||
jz .l2
|
||||
jz .l2
|
||||
cmp esi, eax
|
||||
jl @f
|
||||
jl @f
|
||||
.l2:
|
||||
if DEBUG
|
||||
push eax esi
|
||||
@ -394,7 +394,7 @@ proc snd_hda_get_connections stdcall, nid:dword, conn_list:dword, max_conns:dwo
|
||||
mov ebx, [conns]
|
||||
.next_conn2:
|
||||
cmp ebx, [max_conns]
|
||||
jl @f
|
||||
jl @f
|
||||
if DEBUG
|
||||
push esi
|
||||
mov esi, emsgTooManyConns
|
||||
@ -422,7 +422,7 @@ proc snd_hda_get_connections stdcall, nid:dword, conn_list:dword, max_conns:dwo
|
||||
|
||||
mov ebx, [conns]
|
||||
cmp ebx, [max_conns]
|
||||
jl @f
|
||||
jl @f
|
||||
if DEBUG
|
||||
push esi
|
||||
mov esi, emsgTooManyConns
|
||||
@ -444,7 +444,7 @@ proc snd_hda_get_connections stdcall, nid:dword, conn_list:dword, max_conns:dwo
|
||||
.continue:
|
||||
inc ecx
|
||||
cmp ecx, [conn_len]
|
||||
jl .next_conn
|
||||
jl .next_conn
|
||||
|
||||
mov eax, [conns]
|
||||
.out:
|
||||
@ -512,6 +512,22 @@ proc snd_hda_codec_init ; We use just one codec (the first found)
|
||||
test eax, eax
|
||||
jnz @f
|
||||
|
||||
;Asper+: try to use another codec if possible [
|
||||
if DEBUG
|
||||
push esi
|
||||
mov esi, msgNoAFGFound
|
||||
call SysMsgBoardStr
|
||||
pop esi
|
||||
end if
|
||||
push ecx
|
||||
inc eax
|
||||
mov ecx, [codec.addr]
|
||||
shl eax, cl
|
||||
pop ecx
|
||||
cmp eax, [ctrl.codec_mask]
|
||||
jl .skip_codec
|
||||
;Asper+]
|
||||
|
||||
mov eax, [codec.mfg]
|
||||
test eax, eax
|
||||
jnz @f
|
||||
@ -521,6 +537,7 @@ proc snd_hda_codec_init ; We use just one codec (the first found)
|
||||
call SysMsgBoardStr
|
||||
pop esi
|
||||
end if
|
||||
.skip_codec:
|
||||
mov eax, -1
|
||||
ret
|
||||
@@:
|
||||
@ -560,6 +577,7 @@ proc snd_hda_codec_init ; We use just one codec (the first found)
|
||||
; power up all before initialization
|
||||
stdcall snd_hda_set_power_state, ebx, AC_PWRST_D0
|
||||
|
||||
xor eax, eax
|
||||
pop ebx
|
||||
ret
|
||||
endp
|
||||
@ -820,9 +838,9 @@ proc read_pin_defaults
|
||||
|
||||
if FDEBUG
|
||||
push eax esi
|
||||
mov esi, msgPinCfgs
|
||||
mov esi, msgPinCfgs
|
||||
call SysMsgBoardStr
|
||||
pop esi eax
|
||||
pop esi eax
|
||||
end if
|
||||
|
||||
|
||||
@ -972,7 +990,7 @@ proc hda_codec_setup_stream stdcall, nid:dword, stream_tag:dword, channel_id:dwo
|
||||
or eax, [channel_id]
|
||||
stdcall snd_hda_codec_write, [nid], 0, AC_VERB_SET_CHANNEL_STREAMID, eax
|
||||
|
||||
mov eax, 1000 ; wait 1 ms
|
||||
mov eax, 1000 ; wait 1 ms
|
||||
call StallExec
|
||||
|
||||
stdcall snd_hda_codec_write, [nid], 0, AC_VERB_SET_STREAM_FORMAT, [format]
|
||||
@ -998,7 +1016,7 @@ proc snd_hda_codec_cleanup_stream stdcall, nid:dword
|
||||
pop esi
|
||||
end if
|
||||
stdcall snd_hda_codec_write, [nid], 0, AC_VERB_SET_CHANNEL_STREAMID, 0
|
||||
if 0 ; keep the format
|
||||
if 0 ; keep the format
|
||||
mov eax, 1000000 ; wait 100 ms
|
||||
call StallExec
|
||||
stdcall snd_hda_codec_write, [nid], 0, AC_VERB_SET_STREAM_FORMAT, 0
|
||||
@ -1180,7 +1198,7 @@ proc snd_hda_set_power_state stdcall, fg:dword, power_state:dword
|
||||
stdcall snd_hda_codec_read, [fg], 0, AC_VERB_GET_POWER_STATE, 0
|
||||
cmp eax, ebx
|
||||
je .out
|
||||
mov eax, 1000 ; msleep(1);
|
||||
mov eax, 1000 ; msleep(1);
|
||||
call StallExec
|
||||
dec ecx
|
||||
jnz .wait_D0
|
||||
@ -1194,21 +1212,21 @@ endp
|
||||
|
||||
; codec vendors
|
||||
align 16
|
||||
msg_Cirrus db 'Cirrus Logic ',0
|
||||
msg_Motorola db 'Motorola ',0
|
||||
msg_Cirrus db 'Cirrus Logic ',0
|
||||
msg_Motorola db 'Motorola ',0
|
||||
msg_SiliconImage db 'Silicon Image ',0
|
||||
msg_Realtek db 'Realtek ',0
|
||||
msg_Creative db 'Creative ',0
|
||||
msg_IDT db 'IDT ',0
|
||||
msg_LSI db 'LSI ',0
|
||||
msg_Realtek db 'Realtek ',0
|
||||
msg_Creative db 'Creative ',0
|
||||
msg_IDT db 'IDT ',0
|
||||
msg_LSI db 'LSI ',0
|
||||
msg_AnalogDevices db 'Analog Devices ',0
|
||||
msg_CMedia db 'C-Media ',0
|
||||
msg_Conexant db 'Conexant ',0
|
||||
msg_Chrontel db 'Chrontel ',0
|
||||
msg_LG db 'LG ',0
|
||||
msg_Wolfson db 'Wolfson Microelectronics ',0
|
||||
msg_Qumranet db 'Qumranet ',0
|
||||
msg_SigmaTel db 'SigmaTel ',0
|
||||
msg_CMedia db 'C-Media ',0
|
||||
msg_Conexant db 'Conexant ',0
|
||||
msg_Chrontel db 'Chrontel ',0
|
||||
msg_LG db 'LG ',0
|
||||
msg_Wolfson db 'Wolfson Microelectronics ',0
|
||||
msg_Qumranet db 'Qumranet ',0
|
||||
msg_SigmaTel db 'SigmaTel ',0
|
||||
ac_unknown db 'unknown manufacturer ',0
|
||||
|
||||
chip_unknown db 'unknown codec id ', 0
|
||||
@ -1239,105 +1257,105 @@ hda_vendor_ids:
|
||||
dd 0x8384, msg_SigmaTel, chips_SigmaTel
|
||||
dd 0 ; terminator
|
||||
|
||||
align 16 ;known codecs
|
||||
chips_ATI dd 0xAA01, chip_ATIR6XX
|
||||
dd 0xFF
|
||||
align 16 ;known codecs
|
||||
chips_ATI dd 0xAA01, chip_ATIR6XX
|
||||
dd 0xFF
|
||||
|
||||
chips_Cirrus dd 0xFF
|
||||
chips_Motorola dd 0xFF
|
||||
chips_Cirrus dd 0xFF
|
||||
chips_Motorola dd 0xFF
|
||||
|
||||
chips_SiliconImage dd 0x1392, chip_SI1392
|
||||
dd 0xFF
|
||||
dd 0xFF
|
||||
|
||||
chips_NVidia dd 0x0002, chip_MCP78
|
||||
dd 0xFF
|
||||
chips_NVidia dd 0x0002, chip_MCP78
|
||||
dd 0xFF
|
||||
|
||||
chips_Realtek dd 0x0262, chip_ALC262
|
||||
dd 0x0268, chip_ALC268
|
||||
dd 0x0269, chip_ALC269
|
||||
dd 0x0272, chip_ALC272
|
||||
dd 0x0662, chip_ALC662
|
||||
dd 0x0663, chip_ALC663
|
||||
dd 0x0883, chip_ALC883
|
||||
dd 0x0887, chip_ALC887
|
||||
dd 0x0888, chip_ALC888
|
||||
dd 0x0889, chip_ALC889
|
||||
dd 0xFF
|
||||
chips_Realtek dd 0x0262, chip_ALC262
|
||||
dd 0x0268, chip_ALC268
|
||||
dd 0x0269, chip_ALC269
|
||||
dd 0x0272, chip_ALC272
|
||||
dd 0x0662, chip_ALC662
|
||||
dd 0x0663, chip_ALC663
|
||||
dd 0x0883, chip_ALC883
|
||||
dd 0x0887, chip_ALC887
|
||||
dd 0x0888, chip_ALC888
|
||||
dd 0x0889, chip_ALC889
|
||||
dd 0xFF
|
||||
|
||||
chips_Creative dd 0xFF
|
||||
chips_Creative dd 0xFF
|
||||
|
||||
chips_VIA dd 0xE721, chip_VT1708B_1
|
||||
dd 0x0397, chip_VT17085_0
|
||||
dd 0xFF
|
||||
chips_VIA dd 0xE721, chip_VT1708B_1
|
||||
dd 0x0397, chip_VT17085_0
|
||||
dd 0xFF
|
||||
|
||||
chips_IDT dd 0xFF
|
||||
chips_IDT dd 0xFF
|
||||
|
||||
chips_LSI dd 0x1039, chip_LSI1039
|
||||
dd 0x1040, chip_LSI1040
|
||||
dd 0x3026, chip_LSI3026
|
||||
dd 0x3055, chip_LSI3055
|
||||
dd 0xFF
|
||||
chips_LSI dd 0x1039, chip_LSI1039
|
||||
dd 0x1040, chip_LSI1040
|
||||
dd 0x3026, chip_LSI3026
|
||||
dd 0x3055, chip_LSI3055
|
||||
dd 0xFF
|
||||
|
||||
chips_Analog dd 0x1986, chip_AD1986A
|
||||
dd 0x198B, chip_AD198B
|
||||
dd 0xFF
|
||||
chips_Analog dd 0x1986, chip_AD1986A
|
||||
dd 0x198B, chip_AD198B
|
||||
dd 0xFF
|
||||
|
||||
chips_CMedia dd 0xFF
|
||||
chips_CMedia dd 0xFF
|
||||
|
||||
chips_Conexant dd 0x5045, chip_CX20549
|
||||
dd 0x5051, chip_CX20561
|
||||
dd 0xFF
|
||||
chips_Conexant dd 0x5045, chip_CX20549
|
||||
dd 0x5051, chip_CX20561
|
||||
dd 0xFF
|
||||
|
||||
chips_Chrontel dd 0xFF
|
||||
chips_LG dd 0xFF
|
||||
chips_Wolfson dd 0xFF
|
||||
chips_Intel dd 0xFF
|
||||
chips_Chrontel dd 0xFF
|
||||
chips_LG dd 0xFF
|
||||
chips_Wolfson dd 0xFF
|
||||
chips_Intel dd 0xFF
|
||||
|
||||
chips_Qumranet dd 0x0010, chip_HDA_OUTPUT
|
||||
dd 0x0020, chip_HDA_DUPLEX
|
||||
dd 0xFF
|
||||
chips_Qumranet dd 0x0010, chip_HDA_OUTPUT
|
||||
dd 0x0020, chip_HDA_DUPLEX
|
||||
dd 0xFF
|
||||
|
||||
chips_SigmaTel dd 0x7680, chip_STAC9221
|
||||
dd 0x7682, chip_STAC9221_A2
|
||||
dd 0xFF
|
||||
chips_SigmaTel dd 0x7680, chip_STAC9221
|
||||
dd 0x7682, chip_STAC9221_A2
|
||||
dd 0xFF
|
||||
|
||||
align 16
|
||||
;AnalogDevices
|
||||
chip_AD1986A db 'AD1986A',13,10,0
|
||||
chip_AD198B db 'AD198B',13,10,0
|
||||
chip_AD1986A db 'AD1986A',13,10,0
|
||||
chip_AD198B db 'AD198B',13,10,0
|
||||
|
||||
;ATI
|
||||
chip_ATIR6XX db 'ATIR6XX',13,10,0
|
||||
chip_ATIR6XX db 'ATIR6XX',13,10,0
|
||||
|
||||
;Silicon Image
|
||||
chip_SI1392 db 'SI1392',13,10,0
|
||||
chip_SI1392 db 'SI1392',13,10,0
|
||||
|
||||
;NVidia
|
||||
chip_MCP78 db 'MCP78',13,10,0
|
||||
chip_MCP78 db 'MCP78',13,10,0
|
||||
|
||||
;Realtek
|
||||
chip_ALC262 db 'ALC262',13,10,0
|
||||
chip_ALC268 db 'ALC268',13,10,0
|
||||
chip_ALC269 db 'ALC269',13,10,0
|
||||
chip_ALC272 db 'ALC272',13,10,0
|
||||
chip_ALC662 db 'ALC662',13,10,0
|
||||
chip_ALC663 db 'ALC663',13,10,0
|
||||
chip_ALC883 db 'ALC883',13,10,0
|
||||
chip_ALC887 db 'ALC887',13,10,0
|
||||
chip_ALC888 db 'ALC888',13,10,0
|
||||
chip_ALC889 db 'ALC889',13,10,0
|
||||
chip_ALC262 db 'ALC262',13,10,0
|
||||
chip_ALC268 db 'ALC268',13,10,0
|
||||
chip_ALC269 db 'ALC269',13,10,0
|
||||
chip_ALC272 db 'ALC272',13,10,0
|
||||
chip_ALC662 db 'ALC662',13,10,0
|
||||
chip_ALC663 db 'ALC663',13,10,0
|
||||
chip_ALC883 db 'ALC883',13,10,0
|
||||
chip_ALC887 db 'ALC887',13,10,0
|
||||
chip_ALC888 db 'ALC888',13,10,0
|
||||
chip_ALC889 db 'ALC889',13,10,0
|
||||
|
||||
;Sigmatel
|
||||
chip_STAC9221 db 'STAC9221',13,10,0
|
||||
chip_STAC9221 db 'STAC9221',13,10,0
|
||||
chip_STAC9221_A2 db 'STAC9221_A2',13,10,0
|
||||
|
||||
;VIA
|
||||
chip_VT1708B_1 db 'VT1708B_1',13,10,0
|
||||
chip_VT17085_0 db 'VT17085_0',13,10,0
|
||||
chip_VT1708B_1 db 'VT1708B_1',13,10,0
|
||||
chip_VT17085_0 db 'VT17085_0',13,10,0
|
||||
|
||||
;Conexant
|
||||
chip_CX20549 db 'CX20549',13,10,0
|
||||
chip_CX20561 db 'CX20561',13,10,0
|
||||
chip_CX20549 db 'CX20549',13,10,0
|
||||
chip_CX20561 db 'CX20561',13,10,0
|
||||
|
||||
;Qumranet
|
||||
chip_HDA_OUTPUT db 'HDA-OUTPUT',13,10,0
|
||||
|
@ -13,7 +13,7 @@ DEBUG_IRQ equ 0
|
||||
|
||||
USE_SINGLE_MODE equ 0 ; 1 = Single mode; 0 = Normal mode.
|
||||
|
||||
TEST_VERSION_NUMBER equ '018d'
|
||||
TEST_VERSION_NUMBER equ '018e'
|
||||
|
||||
;Asper+ [
|
||||
SDO_TAG equ 1 ;Asper: Output stream tag id (any number except 0)
|
||||
@ -2338,14 +2338,17 @@ proc azx_codec_create
|
||||
; if USE_FIRST_CODEC
|
||||
; cmp ecx, 1
|
||||
; else
|
||||
cmp ecx, 3
|
||||
cmp ecx, 4
|
||||
; end if
|
||||
jl .next_slot
|
||||
mov eax, -1
|
||||
jmp .out
|
||||
.init:
|
||||
push ecx edx
|
||||
stdcall snd_hda_codec_init
|
||||
xor eax, eax
|
||||
pop edx ecx
|
||||
test eax, eax
|
||||
jnz @b
|
||||
.out:
|
||||
pop edx ecx ebx
|
||||
ret
|
||||
@ -2900,6 +2903,7 @@ if DEBUG
|
||||
msgCodecOK db 'codec probed OK',13,10,0
|
||||
msgCodecError db 'codec probe error disabling it...',13,10,0
|
||||
emsgNoAFGorMFGFound db 'no AFG or MFG node found',13,10,0
|
||||
msgNoAFGFound db 'no AFG node found, trying another codec',13,10,0
|
||||
emsgNoMem db 'hda_codec: cannot malloc',13,10,0
|
||||
msgConnect db 'CONNECT: NID=',0
|
||||
msgIdx db ' IDX=',0
|
||||
|
Loading…
Reference in New Issue
Block a user