community/soc-qcom-sdm845: update ucm confs and add call audio idle suspend workaround (MR 3639)

In SDM845, the q6voice kernel driver connects modem and audio backends.
Callaudiod seems to switch to correct audio device and prepares it, however, the audio
device get's closed since no one from the userspace is actively listening to it.
This cuts the audio in call. As a workaround, I have added to script to disable the
suspend-on-idle pulseaudio module during calls, so the audio devices don't close automatically.
This commit is contained in:
Joel Selvaraj 2022-11-20 19:04:27 -06:00 committed by Oliver Smith
parent 8e5d58b8ad
commit e95d28a6e7
No known key found for this signature in database
GPG key ID: 5AE7F5513E0885CB
4 changed files with 75 additions and 3 deletions

View file

@ -2,7 +2,7 @@
# Co-Maintainer: Joel Selvaraj <joelselvaraj.oss@gmail.com>
pkgname=soc-qcom-sdm845
pkgdesc="Common package for Qualcomm SDM845 devices"
pkgver=12
pkgver=13
pkgrel=0
url="https://postmarketos.org"
license="BSD-3-Clause"
@ -19,12 +19,14 @@ subpackages="
$pkgname-vulkan
"
_ucm_commit="f2a9fad117c2c86d693623fd47dee5b6f7385fe2"
_ucm_commit="3cece34e28f0a04daec2cf39a7830dd8043f614b"
source="
alsa-ucm-conf-$_ucm_commit.tar.gz::https://gitlab.com/sdm845-mainline/alsa-ucm-conf/-/archive/$_ucm_commit/alsa-ucm-conf-$_ucm_commit.tar.gz
90-feedbackd-pmi8998.rules
modemmanager.conf
UPower.conf
call_audio_idle_suspend_workaround.sh
call_audio_idle_suspend_workaround.initd
"
package() {
@ -49,12 +51,21 @@ nonfree_firmware() {
msm-modem
msm-modem-uim-selection
bootmac
alsa-utils
"
install="$subpkgname.post-install $subpkgname.post-upgrade"
mkdir "$subpkgdir"
install -Dm644 "$srcdir"/modemmanager.conf \
"$subpkgdir"/etc/conf.d/modemmanager
# Call Audio idle suspend workaround code
install -Dm755 "$srcdir"/call_audio_idle_suspend_workaround.sh \
"$subpkgdir"/usr/sbin/call_audio_idle_suspend_workaround
# Call Audio idle suspend workaround init script
install -Dm755 "$srcdir"/call_audio_idle_suspend_workaround.initd \
"$subpkgdir"/etc/init.d/call_audio_idle_suspend_workaround
}
ucm() {
@ -81,8 +92,10 @@ vulkan() {
}
sha512sums="
92fa44327488d8deca17be50c3e37538e7e25875b7da8d921058a732ce2dbe8bf6a4d88b2052eea56ffd9a54212babbae10e94fe5e8eed04cce7ce3a37c03833 alsa-ucm-conf-f2a9fad117c2c86d693623fd47dee5b6f7385fe2.tar.gz
22daa3477890d24b0410216cf483204dd6b35875bdc954c5092f8492ce389255d54aee4dbafe0cf1a2f7d08fd153364e18097391b3d8ceecd59ef2ef525bef02 alsa-ucm-conf-3cece34e28f0a04daec2cf39a7830dd8043f614b.tar.gz
4f2c22a3a3fc7d380e200ad977578107d81f0e7ade7918e03bdb15b60a564e8db5f47e13cce22f636d38fd3722696bb46076b8872dae0ca2d8a3838522a1f025 90-feedbackd-pmi8998.rules
e33f41360ccc4900bb76a26cc7b46bde1fb90facdf45c4fbcebc80499386939948401cacd6df9f779eafab10f4ee77ee1fef3e7bd06f483f8c2a4a644c84f327 modemmanager.conf
9d455b56558d453d501a1ad869ffa79f9952ed43485a9847d506db6a78bfcd9f9c9d855660ee1d368eb74f4429385ec166addc30d802261c75562e785fe84c52 UPower.conf
aa5cdb138a3cdd0b15d2bbb60c7f67ae0280ddc7d0488cfe2fc44680095a43c1cdacc54d70a689f2117538e9bf1e42758d8c3ac542c9cb8e8dc6d6f3161b7577 call_audio_idle_suspend_workaround.sh
1111d28b6e23163fb47fcfadc2ed3f83543ce0435c6be187a38d418cfe7821fe7905ac103969f3f7c115bd522d99c43efd52409835e292270a6ac9c34b5bee75 call_audio_idle_suspend_workaround.initd
"

View file

@ -0,0 +1,28 @@
#!/sbin/openrc-run
name="call_audio_idle_suspend_workaround"
description="Disable pulseaudio suspend-on-idle module during call"
pid="/run/call_audio_idle_suspend_workaround.pid"
depend() {
need dbus
}
start() {
ebegin "Starting call audio idle suspend workaround"
userid=10000 # Default User ID in pmOS
user=$(getent passwd $userid | cut -d: -f1)
env_var="XDG_RUNTIME_DIR=/run/user/$userid"
cmd="/usr/sbin/call_audio_idle_suspend_workaround"
start-stop-daemon --start --exec "$cmd" --env "$env_var" --background --user $user --pidfile "$pid" --make-pidfile
eend $?
}
stop() {
ebegin "Stopping call audio idle suspend workaround"
start-stop-daemon --stop --pidfile "$pid"
eend $?
}

View file

@ -0,0 +1,30 @@
#!/bin/sh
# dbus-monitor is run as a child process to this script. Kill child process too when the script terminates.
trap 'pkill -9 -P $$ && exit 0' INT TERM
interface=org.freedesktop.ModemManager1.Call
member=StateChanged
dbus-monitor --system "type='signal',interface='$interface',member='$member'" |
while read -r line; do
state=$(echo "$line" | awk '/\<int32\>/ {print $2}')
if [ -n "$state" ]; then
# Call State is based on https://www.freedesktop.org/software/ModemManager/doc/latest/ModemManager/ModemManager-Flags-and-Enumerations.html#MMCallState
if [ "$state" -eq '0' ] || [ "$state" -eq '3' ]; then
echo "Call Started"
# Unload module-suspend-on-idle when call begins
pactl unload-module module-suspend-on-idle
fi
if [ "$state" -eq '7' ]; then
echo "Call Ended"
# Reload module-suspend-on-idle after call ends
pactl load-module module-suspend-on-idle
fi
fi
done &
wait

View file

@ -2,3 +2,4 @@
rc-update add tqftpserv boot
rc-update add pd-mapper boot
rc-update add q6voiced default
rc-update add call_audio_idle_suspend_workaround default