焼失した消えずの霊火堂
Windows11にアップデートできないノートPCに「Linux
Mint」をインストールをしてみました。
最初は体験用USBメモリを作って起動しましたが,やはりレスポンスが遅いため「Linux
Mint」と「Windows10」のデュアルブートで立ち上がるように改良しました。
Linuxは世界中の多くの人が関わって作られたオープンOSであり,日本製PCではマザーボードのピン配列を正しく理解できないことがあるようです。
WindowsはPCの製造元がその辺のところをチューニングしてくれていますが,Linux
のようなオープンな世界ではそうはいきません。
実証に使ったノートPCは「Let’s Note
SX2J」で,日本では名機ですが世界には通用しないようですね。
今回は,Linux
Mintをインストールした旧型ノートPCの音が出ない問題について考えてみたいと思います。
それでは,学習を開始します。
【実証前提条件】
・リユースPC : Let's Note SX2J UEFI非対応 Win10ノートPC
・Linuxアプリ: Linux Mint を利用
1.はじめに
最初に,何故音が出ないかを考えます。Linuxのサウンドシステム「ALSA」は,PCマザーボードにあるサウンドチップ配線ピンを自動推測して各制御デバイス項目(以下,項目という)を「alsamixer」ソフト内に生成します。
しかし,独自設計の多い日本のパソコンでは回路の繋がり方が特殊なため,Linuxのサウンドシステム(ALSAやPulseAudio/PipeWire)がPCサウンドカード(Realtech製オーディオチップ)の端子を正しく認識・マッピングできない時があります。
そのため,音が出ない現象が出現します。
【調査内容】
今回は旧型ノートPC(以下,PCという)である「Let's Note SX2J」を例に「alsamixer」の状態を調査します。
「Linux Mint」デスクトップ画面の左下にあるシステムトレイからターミナルをクリックします。ターミナル画面を開いたら,以下のコマンドを入力します。
LINUXコード
alsamixer
マスター制御画面が出ますので「F6」キーを押して,各制御項目一覧画面を開きます。
①各制御項目一覧画面の操作説明
「Let's Note SX2J」の場合,一番左のマスター音量項目の「unmute(00)」「mute(MM)」を確認してください。「mute(MM)」だと音は出ません。切り替えは「M」キーを押します。
音量調節は「上下矢印」キーで調節します。各制御項目間の異動は「左右矢印」キーで行います。音の発生は,右下のシステムトレイからサウンドアイコンで「サウンドの設定」>「サウンドをテスト」を使います。
②各制御項目の状態と調査内容
最初にPCを立ち上げた状態は,一番左のマスター音量の右隣に「HeadPhone」項目がありますがクリア状態です。
制御項目を右に探していくと「speaker」項目があり,「音量最大」,「 unmute(00)」になっていますが音はでません。
そこで,「HeadPhone」項目に移って「音量最大」とし「unmute(00)」にすると,内蔵スピーカから音がでます。
この状態で「イヤホンジャックを挿入」します。すると「HeadPhone」項目はそのままですが,「speaker」項目はクリアされます。「HeadPhone」から音は流れます。
今度は「イヤホンジャックを抜いて」みます。すると「HeadPhone」項目はクリアされ「speaker」項目が表示されますが内蔵スピーカから音はでません。
これを総括すると詳しい原因はわかりませんが次のようになります。
- PCデバイスは項目として認識されているが,内蔵スピーカ音量は「HeadPhone」項目でコントロールされている。
- イヤホンジャックを挿すと「HeadPhone」項目が表示され「speaker」項目はクリアとなり「Headphone」から音が出る。イヤホンジャックを抜くと「HeadPhone」項目はクリアとなり「speaker」項目が表示されるが内蔵スピーカから音が出ない。
総括すると,「内蔵スピーカの音量制御は「Headphone」項目に依存する」ということになります。内蔵スピーカから音を出したいときは「HeadPhone」項目を表示する必要があるということです。
このことから,LinuxMintのサウンドシステム(ALSAやPulseAudio/PipeWire)がPCサウンドカード(Realtech製オーディオチップ)の端子を正しく認識・マッピングできていないことがわかります。
そのため,対策としては次の2つを考えることができます。
【対策案1】
「Linuxのサウンドシステム(ALSAやPulseAudio/PipeWire)がPCサウンドカード(Realtech製オーディオチップ)の端子を正しく認識・マッピングするよう設定ファイルを修正する。
【対策案2】
PCの立ち上げ時とイヤホンジャックを抜く時に,「HeadPhone」項目が「音量最大」「unmute(00)」になるようにスクリプトを作成し実行する。
2.対策案1
この対策は,Linuxのサウンドシステム(ALSAやPulseAudio/PipeWire)の設定ファイル内容を変更する方法ですが,PCによって変更方法が異なり正確な情報量が少ない現状では不具合を生じさせる恐れがあります。
今回のPC「Let's Note SX2J」では,以下の方法を試しましたが上手く機能しませんでした。
①ALSAシステムの設定ファイル変更 評価✖
ALSA設定ファイル「sudo nano /etc/modprobe.d/alse-base.conf」の一番下の行に,「options snd-hda-intel,model=auto」の行を加える方法で,model値をいろいろ変えて試しましたが効果ありませんでした。
②alsa-tools-guiツール(hdjackretask)でピンを再割り当てする 評価✖
このツールをインストールし使うと,「headphone」と認識されている端子を強制的に「speaker」としてLinuxに再認識させることが出来るのですが,「speaker」項目と「headphone」項目自体は現状正しく認識されているので設定を中止しました。
③「スピーカ」出力時にヘッドホンの音量を連動して動かす 未評価
この方法はLinux Mint のオーディオ管理システム(PipeWireやPulseAudio)の設定ファイルを書き換えてスピーカ出力時に,Headphoneの音量も一緒に連動(マージ)して動かす方法ですが,「alsamixer」自体を制御した方が得策と考え,トライしませんでした。
【結論】
設定ファイルを修正する方法は情報が乏しい事および「alsamixer」をコマンド制御する方が安全で簡単なため,LinuxMintの不具合リスクの観点から対応を中止しました。
3.対策案2
この対策は,PCの立ち上げ時とイヤホンジャックを抜く時に,「HeadPhone」項目が「音量最大」「unmute(00)」になるようにスクリプトを作成し実行する方法です。
①「HeadPhone」項目を「音量最大」「unmute(00)」にするコマンド
最初に「各項目名」を確認するため次のコマンドをターミナルに入力します。
LINUXコード
amixer -c 0 scontrols
次のように出力されます。
Simple mixer control 'Master',0
Simple mixer control 'Headphone',0
Simple mixer control 'Headphone Mic',0
Simple mixer control 'Headphone Mic Boost',0
Simple mixer control 'Speaker',0
Simple mixer control 'PCM',0
Simple mixer control 'IEC958',0
Simple mixer control 'Beep',0
Simple mixer control 'Capture',0
Simple mixer control 'Auto-Mute Mode',0
Simple mixer control 'Headset Mic',0
Simple mixer control 'Headset Mic Boost',0
Simple mixer control 'Internal Mic',0
Simple mixer control 'Internal Mic Boost',0
Simple mixer control 'Loopback Mixing',0
PC起動時にスピーカから音を出すため,次のコマンドを入力します。
LINUXコード
/usr/bin/amixer -c 0 set Headphone 100% unmute
「alsamixer」コマンドを使って「Headphone」項目が「音量最大」「unmute(00)」で出現していることを確認してください。
②「HeadPhone」項目を出現させる実行スクリプト
次に,上記コマンドを使って実行スクリプトファイルを作ります。
LINUXコード
mkdir ~/.local/bin
sudo nano ~/.local/bin/set-headphone.sh
「set-headphone.sh」ファイル内に次のスクリプトを記入します。
~/.local/bin/set-headphone.sh
#!/bin/bash
# 以下に実行したいコマンドを書きます
sleep 1
# 例:Headphoneを音量100%でアンミュートする場合
/usr/bin/amixer -c 0 set Headphone 100% unmute
「sleep 1」は若干余裕を持たせました。無くても動くと思います。
保存(nanoの場合は,Ctrl+O ➜ Enter ➜ Ctrl+X)して閉じた後,実行権限を与えます。
LINUXコード
sudo chmod +x ~/.local/bin/set-headphone.sh
これで,「headphone」項目を「音量最大」「unmute(00)」する実行スクリプトが完成しました。実行スクリプトを作った理由は,「amixer」コマンドを「自動開始させるアプリ」に直接入力すると上手く動作しなかったためです。
「alsactl」コマンドは直接入力しても起動しますが,原因はわかりませんでした。
③実行スクリプトを「自動開始させるアプリ」に登録
今度は,この実行スクリプトをLinuxMintの「自動開始させるアプリ」に登録します。登録欄には以下のように入力します。このアプリはLinuxMintメニューの検索欄から「start」と打つと簡単に見つけられます。
登録欄
bash -c "~/.local/bin/set-headphone.sh"
PCを再起動して音がでることを確認します。
④イヤホンジャックが抜かれた時の対応
Linux
Mintでイヤホンジャックが抜かれた瞬間をトリガーにして特定のコマンドやスクリプトを自動実行するには,「acpid」(ACPIデーモン)を利用します。
Linuxカーネルはイヤホンジャックの抜き差しをハードウェアの電力・状態変化(ACPIイベント)として検知しているため,これをイベントドリブン(イベント駆動型)に活用します。
A.イベント文字列を確認
パソコンのモデルによってイベントの文字列が若干異なるため,実際のイベント文字列を確認します。
ターミナルに次のコマンドを入力します。
LINUXコード
acpi_listen
もしもコマンドが使えない場合は,次のコマンドでインストールした後行います。
LINUXコード
sudo apt install acpid
「acpi_listen」を動作させた状態で,イヤホンジャックを抜きます。この時,画面に以下のような文字列が表示されます。
「jack/headphone HEADPHONE unplug」
この文字列を覚えておきます。
B.acpiと連携する中継用実行スクリプトの作成
検知したイベントと②で作成した実行スクリプトを結びつけます。
/etc/acpi/events/ディレクトリ下に新しい実行スクリプト(動作する中継スクリプトを指定)を作成します。
LINUXコード
sudo nano /etc/acpi/events/headphone-unplug
以下の内容を書き込みます。
/etc/acpi/events/headphone-unplug
event=jack/headphone HEADPHONE unplug
action=/etc/acpi/headphone-unplug.sh
ここで実行スクリプト「/etc/acpi/headphone-unplug.sh」は,②で作成した実行スクリプトを動かす時に必要なユーザ名を変えるための中継スクリプトになります。保存します。
次に中継スクリプトを作ります。
LINUXコード
sudo nano /etc/acpi/headphone-unplug.sh
以下の内容を張り付けます。「ユーザ名」の部分は,自分のLinux
Mintのユーザ名に置き換えてください。
/etc/acpi/headphone-unplug.sh
#!/bin/bash
# 自分のユーザ権限に切替え,~/.local/bin/set-headphone.shを実行する
su - ユーザ名 -c "~/.local/bin/set-headphone.sh"
保存してください。
この中継スクリプトに実行権限を与えます。
LINUXコード
sudo chmod +x /etc/acpi/headphone-unplug.sh
PC起動時に動かす②Headphone項目用実行スクリプトは/home上に作成したため,root上で実行されるacpiと連携する必要から中継用の実行スクリプトを作りました。
C.ACPI設定の反映
「acpid」サービスを再起動して設定を有効化します。ターミナルから以下のコマンドを入力してください。
LINUXコード
sudo systemctl restart acpid
これで,イヤホンジャックが抜かれた瞬間に指定したスクリプト(コマンド)が自動的にバックグランドで実行されるようになります。
4.まとめ
今回は,LinuxMintをインストールした旧型PCで音が出ない問題について実証しました。
3②で作成した「HeadPhone」項目を出現させる実行スクリプトは,「amixer」コマンドを利用しました。
これ以外に「alsactl
init」コマンドを利用することもできます。しかし,これはLinuxのサウンドシステム(ALSA)を初期化させるコマンドとなるため,マスター音量も初期状態になってしまいます。
そのため,「amixer」コマンドで「headphone」項目だけをコントロールするようにしました。
しばらくは,この内容で運用してみたいと考えます。もっといい方法が見つかれば,お知らせしたいと考えますが,みなさんもいろいろお試しください。
それでは,楽しいITリテラシーライフをお過ごしください。
(ご注意)情報の正確性を期していますが,実施される場合には自己責任でお願いします。
0 件のコメント:
コメントを投稿