Subversion Repositories Kolibri OS

Rev

Rev 425 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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