Date: Thu, 26 Jan 2012 12:09:04 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r230585 - head/sys/dev/sound/pci/hda Message-ID: <201201261209.q0QC94Zv087152@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Thu Jan 26 12:09:04 2012 New Revision: 230585 URL: http://svn.freebsd.org/changeset/base/230585 Log: Press some more info into the PCM device name: - add "+HP" in case of headphones redirection; - add device type for analog devices, if all pins have the same. As result now it may look like "Analog 5.1+HP/2.0" or "Front Analog Mic". I hope it will be more useful than long and confusing. MFC after: 2 months Sponsored by: iXsystems, Inc. Modified: head/sys/dev/sound/pci/hda/hdaa.c Modified: head/sys/dev/sound/pci/hda/hdaa.c ============================================================================== --- head/sys/dev/sound/pci/hda/hdaa.c Thu Jan 26 12:04:19 2012 (r230584) +++ head/sys/dev/sound/pci/hda/hdaa.c Thu Jan 26 12:09:04 2012 (r230585) @@ -6485,9 +6485,12 @@ hdaa_chan_formula(struct hdaa_devinfo *d c = devinfo->chans[as->chans[0]].channels; if (c == 1) snprintf(buf, buflen, "mono"); - else if (c == 2) - buf[0] = 0; - else if (as->pinset == 0x0003) + else if (c == 2) { + if (as->hpredir < 0) + buf[0] = 0; + else + snprintf(buf, buflen, "2.0"); + } else if (as->pinset == 0x0003) snprintf(buf, buflen, "3.1"); else if (as->pinset == 0x0005 || as->pinset == 0x0011) snprintf(buf, buflen, "4.0"); @@ -6497,6 +6500,32 @@ hdaa_chan_formula(struct hdaa_devinfo *d snprintf(buf, buflen, "7.1"); else snprintf(buf, buflen, "%dch", c); + if (as->hpredir >= 0) + strlcat(buf, "+HP", buflen); +} + +static int +hdaa_chan_type(struct hdaa_devinfo *devinfo, int asid) +{ + struct hdaa_audio_as *as; + struct hdaa_widget *w; + int i, t = -1, t1; + + as = &devinfo->as[asid]; + for (i = 0; i < 16; i++) { + w = hdaa_widget_get(devinfo, as->pins[i]); + if (w == NULL || w->enable == 0 || w->type != + HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) + continue; + t1 = HDA_CONFIG_DEFAULTCONF_DEVICE(w->wclass.pin.config); + if (t == -1) + t = t1; + else if (t != t1) { + t = -2; + break; + } + } + return (t); } static int @@ -6537,7 +6566,7 @@ hdaa_pcm_probe(device_t dev) struct hdaa_devinfo *devinfo = pdevinfo->devinfo; char chans1[8], chans2[8]; char buf[128]; - int loc1, loc2; + int loc1, loc2, t1, t2; if (pdevinfo->playas >= 0) loc1 = devinfo->as[pdevinfo->playas].location; @@ -6553,12 +6582,17 @@ hdaa_pcm_probe(device_t dev) loc1 = -2; chans1[0] = 0; chans2[0] = 0; - if (pdevinfo->playas >= 0) + t1 = t2 = -1; + if (pdevinfo->playas >= 0) { hdaa_chan_formula(devinfo, pdevinfo->playas, chans1, sizeof(chans1)); - if (pdevinfo->recas >= 0) + t1 = hdaa_chan_type(devinfo, pdevinfo->playas); + } + if (pdevinfo->recas >= 0) { hdaa_chan_formula(devinfo, pdevinfo->recas, chans2, sizeof(chans2)); + t2 = hdaa_chan_type(devinfo, pdevinfo->recas); + } if (chans1[0] != 0 || chans2[0] != 0) { if (chans1[0] == 0 && pdevinfo->playas >= 0) snprintf(chans1, sizeof(chans1), "2.0"); @@ -6567,7 +6601,15 @@ hdaa_pcm_probe(device_t dev) if (strcmp(chans1, chans2) == 0) chans2[0] = 0; } - snprintf(buf, sizeof(buf), "%s PCM (%s%s%s%s%s%s%s)", + if (t1 == -1) + t1 = t2; + else if (t2 == -1) + t2 = t1; + if (t1 != t2) + t1 = -2; + if (pdevinfo->digital) + t1 = -2; + snprintf(buf, sizeof(buf), "%s PCM (%s%s%s%s%s%s%s%s%s)", device_get_desc(device_get_parent(device_get_parent(dev))), loc1 >= 0 ? HDA_LOCS[loc1] : "", loc1 >= 0 ? " " : "", (pdevinfo->digital == 0x7)?"HDMI/DP": @@ -6575,7 +6617,8 @@ hdaa_pcm_probe(device_t dev) ((pdevinfo->digital == 0x3)?"HDMI": ((pdevinfo->digital)?"Digital":"Analog"))), chans1[0] ? " " : "", chans1, - chans2[0] ? "/" : "", chans2); + chans2[0] ? "/" : "", chans2, + t1 >= 0 ? " " : "", t1 >= 0 ? HDA_DEVS[t1] : ""); device_set_desc_copy(dev, buf); return (BUS_PROBE_SPECIFIC); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201201261209.q0QC94Zv087152>