2009年2月2日月曜日

USBヘッドホンのinputデバイス利用

Linux上でUSBヘッドホンのボタンにコマンドを割り当てるコードを書き
inputデバイスとして使えるようにしてみました。
そのコードと関係するudevの設定についての記事です。


PCで音を聞くのにUSBヘッドホンを愛用してます。
アナログヘッドホンとは違い雑音知らず、かつ、USBポートにさくさく接続でき便利。
また、ヘッドホン自体に操作用のボタンがついており、音量調節等をマウスやキーボードに
触らずできたりします。

もう生産終了してますがこちらの製品を愛用しています。
オーディオテクニカ社 ATC-HA7USB
http://www.audio-technica.co.jp/products/hp/pc/atc-ha7usb.html


最近はワイヤレスの製品も出ているようです。
ラトックシステム社 REX-WHP2
http://www.ratocsystems.com/products/subpage/rexwhp1u.html


 



ただ、Linuxだと専用のドライバーがなくUSBヘッドホンのボタンが使えなかったり、
Windows等のOSでもボタンに別の機能を割り当てられず、不満がありました。

そこでLinux向けにATC-HA7USB用のコードを書いてみました。
以下のようにコンパイルして実行します。
$ gcc -Wall -O2 -o atc-ha7usb atc-ha7usb.c
$ strip atc-ha7usb
$ ls -l atc-ha7sub
-rwxr-xr-x 1 user user 3576 Feb 2 18:10 atc-ha7usb
$ ./atc-ha7sub


udevの設定

USB接続なので端子を抜き差しするたびにデバイスの名前が変わる可能性があります。
そこで、毎回同じ名前(例では"/dev/input/atc-ha7usb")で使用できるようにします。
また、このinputデバイスを一般ユーザーでも読めるようにします。

Linuxのディストリビューションはdebian-lennyを使っています。
/etc/udev/rules.d/10-local.rulesを作成します。内容は以下のものです。
SUBSYSTEMS=="input", ATTRS{name}=="Audio-Technica.corp ATC-HA7USB", SYMLINK="input/atc-ha7usb", MODE="0640", GROUP="user"

この後USBヘッドホンを抜き差しすれば/dev/input/atc-ha7usbとして認識されるようになりました。
udevの再起動は特に必要ありませんでした。

$ ls -al /dev/input
lrwxrwxrwx 1 root root 6 Feb 2 18:10 atc-ha7usb -> event0
drwxr-xr-x 2 root root 100 Feb 2 17:42 by-id/
drwxr-xr-x 2 root root 140 Feb 2 18:10 by-path/
crw-r----- 1 root user 13, 64 Feb 2 18:10 event0
crw-rw---- 1 root root 13, 65 Feb 2 17:42 event1
crw-rw---- 1 root root 13, 66 Feb 2 17:42 event2
crw-rw---- 1 root root 13, 63 Feb 2 17:42 mice
crw-rw---- 1 root root 13, 32 Feb 2 17:42 mouse0

実際には、event*へのシンボリックリンクになります。
以上の例ではevent0へリンクされ、group"user"も読めるようになっていることが分かります。


原理的にどんなコマンドでもUSBヘッドホンのボタンに割り当てられるようになりました。
素早くボリュームアップボタンを2連打すると次の曲へ!というような利用もできそう。
少し便利になりました。


参考リンク

Linux Input Subsystemの使い方
http://www.aya.or.jp/~takuo/input_subsystem/input_subsystem.html


udevルールの書き方
http://www.gentoo.gr.jp/transdocs/udevrules/udevrules.html



環境

OS: Linux
debian-lenny(i386)