En fait dans pixL, deux couches sont importantes à connaitre, Alsa et pulse-audio.
Alsa est la partie basse qui fait partie du kernel linux et qui fournie une API pour les drivers des cartes sons globalement.
Pulse-audio va utilise cette API et qui va être un « serveur » audio pour les applications.
Activer/Désactiver une carte « son »
En fait, dans les PCs maintenant, on a plusieurs hardware qui peuvent fournir du son, la carte mère, une carte son mais aussi les cartes graphiques (via l’HDMI par exemple). Parfois, on peut avoir des conflis.
Comme solution, on peut essayer donc choisir sa « carte » à utiliser pour éviter des conflits
Il suffit de créer en ssh le fichier /etc/modprobe.d/intel.conf avec par exemple le contenu suivant:
options snd_hda_intel enable=1,0
Dans ce cas, la première « carte » audio est activé mais pas la seconde qui aura le nom « snd_hda_intel » (le nom du fichier doit finir par .conf mais son nom à finalement pas beaucoup d’importance)
Si on mets options snd_hda_intel enable=0, on coupera toutes les cartes avec cette dénomination
On peut aussi choisir l’index de la carte (comme une priorité) en fonction du type de carte :
options snd_mia index=0
options snd_hda_intel index=1
Pour voir le résultat, les commandes que l’on peut utiliser en SSH: (dans ce cas, on voit bien que l’on a désactivé les « cartes audio » ) :
# pacmd list-cards
2 card(s) available.
index: 0
name: <alsa_card.pci-0000_04_00.1>
driver: <module-alsa-card.c>
owner module: 6
properties:
alsa.card = "0"
alsa.card_name = "HD-Audio Generic"
alsa.long_card_name = "HD-Audio Generic at 0x803c0000 irq 59"
alsa.driver_name = "snd_hda_intel"
device.bus_path = "pci-0000:04:00.1"
sysfs.path = "/devices/pci0000:00/0000:00:08.1/0000:04:00.1/sound/card0"
device.bus = "pci"
device.vendor.id = "1002"
device.vendor.name = "Advanced Micro Devices, Inc. [AMD/ATI]"
device.product.id = "1640"
device.string = "0"
device.description = "HD-Audio Generic"
module-udev-detect.discovered = "1"
device.icon_name = "audio-card-pci"
profiles:
output:hdmi-stereo: Digital Stereo (HDMI) Output (priority 5900, available: no)
output:hdmi-surround: Digital Surround 5.1 (HDMI) Output (priority 800, available: no)
output:hdmi-surround71: Digital Surround 7.1 (HDMI) Output (priority 800, available: no)
output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) Output (priority 5700, available: no)
output:hdmi-surround-extra1: Digital Surround 5.1 (HDMI 2) Output (priority 600, available: no)
output:hdmi-surround71-extra1: Digital Surround 7.1 (HDMI 2) Output (priority 600, available: no)
output:hdmi-stereo-extra2: Digital Stereo (HDMI 3) Output (priority 5700, available: no)
output:hdmi-surround-extra2: Digital Surround 5.1 (HDMI 3) Output (priority 600, available: no)
output:hdmi-surround71-extra2: Digital Surround 7.1 (HDMI 3) Output (priority 600, available: no)
output:hdmi-stereo-extra3: Digital Stereo (HDMI 4) Output (priority 5700, available: no)
output:hdmi-surround-extra3: Digital Surround 5.1 (HDMI 4) Output (priority 600, available: no)
output:hdmi-surround71-extra3: Digital Surround 7.1 (HDMI 4) Output (priority 600, available: no)
off: Off (priority 0, available: unknown)
active profile: <output:hdmi-stereo>
sinks:
alsa_output.pci-0000_04_00.1.hdmi-stereo/#3: HD-Audio Generic Digital Stereo (HDMI)
sources:
alsa_output.pci-0000_04_00.1.hdmi-stereo.monitor/#4: Monitor of HD-Audio Generic Digital Stereo (HDMI)
ports:
hdmi-output-0: HDMI / DisplayPort (priority 5900, latency offset 0 usec, available: no)
properties:
device.icon_name = "video-display"
hdmi-output-1: HDMI / DisplayPort 2 (priority 5800, latency offset 0 usec, available: no)
properties:
device.icon_name = "video-display"
hdmi-output-2: HDMI / DisplayPort 3 (priority 5700, latency offset 0 usec, available: no)
properties:
device.icon_name = "video-display"
hdmi-output-3: HDMI / DisplayPort 4 (priority 5600, latency offset 0 usec, available: no)
properties:
device.icon_name = "video-display"
index: 1
name: <alsa_card.pci-0000_04_00.5-platform-acp5x_mach.0>
driver: <module-alsa-card.c>
owner module: 7
properties:
alsa.card = "1"
alsa.card_name = "acp5x"
alsa.long_card_name = "Valve-Jupiter-1"
alsa.driver_name = "snd_soc_acp5x_mach"
device.bus_path = "pci-0000:04:00.5-platform-acp5x_mach.0"
sysfs.path = "/devices/pci0000:00/0000:00:08.1/0000:04:00.5/acp5x_mach.0/sound/card1"
device.bus = "pci"
device.vendor.id = "1022"
device.vendor.name = "Advanced Micro Devices, Inc. [AMD]"
device.product.id = "15e2"
device.product.name = "ACP/ACP3X/ACP6x Audio Coprocessor"
device.string = "1"
device.description = "ACP/ACP3X/ACP6x Audio Coprocessor"
module-udev-detect.discovered = "1"
device.icon_name = "audio-card-pci"
profiles:
input:stereo-fallback: Stereo Input (priority 32819, available: unknown)
output:stereo-fallback: Stereo Output (priority 5100, available: no)
output:stereo-fallback+input:stereo-fallback: Stereo Output + Stereo Input (priority 5151, available: unknown)
off: Off (priority 0, available: unknown)
active profile: <output:stereo-fallback+input:stereo-fallback>
sinks:
alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.stereo-fallback/#2: ACP/ACP3X/ACP6x Audio Coprocessor Stereo
sources:
alsa_input.pci-0000_04_00.5-platform-acp5x_mach.0.stereo-fallback/#0: ACP/ACP3X/ACP6x Audio Coprocessor Stereo
alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.stereo-fallback.monitor/#3: Monitor of ACP/ACP3X/ACP6x Audio Coprocessor Stereo
ports:
analog-input-mic: Microphone (priority 8700, latency offset 0 usec, available: unknown)
properties:
device.icon_name = "audio-input-microphone"
analog-input-headset-mic: Headset Microphone (priority 8800, latency offset 0 usec, available: no)
properties:
device.icon_name = "audio-input-microphone"
analog-output-headphones: Headphones (priority 9900, latency offset 0 usec, available: no)
properties:
device.icon_name = "audio-headphones"
# pactl list short cards
0 alsa_card.pci-0000_04_00.1 module-alsa-card.c
1 alsa_card.pci-0000_04_00.5-platform-acp5x_mach.0 module-alsa-card.c
# cat /proc/asound/modules
0 snd_hda_intel
1 snd_soc_acp5x_mach
Voici ce que l’on voit dans /var/log/messages quand on désactive une carte :
Jul 4 08:56:18 RECALBOX user.warn kernel: [ 4.877556] snd_hda_intel: probe of 0000:00:1f.3 failed with error -2
Dans le cas d’une carte activée/activable (le cas quand on a plusieurs cartes) :
Dec 15 05:31:58 RECALBOX user.warn kernel: [ 2.173535] snd_hda_intel 0000:00:1f.3: dmic_detect option is deprecated, pass snd-intel-dspcfg.dsp_driver=1 option instead
Dec 15 05:31:58 RECALBOX user.info kernel: [ 2.173563] snd_hda_intel 0000:00:1f.3: enabling device (0100 -> 0102)
Dec 15 05:31:58 RECALBOX user.warn kernel: [ 2.173786] snd_hda_intel 0000:02:00.1: dmic_detect option is deprecated, pass snd-intel-dspcfg.dsp_driver=1 option instead
Dec 15 05:31:58 RECALBOX user.info kernel: [ 2.173792] snd_hda_intel 0000:02:00.1: enabling device (0100 -> 0102)
Dec 15 05:31:58 RECALBOX user.info kernel: [ 2.173830] snd_hda_intel 0000:02:00.1: Disabling MSI
Dec 15 05:31:58 RECALBOX user.info kernel: [ 2.173834] snd_hda_intel 0000:02:00.1: Handle vga_switcheroo audio client
Dans ce cas, on peut avoir un conflit parce que l’on a le même nom de « driver » mais sur 2 « ports » différents (0000:00:1f.3 et 0000:02:00.1 dans ce cas)
On a aussi cette commande qui peut donenr pleins d’info:
# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC898 Analog [ALC898 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC898 Digital [ALC898 Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 8: HDMI 2 [HDMI 2]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 9: HDMI 3 [HDMI 3]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 10: HDMI 4 [HDMI 4]
Subdevices: 1/1
Subdevice #0: subdevice #0
#
Résoudre les problèmes de « binding »
Si on a pas cela :
# dmesg | grep "bind"
[ 0.217895] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes, linear)
[ 0.218010] TCP: Hash tables configured (established 65536 bind 65536)
[ 7.275686] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
[ 7.813143] snd_hda_intel 0000:01:00.1: bound 0000:01:00.0 (ops nv50_audio_component_bind_ops [nouveau])
#
Mais plutôt cela :
# dmesg | grep "bind"
[ 0.342398] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes, linear)
[ 0.342484] TCP: Hash tables configured (established 131072 bind 65536)
[ 62.538554] snd_hda_intel 0000:00:1f.3: couldn't bind with audio component
[ 62.578900] snd_hda_codec_hdmi hdaudioC0D2: No i915 binding for Intel HDMI/DP codec
[ 62.579828] hdaudio hdaudioC0D2: Unable to bind the codec
#
On peut donc avoir un soucis de disponibilité des cartes audios qui vont s’activer en retard et poser un problème pour garder la configuration des sorties sons pour nos jeux parce que indisponible au démarrage de l’OS et de Pegasus. Ce problème arrive aussi avec les core i7 11ème génération qui demande des kernels plus récents.
Donc il va falloir désactiver les vérifications de compatibilités du drivers i915 dans ce cas.
Comme on peut le voir, le i915 est lié au chipset vidéo intel habituellement :
# dmesg | grep i915
[ 7.231779] i915 0000:00:02.0: vgaarb: deactivate vga console
[ 7.255612] i915 0000:00:02.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=none:owns=io+mem
[ 7.260930] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/kbl_dmc_ver1_04.bin (v1.4)
[ 7.271221] [drm] Initialized i915 1.6.0 20201103 for 0000:00:02.0 on minor 0
[ 7.275686] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
[ 7.278626] fbcon: i915drmfb (fb0) is primary device
[ 7.307007] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device
Il va falloir donc le désactiver pour ne pas être perturbé comme ci-après dans le cas d’un carte nvida sur un PC avec un chipset intel HD graphics, on a le cas où cela se passe mal:
[ 2.194972] i915 0000:00:02.0: Your graphics device 4c8a is not properly supported by the driver in this
[ 2.194972] kernel version. To force driver probe anyway, use i915.force_probe=4c8a
[ 62.578900] snd_hda_codec_hdmi hdaudioC0D2: No i915 binding for Intel HDMI/DP codec
Avant d’activer la commande, on peut vérifier ce qui est déjà actif en terme de paramètres sur le module i915:
# grep -H '' /sys/module/i915/parameters/*
/sys/module/i915/parameters/disable_display:N
/sys/module/i915/parameters/disable_power_well:-1
/sys/module/i915/parameters/dmc_firmware_path:(null)
/sys/module/i915/parameters/edp_vswing:0
/sys/module/i915/parameters/enable_dc:-1
/sys/module/i915/parameters/enable_dp_mst:Y
/sys/module/i915/parameters/enable_dpcd_backlight:-1
/sys/module/i915/parameters/enable_fbc:-1
/sys/module/i915/parameters/enable_guc:0
/sys/module/i915/parameters/enable_hangcheck:Y
/sys/module/i915/parameters/enable_ips:1
/sys/module/i915/parameters/enable_psr:-1
/sys/module/i915/parameters/enable_psr2_sel_fetch:N
/sys/module/i915/parameters/error_capture:Y
/sys/module/i915/parameters/fastboot:-1
/sys/module/i915/parameters/force_probe:
/sys/module/i915/parameters/force_reset_modeset_test:N
/sys/module/i915/parameters/guc_firmware_path:(null)
/sys/module/i915/parameters/guc_log_level:-1
/sys/module/i915/parameters/huc_firmware_path:(null)
/sys/module/i915/parameters/invert_brightness:0
/sys/module/i915/parameters/load_detect_test:N
/sys/module/i915/parameters/lvds_channel_mode:0
/sys/module/i915/parameters/mitigations:auto
/sys/module/i915/parameters/mmio_debug:0
/sys/module/i915/parameters/modeset:-1
/sys/module/i915/parameters/nuclear_pageflip:N
/sys/module/i915/parameters/panel_use_ssc:-1
/sys/module/i915/parameters/psr_safest_params:N
/sys/module/i915/parameters/reset:3
/sys/module/i915/parameters/vbt_firmware:(null)
/sys/module/i915/parameters/vbt_sdvo_panel_type:-1
/sys/module/i915/parameters/verbose_state_checks:Y
#
Donc on va rajouter un options comme conseillé dans le log des messages, on va créer le fichier /etc/modprobe.d/i915.conf avec le contenu suivant:
options i915 force_probe=4c8a
Il est important de bien reprendre l’option comme proposé dans le log avec la bonne valeur comme ici en rouge
Autres commandes pratiques:
Pour connaitre les volumes via pulse audio:
# pactl list sinks | grep -e Name: -e Volume
Name: alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.stereo-fallback
Volume: front-left: 65536 / 100% / 0.00 dB, front-right: 65536 / 100% / 0.00 dB
Base Volume: 65536 / 100% / 0.00 dB
Name: alsa_output.pci-0000_04_00.1.hdmi-stereo
Volume: front-left: 58982 / 90% / -2.75 dB, front-right: 58982 / 90% / -2.75 dB
Base Volume: 65536 / 100% / 0.00 dB
# pactl list sinks | grep -e Name: -e Volume
Name: alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.stereo-fallback
Volume: front-left: 60536 / 92% / -2.07 dB, front-right: 60536 / 92% / -2.07 dB
Base Volume: 65536 / 100% / 0.00 dB
Name: alsa_output.pci-0000_04_00.1.hdmi-stereo
Volume: front-left: 58982 / 90% / -2.75 dB, front-right: 58982 / 90% / -2.75 dB
Base Volume: 65536 / 100% / 0.00 dB
# pactl list sinks | grep -e Name: -e Volume
Name: alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.stereo-fallback
Volume: front-left: 54536 / 83% / -4.79 dB, front-right: 54536 / 83% / -4.79 dB
Base Volume: 65536 / 100% / 0.00 dB
Name: alsa_output.pci-0000_04_00.1.hdmi-stereo
Volume: front-left: 58982 / 90% / -2.75 dB, front-right: 58982 / 90% / -2.75 dB
Base Volume: 65536 / 100% / 0.00 dB
Commande launch a test:
aplay test.wav
Références :
https://shallowsky.com/linux/pulseaudio-command-line.html
https://wiki.archlinux.org/title/Advanced_Linux_Sound_Architecture
https://wiki.archlinux.org/title/PulseAudio/Troubleshooting
Exemple de problèmes:
https://bbs.archlinux.org/viewtopic.php?id=258131
https://bbs.archlinux.org/viewtopic.php?id=180102
https://www.spinics.net/lists/alsa-devel/msg82449.html
Kernel code:
https://github.com/torvalds/linux/blob/v5.7/sound/hda/hdac_i915.c#L140