Radeon HD 4200をLinuxでHDMI接続した際の音声出力に関するメモ

Last modified: 2021-08-19

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

ここでは手元のRadeon HD 4200(オンボードグラフィック)でHDMI接続したときの音声出力についてのメモをまとめる。

音声が出る条件について

オンボードグラフィックの場合の前提条件

オンボードグラフィックのHDMI音声については、BIOS設定でHDMI端子の音声出力に関する設定項目が “有効(Enabled)” になっている必要がある。これが “無効(Disabled)” だとOSからサウンドデバイス(つまり音声出力先)として認識されず、音を出すことができない。

手元のマザーボード “A785GMH/128M” では該当する設定項目 “Onboard HDMI HD Audio” の既定値が “Disabled” になっており、これを “Enabled” にする必要があった。

GNU/Linux上の条件

バージョン3.11系のカーネルの時点では、Radeon HD 4200ではグラフィックドライバに自由なソフトウェアを使用している場合、カーネルのコマンド行にradeon.audio=1を付けないと音が出ない。

AMDのプロプライエタリドライバを使用している場合、上記指定に関係なく音は出る。

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モジュール1では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追記: xrandrコマンドを使用する方法

Linux 3.12以上では、上の方法以外にもradeon.audio=1付けずに起動した後でX11環境上で

