[alsa-devel] 2 speakers are assigned to the same DAC, this can't support 4.0/2.1 channles
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are assigned 1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it, the map_single() can successfully assign the each dac to the 2 speakers respectively. But on that HP machine, the speaker has multiple connections for dac, the map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at http://pastebin.ubuntu.com/11667947/ The alsa-info.txt for that Dell machine is at http://pastebin.ubuntu.com/11667982/
To fix this problem, I can use the quirk in the driver to make the speaker have only one connection for dac or do some change in the hda_generic.c like below, in your opinion, which one is better or probably you have a different idea to fix this problem?
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ac0db16..8194ff1 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -1363,6 +1363,7 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs, dac = try_dac(codec, get_primary_out(codec, i), pin); if (!dac) dac = try_dac(codec, dacs[0], pin); if (!dac) dac = try_dac(codec, get_primary_out(codec, i), pin); if (dac) { @@ -1762,6 +1763,12 @@ static int fill_and_eval_dacs(struct hda_codec *codec, if (err < 0) return err; badness += err; + /* if there are 2 speakers and both of them are assigned to the same dac, + we need to increase the badness for this situation, because in this situation + the 2 speakers can't work together to support 4.0/2.1 channels */ + if (cfg->speaker_outs == 2 && err < spec->extra_out_badness->no_dac && + spec->multiout.extra_out_nid[1] == 0) + badness += spec->extra_out_badness->no_dac; } if (!spec->no_multi_io && cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index bdcda6a..717259c 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -2764,6 +2764,8 @@ static const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = { "HP bNB13", STAC_HP_BNB13_EQ), SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x190e, "HP ENVY TS", STAC_HP_ENVY_TS_BASS), + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1967, + "HP ENVY TS", STAC_HP_ENVY_TS_BASS), SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1940, "HP bNB13", STAC_HP_BNB13_EQ), SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1941,
2015-6-9 下午5:39 於 "hwang4" hui.wang@canonical.com 寫道:
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are
assigned
1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it, the map_single() can successfully assign the each dac to the 2 speakers
respectively.
But on that HP machine, the speaker has multiple connections for dac, the map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at
http://pastebin.ubuntu.com/11667947/
Refer to 92HD91, you don't need 4 channel when there is band pass filter for the subwoofer at the mono pin
2.2. Mono Output The Mono Out port source selection, power state, and mute characteristics are all independently controlled by the mono output port controls. EQ does not apply to this path. An internal 2nd order band-pass filter is provided to restrict the output frequencies when using mono out to drive an exter- nal amplified sub-woofer
The alsa-info.txt for that Dell machine is at
http://pastebin.ubuntu.com/11667982/
The subwoofer is also at mono pin complex, are there any low pass filter for the subwoofer or vendor coeff need to be set ?
To fix this problem, I can use the quirk in the driver to make the
speaker have
only one connection for dac or do some change in the hda_generic.c like
below, in
your opinion, which one is better or probably you have a different idea
to fix this problem?
On 06/09/2015 07:50 PM, Raymond Yau wrote:
2015-6-9 下午5:39 於 "hwang4" hui.wang@canonical.com 寫道:
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are
assigned
1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it, the map_single() can successfully assign the each dac to the 2 speakers
respectively.
But on that HP machine, the speaker has multiple connections for dac, the map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at
http://pastebin.ubuntu.com/11667947/
Refer to 92HD91, you don't need 4 channel when there is band pass filter for the subwoofer at the mono pin
Yes, you are right.
2.2. Mono Output The Mono Out port source selection, power state, and mute characteristics are all independently controlled by the mono output port controls. EQ does not apply to this path. An internal 2nd order band-pass filter is provided to restrict the output frequencies when using mono out to drive an exter- nal amplified sub-woofer
Where did you find this text? Does it mean there is a hardware low frequency pass filter inside the codec?
The alsa-info.txt for that Dell machine is at
http://pastebin.ubuntu.com/11667982/
The subwoofer is also at mono pin complex, are there any low pass filter for the subwoofer or vendor coeff need to be set ?
I don't know it, I guess there is no hardware filter, it will work with the software low pass filter in the pulseaudio.
To fix this problem, I can use the quirk in the driver to make the
speaker have
only one connection for dac or do some change in the hda_generic.c like
below, in
your opinion, which one is better or probably you have a different idea
to fix this problem? _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are
assigned
1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it, the map_single() can successfully assign the each dac to the 2 speakers
respectively.
But on that HP machine, the speaker has multiple connections for dac,
the
map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at
http://pastebin.ubuntu.com/11667947/
Refer to 92HD91, you don't need 4 channel when there is band pass filter for the subwoofer at the mono pin
Yes, you are right.
2.2. Mono Output The Mono Out port source selection, power state, and mute characteristics are all independently controlled by the mono output port controls. EQ does not apply to this path. An internal 2nd order band-pass filter is provided to restrict the output frequencies when using mono out to drive an exter- nal amplified sub-woofer
Where did you find this text? Does it mean there is a hardware low
frequency pass filter inside the codec?
http://www.temposemi.com/products/pclaptop-hd/92hd91/
2.3. Mono output Band-Pass Filter For many applications, the primary speakers are incapable of reproducing low frequency audio. Therefore it is desirable to implement a woofer or sub-woofer speaker. The mono output is ideal for this task. However, the frequency response should be restricted to prevent interference with the primary speakers. Typically an external filter, known as a cross-over filter, is used. The mono processing path includes a band-pass filter with programmable high and low cut-off frequencies to eliminate the need for an external filter.
2.3.1. Mixer Filter Description The band-pass filter is derived from the common biquadratic filter and provides a 12dB/octave roll-off. The filter may be programmed for a -3dB lower band edge of: 63Hz, 80Hz, 100Hz, 120Hz, 150Hz, 200Hz, 315Hz, or 400Hz.
The filter may be programmed for a -3dB upper band edge of: 150Hz, 200Hz, 250Hz, 315Hz, 400Hz, 500Hz, 630Hz, or 800Hz.
The band-pass filter is enabled by default with a cut-off frequencies at 120Hz and 250Hz. The filter may be bypassed using the associated verb (processing state verb
On 2015年06月10日 09:30, Raymond Yau wrote:
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are
assigned
1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it, the map_single() can successfully assign the each dac to the 2 speakers
respectively.
But on that HP machine, the speaker has multiple connections for dac,
the
map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at
http://pastebin.ubuntu.com/11667947/
Refer to 92HD91, you don't need 4 channel when there is band pass filter for the subwoofer at the mono pin
Yes, you are right.
2.2. Mono Output The Mono Out port source selection, power state, and mute characteristics are all independently controlled by the mono output port controls. EQ does not apply to this path. An internal 2nd order band-pass filter is provided to restrict the output frequencies when using mono out to drive an exter- nal amplified sub-woofer
Where did you find this text? Does it mean there is a hardware low
frequency pass filter inside the codec?
http://www.temposemi.com/products/pclaptop-hd/92hd91/
2.3. Mono output Band-Pass Filter For many applications, the primary speakers are incapable of reproducing low frequency audio. Therefore it is desirable to implement a woofer or sub-woofer speaker. The mono output is ideal for this task. However, the frequency response should be restricted to prevent interference with the primary speakers. Typically an external filter, known as a cross-over filter, is used. The mono processing path includes a band-pass filter with programmable high and low cut-off frequencies to eliminate the need for an external filter.
2.3.1. Mixer Filter Description The band-pass filter is derived from the common biquadratic filter and provides a 12dB/octave roll-off. The filter may be programmed for a -3dB lower band edge of: 63Hz, 80Hz, 100Hz, 120Hz, 150Hz, 200Hz, 315Hz, or 400Hz.
The filter may be programmed for a -3dB upper band edge of: 150Hz, 200Hz, 250Hz, 315Hz, 400Hz, 500Hz, 630Hz, or 800Hz.
The band-pass filter is enabled by default with a cut-off frequencies at 120Hz and 250Hz. The filter may be bypassed using the associated verb (processing state verb
Thanks very much, very useful information.
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are
assigned
1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it,
the
map_single() can successfully assign the each dac to the 2 speakers
respectively.
But on that HP machine, the speaker has multiple connections for dac,
the
map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at
http://pastebin.ubuntu.com/11667947/
Refer to 92HD91, you don't need 4 channel when there is band pass
filter
for the subwoofer at the mono pin
Yes, you are right.
2.2. Mono Output The Mono Out port source selection, power state, and mute
characteristics
are all independently controlled by the mono output port controls. EQ does not apply to this path. An internal 2nd order band-pass filter is provided to restrict
the
output frequencies when using mono out to drive an exter- nal amplified sub-woofer
Where did you find this text? Does it mean there is a hardware low
frequency pass filter inside the codec?
http://www.temposemi.com/products/pclaptop-hd/92hd91/
2.3. Mono output Band-Pass Filter For many applications, the primary speakers are incapable of reproducing low frequency audio. Therefore it is desirable to implement a woofer or sub-woofer speaker. The mono output is ideal for this task. However, the frequency response should be restricted to prevent interference with the primary speakers. Typically an external filter, known as a cross-over filter, is used. The mono processing path includes a band-pass filter
with
programmable high and low cut-off frequencies to eliminate the need for
an
external filter.
2.3.1. Mixer Filter Description The band-pass filter is derived from the common biquadratic filter and provides a 12dB/octave roll-off. The filter may be programmed for a -3dB lower band edge of: 63Hz, 80Hz, 100Hz,
120Hz,
150Hz, 200Hz, 315Hz, or 400Hz.
The filter may be programmed for a -3dB upper band edge of: 150Hz, 200Hz, 250Hz, 315Hz, 400Hz, 500Hz, 630Hz, or 800Hz.
The band-pass filter is enabled by default with a cut-off frequencies at 120Hz and 250Hz. The filter may be bypassed using the associated verb (processing state verb
Thanks very much, very useful information.
Do your codec revision support this mono out volume ?
7.4.31.AFG (NID = 01h): DAC3OutAmp (Mono Out Volume)
How do you assign the two volume control to headphone, speaker and subwoofet ?
On 06/11/2015 09:15 AM, Raymond Yau wrote:
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are
assigned
1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it,
the
map_single() can successfully assign the each dac to the 2 speakers
respectively.
But on that HP machine, the speaker has multiple connections for dac,
the
map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at
http://pastebin.ubuntu.com/11667947/
Refer to 92HD91, you don't need 4 channel when there is band pass
filter
for the subwoofer at the mono pin
Yes, you are right.
2.2. Mono Output The Mono Out port source selection, power state, and mute
characteristics
are all independently controlled by the mono output port controls. EQ does not apply to this path. An internal 2nd order band-pass filter is provided to restrict
the
output frequencies when using mono out to drive an exter- nal amplified sub-woofer
Where did you find this text? Does it mean there is a hardware low
frequency pass filter inside the codec?
http://www.temposemi.com/products/pclaptop-hd/92hd91/
2.3. Mono output Band-Pass Filter For many applications, the primary speakers are incapable of reproducing low frequency audio. Therefore it is desirable to implement a woofer or sub-woofer speaker. The mono output is ideal for this task. However, the frequency response should be restricted to prevent interference with the primary speakers. Typically an external filter, known as a cross-over filter, is used. The mono processing path includes a band-pass filter
with
programmable high and low cut-off frequencies to eliminate the need for
an
external filter.
2.3.1. Mixer Filter Description The band-pass filter is derived from the common biquadratic filter and provides a 12dB/octave roll-off. The filter may be programmed for a -3dB lower band edge of: 63Hz, 80Hz, 100Hz,
120Hz,
150Hz, 200Hz, 315Hz, or 400Hz.
The filter may be programmed for a -3dB upper band edge of: 150Hz, 200Hz, 250Hz, 315Hz, 400Hz, 500Hz, 630Hz, or 800Hz.
The band-pass filter is enabled by default with a cut-off frequencies at 120Hz and 250Hz. The filter may be bypassed using the associated verb (processing state verb
Thanks very much, very useful information.
Do your codec revision support this mono out volume ?
7.4.31.AFG (NID = 01h): DAC3OutAmp (Mono Out Volume)
I looks like the current driver does not use this to control the volume.
How do you assign the two volume control to headphone, speaker and subwoofet ?
speaker and headphone are assigned to DAC0 (nid: 0x13), they use the DAC amplifier to control the volume.
subwoofer speaker is assigned to DAC1 (nid: 0x14), it use the DAC amplifier to contorl the volume.
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> > I am trying to enable the subwoofer speaker on a HP laptop, on this > machine, there are two speakers and one headphone, but the BIOS verb > only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need > to use quirk in the kernel driver to configure the second speaker > (subwoofer speaker, nid 0x10). Under current alsa driver, the > headphone will be assigned a dac (nid 0x13) and the 2 speakers will > be assigned a dac (nid 0x14), this assignment is not good since 2 > speakers share the same dac, this means 2 speakers can't work > at the same time to support 4.0/2.1 channels. > > On another Dell machine with realtek codec, there are also 2
speakers,
> 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone
are
assigned > > 1 dac, and the other speaker is assigned another dac, so there is no > problem for this machine to support 4.0/2.1 channels. > > Through debugging, I found on Dell machine, the speaker nid only has > one connection to dac (hardwired), so when driver assign dac to it,
the
> > map_single() can successfully assign the each dac to the 2 speakers
respectively. > > But on that HP machine, the speaker has multiple connections for
dac,
the
> > map_single() can't work for this machine. > > > The alsa-info.txt for that HP machine is at
http://pastebin.ubuntu.com/11667947/
Refer to 92HD91, you don't need 4 channel when there is band pass
filter
for the subwoofer at the mono pin
Yes, you are right.
2.2. Mono Output The Mono Out port source selection, power state, and mute
characteristics
are all independently controlled by the mono output port controls. EQ does not apply to
this
path. An internal 2nd order band-pass filter is provided to restrict
the
output frequencies when using mono out to drive an exter- nal amplified sub-woofer
Where did you find this text? Does it mean there is a hardware low
frequency pass filter inside the codec?
http://www.temposemi.com/products/pclaptop-hd/92hd91/
2.3. Mono output Band-Pass Filter For many applications, the primary speakers are incapable of
reproducing
low frequency audio. Therefore it is desirable to implement a woofer or sub-woofer speaker. The mono output is ideal for this task. However,
the
frequency response should be restricted to prevent interference with
the
primary speakers. Typically an external filter, known as a cross-over filter, is used. The mono processing path includes a band-pass filter
with
programmable high and low cut-off frequencies to eliminate the need for
an
external filter.
2.3.1. Mixer Filter Description The band-pass filter is derived from
the
common biquadratic filter and provides a 12dB/octave roll-off. The
filter
may be programmed for a -3dB lower band edge of: 63Hz, 80Hz, 100Hz,
120Hz,
150Hz, 200Hz, 315Hz, or 400Hz.
The filter may be programmed for a -3dB upper band edge of: 150Hz,
200Hz,
250Hz, 315Hz, 400Hz, 500Hz, 630Hz, or 800Hz.
The band-pass filter is enabled by default with a cut-off frequencies
at
120Hz and 250Hz. The filter may be bypassed using the associated verb (processing state verb
Thanks very much, very useful information.
Do your codec revision support this mono out volume ?
7.4.31.AFG (NID = 01h): DAC3OutAmp (Mono Out Volume)
I looks like the current driver does not use this to control the volume.
How do you assign the two volume control to headphone, speaker and subwoofet ?
speaker and headphone are assigned to DAC0 (nid: 0x13), they use the DAC
amplifier to control the volume.
subwoofer speaker is assigned to DAC1 (nid: 0x14), it use the DAC
amplifier to contorl the volume.
Do pulseaudio like this config since there is no mute switch at pin complex of idt codecs and no headphone playback volume/switch?
After applied your patch
Front playback volume/switch are shared by headphone and speaker Base speaker playback volume/switch
But the other 4 channels hda codecs vt1802 have speaker playback switch and subwoofer playback switch
http://git.kernel.org/cgit/linux/kernel/git/tiwai/hda-emu.git/tree/codecs/vt...
On 06/11/2015 03:37 PM, Raymond Yau wrote:
>> I am trying to enable the subwoofer speaker on a HP laptop, on this >> machine, there are two speakers and one headphone, but the BIOS verb >> only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need >> to use quirk in the kernel driver to configure the second speaker >> (subwoofer speaker, nid 0x10). Under current alsa driver, the >> headphone will be assigned a dac (nid 0x13) and the 2 speakers will >> be assigned a dac (nid 0x14), this assignment is not good since 2 >> speakers share the same dac, this means 2 speakers can't work >> at the same time to support 4.0/2.1 channels. >> >> On another Dell machine with realtek codec, there are also 2
speakers,
>> 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone
are
> assigned >> 1 dac, and the other speaker is assigned another dac, so there is no >> problem for this machine to support 4.0/2.1 channels. >> >> Through debugging, I found on Dell machine, the speaker nid only has >> one connection to dac (hardwired), so when driver assign dac to it,
the
>> map_single() can successfully assign the each dac to the 2 speakers > respectively. >> But on that HP machine, the speaker has multiple connections for
dac,
the
>> map_single() can't work for this machine. >> >> >> The alsa-info.txt for that HP machine is at > http://pastebin.ubuntu.com/11667947/ > > Refer to 92HD91, you don't need 4 channel when there is band pass
filter
> for the subwoofer at the mono pin Yes, you are right.
> 2.2. Mono Output > The Mono Out port source selection, power state, and mute
characteristics
> are all independently > controlled by the mono output port controls. EQ does not apply to
this
> path. An internal 2nd order band-pass filter is provided to restrict
the
> output frequencies when using mono out to drive an exter- > nal amplified sub-woofer Where did you find this text? Does it mean there is a hardware low
frequency pass filter inside the codec?
http://www.temposemi.com/products/pclaptop-hd/92hd91/
2.3. Mono output Band-Pass Filter For many applications, the primary speakers are incapable of
reproducing
low frequency audio. Therefore it is desirable to implement a woofer or sub-woofer speaker. The mono output is ideal for this task. However,
the
frequency response should be restricted to prevent interference with
the
primary speakers. Typically an external filter, known as a cross-over filter, is used. The mono processing path includes a band-pass filter
with
programmable high and low cut-off frequencies to eliminate the need for
an
external filter.
2.3.1. Mixer Filter Description The band-pass filter is derived from
the
common biquadratic filter and provides a 12dB/octave roll-off. The
filter
may be programmed for a -3dB lower band edge of: 63Hz, 80Hz, 100Hz,
120Hz,
150Hz, 200Hz, 315Hz, or 400Hz.
The filter may be programmed for a -3dB upper band edge of: 150Hz,
200Hz,
250Hz, 315Hz, 400Hz, 500Hz, 630Hz, or 800Hz.
The band-pass filter is enabled by default with a cut-off frequencies
at
120Hz and 250Hz. The filter may be bypassed using the associated verb (processing state verb
Thanks very much, very useful information.
Do your codec revision support this mono out volume ?
7.4.31.AFG (NID = 01h): DAC3OutAmp (Mono Out Volume)
I looks like the current driver does not use this to control the volume.
How do you assign the two volume control to headphone, speaker and subwoofet ?
speaker and headphone are assigned to DAC0 (nid: 0x13), they use the DAC
amplifier to control the volume.
subwoofer speaker is assigned to DAC1 (nid: 0x14), it use the DAC
amplifier to contorl the volume. Do pulseaudio like this config since there is no mute switch at pin complex of idt codecs and no headphone playback volume/switch?
After applied your patch
Front playback volume/switch are shared by headphone and speaker Base speaker playback volume/switch
But the other 4 channels hda codecs vt1802 have speaker playback switch and subwoofer playback switch
Even without this patch, the base speaker and headphone already shared the same DAC and use single "Front Playback Volume" to control their volume, I did not see any problem from the pulseaudio/desktop so far.
http://pastebin.ubuntu.com/11667982/
About the sharing the switch between headphone and base speaker, this is a new situation, but I did not see obvious problem from pusleaudio/desktop as well.
http://git.kernel.org/cgit/linux/kernel/git/tiwai/hda-emu.git/tree/codecs/vt... _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
2015-6-11 下午4:33 於 "Hui Wang" hui.wang@canonical.com 寫道:
On 06/11/2015 03:37 PM, Raymond Yau wrote:
>>> >>> I am trying to enable the subwoofer speaker on a HP laptop, on
this
>>> machine, there are two speakers and one headphone, but the BIOS
verb
>>> only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I
need
>>> to use quirk in the kernel driver to configure the second speaker >>> (subwoofer speaker, nid 0x10). Under current alsa driver, the >>> headphone will be assigned a dac (nid 0x13) and the 2 speakers
will
>>> be assigned a dac (nid 0x14), this assignment is not good since 2 >>> speakers share the same dac, this means 2 speakers can't work >>> at the same time to support 4.0/2.1 channels. >>> >>> On another Dell machine with realtek codec, there are also 2
speakers,
>>> >>> 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone
are
>> >> assigned >>> >>> 1 dac, and the other speaker is assigned another dac, so there is
no
>>> problem for this machine to support 4.0/2.1 channels. >>> >>> Through debugging, I found on Dell machine, the speaker nid only
has
>>> one connection to dac (hardwired), so when driver assign dac to
it,
the
>>> >>> map_single() can successfully assign the each dac to the 2
speakers
>> >> respectively. >>> >>> But on that HP machine, the speaker has multiple connections for
dac,
the >>> >>> map_single() can't work for this machine. >>> >>> >>> The alsa-info.txt for that HP machine is at >> >> http://pastebin.ubuntu.com/11667947/ >> >> Refer to 92HD91, you don't need 4 channel when there is band pass
filter
>> >> for the subwoofer at the mono pin > > Yes, you are right. > >> 2.2. Mono Output >> The Mono Out port source selection, power state, and mute
characteristics
>> >> are all independently >> controlled by the mono output port controls. EQ does not apply to
this
>> >> path. An internal 2nd order band-pass filter is provided to
restrict
the
>> >> output frequencies when using mono out to drive an exter- >> nal amplified sub-woofer > > Where did you find this text? Does it mean there is a hardware low
frequency pass filter inside the codec?
http://www.temposemi.com/products/pclaptop-hd/92hd91/
2.3. Mono output Band-Pass Filter For many applications, the primary speakers are incapable of
reproducing
low frequency audio. Therefore it is desirable to implement a woofer
or
sub-woofer speaker. The mono output is ideal for this task. However,
the
frequency response should be restricted to prevent interference with
the
primary speakers. Typically an external filter, known as a cross-over filter, is used. The mono processing path includes a band-pass filter
with
programmable high and low cut-off frequencies to eliminate the need
for
an
external filter.
2.3.1. Mixer Filter Description The band-pass filter is derived from
the
common biquadratic filter and provides a 12dB/octave roll-off. The
filter
may be programmed for a -3dB lower band edge of: 63Hz, 80Hz, 100Hz,
120Hz,
150Hz, 200Hz, 315Hz, or 400Hz.
The filter may be programmed for a -3dB upper band edge of: 150Hz,
200Hz,
250Hz, 315Hz, 400Hz, 500Hz, 630Hz, or 800Hz.
The band-pass filter is enabled by default with a cut-off frequencies
at
120Hz and 250Hz. The filter may be bypassed using the associated verb (processing state verb
Thanks very much, very useful information.
Do your codec revision support this mono out volume ?
7.4.31.AFG (NID = 01h): DAC3OutAmp (Mono Out Volume)
I looks like the current driver does not use this to control the volume.
You can use hda-verb and use vendor specific get verb with afg node to find out whether you can get back the default values 0x7f
How do you assign the two volume control to headphone, speaker and subwoofet ?
speaker and headphone are assigned to DAC0 (nid: 0x13), they use the DAC
amplifier to control the volume.
subwoofer speaker is assigned to DAC1 (nid: 0x14), it use the DAC
amplifier to contorl the volume. Do pulseaudio like this config since there is no mute switch at pin
complex
of idt codecs and no headphone playback volume/switch?
After applied your patch
Front playback volume/switch are shared by headphone and speaker Base speaker playback volume/switch
But the other 4 channels hda codecs vt1802 have speaker playback switch and subwoofer playback switch
Even without this patch, the base speaker and headphone already shared
the same DAC and use single "Front Playback Volume" to control their volume, I did not see any problem from the pulseaudio/desktop so far.
It won't happen with realtek alc2xx codec since the pin complex of most Realtek codec support mute
About the sharing the switch between headphone and base speaker, this is
a new situation, but I did not see obvious problem from pusleaudio/desktop as well.
http://git.kernel.org/cgit/linux/kernel/git/tiwai/hda-emu.git/tree/codecs/vt...
Independent headphone should be disabled when headphone and internal speaker of notebook share same DAC or only enabled on desktop with codecs support 2+2 , 7.1+2
The alsa-info.txt for that Dell machine is at
http://pastebin.ubuntu.com/11667982/
The subwoofer is also at mono pin complex, are there any low pass filter for the subwoofer or vendor coeff need to be set ?
I don't know it, I guess there is no hardware filter, it will work with
the software low pass filter in the pulseaudio.
http://www.realtek.com.tw/products/productsView.aspx?Langid=1&PFid=27&am...
The ALC269 integrates five hardware equalizer bands composed of one low-pass filter, one high-pass filter, and three band-pass filters to compensate for mini-speaker frequency response
Do you mean alc255 does not have tbr hardware equalizer ?
On 2015年06月10日 12:59, Raymond Yau wrote:
The alsa-info.txt for that Dell machine is at
http://pastebin.ubuntu.com/11667982/
The subwoofer is also at mono pin complex, are there any low pass
filter
for the subwoofer or vendor coeff need to be set ?
I don't know it, I guess there is no hardware filter, it will work
with the software low pass filter in the pulseaudio.
http://www.realtek.com.tw/products/productsView.aspx?Langid=1&PFid=27&am...
The ALC269 integrates five hardware equalizer bands composed of one low-pass filter, one high-pass filter, and three band-pass filters to compensate for mini-speaker frequency response
Do you mean alc255 does not have tbr hardware equalizer ?
I don't have alc255 datasheet, but according to the alc269 feature description, it is highly possible that alc255 also has hardware equalizer.
And do you know how to control those equalizer filters with software or do you know where we can find the detailed document for this part?
The alsa-info.txt for that Dell machine is at
http://pastebin.ubuntu.com/11667982/
The subwoofer is also at mono pin complex, are there any low pass filter for the subwoofer or vendor coeff need to be set ?
I don't know it, I guess there is no hardware filter, it will work with
the software low pass filter in the pulseaudio.
The funcional block diagram indicate equaliser is only connected to port D This mean only the internal speaker can use high pass filter
Do you mean your can hear high frequency from the subwoofer of alc255 ?
On 06/12/2015 09:34 AM, Raymond Yau wrote:
The alsa-info.txt for that Dell machine is at
http://pastebin.ubuntu.com/11667982/
The subwoofer is also at mono pin complex, are there any low pass filter for the subwoofer or vendor coeff need to be set ?
I don't know it, I guess there is no hardware filter, it will work with
the software low pass filter in the pulseaudio. The funcional block diagram indicate equaliser is only connected to port D This mean only the internal speaker can use high pass filter
Do you mean your can hear high frequency from the subwoofer of alc255 ?
I am not sure about it, but enable/disable the SW lfe filter will make the sound of subwoofer different
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
At Tue, 09 Jun 2015 17:38:33 +0800, hwang4 wrote:
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are assigned 1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it, the map_single() can successfully assign the each dac to the 2 speakers respectively. But on that HP machine, the speaker has multiple connections for dac, the map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at http://pastebin.ubuntu.com/11667947/ The alsa-info.txt for that Dell machine is at http://pastebin.ubuntu.com/11667982/
To fix this problem, I can use the quirk in the driver to make the speaker have only one connection for dac or do some change in the hda_generic.c like below, in your opinion, which one is better or probably you have a different idea to fix this problem?
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ac0db16..8194ff1 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -1363,6 +1363,7 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs, dac = try_dac(codec, get_primary_out(codec, i), pin); if (!dac) dac = try_dac(codec, dacs[0], pin); if (!dac) dac = try_dac(codec, get_primary_out(codec, i), pin); if (dac) { @@ -1762,6 +1763,12 @@ static int fill_and_eval_dacs(struct hda_codec *codec, if (err < 0) return err; badness += err;
/* if there are 2 speakers and both of them are assigned
to the same dac,
we need to increase the badness for this situation,
because in this situation
the 2 speakers can't work together to support 4.0/2.1
channels */
if (cfg->speaker_outs == 2 && err <
spec->extra_out_badness->no_dac &&
spec->multiout.extra_out_nid[1] == 0)
badness += spec->extra_out_badness->no_dac;
This doesn't look like the correct place to add badness for the missing surround speaker. This function is called for each path, so it's evaluated not only for speakers.
A cleaner way would be to prepare a different badness table for the speaker, and increase the value for shared_surr. An untested patch is below.
Takashi
--- diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ac0db1679f09..ee03fb884426 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -1292,6 +1292,15 @@ const struct badness_table hda_extra_out_badness = { }; EXPORT_SYMBOL_GPL(hda_extra_out_badness);
+static const struct badness_table hda_speaker_out_badness = { + .no_primary_dac = BAD_NO_DAC, + .no_dac = BAD_NO_DAC, + .shared_primary = BAD_NO_EXTRA_DAC, + .shared_surr = BAD_NO_EXTRA_DAC, + .shared_clfe = BAD_SHARED_EXTRA_SURROUND, + .shared_surr_main = BAD_NO_EXTRA_SURR_DAC, +}; + /* get the DAC of the primary output corresponding to the given array index */ static hda_nid_t get_primary_out(struct hda_codec *codec, int idx) { @@ -1758,7 +1767,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec, cfg->speaker_pins, spec->multiout.extra_out_nid, spec->speaker_paths, - spec->extra_out_badness); + spec->speaker_out_badness); if (err < 0) return err; badness += err; @@ -4789,6 +4798,8 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec, spec->main_out_badness = &hda_main_out_badness; if (!spec->extra_out_badness) spec->extra_out_badness = &hda_extra_out_badness; + if (!spec->speaker_out_badness) + spec->speaker_out_badness = &hda_speaker_out_badness;
fill_all_dac_nids(codec);
diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h index 56e4139b9032..1f868de1aec4 100644 --- a/sound/pci/hda/hda_generic.h +++ b/sound/pci/hda/hda_generic.h @@ -246,6 +246,7 @@ struct hda_gen_spec { /* badness tables for output path evaluations */ const struct badness_table *main_out_badness; const struct badness_table *extra_out_badness; + const struct badness_table *speaker_out_badness;
/* preferred pin/DAC pairs; an array of paired NIDs */ const hda_nid_t *preferred_dacs; diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 0521be8d46a8..9e9d0456dab7 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -579,6 +579,7 @@ static int via_parse_auto_config(struct hda_codec *codec)
spec->gen.main_out_badness = &via_main_out_badness; spec->gen.extra_out_badness = &via_extra_out_badness; + spec->gen.speaker_out_badness = &via_extra_out_badness;
err = snd_hda_parse_pin_defcfg(codec, &spec->gen.autocfg, NULL, 0); if (err < 0)
On 06/09/2015 07:51 PM, Takashi Iwai wrote:
At Tue, 09 Jun 2015 17:38:33 +0800, hwang4 wrote:
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are assigned 1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it, the map_single() can successfully assign the each dac to the 2 speakers respectively. But on that HP machine, the speaker has multiple connections for dac, the map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at http://pastebin.ubuntu.com/11667947/ The alsa-info.txt for that Dell machine is at http://pastebin.ubuntu.com/11667982/
To fix this problem, I can use the quirk in the driver to make the speaker have only one connection for dac or do some change in the hda_generic.c like below, in your opinion, which one is better or probably you have a different idea to fix this problem?
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ac0db16..8194ff1 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -1363,6 +1363,7 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs, dac = try_dac(codec, get_primary_out(codec, i), pin); if (!dac) dac = try_dac(codec, dacs[0], pin); if (!dac) dac = try_dac(codec, get_primary_out(codec, i), pin); if (dac) { @@ -1762,6 +1763,12 @@ static int fill_and_eval_dacs(struct hda_codec *codec, if (err < 0) return err; badness += err;
/* if there are 2 speakers and both of them are assigned
to the same dac,
we need to increase the badness for this situation,
because in this situation
the 2 speakers can't work together to support 4.0/2.1
channels */
if (cfg->speaker_outs == 2 && err <
spec->extra_out_badness->no_dac &&
spec->multiout.extra_out_nid[1] == 0)
badness += spec->extra_out_badness->no_dac;
This doesn't look like the correct place to add badness for the missing surround speaker. This function is called for each path, so it's evaluated not only for speakers.
A cleaner way would be to prepare a different badness table for the speaker, and increase the value for shared_surr. An untested patch is below.
Got it, I will test it soon. Thanks.
Takashi
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ac0db1679f09..ee03fb884426 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -1292,6 +1292,15 @@ const struct badness_table hda_extra_out_badness = { }; EXPORT_SYMBOL_GPL(hda_extra_out_badness);
+static const struct badness_table hda_speaker_out_badness = {
- .no_primary_dac = BAD_NO_DAC,
- .no_dac = BAD_NO_DAC,
- .shared_primary = BAD_NO_EXTRA_DAC,
- .shared_surr = BAD_NO_EXTRA_DAC,
- .shared_clfe = BAD_SHARED_EXTRA_SURROUND,
- .shared_surr_main = BAD_NO_EXTRA_SURR_DAC,
+};
- /* get the DAC of the primary output corresponding to the given array index */ static hda_nid_t get_primary_out(struct hda_codec *codec, int idx) {
@@ -1758,7 +1767,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec, cfg->speaker_pins, spec->multiout.extra_out_nid, spec->speaker_paths,
spec->extra_out_badness);
if (err < 0) return err; badness += err;spec->speaker_out_badness);
@@ -4789,6 +4798,8 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec, spec->main_out_badness = &hda_main_out_badness; if (!spec->extra_out_badness) spec->extra_out_badness = &hda_extra_out_badness;
if (!spec->speaker_out_badness)
spec->speaker_out_badness = &hda_speaker_out_badness;
fill_all_dac_nids(codec);
diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h index 56e4139b9032..1f868de1aec4 100644 --- a/sound/pci/hda/hda_generic.h +++ b/sound/pci/hda/hda_generic.h @@ -246,6 +246,7 @@ struct hda_gen_spec { /* badness tables for output path evaluations */ const struct badness_table *main_out_badness; const struct badness_table *extra_out_badness;
const struct badness_table *speaker_out_badness;
/* preferred pin/DAC pairs; an array of paired NIDs */ const hda_nid_t *preferred_dacs;
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 0521be8d46a8..9e9d0456dab7 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -579,6 +579,7 @@ static int via_parse_auto_config(struct hda_codec *codec)
spec->gen.main_out_badness = &via_main_out_badness; spec->gen.extra_out_badness = &via_extra_out_badness;
spec->gen.speaker_out_badness = &via_extra_out_badness;
err = snd_hda_parse_pin_defcfg(codec, &spec->gen.autocfg, NULL, 0); if (err < 0)
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
On 2015年06月09日 21:26, Hui Wang wrote:
On 06/09/2015 07:51 PM, Takashi Iwai wrote:
At Tue, 09 Jun 2015 17:38:33 +0800, hwang4 wrote:
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are assigned 1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it, the map_single() can successfully assign the each dac to the 2 speakers respectively. But on that HP machine, the speaker has multiple connections for dac, the map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at http://pastebin.ubuntu.com/11667947/ The alsa-info.txt for that Dell machine is at http://pastebin.ubuntu.com/11667982/
To fix this problem, I can use the quirk in the driver to make the speaker have only one connection for dac or do some change in the hda_generic.c like below, in your opinion, which one is better or probably you have a different idea to fix this problem?
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ac0db16..8194ff1 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -1363,6 +1363,7 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs, dac = try_dac(codec, get_primary_out(codec, i), pin); if (!dac) dac = try_dac(codec, dacs[0], pin); if (!dac) dac = try_dac(codec, get_primary_out(codec, i), pin); if (dac) { @@ -1762,6 +1763,12 @@ static int fill_and_eval_dacs(struct hda_codec *codec, if (err < 0) return err; badness += err;
/* if there are 2 speakers and both of them are
assigned to the same dac,
we need to increase the badness for this situation,
because in this situation
the 2 speakers can't work together to support
4.0/2.1 channels */
if (cfg->speaker_outs == 2 && err <
spec->extra_out_badness->no_dac &&
spec->multiout.extra_out_nid[1] == 0)
badness += spec->extra_out_badness->no_dac;
This doesn't look like the correct place to add badness for the missing surround speaker. This function is called for each path, so it's evaluated not only for speakers.
A cleaner way would be to prepare a different badness table for the speaker, and increase the value for shared_surr. An untested patch is below.
Got it, I will test it soon. Thanks.
Hi Takashi,
Your patch can fix the problem, it works very well.
Thanks, Hui.
Takashi
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ac0db1679f09..ee03fb884426 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -1292,6 +1292,15 @@ const struct badness_table hda_extra_out_badness = { }; EXPORT_SYMBOL_GPL(hda_extra_out_badness); +static const struct badness_table hda_speaker_out_badness = {
- .no_primary_dac = BAD_NO_DAC,
- .no_dac = BAD_NO_DAC,
- .shared_primary = BAD_NO_EXTRA_DAC,
- .shared_surr = BAD_NO_EXTRA_DAC,
- .shared_clfe = BAD_SHARED_EXTRA_SURROUND,
- .shared_surr_main = BAD_NO_EXTRA_SURR_DAC,
+};
- /* get the DAC of the primary output corresponding to the given
array index */ static hda_nid_t get_primary_out(struct hda_codec *codec, int idx) { @@ -1758,7 +1767,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec, cfg->speaker_pins, spec->multiout.extra_out_nid, spec->speaker_paths,
spec->extra_out_badness);
spec->speaker_out_badness); if (err < 0) return err; badness += err;
@@ -4789,6 +4798,8 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec, spec->main_out_badness = &hda_main_out_badness; if (!spec->extra_out_badness) spec->extra_out_badness = &hda_extra_out_badness;
- if (!spec->speaker_out_badness)
diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.hspec->speaker_out_badness = &hda_speaker_out_badness; fill_all_dac_nids(codec);
index 56e4139b9032..1f868de1aec4 100644 --- a/sound/pci/hda/hda_generic.h +++ b/sound/pci/hda/hda_generic.h @@ -246,6 +246,7 @@ struct hda_gen_spec { /* badness tables for output path evaluations */ const struct badness_table *main_out_badness; const struct badness_table *extra_out_badness;
- const struct badness_table *speaker_out_badness; /* preferred pin/DAC pairs; an array of paired NIDs */ const hda_nid_t *preferred_dacs;
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 0521be8d46a8..9e9d0456dab7 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -579,6 +579,7 @@ static int via_parse_auto_config(struct hda_codec *codec) spec->gen.main_out_badness = &via_main_out_badness; spec->gen.extra_out_badness = &via_extra_out_badness;
- spec->gen.speaker_out_badness = &via_extra_out_badness; err = snd_hda_parse_pin_defcfg(codec, &spec->gen.autocfg,
NULL, 0); if (err < 0) _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
At Wed, 10 Jun 2015 12:19:58 +0800, hwang4 wrote:
On 2015年06月09日 21:26, Hui Wang wrote:
On 06/09/2015 07:51 PM, Takashi Iwai wrote:
At Tue, 09 Jun 2015 17:38:33 +0800, hwang4 wrote:
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are assigned 1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it, the map_single() can successfully assign the each dac to the 2 speakers respectively. But on that HP machine, the speaker has multiple connections for dac, the map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at http://pastebin.ubuntu.com/11667947/ The alsa-info.txt for that Dell machine is at http://pastebin.ubuntu.com/11667982/
To fix this problem, I can use the quirk in the driver to make the speaker have only one connection for dac or do some change in the hda_generic.c like below, in your opinion, which one is better or probably you have a different idea to fix this problem?
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ac0db16..8194ff1 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -1363,6 +1363,7 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs, dac = try_dac(codec, get_primary_out(codec, i), pin); if (!dac) dac = try_dac(codec, dacs[0], pin); if (!dac) dac = try_dac(codec, get_primary_out(codec, i), pin); if (dac) { @@ -1762,6 +1763,12 @@ static int fill_and_eval_dacs(struct hda_codec *codec, if (err < 0) return err; badness += err;
/* if there are 2 speakers and both of them are
assigned to the same dac,
we need to increase the badness for this situation,
because in this situation
the 2 speakers can't work together to support
4.0/2.1 channels */
if (cfg->speaker_outs == 2 && err <
spec->extra_out_badness->no_dac &&
spec->multiout.extra_out_nid[1] == 0)
badness += spec->extra_out_badness->no_dac;
This doesn't look like the correct place to add badness for the missing surround speaker. This function is called for each path, so it's evaluated not only for speakers.
A cleaner way would be to prepare a different badness table for the speaker, and increase the value for shared_surr. An untested patch is below.
Got it, I will test it soon. Thanks.
Hi Takashi,
Your patch can fix the problem, it works very well.
OK, good to know. I'd like to test a bit more via hda-emu whether this gives any ill effects. So far, this seems fixing a few other machines, too, so it's a good thing to have in general.
Takashi
At Wed, 10 Jun 2015 12:28:39 +0200, Takashi Iwai wrote:
A cleaner way would be to prepare a different badness table for the speaker, and increase the value for shared_surr. An untested patch is below.
Got it, I will test it soon. Thanks.
Hi Takashi,
Your patch can fix the problem, it works very well.
OK, good to know. I'd like to test a bit more via hda-emu whether this gives any ill effects. So far, this seems fixing a few other machines, too, so it's a good thing to have in general.
This change alone results in regressions on machines that are capable of 4.0/5.1 surrounds. For avoiding it, the badness for multi-io has to be increased as well. It's damn sensitive.
But, now I wonder now whether blindly applying this is good. Suppose a machine with 2.1 speaker and one headphone, but the codec has only two DACs. With this setup, now the headphone and the speaker share the same DAC, as the cost of having individual 2.1 speaker volume. Is this more useful than having individual volumes for speaker and headphone?
Maybe the machine you're trying to support has a different situation. So applying the new rule to limited devices is fine. But if so, it's not necessarily to be an adjustment of badness table, but just you can provide the simple DAC/pin preference map explicitly in the fixup.
Takashi
On 06/11/2015 11:10 PM, Takashi Iwai wrote:
At Wed, 10 Jun 2015 12:28:39 +0200, Takashi Iwai wrote:
A cleaner way would be to prepare a different badness table for the speaker, and increase the value for shared_surr. An untested patch is below.
Got it, I will test it soon. Thanks.
Hi Takashi,
Your patch can fix the problem, it works very well.
OK, good to know. I'd like to test a bit more via hda-emu whether this gives any ill effects. So far, this seems fixing a few other machines, too, so it's a good thing to have in general.
This change alone results in regressions on machines that are capable of 4.0/5.1 surrounds. For avoiding it, the badness for multi-io has to be increased as well. It's damn sensitive.
But, now I wonder now whether blindly applying this is good. Suppose a machine with 2.1 speaker and one headphone, but the codec has only two DACs. With this setup, now the headphone and the speaker share the same DAC, as the cost of having individual 2.1 speaker volume. Is this more useful than having individual volumes for speaker and headphone?
If having individual volumes for speaker and headphone (the speakers share the same DAC), there will be no "Front Speaker" and "Bass Speaker", as a result, in the userspace, pulseaudio can't regard the 2.1 channels is a valid profile.
Maybe the machine you're trying to support has a different situation. So applying the new rule to limited devices is fine. But if so, it's not necessarily to be an adjustment of badness table, but just you can provide the simple DAC/pin preference map explicitly in the fixup.
This is a good idea, so far this machine is the only one with this problem, it is suitable to use a machine specific fixup. If in future, we have more machines with this problem, then we will think about a general way to fix it.
Takashi _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
A cleaner way would be to prepare a different badness table for the speaker, and increase the value for shared_surr. An untested patch
is
below.
Got it, I will test it soon. Thanks.
Hi Takashi,
Your patch can fix the problem, it works very well.
OK, good to know. I'd like to test a bit more via hda-emu whether this gives any ill effects. So far, this seems fixing a few other machines, too, so it's a good thing to have in general.
This change alone results in regressions on machines that are capable of 4.0/5.1 surrounds. For avoiding it, the badness for multi-io has to be increased as well. It's damn sensitive.
But, now I wonder now whether blindly applying this is good. Suppose a machine with 2.1 speaker and one headphone, but the codec has only two DACs. With this setup, now the headphone and the speaker share the same DAC, as the cost of having individual 2.1 speaker volume. Is this more useful than having individual volumes for speaker and headphone?
If having individual volumes for speaker and headphone (the speakers
share the same DAC), there will be no "Front Speaker" and "Bass Speaker", as a result, in the userspace, pulseaudio can't regard the 2.1 channels is a valid profile.
Do you mean you can still hear high frequency from the subwoofer of 92hd91 (i.e. pulseaudio lfe filtering is much better than the band pass filter in 92hd91)
How much auddional cpu need to enable lfe filtering ?
On 06/12/2015 09:22 AM, Raymond Yau wrote:
> A cleaner way would be to prepare a different badness table for the > speaker, and increase the value for shared_surr. An untested patch
is
> below. Got it, I will test it soon. Thanks.
Hi Takashi,
Your patch can fix the problem, it works very well.
OK, good to know. I'd like to test a bit more via hda-emu whether this gives any ill effects. So far, this seems fixing a few other machines, too, so it's a good thing to have in general.
This change alone results in regressions on machines that are capable of 4.0/5.1 surrounds. For avoiding it, the badness for multi-io has to be increased as well. It's damn sensitive.
But, now I wonder now whether blindly applying this is good. Suppose a machine with 2.1 speaker and one headphone, but the codec has only two DACs. With this setup, now the headphone and the speaker share the same DAC, as the cost of having individual 2.1 speaker volume. Is this more useful than having individual volumes for speaker and headphone?
If having individual volumes for speaker and headphone (the speakers
share the same DAC), there will be no "Front Speaker" and "Bass Speaker", as a result, in the userspace, pulseaudio can't regard the 2.1 channels is a valid profile. Do you mean you can still hear high frequency from the subwoofer of 92hd91 (i.e. pulseaudio lfe filtering is much better than the band pass filter in 92hd91)
I don't mean we will definitely enable the lfe filter in the pulseaudio, if the codec has HW filter, we can disable the lfe filter in the pulseaudio. The problem is if we don't choose 2.1 channels, the pulseaudio will not feed the data to the subwoofer speaker, so there is no sound coming from the subwoofer speaker.
2.1 channles != enabling lfe filter.
How much auddional cpu need to enable lfe filtering ? _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
A cleaner way would be to prepare a different badness table for the speaker, and increase the value for shared_surr. An untested
patch is
below.
Got it, I will test it soon. Thanks.
Hi Takashi,
Your patch can fix the problem, it works very well.
OK, good to know. I'd like to test a bit more via hda-emu whether this gives any ill effects. So far, this seems fixing a few other machines, too, so it's a good thing to have in general.
This change alone results in regressions on machines that are capable of 4.0/5.1 surrounds. For avoiding it, the badness for multi-io has to be increased as well. It's damn sensitive.
But, now I wonder now whether blindly applying this is good. Suppose a machine with 2.1 speaker and one headphone, but the codec has only two DACs. With this setup, now the headphone and the speaker share the same DAC, as the cost of having individual 2.1 speaker volume. Is this more useful than having individual volumes for speaker and headphone?
Some realtek codec e.g. alc262
Supports MONO line output with independent volume control
http://www.realtek.com.tw/products/productsView.aspx?Langid=1&PFid=27&am...
Badness table cannot be applied to all realtek codecs
On 2015-06-11 17:10, Takashi Iwai wrote:
At Wed, 10 Jun 2015 12:28:39 +0200, Takashi Iwai wrote:
OK, good to know. I'd like to test a bit more via hda-emu whether this gives any ill effects. So far, this seems fixing a few other machines, too, so it's a good thing to have in general.
This change alone results in regressions on machines that are capable of 4.0/5.1 surrounds. For avoiding it, the badness for multi-io has to be increased as well. It's damn sensitive.
But, now I wonder now whether blindly applying this is good. Suppose a machine with 2.1 speaker and one headphone, but the codec has only two DACs. With this setup, now the headphone and the speaker share the same DAC, as the cost of having individual 2.1 speaker volume. Is this more useful than having individual volumes for speaker and headphone?
Maybe the machine you're trying to support has a different situation. So applying the new rule to limited devices is fine. But if so, it's not necessarily to be an adjustment of badness table, but just you can provide the simple DAC/pin preference map explicitly in the fixup.
Oh, this is an interesting trade-off.
In the PulseAudio desktop scenario, we automute the speaker, and PulseAudio remembers the individual headphone and speaker volumes. So in this case, there is no benefit from having individual headphone and speaker volume at the ALSA level.
However if a user wants to turn off automute, then there is a need for being able to adjust headphone and speaker volume individually.
But it's not just a question of volume control for 2.1. Being able to send a different stream to the subwoofer could be useful too, especially if the hardware filter is bad or non-existing.
So my gut feeling leans towards using the second DAC for the subwoofer speaker being the more useful default, but it's not a clear cut.
// David
OK, good to know. I'd like to test a bit more via hda-emu whether this
gives any ill effects. So far, this seems fixing a few other machines, too, so it's a good thing to have in general.
This change alone results in regressions on machines that are capable of 4.0/5.1 surrounds. For avoiding it, the badness for multi-io has to be increased as well. It's damn sensitive.
But, now I wonder now whether blindly applying this is good. Suppose a machine with 2.1 speaker and one headphone, but the codec has only two DACs. With this setup, now the headphone and the speaker share the same DAC, as the cost of having individual 2.1 speaker volume. Is this more useful than having individual volumes for speaker and headphone?
Maybe the machine you're trying to support has a different situation. So applying the new rule to limited devices is fine. But if so, it's not necessarily to be an adjustment of badness table, but just you can provide the simple DAC/pin preference map explicitly in the fixup.
Oh, this is an interesting trade-off.
In the PulseAudio desktop scenario, we automute the speaker, and PulseAudio remembers the individual headphone and speaker volumes. So in this case, there is no benefit from having individual headphone and speaker volume at the ALSA level.
However if a user wants to turn off automute, then there is a need for being able to adjust headphone and speaker volume individually.
Do "front Playback volume" a good name when volume control is shared by headphone and speaker" ?
in desktop with alc66x , volume control shared by headphone and Line Out is name as "Front" because it support 5.1
But it's not just a question of volume control for 2.1. Being able to send a different stream to the subwoofer could be useful too, especially if the hardware filter is bad or non-existing.
when subwoofer is using stereo pin complex (usually with 6, 8 or 10 channels codec), only one left or right channel is used (e.g. Asus N series note book external sonic master subwoofer use right channel but acer aspire 5930g internal subwoofer using left channel
FL, FR LFE N/A FL, FR, N/A, LFE
how do pulseaudio perform lfe filter when subwoofer is using mono pin since the downmix widget mix left and right channel and scale down the volume ?
FL, FR, LFE, LFE
do it need more CPU than those use one channel of stereo pin complex
For those 2 channel hda codec 's subwoofer must use mono pin
At Fri, 12 Jun 2015 08:07:20 +0200, David Henningsson wrote:
On 2015-06-11 17:10, Takashi Iwai wrote:
At Wed, 10 Jun 2015 12:28:39 +0200, Takashi Iwai wrote:
OK, good to know. I'd like to test a bit more via hda-emu whether this gives any ill effects. So far, this seems fixing a few other machines, too, so it's a good thing to have in general.
This change alone results in regressions on machines that are capable of 4.0/5.1 surrounds. For avoiding it, the badness for multi-io has to be increased as well. It's damn sensitive.
But, now I wonder now whether blindly applying this is good. Suppose a machine with 2.1 speaker and one headphone, but the codec has only two DACs. With this setup, now the headphone and the speaker share the same DAC, as the cost of having individual 2.1 speaker volume. Is this more useful than having individual volumes for speaker and headphone?
Maybe the machine you're trying to support has a different situation. So applying the new rule to limited devices is fine. But if so, it's not necessarily to be an adjustment of badness table, but just you can provide the simple DAC/pin preference map explicitly in the fixup.
Oh, this is an interesting trade-off.
In the PulseAudio desktop scenario, we automute the speaker, and PulseAudio remembers the individual headphone and speaker volumes. So in this case, there is no benefit from having individual headphone and speaker volume at the ALSA level.
However if a user wants to turn off automute, then there is a need for being able to adjust headphone and speaker volume individually.
But it's not just a question of volume control for 2.1. Being able to send a different stream to the subwoofer could be useful too, especially if the hardware filter is bad or non-existing.
So my gut feeling leans towards using the second DAC for the subwoofer speaker being the more useful default, but it's not a clear cut.
Right, this is indeed a difficult problem, and probably there is never a clear answer.
Another interesting examples are: A. 3 DACs, 2 HP, 2 speakers B. 3 DACs, 2 HP, 1 mic, 1 speaker C. 4 DACs, 2 HP, 1 mic, 2 speakers
For B and C, user expects the possible 5.1 outputs by retasking the mic. But then you'll lose the individual volume control with the speaker.
Takashi
Oh, this is an interesting trade-off.
In the PulseAudio desktop scenario, we automute the speaker, and
PulseAudio remembers the individual headphone and speaker volumes. So in this case, there is no benefit from having individual headphone and speaker volume at the ALSA level.
However if a user wants to turn off automute, then there is a need for
being able to adjust headphone and speaker volume individually.
But it's not just a question of volume control for 2.1. Being able to
send a different stream to the subwoofer could be useful too, especially if the hardware filter is bad or non-existing.
It is not just low pass filter with subwoofer
Pulseaudio seem also perform high pass filter at the same time
http://cgit.freedesktop.org/pulseaudio/pulseaudio/commit/?id=f3ebf6b667b155f...
92hd91 have high pass filter for internal speakers
2.20.BTL Amplifier High-Pass Filter
For mobile applications, speakers are often incapable of reproducing low frequency audio and unable to handle the maximum output power of the BTL amplifier. A high-pass filter is implemented in the BTL output path to reduce the amount of low frequency energy reaching speakers attached to the BTL amplifier. This can prevent speaker failure.
2.20.1.Filter Description
The high-pass filter is derived from the common biquadratic filter and provides a 12dB/octave roll-off. The filter may be programmed for a -3dB response at: 100Hz, 200Hz, 300Hz, 400Hz, 500Hz, 750Hz, 1KHz, or 2KHz. The high pass filter is enabled by default with a cut-off frequency of 300Hz. The filter may be bypassed using the associated verb (processing state verb).
I am trying to enable the subwoofer speaker on a HP laptop, on this machine, there are two speakers and one headphone, but the BIOS verb only enabled one speaker(nid 0xd) and one headphone(nid 0xb), I need to use quirk in the kernel driver to configure the second speaker (subwoofer speaker, nid 0x10). Under current alsa driver, the headphone will be assigned a dac (nid 0x13) and the 2 speakers will be assigned a dac (nid 0x14), this assignment is not good since 2 speakers share the same dac, this means 2 speakers can't work at the same time to support 4.0/2.1 channels.
On another Dell machine with realtek codec, there are also 2 speakers, 1 headphone and 2 dacs, on this machine, 1 speaker and 1 headphone are assigned 1 dac, and the other speaker is assigned another dac, so there is no problem for this machine to support 4.0/2.1 channels.
Through debugging, I found on Dell machine, the speaker nid only has one connection to dac (hardwired), so when driver assign dac to it, the map_single() can successfully assign the each dac to the 2 speakers respectively. But on that HP machine, the speaker has multiple connections for dac,
the
map_single() can't work for this machine.
The alsa-info.txt for that HP machine is at http://pastebin.ubuntu.com/11667947/
Node 0x13 [Audio Output] wcaps 0xd0c05: Stereo Amp-Out R/L Control: name="Headphone Playback Volume", index=0, device=0 ControlAmp: chs=3, dir=Out, idx=0, ofs=0 Control: name="Headphone Playback Switch", index=0, device=0 ControlAmp: chs=3, dir=Out, idx=0, ofs=0 Device: name="92HD91BXX Analog", type="Audio", device=0 Amp-Out caps: N/A Amp-Out vals: [0x80 0x80] Converter: stream=5, channel=0 Power states: Power: setting=D0, actual=D0 Delay: 13 samples Node 0x14 [Audio Output] wcaps 0xd0c05: Stereo Amp-Out R/L Control: name="Speaker Playback Volume", index=0, device=0 ControlAmp: chs=3, dir=Out, idx=0, ofs=0 Control: name="Speaker Playback Switch", index=0, device=0 ControlAmp: chs=3, dir=Out, idx=0, ofs=0 Amp-Out caps: N/A Amp-Out vals: [0x64 0x64] Converter: stream=5, channel=0 Power states: Power: setting=D0, actual=D0 Delay: 13 samples
Do hda_proc.c or hda_codec use the correct verb to get amp out cap of idt codecs ?
92hd91 datasheet has default values of amp out caps
Why amp out caps are N/A ?
7.14.2.DAC0 (NID = 13h): OutAmpLeft
7.14.3.DAC0 (NID = 13h): OutAmpRight
7.15.2.DAC1 (NID = 14h): OutAmpLeft
7.15.3.DAC1 (NID = 14h): OutAmpRight
participants (5)
-
David Henningsson
-
Hui Wang
-
hwang4
-
Raymond Yau
-
Takashi Iwai