試験運用中なLinux備忘録

2013/11/30

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

Radeon HD 4200をGNU/Linuxで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使用時のノイズについて

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

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

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

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

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

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

音量調整について

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

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

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

サウンドカードの出力端子から音声を出力する場合、ライン入力やマイクから入ってくる音はミキサーの入力元選択に加えてそのキャプチャ音量(録音レベル)と出力側の音量を正しく設定していれば聞こえてきていた(PulseAudio使用時には入力元選択とキャプチャ音量をpavucontrolでも設定可)。しかし、グラフィックボード(オンボードグラフィック含む)のHDMI端子からの音声は入力端子に接続したサウンドカードとは別のサウンドカードとして扱われることもあり、HDMI接続時には聞こえない(オンボードサウンドとオンボードグラフィック上のHDMI出力の組み合わせでも)。

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

PulseAudioを使用する場合

PulseAudioを使用している場合、「module-loopback」というモジュールを読み込むことで(ライン入力やマイクの)入力音声をそのまま出力(ここではHDMI音声)に渡して聞くことができる。準備として、事前にpavucontrolの「設定」タブで入力のサウンドカードを適切に設定(手元の環境ではオンボードサウンドを使用するために「内部オーディオ」のプロファイルを「アナログステレオ Input」に指定)しておく必要がある。

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

$ 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・音飛びする場合などに調整
  • サンプルレート: 48000か44100(手元の環境では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使用時のノイズについて

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

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

(2013/12/1)/etc/pulse/default.paを「Ubuntu 13.10における幾つかのメモ(2013年10月下旬時点)」の「PulseAudioの設定ファイルなどの場所」で書いたディレクトリにコピーし、

load-module module-udev-detect

の行を

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-13-lowlatency

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

(C) 2007-2015 kakurasan
本ウェブログの表示につきましては、横幅1,000ピクセル以上を推奨します。