今回は、Ubuntu 12.04においてサウンドサブシステムに新しく追加されたJack Detect[1] という機能、そしてそれを実現するために尽力したCanonical社のエンジニア、David Henningsson の行った仕事を取り上げます。
Jack Detectとは?
Skypeなどでインターネット通話をする際、またはRhythmboxなどの音楽プレイヤーで音楽を聞く際、あるいはブラウザ越しにYoutubeやニコニコ動画を視聴する際に、マイクやイヤホンを使ったことがあるでしょう。この時、コンピューター本体に挿入する端子を「プラグ」 、それを受けるコンピューター本体側の端子を「ジャック」と呼びますが、Windows 7でプラグの挿入、あるいは取り外しを行ってジャックの状態を変えると、アプリケーションによっては自動でその挙動が変わります。これと同じことを実現するのが、Jack Detectです。
Jack Detectを実現するには、対応する実装がサウンドカード、サウンドドライバー、そしてソフトウェア(サウンドサーバー)の3つに必要です。詳しく見ていきましょう。
Jack Detectとサウンドカード
まず、サウンドカードがプラグの挿抜によるジャックの状態変化を検出して信号を発生する必要があります。大抵のマザーボードやラップトップに搭載されているIntel HDA規格のサウンドカードは、標準でこの機能を持っています。
Jack Detectとサウンドドライバー
サウンドカードが発生したジャックの状態変化信号を、サウンドドライバーが適切に処理する必要があります。Ubuntuでは、Linux標準のサウンドドライバーであるALSAがこの役割を果たし、ジャックの状態変化信号に応じたイベントを発生します。
この機能自体は、実はALSAのバージョン1.0.18から実装されています[2] 。しかし、ユーザーランドから見るとALSAのコア機能の処理が不十分で必要な情報が得られず、これまで使われてきませんでした。Linuxカーネル3.3に取り込まれた最新のALSAはこの部分を整備したため、ついに実現可能となりました。現在、Intel HDA規格のサウンドカード及びAsus社のXonar DSシリーズのサウンドカード向けドライバーがこの機能を持っています。
ここでひとつ問題があります。Ubuntu 12.04に採用されているカーネルはLinuxカーネル3.2であり、このカーネルに含まれるALSAではJack Detectの先進的機能が利用できません。そこでDavid Henningssonがバックポート[3] を行い、Ubuntu 12.04のカーネルで利用できるようにしました。
Jack DetectとPulseAudio
サウンドドライバーが発生したイベントを受けて動作を変更するよう、PulseAudioの開発が進められました。この開発を上流で行ったのもDavid Henningssonです[4] 。Jack DetectはPulseAudioのバージョン1.99.1以降がサポートしています。
しかしこのバージョンがリリースされたのは2012年3月であり、Ubuntu 12.04にはパッケージングが間に合いませんでした。そこでDavid Henningssonがバックポートを行い、Ubuntu 12.04のPulseAudioバージョン1.1で利用可能としました。
[4] PulseAudioは2011年6月から2012年3月の6ヶ月間に、そのバージョンを0.9.23から2.0まで上げています。過去のリリースサイクルと比較するとナンバリングの更新の速さが顕著ですが、David Henningssonがその一助となっています。PulseAudio 2.0のリリースノート
新しくなった「サウンドの設定」
これらによってUbuntu 12.04にはJack Detectの機能が追加されました。一般のユーザーは、改良された「サウンドの設定」を操作することでこの機能を体感できます。「 サウンドの設定」を起動するには、デスクトップ右上のスピーカーアイコンを左クリックして表示されるメニューから選択します。
図1 サウンドの設定
Jack Detectを体感するには、マイクのプラグをマザーボードのジャックに差し込んでみるのが簡単です。「 サウンドの設定」の「入力」タブを開いてから、お手持ちのマイクのプラグをマイク用ジャックに挿入します。そうすると大抵の場合、入力のためのサウンドカードが新しく追加されます。
図2 挿入前
図3 挿入後。音声入力のためのサウンドカードが追加されている
おそらくこれだけでは、マイク入力を日常的に使わないユーザーにとってはあまり嬉しくないでしょう。そこでここからは、Linuxのサウンドシステムでよく見られる2つのトラブルがJack Detectによってどう解決されるのかを見ていきます。
HDA Jack Retask
Intel HDA規格のサウンドカードでよく見られるトラブルとして、サウンドシステム周りの設定をどのように変更しても絶対に音声出力できない場合があることが挙げられます。簡単に説明すると、「 ALSAサウンドドライバーを通じてサウンドカードのジャックがたくさん見えてるけど、どのジャックに音声を出力していいか、どのジャックから音声を入力していいかはっきりわからない。いちおうサウンドドライバーのデフォルトのジャックにアサインしたけれど、どうやら間違えているっぽい」状態です。サウンドカードそれぞれのジャック構成表(役割表と言った方がわかりやすいかもしれません)をサウンドドライバーが持つことで対応していますが、市場に出回っている全てのサウンドカードに対応するのは無理があるというのが、このトラブルの要因です。
David Henningssonが開発したHDA Jack Retask は、このトラブルへの一つの対応策です。HDA Jack Retaskに関しては、Ubuntuの Japanese Teamのもうひとつの連載であるUbuntu Weekly Topicsの2011年12月2日号で詳しく紹介している ため、そちらをご覧ください。
なお、HDA Jack Retaskは2012年4月に、ALSAの上流のソフトウェアのひとつであるalsa-toolsに「hdajackretask」として取り込まれました[5] 。残念ながらUbuntu 12.04には間に合いませんでしたが、12.10以降ではパッケージ「alsa-tools」をインストールすることで利用可能になると思います。
HDMI/Displayport音声入出力トラブルの解消
もうひとつのよくあるトラブルが、HDMIやDisplayportで音声出力できないことです。簡単に説明すると「ALSAサウンドドライバーを通じてHDMI/Displayport音声機能のジャックがたくさん見えてるけど、どれに音声を出力していいのか、システムにもユーザーにもさっぱり見当がついてない」状態です。
これまではユーザーがジャックひとつひとつに音声出力をして探っていく必要がありました。現在はシステムがJack Detectを利用し、どのジャックがスピーカーにつながっているのかを自動で把握します。そのためユーザーはジャックとのアサインを特に意識することなく、「 サウンドの設定」で出力先を切り替えるだけで十分となりました。
なお、この一連の修正パッチをALSAの上流に投げたのも、David Henningssonその人です[6] 。
まとめ
Ubuntu 12.04のサウンド機能は、ユーザーが直接目にすることができない部分にかなりの改善が施されました。そしてそこには、David Henningssonの貢献があります。Ubuntuユーザーが報告したバグを調べ、機能改善方法を考案し、それをパッチにして投げるというプロセスで上流に貢献し、UbuntuのみならずLinuxのサウンドシステム全体を改善しました。Ubuntuというエコシステムがうまく機能し、オープンソースソフトウェア全体をよくしたひとつの実例と言えるのではないでしょうか。