callaudioshim 1-r1: own callaudiod's activation file, so Phosh gets the shim
Some checks failed
image / image (push) Has been cancelled

Phosh D-Bus-activates org.mobian_project.CallAudio at startup (cui_init ->
call_audio_init), before any autostart runs. So the stock callaudiod took
the name, segfaulted once, and then refused every mute ("card has no usable
source"): Calls' mute did nothing and Calls asserted on each refusal. Under
Plasma the shim won only because its phase-1 autostart ran first.

The package now installs the activation file at callaudiod's path
(replaces="callaudiod"), pointing at the shim, so whoever asks first gets
the shim. apk keeps the file through callaudiod reinstalls and upgrades,
including both packages upgrading in one transaction (tested in
alpine:edge). Removing the shim removes the file; 'apk fix callaudiod'
restores the stock one. A second instance exits quietly instead of
tracing back.

Tested on the dev phone: Phosh (activation at login, mute silences the
uplink, no Calls assertions) and Plasma (autostart owns the name, the
dialer's mute button follows the mic state).
This commit is contained in:
Jorijn van der Graaf 2026-09-23 17:20:26 +02:00
commit 12a65a5574
Signed by: jorijnvdgraaf
GPG key ID: 2937E59CDCC1BCFB
3 changed files with 27 additions and 9 deletions

View file

@ -3,22 +3,27 @@
# Earpiece port), leaving plasma-dialer's mute button dead and blocking # Earpiece port), leaving plasma-dialer's mute button dead and blocking
# kde-telephony-daemon 25s per call; see the script header for the full # kde-telephony-daemon 25s per call; see the script header for the full
# write-up. The callaudiod package stays installed (plasma-mobile depends on # write-up. The callaudiod package stays installed (plasma-mobile depends on
# it) — this shim simply owns org.mobian_project.CallAudio first via an # it); this package replaces its D-Bus activation file, so activating
# early-phase autostart, so D-Bus activation of the real daemon never fires. # org.mobian_project.CallAudio starts the shim in any session. Phosh
# Deployed and tested on the development FP6. # activates the name at startup, before autostart runs, and the stock daemon
# used to win there (1-r0). Removing this package removes the activation file
# too; 'apk fix callaudiod' restores callaudiod's. Deployed and tested on the
# development FP6.
maintainer="Jorijn van der Graaf <jorijnvdgraaf@catcrafts.net>" maintainer="Jorijn van der Graaf <jorijnvdgraaf@catcrafts.net>"
pkgname=callaudioshim pkgname=callaudioshim
pkgver=1 pkgver=1
pkgrel=0 pkgrel=1
pkgdesc="callaudiod replacement shim: working in-call mic mute on the FP6" pkgdesc="callaudiod replacement shim: working in-call mic mute on the FP6"
url="https://forgejo.catcrafts.net/Catcrafts/fp6-img" url="https://forgejo.catcrafts.net/Catcrafts/fp6-img"
arch="noarch" arch="noarch"
license="GPL-3.0-only" license="GPL-3.0-only"
depends="python3 py3-dbus py3-gobject3 wireplumber" depends="python3 py3-dbus py3-gobject3 wireplumber"
replaces="callaudiod"
options="!check" options="!check"
source=" source="
callaudioshim.py callaudioshim.py
callaudioshim.desktop callaudioshim.desktop
org.mobian_project.CallAudio.service
" "
package() { package() {
@ -26,9 +31,12 @@ package() {
"$pkgdir"/usr/libexec/callaudioshim.py "$pkgdir"/usr/libexec/callaudioshim.py
install -Dm644 "$srcdir"/callaudioshim.desktop \ install -Dm644 "$srcdir"/callaudioshim.desktop \
"$pkgdir"/etc/xdg/autostart/callaudioshim.desktop "$pkgdir"/etc/xdg/autostart/callaudioshim.desktop
install -Dm644 "$srcdir"/org.mobian_project.CallAudio.service \
"$pkgdir"/usr/share/dbus-1/services/org.mobian_project.CallAudio.service
} }
sha512sums=" sha512sums="
7ca7d75402ea6c48a7c1c19c5c5ed6e556f2c0133aa6e32a12f5c5a1afc0c791f04ebd40102a4b92b0dd87f9330ae64ada025c344525b9ed17289acd8cb952d7 callaudioshim.py 05995f0f732319559ccd9a7f3891c6363261e52ddbdf13b812fce580dbb816c362bd76da36cb9f1c7ee203d5ce2486762ffe46a7660dd4bc10c8bf2b4cd1a8ca callaudioshim.py
060b76660398115af26463425db5a6a2d634b6bdbf48a8ae488528403f8e086a9ef23470316196e6ccd8cb65e0ebd09bbc0df2ff5f8a830407d98404f439c706 callaudioshim.desktop 060b76660398115af26463425db5a6a2d634b6bdbf48a8ae488528403f8e086a9ef23470316196e6ccd8cb65e0ebd09bbc0df2ff5f8a830407d98404f439c706 callaudioshim.desktop
6b44134e3f3ed0a8c3314b0b0cf9a9e5483850cdfb54f486d23199dd9f5f1ee66d674a391126e803796db69182f980b30a714457a81c9a447e146bc9ba5992bd org.mobian_project.CallAudio.service
" "

View file

@ -37,9 +37,11 @@ interface (verified against callaudiod's org.mobian_project.CallAudio.xml):
dynamic in this setup journal/audio.md 2026-07-18). SpeakerState dynamic in this setup journal/audio.md 2026-07-18). SpeakerState
defaults to ON. When an Earpiece UCM device exists these become real. defaults to ON. When an Earpiece UCM device exists these become real.
Stock callaudiod must not own the name: pkill it and mask its D-Bus Stock callaudiod must not own the name. The package replaces callaudiod's
activation (see journal/ims.md s44 deploy notes). Runs as the session user D-Bus activation file with one that starts this shim, so whichever client asks
(autostart .desktop), no root needed. first Phosh activates the name at startup, before autostart runs gets the
shim; the KDE early-phase autostart stays for the DialerUtils push at session
start. Runs as the session user, no root needed.
""" """
import subprocess import subprocess
@ -185,7 +187,12 @@ class CallAudio(dbus.service.Object):
def main(): def main():
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
session = dbus.SessionBus() session = dbus.SessionBus()
name = dbus.service.BusName(BUS_NAME, session, do_not_queue=True) # noqa: F841 try:
name = dbus.service.BusName(BUS_NAME, session, do_not_queue=True) # noqa: F841
except dbus.exceptions.NameExistsException:
# activated and autostarted in the same session: the first one serves
log(f"callaudioshim: {BUS_NAME} already owned; exiting")
return
CallAudio(session) CallAudio(session)
log(f"callaudioshim: owning {BUS_NAME}") log(f"callaudioshim: owning {BUS_NAME}")
GLib.MainLoop().run() GLib.MainLoop().run()

View file

@ -0,0 +1,3 @@
[D-BUS Service]
Name=org.mobian_project.CallAudio
Exec=/usr/libexec/callaudioshim.py