USBスピーカーのALSA番号

リブートする度、ランダムに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 行を挿入するだけで十分そうです。