Comment 56 for bug 590756

Revision history for this message
Matthew Damiano (damiano) wrote :

For my system, I got kanyo's method to work automatically on every boot by reverse engineering the ioctl calls that come from HDA Analyzer when you click on the widgets to adjust the settings. Here is my pyhon script:

#!/usr/bin/python
# Matt Damiano's script based on hda-analyzer
# to automatically enable onboard mic on Lenovo G560
#

import os
import struct
from fcntl import ioctl

def main():
    fd = get_fd_for_device(0, 1)
    modify_settings(fd)

def __ioctl_val(val):
    # copied directly from hda_codec.py
    # workaround for OverFlow bug in python 2.4
    if val & 0x80000000:
        return -((val^0xffffffff)+1)
    return val

IOCTL_INFO = __ioctl_val(0x80dc4801)
IOCTL_VERB_WRITE = __ioctl_val(0xc0084811)

def modify_settings(fd):
    # set active connection for Node [0x14] AUD_IN to Audio Selector [0x18]
    set_active_connection_verb = 336003329
    unmute_val2_verb = 335765760
    unmute_val3_verb = 335761664
    boost_val2_volume_verb = 335765840
    boost_val3_volume_verb = 335761744

    ioctl(fd, IOCTL_VERB_WRITE, struct.pack('II', set_active_connection_verb, 0))
    ioctl(fd, IOCTL_VERB_WRITE, struct.pack('II', unmute_val2_verb, 0))
    ioctl(fd, IOCTL_VERB_WRITE, struct.pack('II', unmute_val3_verb, 0))
    ioctl(fd, IOCTL_VERB_WRITE, struct.pack('II', boost_val2_volume_verb, 0))
    ioctl(fd, IOCTL_VERB_WRITE, struct.pack('II', boost_val3_volume_verb, 0))

    return

def get_fd_for_device(card, device):
    fd = os.open("/dev/snd/hwC%sD%s" % (card, device), os.O_RDWR)

    ## just to prove his is the right file descriptor...
    info = struct.pack('Ii64s80si64s', 0, 0, '', '', 0, '')
    result = ioctl(fd, IOCTL_INFO, info)
    name = struct.unpack('Ii64s80si64s', result)[3]
    print name

    return fd

if __name__ == "__main__":
    main()