$ xrandr --output HDMI-0 --set audio [on または 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追記: HDMIオーディオが既定で有効に

Linux 3.13以上(例:Ubuntu 14.04)では

http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=ad41550666f89b5af9335fcde9e98b61190daf99

の修正によって標準でHDMI音声は有効となり、radeon.audio=1の指定は不要となっている。

HDMIオーディオ用のサウンドドライバについて

サウンドドライバは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-系のバージョンの時点で修正済みなのを確認した。

PulseAudioで出力先をHDMI出力にする

PulseAudioには既定の出力先(Default Sink)という状態(値)があるので、これを必要に応じて指定することで音声出力先をHDMI出力にすることができる。

“HDMI出力のデバイスの他にオンボードサウンドのみ” といった構成であれば “PulseAudio 音量調節” (以下、コマンド名のpavucontrol)の “設定” タブで

  • “RS880 HDMI Audio [Radeon HD 4200 Series](グラフィックボードの項目・カードにより文字列は異なる)” のプロファイルを “デジタルステレオ (HDMI) 出力” (“オフ” ではないもの)にする
  • “内部オーディオ” (オンボードサウンドの項目)のプロファイルを “アナログステレオ Input” などの出力のないものにする

としてHDMI出力以外の出力がない状態にすれば手っ取り早くHDMI出力が選択できる。

この設定はユーザ単位で保持され、OS起動後に毎回作業を行う必要はない。

音量調整について

HDMI音声では、ALSAのミキサーに音量の調整項目がないためにハードウェアのミキサーでの音量調整ができない。

しかし、PulseAudioを使用していればpavucontrolなどでHDMI音声に対する音量が調整でき、同様にPulseAudioの持つ機能としてアプリケーションごとの音量指定もできる。

サウンドカードへの入力(ライン入力やマイク)の音声をHDMI出力で聞く

サウンドカードの出力端子から音声を出力する場合、ライン入力やマイクから入ってくる音はミキサーの入力元選択に加えてそのキャプチャ音量(録音レベル)と出力側の音量を正しく設定していれば聞こえてきていた2

しかし、グラフィックボード(オンボードグラフィック含む)のHDMI端子からの音声は入力端子に接続したサウンドカードとは別のサウンドカードとして扱われることもあり、HDMI接続時には聞こえない(オンボードサウンドとオンボードグラフィック上のHDMI出力の組み合わせでも)。

しかし、これはサウンドサーバをうまく用いれば解決できる。

PulseAudioを使用する場合

PulseAudioを使用している場合、module-loopbackというモジュールを読み込むことで(ライン入力やマイクの)入力音声をそのまま出力(ここではHDMI音声)に渡して聞くことができる。

準備として、事前にpavucontrolの “設定” タブで入力のサウンドカードを適切に設定3しておく必要がある。

コマンドを用いてこのモジュールを追加読み込みするには下のようにする。

$ pacmd load-module module-loopback

もしうまく鳴らない場合はpavucontrolの “入力装置” タブでポート(入力元)や音量を確認の上で “録音” タブの “見る” という一覧で “All Streams” か “Virtual Streams” を選択して “Loopback to RS880 HDMI Audio [Radeon HD 4200 Series] デジタルステレオ (HDMI) から” のような名前のmodule-loopbackモジュールの項目のボタンがサウンドカードの項目(手元の環境では “内部オーディオ アナログステレオ”)になっているかを確認する。

このモジュールは読み込むとCPU資源を若干使用する(PulseAudioデーモンのCPU使用率が少し上がる)。

必要がなくなったら

$ pacmd unload-module module-loopback

でモジュールを破棄することもできる。

JACK Audio Connection Kitを使用する場合

JACK Audio Connection Kitでは、キャプチャ側のカードと出力側のカードをデーモン起動時に適切に指定した上でsystemの出力(読み込み)ポートと入力(書き込み)ポートとを接続することで、あるサウンドカードの入力端子からの音声を別のサウンドカードへ出力することができる。

この接続は前述のPulseAudioのmodule-loopbackモジュールと同様の働きをする。

手元の環境ではオンボードサウンドがhw:0でHDMI出力がhw:1,3となっているため

$ jackd -P85 -dalsa -r48000 -p2048 -n2 -Xseq -D -Chw:0 -Phw:1,3

などのように起動すると、オンボードサウンドの入力端子からの出力ポートとHDMI音声出力への入力ポートが同時に利用できる状態になるため、これらのポートを接続することでオンボードサウンドの入力端子からの音をHDMI出力で鳴らすことができる。

ただし、JACKデーモンの設定によってはリアルタイム優先度に関する権限を設定した上でリアルタイム優先度を高くしても音飛びが発生する場合もあり、その場合は-p-nといったオプションの値を上げてJACKデーモンの遅延が大きくなるようにする。

GUIのQjackCtlでは

  • ドライバー: alsa
  • オーディオ: 入出力
  • 入力デバイス: hw:[サウンドカードのサウンドカード番号,デバイス番号] (手元の環境ではhw:0)
  • 出力デバイス: hw:[HDMI音声のサウンドカード番号,デバイス番号] (手元の環境ではhw:1,3)
  • フレーム/ピリオド: 音飛びしなければ1024など・音飛びが起こる場合は高くして遅延を大きくする
  • ピリオド/バッファー: 2・音飛びする場合などに調整
  • サンプルレート: 4800044100(手元の環境ではHDMI出力はこれら2つの値のみ対応)

などのようにする。

2014/9/10追記: Ubuntu 14.04のカーネルでは手元の環境ではこの起動の仕方ではうまく動作しないため、この方法は使えない。

ポートの接続/切断の操作は、コマンドでは

(接続)
$ jack_connect "system:capture_1" "system:playback_1"; jack_connect "system:capture_2" "system:playback_2"

(切断)
$ jack_disconnect "system:capture_1" "system:playback_1"; jack_disconnect "system:capture_2" "system:playback_2"

とし、GUIのQjackCtlでは “接続” ダイアログの “オーディオ” タブで左右のsystemどうしを選択して “接続” “切断” のボタンで操作する。

JACK Audio Connection Kit使用時にPulseAudio(のJACKモジュール・Debian/Ubuntuではパッケージ名pulseaudio-module-jack)も使用する場合、PulseAudioの出力先はpavucontrolの “出力装置” タブの “Jack sink (PulseAudio JACK Sink)” の “代替として設定” ボタンを押すとPulseAudioの既定の出力先(Default Sink)がJACKへの出力になり、PulseAudioへ出された音がJACK経由で出るようになる。PulseAudioの音量調整は同タブの “Jack sink (PulseAudio JACK Sink)” でできる。

Google Chrome上のFlash使用時のノイズについて

Flash Playerは2020年末で提供およびサポートが終了している。

手元の環境では、PulseAudio使用時にGoogle ChromeでFlashプラグインから音の出るサイト(動画サイトなど)でHDMI出力から音を出すとノイズが入ってしまう。バージョン11.2系のFlashをMozilla Firefoxで使用した場合にはノイズは出ない。

ただ、PulseAudioの代わりにJACK Audio Connection Kitのデーモンを動かしてPulseAudioのJACKモジュールを読み込んでJACK経由で出力されるようにするとGoogle Chromeでもノイズが入らなくなる。

2013/12/1追記: PulseAudioのみの使用でノイズが出ないように設定する

この件については/etc/pulse/default.pa${XDG_CONFIG_HOME}/pulse/(XDG_CONFIG_HOME未定義時は[ホームディレクトリ]/.config/pulse/)にコピーし

[一部]ファイル名:default.pa
load-module module-udev-detect

の行を

[一部]ファイル名:default.pa
load-module module-udev-detect tsched=0

として上書きしてからPulseAudioデーモンを起動し直す(再起動などでも可)と、PulseAudioを使用していてもノイズは出なくなった。

このtschedという引数はモジュール一覧にあるmodule-udev-detectモジュールからmodule-alsa-sinkモジュールに渡されて “システムタイマーに基づくスケジューリング(glitch-free)” を無効化するもので、一部のサウンドカードではこれをしないと問題が出ることがあるようだ。

なお、一般ユーザのdefault.paを配置する代わりに管理者権限で/etc/pulse/default.pa側を編集する方法もある。

(管理者権限で直接/etc/pulse/default.paをノイズが出ないように変更・全ユーザに有効)
$ sudo sed -i 's/\(load-module module-udev-detect\)/\1 tsched=0/' /etc/pulse/default.pa
  • 使用したバージョン
    • PulseAudio 4.0
    • JACK Audio Connection Kit 1.9.10
    • QjackCtl 0.3.10
    • Google Chrome 31.0.1650.57
    • Flash(NPAPI版) 11.2.202.327
    • Linux 3.11.0-11-lowlatency, 3.11.0-13-lowlatency, 3.11.7

  1. “Direct Rendering Manager” と呼ばれるもの ↩︎

  2. PulseAudio使用時には入力元選択とキャプチャ音量をpavucontrolでも設定可 ↩︎

  3. 手元の環境ではオンボードサウンドを使用するために “内部オーディオ” のプロファイルを “アナログステレオ Input” に指定 ↩︎