リブートする度、ランダムにALSA番号が変更されるようなので、起動時にカード番号とデバイス番号を読み取りにゆき、自動的に alias を実行することを試みました。
reboot_work.sh
#!/bin/bash file="/home/user/work/speaker_ctrl/speaker_device.txt" aplay -l | grep -A 3 'USB Audio \[USB Audio\]' > $file led_flash_alt.sh FLASH=1 printf "起動:%sシステムを再起動しました\n" \ `date +%Y年%m月%d日%H時%M分`
3行目の aplay で始まるコマンドでUSBスピーカーの番号をファイル speaker_device.txt に書き込みます。当該システムの場合は
カード 2: Set [C-Media USB Headphone Set], デバイス 0: USB Audio [USB Audio] サブデバイス: 1/1 サブデバイス #0: subdevice #0
という中身になります。その後、 ~/.bash_aliases を
#!/bin/bash file="/home/user/work/speaker_ctrl/speaker_device.txt" CARD=`\ cat $file |\ sed -n 1p |\ sed -e "s/^.*カード//g" |\ sed -e "s/:.*//g"` DEVICE=`\ cat $file |\ sed -n 1p |\ sed -e "s/^.*デバイス//g" |\ sed -e "s/:.*//g"` CARD=`printf "%d" $CARD` DEVICE=`printf "%d" $DEVICE` alias mplayer="mplayer -ao alsa:device=plughw=${CARD}.${DEVICE} " alias aplay="aplay -D plughw:${CARD},${DEVICE} "
と設定しておくことで、mplayer および aplay コマンドの alias を試みています。最後に reboot_work.sh コマンドを
# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed @reboot reboot_work.sh >> /home/user/work/log/auto_job.log 2>&1
と crontab に登録しておくことで、PCを再起動する都度自動的に reboot_work.sh が実行されることとなります。実行順序まで考慮する場合は systemctl (かつての rc.local )の設定が必要となるでしょう。しかし、何でもよいので起動時に実行したい場合は crontab に @reboot 行を挿入するだけで十分そうです。