This commit is contained in:
85
scripts/configure_display_audio.sh
Executable file
85
scripts/configure_display_audio.sh
Executable file
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env bash
|
||||
set -Eeuo pipefail
|
||||
|
||||
log() {
|
||||
printf '[display-audio] %s\n' "$*"
|
||||
}
|
||||
|
||||
warn() {
|
||||
printf '[display-audio] WARN: %s\n' "$*" >&2
|
||||
logger -t couch-display-audio -- "$*" 2>/dev/null || true
|
||||
}
|
||||
|
||||
pick_hdmi_refresh() {
|
||||
awk '
|
||||
$1 == "HDMI-1" && $2 == "connected" { in_hdmi=1; next }
|
||||
in_hdmi && $0 !~ /^[[:space:]]/ { exit }
|
||||
in_hdmi && $1 == "1920x1080" {
|
||||
for (i = 2; i <= NF; i++) {
|
||||
gsub(/[+*]/, "", $i)
|
||||
if ($i ~ /^[0-9]+(\.[0-9]+)?$/) {
|
||||
value = $i + 0
|
||||
if (value > best) {
|
||||
best = value
|
||||
best_text = $i
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
END {
|
||||
if (best_text != "") {
|
||||
print best_text
|
||||
}
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
choose_hdmi_profile() {
|
||||
pactl list cards | awk '
|
||||
/^Card #[0-9]+/ { card="" }
|
||||
/^\tName: / { sub(/^\tName: /, "", $0); card=$0 }
|
||||
/^\t\toutput:hdmi/ && /available: yes/ {
|
||||
profile=$1
|
||||
sub(/:$/, "", profile)
|
||||
print card "\t" profile
|
||||
exit
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
choose_hdmi_sink() {
|
||||
pactl list short sinks | awk '$2 ~ /\.hdmi/ { print $2; exit }'
|
||||
}
|
||||
|
||||
xrandr_output="$(xrandr --query)"
|
||||
if ! grep -q '^HDMI-1 connected' <<<"${xrandr_output}"; then
|
||||
warn "HDMI-1 is not connected; deferring display/audio switch"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
refresh="$(printf '%s\n' "${xrandr_output}" | pick_hdmi_refresh)"
|
||||
if [[ -z "${refresh}" ]]; then
|
||||
warn "HDMI-1 is connected but no 1920x1080 refresh was discovered"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
log "setting HDMI-1 primary at 1920x1080@${refresh} and disabling eDP-1"
|
||||
xrandr --output HDMI-1 --primary --mode 1920x1080 --rate "${refresh}" --output eDP-1 --off
|
||||
|
||||
profile_line="$(choose_hdmi_profile || true)"
|
||||
if [[ -z "${profile_line}" ]]; then
|
||||
warn "HDMI audio sink/profile not available yet; display configured and audio switch deferred"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
card_name="${profile_line%%$'\t'*}"
|
||||
profile_name="${profile_line#*$'\t'}"
|
||||
log "selecting HDMI audio profile ${profile_name} on ${card_name}"
|
||||
pactl set-card-profile "${card_name}" "${profile_name}"
|
||||
pactl list short sinks >/dev/null 2>&1 || true
|
||||
sink_name="$(choose_hdmi_sink || true)"
|
||||
if [[ -z "${sink_name}" ]]; then
|
||||
warn "HDMI sink still unavailable after profile switch; audio switch deferred"
|
||||
exit 0
|
||||
fi
|
||||
pactl set-default-sink "${sink_name}"
|
||||
Reference in New Issue
Block a user