Skip to content

Audio workaround and fixes with PipeWire

jaymz665 did amazing work and shared it in the Matrix room to improve the stability and noise of SDM845 audio stack.

Changes

sudo rm -r /etc/wireplumber/main.lua.d
sudo nano /etc/wireplumber/wireplumber.conf.d/51-disable-suspension.conf
monitor.alsa.rules = [
  {
    matches = [
      {
        # Matches all sources
        node.name = "~alsa_input.*"
      },
      {
        # Matches all sinks
        node.name = "~alsa_output.*"
      }
    ]
    actions = {
      update-props = {
        audio.format           = "S16LE"
        audio.rate             = 48000
        api.alsa.period-size   = 4096
        api.alsa.period-num    = 6
        api.alsa.headroom      = 512,
       # session.suspend-timeout-seconds = 0
       # dither.method = "wannamaker3", # add dither of desired shape
       # dither.noise = 2, # add additional bits of noise
     }
    }
  }
]
sudo nano  /usr/sbin/call_audio_idle_suspend_workaround

#!/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"
                                alsaucm reload
                                pw-loopback &

                                # Unload module-suspend-on-idle when call begins
                                #pactl unload-module module-suspend-on-idle
                        fi

                        if [ "$state" -eq '7' ]; then
                                echo "Call Ended"
                                killall -9 pw-loopback &

                                # Reload module-suspend-on-idle after call ends
                                #pactl load-module module-suspend-on-idle
                        fi
                fi
        done &

wait
Edited by Dylan Van Assche