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