試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Radeon HD 4200をGNU/LinuxでHDMI接続した際の音声出力に関するメモ(前半)

HDMI端子の存在するPCとディスプレイを接続すると、PCからの音声も映像と一緒に送ることができる。GNU/LinuxではHDMI接続での音声出力はサウンドカードと同じような1つのサウンドバイスとして扱われ、サウンドデーモン(やアプリケーション)から出力先を適切に指定することで音が鳴らせる。
ここでは手元のRadeon HD 4200(オンボードグラフィック)でHDMI接続したときの音声出力についてのメモをまとめる。

  1. 音声が出る条件について <前半>
    1. オンボードグラフィックの場合の前提条件
    2. GNU/Linux上の条件
    3. サウンドドライバについて
  2. Ubuntu 13.10での高速再生問題(更新により修正済み)
  3. PulseAudioで出力先をHDMI出力にする <後半>
  4. 音量調整について
  5. サウンドカードへの入力(ライン入力やマイク)の音声をHDMI出力で聞く
    1. PulseAudioを使用する場合
    2. JACK Audio Connection Kitを使用する場合
  6. Google Chrome上のFlash使用時のノイズについて

音声が出る条件について

オンボードグラフィックの場合の前提条件
オンボードグラフィックのHDMI音声については、BIOS設定でHDMI端子の音声出力に関する設定項目が「有効(Enabled)」になっている必要がある。これが「無効(Disabled)」だとOSからサウンドバイス(つまり音声出力先)として認識されず、音を出すことができない。
手元のマザーボード「A785GMH/128M」では該当する設定項目「Onboard HDMI HD Audio」の既定値が「Disabled」になっており、これを「Enabled」にする必要があった。

GNU/Linux上の条件
バージョン3.11系のカーネルの時点では、Radeon HD 4200ではグラフィックドライバに自由なソフトウェアを使用している場合、カーネルのコマンド行に「radeon.audio=1」を付けないと音が出ない。プロプライエタリな「Catalyst(fglrx)」ドライバを使用している場合、上記指定に関係なく音は出る。
[引用] http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=805c22168da76a65c978017d0fe0d59cd048e995 より

The current RE'd code causes blank screens and display problems on a lot of systems. So disable it by default for now. It can still be enabled by setting the audio parameter to 1. E.g.: radeon.audio=1

上のリンク先の修正が行われた時点(2011年6月)のカーネル内の「radeon」モジュール(「Direct Rendering Manager」と呼ばれるもの)ではHDMI音声を有効にしたときに画面に何も映らないなどの映像出力の問題が多くの環境で確認されているため、Radeon系のグラフィックドライバではHDMI音声はLinux 3.0(2011年7月公開)以上では標準では無効になっており、起動時のオプション指定で有効にしないと動作しないようになっている。とは言っても、手元の環境を含め、問題なく正常に動作する環境もまた多数存在する。
Debian/Ubuntuでは、/etc/default/grubの変数「GRUB_CMDLINE_LINUX」のダブルクォート内に文字列「radeon.audio=1」を追加した後で「sudo update-grub」を実行することで次回以降の起動でこのオプションが付いて音が出るようになる。
なお、HDMI音声とは関係ないが、カーネル起動時のオプションとして「radeon.dpm=1」を付けると動的な電力消費管理の仕組みが利用可能となり(Radeon HD 2400以上かつLinux 3.11以上の環境のみ)、/sys/class/drm/card[番号]/device/power_dpm_stateに対して管理者権限で「performance」「battery」「balanced」のいずれかの文字列を読み書きして用いる。これを適切に設定すると特にGPU低負荷時の電力消費が抑えられるとされる。
(2013/11/14)Linux 3.12以上では、上の方法以外にもradeon.audio=1」を付けずに起動した後でX11環境上で

$ xrandr --output HDMI-0 --set audio on
(もしくは)
$ xrandr --output HDMI-0 --set audio auto

を実行することでも音が出るようになる(手元の環境で確認済み・切り替わり時に画面が一度暗くなる)。「HDMI-0」の数字部分はハードウェア環境によっては変更する必要があるかもしれない。なお、Linux 3.12未満で実行しても処理に失敗して何も変わらない。

(動作カーネルのバージョンを表示)
$ uname -r
3.11.0-13-lowlatency
(実行しても失敗する)
$ xrandr --output HDMI-0 --set audio on
X Error of failed request:  BadName (named color or font does not exist)
  Major opcode of failed request:  140 (RANDR)
  Minor opcode of failed request:  11 (RRQueryOutputProperty)
  Serial number of failed request:  27
  Current serial number in output stream:  27

(2014/9/26)Linux 3.13以上(例:Ubuntu 14.04)では
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=ad41550666f89b5af9335fcde9e98b61190daf99
の修正によって標準でHDMI音声は有効となり、「radeon.audio=1」の指定は不要となっている。

サウンドドライバについて
サウンドドライバはALSAの「Intel HD Audio」ドライバとその「HDMI」コーデックが用いられ、HDMI端子からの音声出力はALSAサウンドカードの1つとして扱われる。そのため、カーネルを自分でビルドする場合、この「Intel HD Audio」や「HDMI」コーデックが無効になっているとドライバがない状態となり音は出ない。

Ubuntu 13.10での高速再生問題(更新により修正済み)

Ubuntu 13.10の初期のカーネルには「radeon.audio=1」オプション付きでカーネルを起動した際にHDMI出力からの音が高速(4倍速?)再生される不具合があり、動画の再生時には映像も早回しになる。これは本家カーネル側の不具合(Ubuntu 13.04のカーネルでは不具合なし)で、Linux 3.11.7時点では修正済みとなっている。カーネル
kernel.ubuntu.com/~kernel-ppa/mainline/
の中のパッケージをインストールして試し確認した。
ディストリのカーネルでも「(linux-image-)3.11.0-13-」系のバージョンの時点で修正済みなのを確認した。

使用したバージョン:

  • Linux 3.11.0-11-lowlatency, 3.11.0-13-lowlatency, 3.11.7