#!/bin/sh
# Is somebody recording this panel's microphone right now? Prints "1" or "0".
#
# Installed to /usr/local/bin/mic-in-use and polled by the touch dock
# (configs/eww/eww.yuck), which turns a "1" into a red LIVE badge.
#
# WHY THIS EXISTS: this panel can be used as a remote microphone by a desktop in
# another room (mic-follow/). That is a deliberate, useful feature, and it is also a
# microphone in a shared flat that somebody elsewhere can open. Such a thing has to be
# visible IN THE ROOM, not only in Home Assistant — anyone standing in the Loggia
# should be able to see that the panel is listening without knowing mic-follow exists.
#
# It reports what is actually capturing, from PipeWire, rather than trusting anything
# about who asked: a stray process recording for its own reasons lights the badge too,
# which is correct for an indicator whose whole job is to be believed.
#
# Monitor streams — something recording what the panel is PLAYING, like a visualiser —
# are not the microphone and must not light it up.
set -eu

command -v pactl >/dev/null 2>&1 || { echo 0; exit 0; }

if command -v jq >/dev/null 2>&1; then
  sources="$(pactl -f json list sources 2>/dev/null || echo '[]')"
  outputs="$(pactl -f json list source-outputs 2>/dev/null || echo '[]')"
  jq -n --argjson s "$sources" --argjson o "$outputs" '
    # The indexes of every monitor source, by either of the two ways one identifies
    # itself.
    [ $s[]
      | select(((.properties["device.class"] // "") | ascii_downcase) == "monitor"
               or (.name | endswith(".monitor")))
      | .index ] as $monitors
    | [ $o[] | select([.source] | inside($monitors) | not) ] | length > 0
    | if . then 1 else 0 end
  ' 2>/dev/null || echo 0
  exit 0
fi

# No jq: fall back to counting capture streams without being able to tell a monitor
# apart. That OVER-reports, which is the right direction to be wrong in for a warning
# light — a badge that is on too often gets questioned, one that is off too often gets
# trusted wrongly.
if pactl list source-outputs 2>/dev/null | grep -q "^Source Output #"; then
  echo 1
else
  echo 0
fi
