牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

Macbook にAIF 経由で外部スピーカーに接続してるとスリープ中に「ボッ」と異音が出る問題を対処してみたメモ

前書き

ChatGPTの提案『オーディオインターフェースをスリープ時に自動切断する方法』が良さそうなのでこれで対処してみた

sleepwatcher を利用して対処

sleepwatcher でスリープのオン・オフのタイミングでスクリプトを実行できるっぽい

インストール

switchaudio-osx で『切り替えに使う出力名を確認』と『オーディオ切り替え』をする

$ brew install sleepwatcher
$ brew install switchaudio-osx

出力先を確認

$ SwitchAudioSource -a -t output
Scarlett Solo USB
MacBook Airのスピーカー

スリープ時のスクリプト

動作確認のためのログファイル

$ touch /tmp/sleepwatcher.log

~/.sleep

#!/bin/bash

LOGFILE=/tmp/sleepwatcher.log # 動作確認用
echo "$(date) sleep triggered" >> $LOGFILE # 動作確認用
/opt/homebrew/bin/SwitchAudioSource -c >> $LOGFILE 2>&1 # 動作確認用

# 出力を内蔵スピーカーに切り替え
/opt/homebrew/bin/SwitchAudioSource -s "MacBook Airのスピーカー" -t output

/opt/homebrew/bin/SwitchAudioSource -c >> $LOGFILE 2>&1 # 動作確認用

~/.wake

#!/bin/bash

# 切り替えたい出力先名(正確に記載)
TARGET_DEVICE="Scarlett Solo USB"

# 接続されている出力一覧にScarlettが含まれているかを確認
if /opt/homebrew/bin/SwitchAudioSource -a -t output | grep -q "$TARGET_DEVICE"; then
    # デバイスが存在する場合のみ出力先を変更
    /opt/homebrew/bin/SwitchAudioSource -s "$TARGET_DEVICE" -t output
fi

LOGFILE=/tmp/sleepwatcher.log # 動作確認用
echo "$(date) wake triggered" >> $LOGFILE # 動作確認用
/opt/homebrew/bin/SwitchAudioSource -c >> $LOGFILE 2>&1 # 動作確認用

スクリプトに実行権限を付与

$ chmod +x ~/.sleep
$ chmod +x ~/.wake

sleepwatcher の設定

~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist を作成

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>de.bernhard-baehr.sleepwatcher</string>
  <key>ProgramArguments</key>
  <array>
    <string>/opt/homebrew/sbin/sleepwatcher</string>
    <string>-V</string>
    <string>-s</string>
    <string>{home_dir_path}/.sleep</string>
    <string>-w</string>
    <string>{home_dir_path}/.emacs.d/site-script/sleepwatcher/.wake</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

plist をリロード

$ launchctl unload ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
$ launchctl load ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist

スリープをオン・オフして動作確認

  • スリープ時に指定した内蔵スピーカーへ自動で切り替わる
  • 復帰時に指定した出力へ自動で戻る
  • 結果として「スリープ時のポップノイズ」を回避(されるはず)
$ cat /tmp/ sleepwatcher.log
Sat May 24 15:58:45 JST 2025 sleep triggered
Scarlett Solo USB
MacBook Airのスピーカー
Sat May 24 15:58:56 JST 2025 wake triggered
Scarlett Solo USB

感想

これで外部スピーカーの電源を切り忘れても安眠できる