#!/bin/sh
# ═══ JOYEUSE — ROUTE AUDIO D'APPEL ═══
set -u

export LC_ALL=C

BUS=org.mobian_project.CallAudio
CHEMIN=/org/mobian_project/CallAudio
ETAT_MIC="${XDG_RUNTIME_DIR:-/tmp}/joyeuse-appel-audio.mic"

log()
{
	echo "joyeuse-appel-audio: $*"
}

prop()
{
	gdbus call --session -d "$BUS" -o "$CHEMIN" \
		-m org.freedesktop.DBus.Properties.Get "$BUS" "$1" 2>/dev/null |
		sed -n 's/.*uint32 \([0-9]*\).*/\1/p'
}

valeur()
{
	amixer -c0 cget name="$1" 2>/dev/null |
		sed -n 's/^[[:space:]]*: values=\([0-9]*\).*/\1/p' |
		head -1
}

micro_appel()
{
	if [ "$1" = "off" ]
	then
		: > "$ETAT_MIC"
		for ctrl in "TX_DEC0 Volume" "TX_DEC1 Volume"
		do
			actuel=$(valeur "$ctrl")
			if [ -n "$actuel" ] && [ "$actuel" != "0" ]
			then
				echo "$ctrl=$actuel" >> "$ETAT_MIC"
			fi
			amixer -c0 -q cset name="$ctrl" 0 2>/dev/null
		done
	else
		for ctrl in "TX_DEC0 Volume" "TX_DEC1 Volume"
		do
			repose=$(sed -n "s/^$ctrl=//p" "$ETAT_MIC" 2>/dev/null | head -1)
			[ -n "$repose" ] || continue
			amixer -c0 -q cset name="$ctrl" "$repose" 2>/dev/null
		done
		rm -f "$ETAT_MIC"
	fi
	log "micro d'appel : $1 (relu : TX_DEC0=$(valeur 'TX_DEC0 Volume') TX_DEC1=$(valeur 'TX_DEC1 Volume'))"
}

aucun_appel_reel()
{
	racine=/org/freedesktop/ModemManager1
	modems=$(gdbus call --system -d org.freedesktop.ModemManager1 -o "$racine" \
		-m org.freedesktop.DBus.ObjectManager.GetManagedObjects 2>/dev/null |
		grep -oE "$racine/Modem/[0-9]+" |
		sort -u)
	[ -n "$modems" ] || return 1
	for m in $modems
	do
		v=$(gdbus call --system -d org.freedesktop.ModemManager1 -o "$m" \
			-m org.freedesktop.DBus.Properties.Get \
			org.freedesktop.ModemManager1.Modem.Voice Calls 2>/dev/null) || return 1
		case "$v" in
			*"@ao []"*) ;;
			*) return 1 ;;
		esac
	done
	return 0
}

ecouteur()
{
	gdbus call --session -d "$BUS" -o "$CHEMIN" \
		-m "$BUS".EnableSpeaker false >/dev/null 2>&1
}

appliquer()
{
	if [ "$1" = "1" ]
	then
		ecouteur
		log "appel : ecouteur, profil audio inchange"
	else
		micro_appel on
		log "fin d'appel : profil audio inchange"
	fi
}

mode=$(prop AudioMode)
if [ "${mode:-}" = "1" ] && aucun_appel_reel
then
	log "appel fantome ignore"
	mode=0
fi
[ -n "${mode:-}" ] && appliquer "$mode"

gdbus monitor --session --dest "$BUS" 2>/dev/null |
while read -r ligne
do
	case "$ligne" in
		*AudioMode*)
			m=$(echo "$ligne" | sed -n "s/.*'AudioMode': <uint32 \([0-9]*\)>.*/\1/p")
			[ -n "$m" ] && appliquer "$m"
			;;
		*MicState*)
			m=$(echo "$ligne" | sed -n "s/.*'MicState': <uint32 \([0-9]*\)>.*/\1/p")
			[ -n "$m" ] || continue
			[ "$(prop AudioMode)" = "1" ] || continue
			if [ "$m" = "0" ]
			then
				micro_appel off
			else
				micro_appel on
			fi
			;;
		*SpeakerState*)
			s=$(echo "$ligne" | sed -n "s/.*'SpeakerState': <uint32 \([0-9]*\)>.*/\1/p")
			[ -n "$s" ] || continue
			[ "$(prop AudioMode)" = "1" ] || continue
			if [ "$s" = "1" ]
			then
				ecouteur
				log "haut-parleur indisponible : maintien de l'ecouteur"
			else
				log "bouton : ecouteur"
			fi
			;;
	esac
done
