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

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

TuxOnIce + hibernate-scriptとサウンドについて

復帰後に不具合が起きる場合にはサービス停止/起動で回避する

TuxOnIceを実行するために使用するhibernate-script*1には自動でサービスを停止/開始する*2機能があり、サウンドもその1つとなっていて、Gentoo Linuxでは、/etc/init.d/alsasoundが使用される。
休止状態からの復帰後にサウンド機能に不具合が出る場合には
ファイル名: /etc/hibernate/common.conf

RestartServices alsasound

「RestartServices」でディストリの/etc/init.d/以下のALSAに関するスクリプトの名前を指定することで、hibernate-scriptの実行時に自動的に「休止前に停止・復帰後に開始」して不具合を回避するようになっている。

ハイバネーションではオーディオアプリケーションの状態は保存できない

終了してしまうアプリケーションを復帰後に自動起動させる

オーディオアプリケーションは、「休止」することによる状態の保存は基本的にできない。また、サウンドサービスを再起動すると終了してしまうアプリケーションもあるため、終了してしまうと問題がある場合は、復帰後に自動で起動するようにする。具体的には「TuxOnIceの休止と復帰の実際(3.0-rc1の時点)」に貼ってあるhibernate-scriptのラッパースクリプトの「sudo /usr/sbin/hibernate ${HIBERNATE_OPT}」の行の後ろに

LC_TIME=C gkrellm &
qjackctl &

などのようにして自動起動*3したいものを追加する。上の例ではGKrellM*4QjackCtl

状態の保存について

上にも書いたように、状態保存に関しては基本的にできないが、LASH対応アプリケーションは、セッションを保存することで状態を復元しやすくなっている。非対応のものでも、JACK Audio Connection Kitのポート接続状態に関してはQjackCtlのPatchbay機能である程度制御できる。
関連記事:

手元の環境での覚え書き

手元の環境*5では、ALSAのドライバやライブラリなどを1.0.16にする前までは問題がなかったのだが、ALSAのバージョンを1.0.16にしてからは何故か復帰後に音が出なくなってしまい、ALSA以下をモジュールにした上で「RestartServices」指定したものの何故かダメ*6で、意図する動作*7にならなかった。
試行錯誤の後、「休止前にサウンドを停止し、復帰の早い段階でサウンドを開始」という形に落ち着いた。「UnloadAllModules」*8は指定せず、ALSA関係のモジュールを「UnloadModules」で個別に指定することも行っていない。
ファイル名: /etc/hibernate/common.conf

GentooModulesAutoload yes

StopServices alsasound
OnResume 94 /etc/init.d/alsasound start

下の2行の代わりに「OnResume 94 /etc/init.d/alsasound restart」でも鳴るようにはなったが、QjackCtlを動かしたまま休止すると、ALSA(seq関連)のモジュール関係で確実に復帰後に固まってしまったため、上の形になった。
「GentooModulesAutoload yes」の部分は、他のディストリの場合

LoadModulesFromFile [起動/復帰時に自動で読み込ませるカーネルモジュールのリストファイル]

を指定する。自動で読み込むモジュール一覧ファイルは、Debian/Ubuntuでは/etc/modulesになっている。
(2008/8/31)Linux 2.6.26 + ALSA 1.0.17では、サウンドカードのドライバをカーネル組み込みにしても、復帰後に音が出なくなるということはなくなった。

使用したバージョン:

  • Linux 2.6.23(tuxonice-sources-2.6.23-r9) - 2.6.24(tuxonice-sources-2.6.24-r2)
  • TuxOnIce 3.0-rc5
  • ALSA 1.0.15, 1.0.16
  • JACK Audio Connection Kit 0.109.2
  • QjackCtl 0.3.2

*1:uswsuspとsysfsも使用可能

*2:/etc/init.d/以下のスクリプトを制御する

*3:GUIのアプリケーションは基本的に「&」を付けてバックグラウンド起動する

*4:alsamixerとamixer、GUIのミキサー」で書いている「Volume Plugin」を使用している

*5:「K9NU Neo-V」というマザーボードオンボードサウンドで、ドライバは「hda-intel」、カード名は「HDA ULI M5461」、チップ名は「Realtek ALC883」

*6:正確には、復帰後に手動で「sudo /etc/init.d/alsasound restart」を実行すればうまくいったのだが、それでは不便

*7:自動で「復帰後に音が鳴る」という状態にする

*8:休止前にカーネルモジュールを全て削除したい場合に「yes」を指定