前書き
- Macbook にオーディオインターフェース経由で外部スピーカーを接続してると、スリープ中に異音が出ることがある
- 環境
- M1 Macbook Air 2020(macOS15.5)
- オーディオインターフェース: Scarlett Solo G2
- 対処法
- 似たような問題はあるようだけど対処法がいまいち
- ChatGPT に相談
- 原因(の予想)
- オーディオインターフェースが電力制御またはスリープに入るときのノイズ。
- USB バスの電源制御で信号が一瞬切れることでスピーカーからポップ音が鳴る。
- Mac のスリープ設定によりオーディオ出力が不安定になることがある。
- 解決・軽減方法(の提案)
- オーディオインターフェースの電源を Mac の USB から独立させる
- スリープを無効化する/調整する
- オーディオインターフェースをスリープ時に自動切断する方法
- スピーカー側で自動電源オフを設定
- 原因(の予想)
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
感想
これで外部スピーカーの電源を切り忘れても安眠できる