pmaports/device/testing/device-samsung-j7y17lte/usr-libexec-samsungipcd-voicecall.sh
Eray Tutmaz 93f68f6253
samsung-j7y17lte: new device (MR 4502)
[ci:skip-build]: Already built successfully in CI.
2024-02-15 02:19:03 -08:00

61 lines
2.2 KiB
Bash

#!/bin/sh
# This script sets up the audio subsystem to route audio to and from the modem.
# Called by samsungipcd when the call starts. When the call ends, we receive a
# newline and terminate ourselves.
# Note: as a side effect, software on the phone cannot access the microphone
# during a call.
# Put ourselves into a PID namespace. This is an easy and non-racey way to
# ensure that all child processes get killed on our exit.
if [ "$$" != 1 ]; then
unshare -p sh "$0"
exitcode="$?"
# Restore MIC1 state to normal. We should be the only entity fiddling
# with that.
amixer -D sysdefault cset name='MIC1 MIC1 On' 1
exit "$exitcode"
fi
# callaudiod has already changed the UCM verb, no need to do it manually
#alsaucm set _verb 'Voice Call'
# In order for sound to be forwarded, there must be applictions that are
# currently playing and recording audio. To ensure that they exists, we
# connect to each user's PipeWire and start ones.
# Playback
for i in /run/user/*/; do
# To avoid vulnerabilities in PulseAudio becoming LPEs, setuid to the
# user running PipeWire.
XDG_RUNTIME_DIR="$i" su -c 'aplay /dev/zero' "$(grep "^[^:]*:[^:]*:$(basename "$i"):" /etc/passwd | cut -d : -f 1-1)" &
done
# Same for recording
for i in /run/user/*/; do
XDG_RUNTIME_DIR="$i" su -c 'arecord /dev/null' "$(grep "^[^:]*:[^:]*:$(basename "$i"):" /etc/passwd | cut -d : -f 1-1)" &
done
# Microphone switching logic
for i in /run/user/*/; do
XDG_RUNTIME_DIR="$i" su -c '
# Set locale to C to avoid parsing localized command output
export LANG=C
# Report microphone mute events
( echo; pactl subscribe; ) | while read; do pactl get-source-mute @DEFAULT_SOURCE@; done
' "$(grep "^[^:]*:[^:]*:$(basename "$i"):" /etc/passwd | cut -d : -f 1-1)" &
done | while read line; do
if [[ "$line" == "Mute: yes" ]]; then
amixer -D sysdefault cset name='MIC1 MIC1 On' 0
elif [[ "$line" == "Mute: no" ]]; then
amixer -D sysdefault cset name='MIC1 MIC1 On' 1
fi
done &
# Wait for newline from samsungipcd. This means that the call has ended.
read
# No need to clean up, closing the PID namespace will kill all children
#jobs -p | xargs kill
# Again, callaudiod will switch UCM verbs for us
#alsaucm set _verb 'HiFi'