ご紹介するトピック
macOS の OSコマンドで、以下2点を行うコマンドの使い方です。
- Macでオーディオ出力中を判定する
- Macでオーディオ再生の 「開始」 / 「停止」 を監視する
ほとんどのMacBookユーザーが検討するであろう Amphetamine を使用していますが、細かいところで満足できなくなり、蓋を閉じた時の挙動を制御することを検討中です。 MacBookの蓋を閉じた時、音楽などを再生中ならスリープせず、再生が終わればスリープする。そんな事をしたくて調べています。
環境
- MacBook Pro 2019
- macOS Monterey 12.2.1
1. Macでオーディオ出力中を判定する
sample.sh
#!/bin/bash
pmset -g | grep -e "sleep" | grep -e "coreaudiod"
# 行が見つかればオーディオ再生中
説明
- 現時点で オーディオ出力しているか否か を判定します。
- pmset コマンドは、macOSの電源管理設定コマンド。
- -g オプションで現在の電源関連の設定値を出力します。
- コマンド出力に「スリープ」に関する設定が含まれており、スリープ防止プロセスの名前が付記されています。
- スリープ防止プロセスに「coreaudiod」が含まれていると、「出力中」という事になります。
- オーディオ出力を止めれば、上記から「coreaudiod」は消えます。
※ スリープ防止と言っても、MacBookの蓋を閉じた時のスリープには効きません。
補足
- 判定できるオーディオ出力の音源は何でも良さそうです。 音を出していれば。
ミュージック.appでの音楽再生、ブラウザでの動画再生、他の機器(iPhone等)からAirPlay経由で受信した音源の再生など判定できました。 - オーディオの出力先も何でも良さそうです。本体のスピーカー、Bluetoothスピーカー、AirPlayの再生先でも判定できました。
その他
- オーディオ出力をミュートした場合は 「出力していない」 扱いになります。 (個人的にはその方が良い)
- 再生は即時反映されますが、出力停止の反映は、数秒かかります。
2. Macでオーディオ再生の 「開始」 / 「停止」 を監視
sample.sh
log stream --style compact \
| grep --line-buffered -e "CoreAudio" \
| grep --line-buffered -e "::StartIO" -e "::StopIO"
説明
- 音を出すプロセスからの 出力開始 / 出力停止 リクエストを拾うコマンド使用法です。
- log stream は、macOS の システムログを tail -f のように、待ち受け表示します。
- システムログには、coreaudiod のイベントが頻繁に書き込まれています。
- その中にオーディオ出力の 「開始」 / 「停止」 のイベントが含まれており、それを拾います。
- grep は、抽出結果をバッファリングするので --line-buffered をつけます。
注意点
- 厳密には、coreaudiod が、音を出すプロセスからの StartIO / StopIO リクエストを受け付けた/処理したイベントを拾っているだけ、オーディオ出力の有無を総合的に判断できるわけではありません。
- OSの通知音(ポーン等)でも StartIO / StopIO が発生します。
- 音楽の再生などでは、曲と曲の切れ目でも StopIO / StartIO が発生します。
- つまり、音楽再生など、イメージしているオーディオ出力以外にも、時報読み上げ、通知音、何かの警告音など、細かいことに反応する事が想定されます。
- ちょっと敏感で使えないかも。
近いうちに、活用編を投稿したいものです。。。