J'ai récemment mis à niveau mon ordinateur vers Ubuntu 14.04.
Après la mise à niveau, le système ne lit plus les quelques chansons que je faisais jouer via crontab.
Les lignes de crontab ressemblent à ceci:
0 9 * * 1-5 /usr/bin/mpg123 -q /home/user/Music/song.mp3
Je ne reçois aucune erreur de cron lors de l'exécution de la commande. Si je lance la commande manuellement via SSH, la chanson est jouée avec succès.
J'ai préfixé la commande dans crontab avec 'env' pour mieux comprendre l'environnement dans lequel cron exécute le travail:
0 9 * * 1-5 env; /usr/bin/mpg123 /home/user/Music/song.mp3
Cela a généré la sortie suivante:
HOME=/home/user
LOGNAME=user
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
Shell=/bin/sh
PWD=/home/user
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
version 1.16.0; written and copyright by Michael Hipp and others
free software (LGPL) without any warranty but with best wishes
Directory: /home/user/Music/
Playing MPEG stream 1 of 1: song.mp3 ...
MPEG 1.0 layer III, 320 kbit/s, 44100 Hz stereo
Comment: 00000000 00000210 00000AA0 000000000058C5D0 00000000 00506FD7 00000000 00000000 00000000 00000000 00000000 00000000
[2:11] Decoding of song.mp3 finished
Pour que le shell interactif de ma connexion ssh ressemble davantage à celui qui est exécuté par cron, je désactive tous les paramètres sauf les variables d’environnement spécifiées:
for a in `env | awk -F= '{ print $1 }' | grep -v "HOME\|LOGNAME\|PATH\|LANG\|Shell\|PWD" | xargs`; do unset $a; done
Et après ce changement, copier + coller de crontab ne produit plus aucun son. Le programme semble lire le fichier cependant:
$ /usr/bin/mpg123 /home/user/Music/song.mp3
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
version 1.16.0; written and copyright by Michael Hipp and others
free software (LGPL) without any warranty but with best wishes
Directory: /home/user/Music/
Playing MPEG stream 1 of 1: song.mp3 ...
MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo
[2:51] Decoding of song.mp3 finished.
Cela me porte à croire que le son est simplement émis vers le mauvais périphérique.
Passer à un jeu, le suivi ne produit aucun son:
$ aplay /usr/share/sounds/alsa/Front_Center.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
Mais spécifier que cet appareil joue sur HDMI comme prévu:
$ aplay -D plughw:CARD=NVidia,DEV=3 /usr/share/sounds/alsa/Front_Center.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
Comment puis-je définir ce périphérique comme système par défaut? (Ce qui semble être chaque fois que j'ai un environnement plus riche.)
Sinon, comment puis-je forcer mgp123 à utiliser le bon périphérique? Est-ce que le périphérique ALSA : CARD = NVidia, DEV = 3 est en corrélation avec un périphérique dans/dev?
mpg123 vous permettra de spécifier un périphérique particulier comme ceci:
-a dev, --audiodevice dev
Specify the audio device to use. The default is system-dependent (usually /dev/audio or /dev/dsp). Use this option if you have multiple audio
devices and the default is not what you want.
Les appareils multifonctions dans alsa:
$ aplay -L | grep plughw -A2
plughw:CARD=NVidia,DEV=0
HDA NVidia, ALC889A Analog
Hardware device with all software conversions
plughw:CARD=NVidia,DEV=1
HDA NVidia, ALC889A Digital
Hardware device with all software conversions
plughw:CARD=NVidia,DEV=3
HDA NVidia, HDMI 0
Hardware device with all software conversions
Semblent correspondre avec les pcmC0D? P-devices dans/dev/snd:
$ ls /dev/snd/ | egrep [013]p
pcmC0D0p
pcmC0D1p
pcmC0D3p
Mais son utilisation ne semble pas aider mpg123:
$ /usr/bin/mpg123 -q -a /dev/snd/pcmC0D3p /home/user/Music/song.mp3
[oss.c:129] error: Can't reset audio!
[mpg123.c:690] error: ...in decoding next frame: Unable to set up output format! (code 1)
Je ne comprends pas vraiment ce que sont ALSA et/ou PulseAudio à cet égard.
Ni semblent fonctionner dans l'environnement limité:
$ pactl list cards
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
$ alsamixer
Error opening terminal: unknown.
Les deux commandes fonctionnent avec les variables d'environnement "normales".
J'ai téléchargé et exécuté alsa-info.sh, d'abord avec un environnement "normal":
http://www.alsa-project.org/db/?f=e2be8ceb9ef289ff9ef95557396dd82b88f337e
Lorsque j'ai essayé de l'exécuter avec la plupart des variables d'environnement non définies, j'ai reçu une erreur.
Après avoir mis:
export TERM=xterm
J'ai relancé le script. Résultat ici:
http://www.alsa-project.org/db/?f=67fdd80bd55c76cd6dd30c981bf02fe66ba3d9d6
MODIFIER:
Une analyse plus poussée de la suppression de la variable d'environnement montre qu'il ne me reste plus qu'à désélectionner XDG_RUNTIME_DIR pour interrompre la lecture.
$ unset XDG_RUNTIME_DIR
EDIT2:
Si j’abandonne mgp123 pour cvlc, j’ai un son lorsque je joue via crontab comme ceci:
0 9 * * 1-5 /usr/bin/cvlc -q --alsa-audio-device="hw:0,3" --play-and-exit /home/user/Music/song.mp3 2> /dev/null
Lorsque vous utilisez la connexion ssh, essayez d’ajouter votre utilisateur au groupe "audio":Sudo usermod -aG audio username
redémarrez et testez qu’alsamixer est bon, vous pouvez ainsi régler les volumes: vous devrez probablement appuyer sur F6 pour sélectionner le troisième appareil.
Ensuite, dans mon cas, je peux lire le son connecté par ssh sur un ordinateur distant sans serveur X en utilisant:
cvlc --alsa-audio-device="hw:0,3" /usr/share/sounds/alsa/Front_Center.wav
mpg123 -a hw:0,3 Musique/test.mp3
Notez que dans mon cas, pulseaudio est désactivé sur le PC distant (la désactivation n’est pas utile car pulseaudio est démarré via une session X et lightdm). Pour vérifier que pulseaudio est désactivé et qu'il ne soit pas auto-réactivé, exécutez plusieurs fois killall -9 pulseaudio
Donc, je viens de définir la variable d'environnement XDG_RUNTIME_DIR
de la même manière que dans mes shells de travail, et cela fonctionne. J'ai trouvé cette page parce que j'avais le même problème lorsque j'essayais de faire jouer le son à partir de tâches cron - mpg123 semblant penser que le fichier était bon, mais sans audio. La définition de cette variable a corrigé le problème.