Created attachment 52868 [details] ALSA info gzipped I basically have a generic Dell box with integrated ICH7 audio 0 [ICH7 ]: ICH4 - Intel ICH7 Intel ICH7 with AD1981B at irq 23 When I plug my headphones into the front, in alsamixer only the Headphone slider has an effect, Master does nothing to change volume. Now Pulseaudio somehow merges these (even if flatvol is off) and the whole range of Headphone is compressed into the low range and it gets painful very quickly. No idea if this is ALSA bug or not. Please advise and forward accordingly. ALSA info and pulseaudio verbose output attached
Created attachment 52869 [details] pulseadui -vvvvvv gzipped
Have you had time to look at this yet, Maarten? You've told me to poke you.
I think this is expected behaviour... Can you attach output of "pacmd ls"? Normally I'd expect a "Headphones" port to be available for your Sink. With the jack detection capabilities added in PA 2.0, this port will hopefully now be activated automatically when a jack is plugged in. In older versions you have to enable the port manually in pavucontrol or another mixer when you plug in a jack.
Created attachment 58411 [details] pacmd ls Attached »pacmd ls«. (Note I have an Apple Monitor with USB audio too) It’s not expected behaviour that when I use my volume buttons that only the two lowest ticks give me a range between threshold-of-hearing and thresold-of-pain, is it? |0---xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| 0 nothing, x == pain I don’t have a headphone port. It’s not there. And on IRC mkbosman told me he had the same problem and to open this bug.
Created attachment 58415 [details] Plain version of alsa-info for better readability.
You appear to have two Headphone related ports available along with a couple others: * Headphones / Amplifier * Headphones / No Amplifier ports: analog-output-headphones;output-amplifier-on: Headphones / Amplifier (priority 9010, available: unknown) analog-output-headphones;output-amplifier-off: Headphones / No Amplifier (priority 9000, available: unknown) analog-output-lfe-on-mono;output-amplifier-on: LFE on Separate Mono Output / Amplifier (priority 4010, available: unknown) analog-output-lfe-on-mono;output-amplifier-off: LFE on Separate Mono Output / No Amplifier (priority 4000, available: unknown) What is interesting is that you do not have any "Analog Speakers" ports listed. I think we're addressing this shortly in PA master having spoken to David (I can tell you're using Ubuntu from the patches), so this is good, but I'm not sure why Master is getting adjusted here... I'd have expected the two headphone ports to adjust Headphones and Line respectively. Ultimately, this basically boils down to writing a profile for the hardware. I'd have hoped the default profiles would have sufficed and perhaps it still can once the speakers port comes in. For more info on writing profiles see: http://www.freedesktop.org/wiki/Software/PulseAudio/Backends/ALSA/Profiles I've CC'ed David to get his input here.
> in alsamixer only the Headphone slider has an effect, Master does nothing to change volume That's an ALSA driver bug. Unfortunately I don't know how to fix AC'97s. > What is interesting is that you do not have any "Analog Speakers" ports listed. There does not seem to be any kcontrols indicating that you have speakers, therefore no "Analog Speakers" port. It seems to me that if "Master" controls the speaker but not the headphones, "Master" should be renamed to "Speaker".
What needs to be done here? ALSA-side fix?
PCM Playback volume of a two channels AC97 Codec is just similar to the virtual master volume of HDA codec
https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/1078704/comments/5 without the headphone plugged in 0:72 = 0804 with the headphone plugged in 0:72 = 080c it is possible to add Jack detection support on some AC97 codec
MASTER VOLUME REGISTER Index 0x02 This register controls the Line_Out volume controls for both stereo channels and the mute bit. Each volume subregister contains five bits, generating 32 volume levels with 31 steps of 1.5 dB each. Because AC ’97 defines 6-bit volume registers, to maintain compatibility whenever the D5 or D13 bits are set to 1, their respective lower five volume bits are automatically set to 1 by the codec logic. On readback, all lower five bits read 1s whenever these bits are set to 1. Refer to Table 12 for examples. HEADPHONE VOLUME REGISTER Index 0x04 This register controls the headphone volume controls for both stereo channels and the mute bit. Each volume subregister contains five bits, generating 32 volume levels with 31 steps of 1.5 dB each. Because AC ’97 defines 6-bit volume registers, to maintain compatibility, whenever the D5 or D13 bits are set to 1, their respective lower five volume bits are automatically set to 1 by the codec logic. On readback, all lower five bits read 1s whenever these bits are set to 1. Refer to Table 12 for examples. this is quite different from those virtual master of hda codecs
pulseaudio dB range (-127.5,+12) is incorrect 662| 0.000) D: [pulseaudio] alsa-mixer.c: Path analog-output-headphones (Headphones), direction=1, priority=90, probed=yes, supported=yes, has_mute=yes, has_volume=yes, has_dB=yes, min_volume=0, max_volume=31, min_dB=-127.5, max_dB=12 ( 0.662| 0.000) D: [pulseaudio] alsa-mixer.c: Element Master, direction=1, switch=1, volume=1, volume_limit=-1, enumeration=0, required=0, required_any=0, required_absent=0, mask=0x3600000000f66, n_channels=2, override_map=yes ( 0.662| 0.000) D: [pulseaudio] alsa-mixer.c: Element Master Mono, direction=1, switch=2, volume=2, volume_limit=-1, enumeration=0, required=0, required_any=0, required_absent=0, mask=0x7ffffffffffff, n_channels=1, override_map=no ( 0.662| 0.000) D: [pulseaudio] alsa-mixer.c: Element Headphone, direction=1, switch=1, volume=1, volume_limit=-1, enumeration=0, required=0, required_any=4, required_absent=0, mask=0x3600000000f66, n_channels=2, override_map=yes ( 0.662| 0.000) D: [pulseaudio] alsa-mixer.c: Element PCM, direction=1, switch=1, volume=1, volume_limit=-1, enumeration=0, required=0, required_any=0, required_absent=0, mask=0x3600000000f66, n_channels=2, override_map=yes ( 0.662| 0.000) D: [pulseaudio] alsa-mixer.c: Element External Amplifier, direction=1, switch=4, volume=0, volume_limit=-1, enumeration=0, required=0, required_any=0, required_absent=0, mask=0x0, n_channels=0, override_map=no ( 0.662| 0.000) D: [pulseaudio] alsa-mixer.c: Option on (output-amplifier-on/Amplifier) index=1, priority=10 ( 0.662| 0.000) D: [pulseaudio] alsa-mixer.c: Option off (output-amplifier-off/No Amplifier) index=0, priority=0 ( 0.663| 0.000) D: [pulseaudio] alsa-mixer.c: Jack Front Headphone, alsa_name='Front Headphone Jack', detection unavailable ( 0.663| 0.000) D: [pulseaudio] alsa-mixer.c: Jack Front Headphone Phantom, alsa_name='Front Headphone Phantom Jack', detection unavailable ( 0.663| 0.000) D: [pulseaudio] alsa-mixer.c: Jack Headphone, alsa_name='Headphone Jack', detection unavailable ( 0.663| 0.000) D: [pulseaudio] alsa-mixer.c: Jack Headphone Phantom, alsa_name='Headphone Phantom Jack', detection unavailable ( 0.663| 0.000) D: [pulseaudio] alsa-mixer.c: Jack Headphone Mic, alsa_name='Headphone Mic Jack', detection unavailable ( 0.663| 0.000) D: [pulseaudio] alsa-mixer.c: Setting output-amplifier-on (Amplifier) priority=10 ( 0.663| 0.000) D: [pulseaudio] alsa-mixer.c: Setting output-amplifier-off (No Amplifier) priority=
--- /home/kingfisher/Desktop/alsa-info.no-hp.txt +++ /home/kingfisher/Desktop/alsa-info.hp.txt @@ -3,7 +3,7 @@ !!ALSA Information Script v 0.4.64 !!################################ -!!Script ran on: Fri Sep 11 02:28:42 UTC 2015 +!!Script ran on: Fri Sep 11 02:31:15 UTC 2015 !!Linux Distribution @@ -215,7 +215,7 @@ 0:6c = 0000 0:6e = 0000 0:70 = 0000 -0:72 = 1804 +0:72 = 180c 0:74 = 1001 0:76 = 2010 0:78 = 0000 JACK SENSE/AUDIO INTERRUPT/STATUS REGISTER Index 0x72 Reg No. Name D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 0x72 Jack Sense X X X JS MT2 JS MT1 JS MT0 JS1 EQB JS0 EQB JS1 TMR JS0 TMR JS1 MD JS0 MD JS1 ST JS0 ST JS1 INT JS0 INT All register bits are read/write except for JS0ST and JS1ST, which are read-only. All registers are not shown, and bits containing an X are assumed to be reserved. Table 41. Jack Sense Mute Select—JSMT [2:0] Ref JS1 Headphone JS0 LINE_OUT JSMT2 JSMT1 JSMT0 HP_OUT LINE_OUT MONO_OUT Notes 0 OUT (0) OUT (0) 0 0 0 ACTIVE ACTIVE ACTIVE JS0 and JS1 ignored. 16 OUT (0) OUT (0) 1 0 0 FMUTE FMUTE ACTIVE JS0 mutes Mono; JS1 no mute action. 17 OUT (0) IN (1) 1 0 0 FMUTE ACTIVE FMUTE 18 IN (1) OUT (0) 1 0 0 ACTIVE FMUTE ACTIVE 19 IN (1) IN (1) 1 0 0 ACTIVE ACTIVE FMUTE
Created attachment 118207 [details] attachment-25654-0.html Just for the record, the reporter (me) doesn't have access to that PC anymore. On 11 Sep 2015 05:57, <bugzilla-daemon@freedesktop.org> wrote: > *Comment # 13 <https://bugs.freedesktop.org/show_bug.cgi?id=42353#c13> on > bug 42353 <https://bugs.freedesktop.org/show_bug.cgi?id=42353> from Raymond > <superquad.vortex2@gmail.com> * > > > > > --- /home/kingfisher/Desktop/alsa-info.no-hp.txt > +++ /home/kingfisher/Desktop/alsa-info.hp.txt > > @@ -3,7 +3,7 @@ > > !!ALSA Information Script v 0.4.64 > > !!################################ > > > > -!!Script ran on: Fri Sep 11 02:28:42 UTC 2015 > +!!Script ran on: Fri Sep 11 02:31:15 UTC 2015 > > > !!Linux Distribution > > @@ -215,7 +215,7 @@ > 0:6c = 0000 > 0:6e = 0000 > 0:70 = 0000 > -0:72 = 1804 > +0:72 = 180c > 0:74 = 1001 > 0:76 = 2010 > 0:78 = 0000 > > > JACK SENSE/AUDIO INTERRUPT/STATUS REGISTER Index 0x72 > Reg No. Name D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 > > 0x72 Jack Sense X X X JS MT2 JS MT1 JS MT0 JS1 EQB JS0 EQB JS1 TMR > JS0 TMR JS1 MD JS0 MD JS1 ST JS0 ST JS1 INT JS0 INT > > All register bits are read/write except for JS0ST and JS1ST, which are > read-only. > All registers are not shown, and bits containing an X are assumed to be > reserved. > > > Table 41. Jack Sense Mute Select—JSMT [2:0] Ref JS1 Headphone JS0 LINE_OUT > JSMT2 JSMT1 JSMT0 HP_OUT LINE_OUT MONO_OUT > Notes 0 OUT (0) OUT (0) 0 0 0 ACTIVE ACTIVE ACTIVE JS0 and JS1 ignored. > > > 16 OUT (0) OUT (0) 1 0 0 FMUTE FMUTE ACTIVE JS0 mutes Mono; JS1 no mute action. > 17 OUT (0) IN (1) 1 0 0 FMUTE ACTIVE FMUTE > 18 IN (1) OUT (0) 1 0 0 ACTIVE FMUTE ACTIVE > 19 IN (1) IN (1) 1 0 0 ACTIVE ACTIVE FMUTE > > ------------------------------ > You are receiving this mail because: > > - You reported the bug. > >
(In reply to Arun Raghavan from comment #8) > What needs to be done here? ALSA-side fix? https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/893210 it is unlikely fix in alsa driver as pulseaudio expect jack detection kctl although js0 ST or js1 ST of ac97 register 0x72 of ad1981b may reflect hp status it is not clear how and when to check the change in jack state by timer or interrept
Table 40. Bit Mnemonic JS0 Interrupt Function JS1 TMR JS0 TMR JS1 MD JS0 MD JS1 ST JS0 ST JS1 INT JS0 INT 0x0000 JS1INT JS0ST JS1ST JS0MD JS1MD JS0TMR JS1TMR JS0EQB JS1EQB JSMT [2:0] JS0INT This bit indicates that Pin JS0 has generated an interrupt. This bit remains set until the software services the JS0 interrupt, that is, JS0 ISR should clear this bit by writing a 0 to it. The interrupt to the system is an OR combination of this bit and JS1INT. The actual interrupt implementation is selected by the INTS bit (Register 0x76). It is also possible to generate a software system interrupt by writing a 1 to this bit. Js1 Interrupt This bit indicates that Pin JS1 has generated an interrupt. This bit remains set until the software services the JS1 interrupt, that is, JS1 ISR should clear this bit by writing a 0 to it. See the JS0INT description for details. JS0 State This bit always reports the logic state of the JS0 pin. JS1 State This bit always reports the logic state of the JS1 pin. JS0 Mode This bit selects the operation mode for the JS0 pin. 0 = Jack sense mode (default). 1 = Interrupt mode. JS1 Mode This bit selects the operation mode for the JS1 pin. 0 = Jack sense mode (default). 1 = Interrupt mode. JS0 Timer Enable If this bit is set to 1, JS0 must be high for >278 ms to be recognized. JS1 Timer Enable If this bit is set to 1, JS1 must be high for >278 ms to be recognized. JS0 EQ Bypass Enable This bit enables JS0 to control the EQ bypass. When this bit is set to 1, JS0 = 1 causes the EQ to be bypassed. JS1 EQ Bypass Enable This bit enables JS1 to control the EQ bypass. When this bit is set to 1, JS1 = 1 causes the EQ to be bypassed. JS Mute Enable Selector These three bits select and enable the jack sense muting action (see Table 41
static const struct snd_kcontrol_new snd_ac97_ad1981x_jack_sense[] = { AC97_SINGLE("Headphone Jack Sense", AC97_AD_JACK_SPDIF, 11, 1, 0), AC97_SINGLE("Line Jack Sense", AC97_AD_JACK_SPDIF, 12, 1, 0), }; these two controls only change JSMT2 and JSMT1 you need bit 2 and bit3 of AC97_AD_JACK_SPDIF for JS0 ST and JS1 ST create hp jack kctl similar to https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/commit/sound/pci/oxygen?id=435feac648cab190990aa0bf9355f77d1f082db3 the point is when do the driver call snd_jack_report by interrupt or timer
http://cgit.freedesktop.org/pulseaudio/pulseaudio/tree/src/modules/alsa/mixer/paths/analog-output-headphones.conf you need to remove Element Master from analog-output-headphones.conf since master is used by line out jack [Element Master] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right
device.vendor.name = "Intel Corporation" device.product.id = "27de" device.product.name = "OptiPlex GX620" device.form_factor = "internal" device.string = "front:0" device.buffering.buffer_size = "65536" device.buffering.fragment_size = "65536" device.access_mode = "mmap+timer" device.profile.name = "analog-stereo" device.profile.description = "Analogue Stereo" device.description = "Built-in Audio Analogue Stereo" alsa.mixer_name = "Analog Devices AD1981B" alsa.components = "AC97a:41445374" module-udev-detect.discovered = "1" device.icon_name = "audio-card-pci" Ports: analog-output-headphones;output-amplifier-on: Headphones / Amplifier (priority: 9010) analog-output-headphones;output-amplifier-off: Headphones / No Amplifier (priority: 9000) Active Port: analog-output-headphones;output-amplifier-off the port is different from those ac97 codec in virtualbox 4.x or those ac97 codec without headphone volume control
ftp://ftp.alsa-project.org/pub/manuals/intel/ refer to ac97 2.1/2.3 specification Figure 16. AC ‘97 Mixer Functional Diagram master volume control line out headphone volume control hp master mono volume control mono out
> so how can I get pactl list sinks to include: >analog-output-lfe-on-mono;output-amplifier-on: LFE on Separate Mono Output / Amplifier (priority: 4010) >analog-output-lfe-on-mono;output-amplifier-off: LFE on Separate Mono Output / No Amplifier (priority: 4000) do you mean the internal speaker is using mono out, you have to ask pulseaudio developer ? http://cgit.freedesktop.org/pulseaudio/pulseaudio/commit/src/modules/alsa/mixer?id=9e4229cfe03d441a01a0f1bd02972936048ae85d
> I just booted from ubuntu-12.04.5-desktop-amd64.iso, played a music file, opened alsamixer, and discovered that; changing Master M volume independently changed the internal speaker volume. In 14.04 Master M is muted by default, unmuting and raising the volume has no effect. You have to turn off headphone jack sense and line jack sense controls to set mute enable selector JSMT[2:0] to 0 http://cgit.freedesktop.org/pulseaudio/pulseaudio/patch/src/modules/alsa/mixer/paths?id=ba0203c4c0938fd646cf559456e3d691fc889029 you have to send email to the author if you think it is a regression of this patch
Hi, I am also trying to get internal speakers to work on Dell OptiPlex GX620 (model no.: DCCY). External speakers work, however internal speakers are not even listed in PulseAudio Volume Control (and there is no sound). The internal speakers worked on previous OS (Windows XP). do you mean your desktop have stereo internal speakers since ad1981b only has three output line out hp mono out and your dell gx520 seem have hp at front and line out at rear Small error on my part: I have OptiPlex GX520, not GX620. Should be similar though. Attaching my alsa-info. https://launchpadlibrarian.net/217865539/alsa-info.txt.TO94irU7Fb 0:72 = 0800 0:74 = 1001 0:76 = 2010 0:78 = 0000 0:7a = 0000 0:7c = 4144 0:7e = 5374 js1 st and js0 st seem to be clear , mono out is not muted by FMUTE
http://cgit.freedesktop.org/pulseaudio/pulseaudio/commit/src/modules/alsa/mixer?id=052316e4195cc01c6b13ce9e21724cb7c25aad82 as desktop speaker.conf has beem merged if your desktop speaker use mono out playback volume/switch you have to add element master mono to speaker.conf
Created attachment 118260 [details] ad1981b - add jack detect kctl This patch still lack the interrupt to call ad198x_handle_hp_jack() and ad198x_handle_lo_jack() when hp or line out is plugged
you will also need to schedule the driver to call ad198x_handle_hp_jack and ad198x_handle_lo_jack in intel8x0.c periodically similar to hda vt1708 codec https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/commit/sound/pci/hda/patch_via.c?id=187d333edc0a8e1bb507900ce89853ffe3bd2c84
Created attachment 118276 [details] [review] patch for ac97 codec with HP, Line Out and Speaker For AC97 codec which Line Out use Master Playback Volume Headphone use Headphone Playback Volume Speaker use Master Mono Playback Volume
SERIAL CONFIGURATION REGISTER Index 0x74 D4 INTS Interrupt Mode Select This bit selects the JS interrupt implementation path. 0 = Bit 0 Slot 12 (modem interrupt). 1 = Slot 6 valid bit (MIC ADC interrupt). 2.2.9 GLOB_STA—Global Status Register (Audio—D30:F2) I/O Address: Default Value: Lockable: Bit 31:30Reserved. NABMBAR + 30h GPI Status Change Interrupt (GSCI) — R/WC. 0 =Software clears this bit by writing a 1 to it. 1 =This bit reflects the state of bit 0 in slot 12, and is set when bit 0 of slot 12 is set. This indicates that one of the GPI’s changed state, and that the new values are available in slot 12. This bit is not affected by AC ‘97 Audio Function D3HOT to D0 Reset.
https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/1078704 however ad1981b is also used in notebook or desktop this mean that you need to differentitate desktop and notebook most likely you need pulseaudio to adjust the element in speaker path in alsa-mixer.c if notebook use master for the speaker
only those in whitelist call snd_ac97_update_bits(ac97, AC97_AD_JACK_SPDIF, 1<<11, 1<<11); https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/tree/sound/pci/ac97/ac97_patch.c static unsigned int ad1981_jacks_whitelist[] = { 0x0e11005a, /* HP nc4000/4010 */ 0x103c0890, /* HP nc6000 */ 0x103c0938, /* HP nc4220 */ 0x103c099c, /* HP nx6110 */ 0x103c0944, /* HP nc6220 */ 0x103c0934, /* HP nc8220 */ 0x103c006d, /* HP nx9105 */ 0x103c300d, /* HP Compaq dc5100 SFF(PT003AW) */ 0x17340088, /* FSC Scenic-W */ 0 /* end */ }; static void check_ad1981_hp_jack_sense(struct snd_ac97 *ac97) { if (check_list(ac97, ad1981_jacks_whitelist)) /* enable headphone jack sense */ snd_ac97_update_bits(ac97, AC97_AD_JACK_SPDIF, 1<<11, 1<<11); }
http://cgit.freedesktop.org/pulseaudio/pulseaudio/tree/src/modules/alsa/mixer/paths/analog-output.conf.common another problem is external amplifier defined in [Element External Amplifier] switch = select [Option External Amplifier:on] name = output-amplifier-on priority = 10 [Option External Amplifier:off] name = output-amplifier-off priority = 0 you have to determine it affect which output paths
if (check_list(ac97, ad1981_jacks_blacklist)) return 0; + if (ac97->subsystem_vendor == 0x1028 && + ac97->subsystem_device == 0x01ad) { + snd_ac97_rename_vol_ctl(ac97, "Master Playback", "Line Out Playback"); + snd_ac97_rename_vol_ctl(ac97, "Master Mono Playback", + "Speaker Playback"); + } return patch_build_controls(ac97, snd_ac97_ad1981x_jack_sense, ARRAY_SIZE(snd_ac97_ad1981x_jack_sense)); }
post the output of cat /proc/asound/card0/intel8x0 check whether bit 0 of the global status of your ich controller change when you enable js interrupt by set js1 mode of ac97 registers using echo
https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/tree/Documentation/sound/alsa/Procfile.txt AC97 Codec Information ---------------------- card*/codec97#*/ac97#?-? Shows the general information of this AC97 codec chip, such as name, capabilities, set up. card*/codec97#0/ac97#?-?+regs Shows the AC97 register dump. Useful for debugging. When CONFIG_SND_DEBUG is enabled, you can write to this file for changing an AC97 register directly. Pass two hex numbers. For example, # echo 02 9f1f > /proc/asound/card0/codec97#0/ac97#0-0+regs
0:72 = 1804 0:74 = 1001 0:76 = 2010 cat /proc/asound/card0/intel8x0 Intel8x0 Global control : 0xc0000002 Global status : 0x00700100 SDM : 0x00000008 AC'97 codecs ready : primary AC'97 codecs SDIN : 0 0 0 card*/codec97#0/ac97#?-?+regs Shows the AC97 register dump. Useful for debugging. recompile alsa driver with CONFIG_SND_DEBUG is enabled, you can write to this file for changing an AC97 register directly. Pass two hex numbers. For example, # echo 02 9f1f > /proc/asound/card0/codec97#0/ac97#0-0+regs this change master playback volume register with headphone unplugged set js1 mode bit of ac97 register 0x72 echo 72 1824 > /proc/asound/card0/codec97#0/ac97#0-0+regs plug headphone cat /proc/asound/card0/intel8x0 check bit 0 of global status is set or not repeat the test with line out by set js0 mode if gpi bit of global status was set after jack is plugged we need to add a check of this bit in snd_intel8x0_interrupt and call those ad198x_handle_jp_jack
-- GitLab Migration Automatic Message -- This bug has been migrated to freedesktop.org's GitLab instance and has been closed from further activity. You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/393.
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.