Rev 378 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
168 | serge | 1 | |
2 | proc detect_codec |
||
3 | locals |
||
4 | codec_id dd ? |
||
5 | endl |
||
6 | |||
7 | |||
8 | shl eax, 16 |
||
9 | mov [codec_id], eax |
||
10 | |||
11 | |||
12 | or eax, [codec_id] |
||
13 | |||
14 | |||
15 | and eax, 0xFFFFFF00 |
||
16 | |||
17 | |||
18 | @@: |
||
19 | mov ebx, [edi] |
||
20 | test ebx, ebx |
||
21 | jz .unknown |
||
22 | |||
23 | |||
24 | jne .next |
||
25 | mov eax, [edi+4] |
||
26 | mov [codec.ac_vendor_ids], eax |
||
27 | stdcall detect_chip, [edi+8] |
||
28 | ret |
||
29 | .next: |
||
30 | add edi, 12 |
||
31 | jmp @B |
||
32 | .unknown: |
||
33 | mov [codec.ac_vendor_ids], ac_unknown |
||
34 | mov [codec.chip_ids], chip_unknown |
||
35 | ret |
||
36 | endp |
||
37 | |||
38 | |||
39 | proc detect_chip stdcall, chip_tab:dword |
||
40 | |||
41 | |||
42 | and eax, 0xFF |
||
43 | |||
44 | |||
45 | @@: |
||
46 | mov ebx, [edi] |
||
47 | test ebx, ebx |
||
48 | jz .unknown |
||
49 | |||
50 | |||
51 | jne .next |
||
52 | mov eax, [edi+4] |
||
53 | mov [codec.chip_ids], eax |
||
54 | ret |
||
55 | .next: |
||
56 | add edi, 8 |
||
57 | jmp @b |
||
58 | .unknown: |
||
59 | mov [codec.chip_ids], chip_unknown |
||
60 | ret |
||
61 | endp |
||
62 | |||
63 | |||
64 | proc setup_codec |
||
65 | |||
66 | |||
67 | stdcall codec_write, dword CODEC_AUX_VOL |
||
68 | |||
69 | |||
378 | serge | 70 | stdcall codec_write, dword CODEC_MASTER_VOL_REG |
168 | serge | 71 | |
72 | |||
73 | stdcall codec_write, dword 0x0C |
||
74 | |||
75 | |||
76 | stdcall codec_write, dword CODEC_PCM_OUT_REG |
||
77 | |||
78 | |||
79 | stdcall codec_write, dword 0x10 |
||
80 | |||
81 | |||
82 | stdcall codec_write, dword 0x12 |
||
83 | |||
84 | |||
85 | stdcall codec_write, dword 0x16 |
||
86 | |||
87 | |||
88 | |||
89 | |||
90 | |||
91 | or eax, BIT0 ; set VRA (BIT0) |
||
92 | stdcall codec_write, dword CODEC_EXT_AUDIO_CTRL_REG |
||
93 | |||
94 | |||
95 | |||
96 | |||
97 | |||
98 | |||
99 | ret |
||
100 | endp |
||
101 | |||
102 | |||
378 | serge | 103 | |
104 | ; eax= volume -10000 - 0 for both channels |
||
105 | |||
106 | |||
168 | serge | 107 | set_master_vol: |
378 | serge | 108 | cmp eax, 0 |
109 | jl @F |
||
110 | xor eax, eax |
||
111 | jmp .set |
||
112 | @@: |
||
168 | serge | 113 | cmp eax, -9450 |
378 | serge | 114 | jg .set |
115 | mov eax, -9450 ;clamp into 6 bits |
||
116 | .set: |
||
117 | cdq |
||
118 | mov ebx, -150 |
||
119 | idiv ebx |
||
120 | mov ah, al |
||
121 | stdcall codec_write, dword CODEC_MASTER_VOL_REG |
||
168 | serge | 122 | xor eax, eax |
378 | serge | 123 | ret |
168 | serge | 124 | |
125 | |||
126 | proc get_master_vol stdcall, pvol:dword |
||
127 | |||
128 | |||
129 | and eax, 0x3F |
||
130 | imul eax, -150 |
||
378 | serge | 131 | mov ebx, [pvol] |
168 | serge | 132 | mov [ebx], eax |
133 | xor eax, eax |
||
378 | serge | 134 | ret |
168 | serge | 135 | endp |
136 | |||
137 | |||
138 | proc set_sample_rate stdcall, rate:dword |
||
139 | mov eax, [rate] |
||
140 | stdcall codec_write, dword CODEC_PCM_FRONT_DACRATE_REG |
||
141 | ret |
||
142 | endp |
||
143 | |||
144 | |||
145 | ac_unknown db 'unknown manufacturer',13,10,0 |
||
146 | ac_Realtek db 'Realtek Semiconductor',13,10,0 |
||
147 | ac_Analog db 'Analog Devices',13,10,0 |
||
148 | ac_CMedia db 'C-Media Electronics',13,10,0 |
||
149 | chip_unknown db 'unknown chip', 13,10,0 |
||
150 | |||
151 | |||
152 | CHIP_REALTEK equ 0x414C4700 |
||
153 | CHIP_CMEDIA equ 0x434D4900 |
||
154 | |||
155 | |||
156 | codecs dd CHIP_ANALOG, ac_Analog, chips_Analog |
||
157 | dd CHIP_CMEDIA, ac_CMedia, chips_CMedia |
||
158 | dd CHIP_REALTEK,ac_Realtek, chips_Realtek |
||
159 | dd 0 |
||
160 | |||
161 | |||
162 | chips_Analog dd 0x03, chip_AD1819 |
||
163 | dd 0x40, chip_AD1881 |
||
164 | dd 0x48, chip_AD1881A |
||
165 | dd 0x60, chip_AD1884 |
||
166 | dd 0x61, chip_AD1886 |
||
167 | dd 0x62, chip_AD1887 |
||
168 | dd 0x63, chip_AD1886A |
||
169 | dd 0x70, chip_AD1980 |
||
170 | dd 0x75, chip_AD1985 |
||
171 | dd 0 |
||
172 | |||
173 | |||
174 | dd 0x21, chip_ALC650D |
||
175 | dd 0x22, chip_ALC650E |
||
176 | dd 0x23, chip_ALC650F |
||
177 | dd 0x60, chip_ALC655 |
||
178 | dd 0x80, chip_ALC658 |
||
179 | dd 0x81, chip_ALC658D |
||
180 | dd 0x90, chip_ALC850 |
||
181 | dd 0 |
||
182 | |||
183 | |||
184 | dd 0x61, chip_CM9739 |
||
185 | dd 0x69, chip_CM9780 |
||
186 | dd 0x78, chip_CM9761 |
||
187 | dd 0x82, chip_CM9761 |
||
188 | dd 0x83, chip_CM9761 |
||
189 | dd 0 |
||
190 | |||
191 | |||
192 | ;Analog Devices |
||
193 | chip_AD1819 db 'AD1819 ',0dh,0ah,00h |
||
194 | chip_AD1881 db 'AD1881 ',0dh,0ah,00h |
||
195 | chip_AD1881A db 'AD1881A',0dh,0ah,00h |
||
196 | chip_AD1884 db 'AD1885 ',0dh,0ah,00h |
||
197 | chip_AD1885 db 'AD1885 ',0dh,0ah,00h |
||
198 | chip_AD1886 db 'AD1886 ',0dh,0ah,00h |
||
199 | chip_AD1886A db 'AD1886A',0dh,0ah,00h |
||
200 | chip_AD1887 db 'AD1887 ',0dh,0ah,00h |
||
201 | chip_AD1980 db 'AD1980 ',0dh,0ah,00h |
||
202 | chip_AD1985 db 'AD1985 ',0dh,0ah,00h |
||
203 | |||
204 | |||
205 | chip_ALC650 db 'ALC650 ',0dh,0ah,00h |
||
206 | chip_ALC650D db 'ALC650D',0dh,0ah,00h |
||
207 | chip_ALC650E db 'ALC650E',0dh,0ah,00h |
||
208 | chip_ALC650F db 'ALC650F',0dh,0ah,00h |
||
209 | chip_ALC655 db 'ALC655 ',0dh,0ah,00h |
||
210 | chip_ALC658 db 'ALC658 ',0dh,0ah,00h |
||
211 | chip_ALC658D db 'ALC658D',0dh,0ah,00h |
||
212 | chip_ALC850 db 'ALC850 ',0dh,0ah,00h |
||
213 | |||
214 | |||
215 | chip_CM9738 db 'CMI9738', 0dh,0ah,0 |
||
216 | chip_CM9739 db 'CMI9739', 0dh,0ah,0 |
||
217 | chip_CM9780 db 'CMI9780', 0dh,0ah,0 |
||
218 | chip_CM9761 db 'CMI9761', 0dh,0ah,0 |
||
219 |