Re: Sound issues with Dell Latitude 7490 (kabylake)

From: Jakob Alvermark <jakob_at_alvermark.net>
Date: Tue, 2 Oct 2018 22:32:31 +0200
On 10/2/18 9:56 PM, Johannes Lundberg wrote:
>
>
> On Mon, Oct 1, 2018 at 10:12 PM Jakob Alvermark <jakob_at_alvermark.net 
> <mailto:jakob_at_alvermark.net>> wrote:
>
>     On 10/1/18 10:56 PM, Johannes Lundberg wrote:
>     > On Mon, Oct 1, 2018 at 8:37 PM Jakob Alvermark
>     <jakob_at_alvermark.net <mailto:jakob_at_alvermark.net>> wrote:
>     >
>     >> On 10/1/18 5:57 PM, Johannes Lundberg wrote:
>     >>> Hi
>     >>>
>     >>> While sound work out of the box (with headphone switching) on
>     the 1-2
>     >> year
>     >>> older Latitude 7270, it does not on my new machine.
>     >>>
>     >>> The internal speaker works fine. If I plug in external
>     speakers in the
>     >>> headphone jack, sound still goes to the internal speaker while
>     a very
>     >> load
>     >>> buzz comes from the external speakers.
>     >>>
>     >>> Do we have a solution for this?
>     >>>
>     >>> # cat /dev/sndstat
>     >>> Installed devices:
>     >>> pcm0: <Realtek ALC256 (Internal Analog)> (play/rec) default
>     >>> pcm1: <Realtek ALC256 (Front Analog Headphones)> (play)
>     >>> pcm2: <Intel Kabylake (HDMI/DP 8ch)> (play)
>     >>> No devices installed from userspace.
>     >>>
>     >>> # sysctl hw.snd
>     >>> hw.snd.maxautovchans: 16
>     >>> hw.snd.default_unit: 0
>     >>> hw.snd.version: 2009061500/amd64
>     >>> hw.snd.default_auto: 1
>     >>> hw.snd.verbose: 0
>     >>> hw.snd.vpc_mixer_bypass: 1
>     >>> hw.snd.feeder_rate_quality: 1
>     >>> hw.snd.feeder_rate_round: 25
>     >>> hw.snd.feeder_rate_max: 2016000
>     >>> hw.snd.feeder_rate_min: 1
>     >>> hw.snd.feeder_rate_polyphase_max: 183040
>     >>> hw.snd.feeder_rate_presets: 100:8:0.85 100:36:0.92 100:164:0.97
>     >>> hw.snd.feeder_eq_exact_rate: 0
>     >>> hw.snd.feeder_eq_presets:
>     >>>
>     PEQ:16000,0.2500,62,0.2500:-9,9,1.0:44100,48000,88200,96000,176400,192000
>     >>> hw.snd.basename_clone: 1
>     >>> hw.snd.compat_linux_mmap: 0
>     >>> hw.snd.syncdelay: -1
>     >>> hw.snd.usefrags: 0
>     >>> hw.snd.vpc_reset: 0
>     >>> hw.snd.vpc_0db: 45
>     >>> hw.snd.vpc_autoreset: 1
>     >>> hw.snd.timeout: 5
>     >>> hw.snd.latency_profile: 1
>     >>> hw.snd.latency: 5
>     >>> hw.snd.report_soft_matrix: 1
>     >>> hw.snd.report_soft_formats: 1
>     >>>
>     >>> # sysctl dev.pcm
>     >>> dev.pcm.2.bitperfect: 0
>     >>> dev.pcm.2.buffersize: 65536
>     >>> dev.pcm.2.play.vchanformat: s16le:2.0
>     >>> dev.pcm.2.play.vchanrate: 48000
>     >>> dev.pcm.2.play.vchanmode: passthrough
>     >>> dev.pcm.2.play.vchans: 1
>     >>> dev.pcm.2.play.32bit: 24
>     >>> dev.pcm.2.%parent: hdaa1
>     >>> dev.pcm.2.%pnpinfo:
>     >>> dev.pcm.2.%location: nid=3
>     >>> dev.pcm.2.%driver: pcm
>     >>> dev.pcm.2.%desc: Intel Kabylake (HDMI/DP 8ch)
>     >>> dev.pcm.1.bitperfect: 0
>     >>> dev.pcm.1.buffersize: 65536
>     >>> dev.pcm.1.play.vchanformat: s16le:2.0
>     >>> dev.pcm.1.play.vchanrate: 48000
>     >>> dev.pcm.1.play.vchanmode: fixed
>     >>> dev.pcm.1.play.vchans: 1
>     >>> dev.pcm.1.play.32bit: 24
>     >>> dev.pcm.1.%parent: hdaa0
>     >>> dev.pcm.1.%pnpinfo:
>     >>> dev.pcm.1.%location: nid=33
>     >>> dev.pcm.1.%driver: pcm
>     >>> dev.pcm.1.%desc: Realtek ALC256 (Front Analog Headphones)
>     >>> dev.pcm.0.bitperfect: 0
>     >>> dev.pcm.0.buffersize: 65536
>     >>> dev.pcm.0.rec.vchanformat: s16le:2.0
>     >>> dev.pcm.0.rec.vchanrate: 48000
>     >>> dev.pcm.0.rec.vchanmode: fixed
>     >>> dev.pcm.0.rec.vchans: 1
>     >>> dev.pcm.0.rec.autosrc: 2
>     >>> dev.pcm.0.rec.32bit: 24
>     >>> dev.pcm.0.play.vchanformat: s16le:2.0
>     >>> dev.pcm.0.play.vchanrate: 48000
>     >>> dev.pcm.0.play.vchanmode: fixed
>     >>> dev.pcm.0.play.vchans: 2
>     >>> dev.pcm.0.play.32bit: 24
>     >>> dev.pcm.0.%parent: hdaa0
>     >>> dev.pcm.0.%pnpinfo:
>     >>> dev.pcm.0.%location: nid=20,18
>     >>> dev.pcm.0.%driver: pcm
>     >>> dev.pcm.0.%desc: Realtek ALC256 (Internal Analog)
>     >>> dev.pcm.%parent:
>     >>
>     >> You could try
>     >>
>     >> sysctl dev.hdaa.0.nid33_config="as=1 seq=15 device=Headphones"
>     >>
>     >> sysctl dev.hdaa.0.reconfig=1
>     >>
>     >>
>     >> It should result in you having only one pcm device for the two
>     outputs
>     >> and it should switch from
>     >>
>     >> internal to external when you plug in the external speakers and
>     vice versa.
>     >>
>     >> To make it permanent put 'hint.hdaa.0.nid33.config="as=1 seq=15
>     >> device=Headphones"' in your loader.conf
>     >>
>     >>
>     >> The loud buzz is a bit worrying, it could be related to the
>     problem I
>     >> have been having, where I got strange sound
>     >>
>     >> when using headphones on my laptop. I have worked around it by
>     patching
>     >> the sound driver, I have kept my local
>     >>
>     >> patch for years.
>     >>
>     >>
>     > With that hint it does turn off the internal speakers but I can hear
>     > nothing in my headphones. Turning the volume to 100% I can hear the
>     > playback in my internal speakers at very low volume (with headphones
>     > connected).
>     > The headphones has no buzzing sound, that is only my external
>     speakers and
>     > they only act like that when connect to this laptop (kind of
>     like the buzz
>     > noise you get when the connector touches something (ground?))...
>
>
>     Do the headphones work with this patch?
>
>     Index: sys/dev/sound/pci/hda/hdaa.c
>     ===================================================================
>     --- sys/dev/sound/pci/hda/hdaa.c    (revision 339076)
>     +++ sys/dev/sound/pci/hda/hdaa.c    (working copy)
>     _at__at_ -5034,11 +5034,13 _at__at_
>               pincap = w->wclass.pin.cap;
>
>               /* Disable everything. */
>     +        /*
>               w->wclass.pin.ctrl &= ~(
>                   HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE |
>                   HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE |
>                   HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE |
>     HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE_MASK);
>     +        */
>
>               if (w->enable == 0) {
>                   /* Pin is unused so left it disabled. */
>
>
>
> YES!!!!
>
> With this patch and this in loader.conf
> hint.hdaa.0.nid33.config="as=1 seq=15 device=Headphones"
>
> I got it switching automatically between internal and headphones and 
> no more buzzing sound in my external speakers when they are connected 
> to the headphone jack.


Ok, great! So my suspicion was right.

I had a similar problem on my laptop, where the audio in the headphones 
was really strange, like the ground pin was not connected somehow.

It worked fine running Windows.

My understanding is this:

1. The BIOS/firmware is supposed to set up the parameters correctly when 
you boot the machine.

2. When snd_hda starts, it clears some of the settings, for reasons I 
don't understand.

3. hdaa_patches.c adds some specific settings for particular hardware.


What I did was commenting out what was happening in (2) above. That's 
what the patch does. My headphones worked!

So, your headphone pins are correctly set up by your firmware, and 
snd_hda destroys that.

You could compare the output of 'sysctl dev.hdaa.0' with and without the 
patch and see what changed, that would be interesting.


Jakob
Received on Tue Oct 02 2018 - 18:32:34 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:18 UTC