On 10/2/18 9:56 PM, Johannes Lundberg wrote:


On Mon, Oct 1, 2018 at 10:12 PM Jakob Alvermark <ja...@alvermark.net <mailto:ja...@alvermark.net>> wrote:

    On 10/1/18 10:56 PM, Johannes Lundberg wrote:
    > On Mon, Oct 1, 2018 at 8:37 PM Jakob Alvermark
    <ja...@alvermark.net <mailto:ja...@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)
    @@ -5034,11 +5034,13 @@
              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

_______________________________________________
freebsd-current@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to