Eu recentemente atualizei meu computador para o Ubuntu 14.04.
Após a atualização, o sistema não reproduz mais algumas músicas que eu reproduzi via crontab.
As linhas crontab são assim:
0 9 * * 1-5 /usr/bin/mpg123 -q /home/user/Music/song.mp3
Não recebo nenhum erro do cron ao executar o comando. Se eu executar o comando manualmente via SSH, a música será reproduzida com sucesso.
Anexei o comando em crontab com 'env' para obter uma melhor compreensão do ambiente sob o qual o cron executa o trabalho:
0 9 * * 1-5 env; /usr/bin/mpg123 /home/user/Music/song.mp3
Isso gerou a seguinte saída:
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
Para tornar o shell interativo da minha conexão ssh mais parecido com o cron no qual estou executando, eu anoto tudo menos o ambiente especificado:
for a in 'env | awk -F= '{ print }' | grep -v "HOME\|LOGNAME\|PATH\|LANG\|SHELL\|PWD" | xargs'; do unset $a; done
Depois disso, a cópia copy + paste do crontab não produz mais nenhum som. O programa parece reproduzir o arquivo no entanto:
$ /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.
Levando-me a acreditar que o som é enviado para o dispositivo errado.
Mudar para reproduzir o seguinte não produz som:
$ 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
Mas especificando que este dispositivo é reproduzido por HDMI como pretendido:
$ 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
Como posso definir esse dispositivo como o padrão do sistema?
(O que parece ser sempre que eu tenho um ambiente mais rico.)
Como alternativa, como posso forçar o mgp123 a usar o dispositivo correto?
O dispositivo ALSA plughw: CARD = NVidia, DEV = 3 está correlacionado a um dispositivo em / dev?
O mpg123 permite que você especifique um dispositivo em particular como este:
-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.
Os dispositivos plughw em 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
Parece combinar com os pcmC0D? p-devices em / dev / snd:
$ ls /dev/snd/ | egrep [013]p
pcmC0D0p
pcmC0D1p
pcmC0D3p
Mas usá-lo não parece ajudar o 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)
Eu realmente não entendo o que a ALSA e / ou o PulseAudio são em relação a isso.
Nem parece funcionar no ambiente limitado:
$ pactl list cards
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
$ alsamixer
Error opening terminal: unknown.
Ambos os comandos funcionam com o conjunto de variáveis de ambiente "normal".
Eu baixei e executei alsa-info.sh, primeiro com ambiente "normal":
link
Quando tentei executá-lo com a maioria das variáveis de ambiente não configurada, recebi um erro.
Após a configuração:
export TERM=xterm
Eu recebi o script novamente. Resultado aqui:
link
EDITAR:
Uma investigação mais aprofundada da desativação da variável de ambiente mostra que eu só tenho que desarmar XDG_RUNTIME_DIR para interromper a reprodução.
$ unset XDG_RUNTIME_DIR
EDIT2:
Se eu abandonar o mgp123 para o cvlc, recebo som ao jogar via crontab da seguinte forma:
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