Subversion Repositories Kolibri OS

Rev

Rev 378 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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