Subversion Repositories Kolibri OS

Rev

Rev 387 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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