HDMIの音声頭欠けとの闘い

音が出ない?

諸事情でハーティーラダーという入力支援ソフトの環境を構築している。
PC画面ともう一枚画面があった方が何かと都合がよいので、HDMI接続のモバイルモニターを使用したのだが、予想外の問題が発生してしまった。

音声が出ない。

いや、正確には出たり出なかったりする。
もっと正確には、音声の最初の方がちょっと欠けている。
ハーティーラダーの場合、ひらがな単音とかの短い音声の場合が多いので、体感上は「出ない」という認識になるのである。
ググってみるとこれはHDMIの音声頭欠けとして知られている現象らしい。
PCのチップか何かによって発生するものがあるようだ。
どうやらはずれを引いた。

無音再生の術(ごり押し解決)

この問題には常套手段があるらしく、ずばり、無音の音声を延々と再生し続けるというものである。
要は、頭が欠けるならずっと再生すればいいじゃない、無音だっていいじゃないごり押しだもの、というわけである。
これぞごり押しというレベルのごり押しである。
潔くて美しさすら感じる。

この種のソフトはググればいくつか見つかるが私はこちらの「SoS.exe」を使用させて頂きました。作者様ありがとうございます。

ひとまず、起動中はこれで問題なく、ちゃんと途切れずに再生されるようになった。
しかしまだ大きな問題が隠されていたのである。

スリープしたらダメじゃん

うまくいったぞとすっかり安心してひとまずPCをスリープ。
1時間後、おもむろにスリープから復帰すると、、、

全然音出ないじゃん。

訳も分からず「SoS.exe」のメニューを確認してみると、なんとHDMIの認識が外れている。
どうやらスリープ時にデバイスの接続が切れてしまって手動で再認識するまでHDMIを見失うようだ。
これは困った。ハーティーラダーは起動になかなか時間がかかるので、是が非でもスリープ復帰の形で使いたいのだ。
もちろん手動で再認識というのは選択肢に入らないので(基本的にPCに不慣れな人が使用するので余計な操作は極力省く必要がある)、何としても自動的に再認識させなくてはならない。

ザキオリクの術

ザキオリクというのはザキとザオリクを合わせた造語である。
私が今さっき思いついたのでググっても無駄である。
語感から想像がついた人も多いとは思うのだが、要はいったんキルして再起動するだけである。
あまりに簡単なのでせめて名前で重厚感を出そうと企んだわけである。
(失敗した可能性が高いことは既に認識しているので突っ込まないでね)

スリープ復帰に合わせてザキオリクを唱えれば勝手に再認識(というか再起動に伴う初期認識だが)までやってくれるであろうという、まあ、それだけの話なのだが、無駄にダラダラ書き連ねるとなんだかありがたみも増すというものだよ。

ザキオリクの中身

やることは単にこれだけである。

  1. 「taskkill.exe」で「SoS.exe」を終了させる
    C:\Windows\System32\taskkill.exe /im SoS.exe

  2. 「SoS.exe」を再起動する
    <SoS保存先>\SoS.exe

ザキオリクの仕込み

さて、スリープ解除に合わせてこれを実行すればいいわけだが、仕込み方が少々特殊である。
スタートアップのようなお手軽な窓口は用意されていないので、スリープ解除を検知して動作するようなイベント駆動型のタスクを登録する。
タスクスケジューラを使って次のようにされたし。

  1. タスクスケジューラで「基本タスクの作成」をする

  2. 名前はもちろん「ザキオリク」(※各自で自由に決めてください)

  3. トリガーは「特定イベントのログへの記録時」

  4. 設定は次のように(これがスリープ復帰の目印)
    ログ「システム」(遥か下の方にあるよ)
    ソース「Power-Troubleshooter」
    イベントID「1」

  5. 操作は「プログラムの開始」

  6. 設定は次のように
    プログラム/スクリプト「C:\Windows\System32\taskkill.exe」
    引数の追加「/im SoS.exe」

  7. 完了

しかし、これはまだザキである。
ここにオリク(※ザオリクです)を追加する。

  1. 「アクティブなタスク」で先ほど作成した「ザキオリク」(※適宜読み替えてください)をダブルクリック

  2. さらにダブルクリックするか、「ザキオリク」のプロパティで詳細表示

  3. 「操作」タブで「新規」を押して操作を追加

  4. 設定は以下のように
    操作「プログラムの開始」
    プログラム/スクリプト「<SoS保存先>\SoS.exe」

  5. ちょっと理由は忘れてしまったが、「設定」タブで以下を指定
    「要求時に実行中のタスクが終了しない場合、タスクを強制的に停止する」にチェック
    タスクが既に実行中の場合に適用される規則「既存のインスタンスの停止」
    (※これを設定しないとスリープ復帰を繰り返した時に何かまずかったような気がするのだが記憶が定かではない)

ここにザキオリクは完成した。
もうスリープし放題だよ。

備考

今のところこれでうまくいっている様子ではあるが保証はありませんのであしからず。
なお、スリープに入る際にはソース「Kernel-Power」ID「42」のイベントが発生するのでtaskkillについてはこれでもいけそうな気もするのだが、ちょっと試したときに何か変なことが起こってやめたようである。これも記憶が定かではない。
たぶん頑張ればそっちでも行けるのだろうが、スケジュール登録1個の方が楽だし、今回は忘れてしまおう。

この記事が気に入ったらサポートをしてみませんか?