
Percebi que isso acontece tanto no meu PC ArchLinux quanto no meu MacBook ArchLinux. Preciso receber notificações de aplicativos por meio de tons de áudio curtos e descobri que isso não é um problema devido à notificação de aplicativos, mas ao próprio sistema, e isso acontece em ambos os sistemas, que são muito diferentes.
Quando reproduzo um arquivo de áudio curto, paplay /usr/share/sounds/freedesktop/stereo/message.oga
não ouço na primeira vez que o reproduzo.
Se eu tocar novamente em sequência, eu ouço e é tocado corretamente, sempre repito em sequência.
Se eu esperar cerca de 10 segundos para tocar novamente, ele fica mudo (como no início): soa apenas durante o aquecimento.
O mesmo acontece com o aplay /usr/share/sounds/alsa/Front_Left.wav
, mas como é um tom mais longo, o problema acontece logo no início do arquivo. No começo ouço apenas "t left", faltando "fron". Depois ouço claro e completo: "frente esquerda". Se eu esperar 10 segundos, "não saí" novamente.
O problema não acontece se eu estiver reproduzindo um arquivo de música em segundo plano em um reprodutor de mídia. Isso acontece apenas quando o computador não está reproduzindo nenhum som.
Como consertar isto? (exceto manter o PC tocando um som inaudível no daemon em segundo plano para mantê-lo sempre aquecido)
Sessão de teste relevante onde o problema persiste apenas usando alsa:
~ ❯❯❯ sudo mv /usr/bin/pulseaudio /usr/bin/pulseaudio.bak
~ ❯❯❯ pulseaudio.bak --kill
W: [pulseaudio.bak] main.c: Couldn't canonicalize binary path, cannot self execute.
~ ❯❯❯ paplay /usr/share/sounds/freedesktop/stereo/message.oga
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
~ ❯❯❯ ps axu | grep -i pulse
francis+ 31563 0.0 0.0 10796 2144 pts/2 S+ 14:35 0:00 grep --color=auto -i pulse
~ ❯❯❯ aplay -D plughw:0,7 /usr/share/sounds/alsa/Front_Left.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Left.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
~ ❯❯❯ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: Generic Analog [Generic Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: Generic Digital [Generic Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
~ ❯❯❯ lspci -nn | grep -i audio
00:1f.3 Audio device [0403]: Intel Corporation Device [8086:a2f0]
ATUALIZAR
Após o kernel Linux 4.11.2,O codec ALC1220 está em:
~ ❯❯❯ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC1220 Analog [ALC1220 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC1220 Digital [ALC1220 Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 9: HDMI 3 [HDMI 3]
Subdevices: 1/1
Subdevice #0: subdevice #0
Conectei meus fones de ouvido e consegui reproduzir o problema apenas usando, aplay
mas de forma diferente:
~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/alsa/Front_Left.wav
~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/purple/alert.wav
~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/alsa/Front_Left.wav
~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/purple/alert.wav
...
Tive que reproduzir diferentes arquivos de áudio residentes em diretórios diferentes, ambas as reproduções são cortadas no início se uma for reproduzida e depois a outra, o intervalo entre as reproduções não importa. Se um arquivo for reproduzido uma vez, reproduzir arquivos no mesmo diretório posteriormente não reproduzirá o problema, nem esperará que ele "esfrie" (esperei 1 minuto). O mesmo acontece paplay
ao ativar o pulseaudio. Ao jogar através de HDMI, reproduz em ambos os casos de teste.
ATUALIZAÇÃO 2
Preguiçoso como sou, ainda não relatei isso aos desenvolvedores do ALSA, mas criei umunidade systemd do usuário:
[Unit]
Description=Continuous silence
[Service]
ExecStart=/usr/bin/play -qn
[Install]
WantedBy=default.target
Basta salvá-lo ~/.config/systemd/user/continuous-silence.service
e habilitá-lo com systemctl --user enable continuous-silence
.
Responder1
Partindo do pressuposto de que o sistema de som receptor precisa "acordar" antes de emitir sons, e só o fazdepoisrecebendo o lote inicial de dados de som, descartando o primeiro lote, se isso não puder ser corrigido no sistema de som receptor, uma solução alternativa é gerar silêncio continuamente, por exemplo, com play
from sox
:
play -n
Editar
Com a informação adicional de que funciona no Windows e de que nem a placa de som ("Dispositivo Intel Corporation") nem o Codec ("Genérico") são reconhecidos pelo nome, também é possível que haja algum problema de driver. Há um bit "keep alive enable" (KAE) no Codec, talvez isso precise ser definido, possivelmente por um controle de mixer, mas não sei o suficiente sobre isso.
Registre um bug com os desenvolvedores do ALSA, forneça as lspci -nn
informações e a saída do arquivo cat /proc/asound/card*/codec\#*
. (Você também pode colocar a saída deste último em um pastebin e editar sua pergunta com o link, para que eu possa dar uma olhada).
Responder2
Outra solução para mim aconteceu quando comecei a adotar o Jack Audio Connection Kit acoplado ao pulseaudio-jack, em vez do pulseaudio simples.
Responder3
Corrigido seguindo o wiki sobre como configurar áudio de baixa latência
- Siga a Seção 1.1 no wikihttps://wiki.archlinux.org/title/Professional_audio
- Não instale o kernel AUR do linux-rt
- A reinicialização após concluir a Seção 1.1 deve eliminar a latência
- Caso contrário, prossiga com o resto do wiki e configure o JACK