Fix mobile data static IP bearer, call recording, earpiece audio, and ringtone/vibration

This commit is contained in:
Luxferre
2026-10-25 20:23:17 +02:00
parent 21dfb187be
commit a8a28fa685
23 changed files with 624 additions and 212 deletions
@@ -30,5 +30,12 @@ start() {
if [ -n "$QMICLI_MODEM" ]; then
$QMICLI_MODEM --dpm-open-port=hw-data-ep-type=bam-dmux,hw-data-ep-iface-number=1,hw-data-rx-id=1,hw-data-tx-id=1 >/dev/null 2>&1 || true
fi
for f in /etc/NetworkManager/system-connections/*.nmconnection; do
[ -f "$f" ] || continue
if grep -q "^type=gsm" "$f" 2>/dev/null; then
sed -i '/^\[ipv6\]/,/^\[/ s/^method=auto$/method=ignore/' "$f" 2>/dev/null || true
fi
done
eend 0
}
@@ -0,0 +1,4 @@
SXMO_RINGTIME=20
SXMO_RINGNUMBER=10
SXMO_VIBRATE_STRENGTH=2
SXMO_RINGVOL=100
@@ -0,0 +1 @@
/usr/share/sxmo/ringtones/Banana_Chime.wav
+5 -2
View File
@@ -2,6 +2,8 @@
# SPDX-License-Identifier: AGPL-3.0-only
# Copyright 2022 Sxmo Contributors
export PATH="${XDG_CONFIG_HOME:-${HOME:-/home/user}/.config}/sxmo/hooks:/usr/share/sxmo/default_hooks:$PATH"
# include common definitions
# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh
. sxmo_hook_icons.sh
@@ -107,9 +109,10 @@ checkforfinishedcalls() {
# If it was the last call
if ! sxmo_modemcall.sh list_active_calls | grep -q .; then
# Cleanup
sxmo_jobs.sh stop ringing
rm -f "$XDG_RUNTIME_DIR/sxmo_calls/"* 2>/dev/null || true
if [ "$STATE" != muted ]; then
sxmo_vibrate 1000 "${SXMO_VIBRATE_STRENGTH:-1}" &
if [ "$STATE" != muted ] && [ ! -f "$XDG_CONFIG_HOME/sxmo/.novibrate" ]; then
sxmo_vibrate 600 &
fi
sxmo_jobs.sh stop incall_menu
sxmo_jobs.sh stop proximity_lock
+31 -21
View File
@@ -6,19 +6,26 @@ export PATH="${XDG_CONFIG_HOME:-$HOME/.config}/sxmo/hooks:/usr/share/sxmo/defaul
. sxmo_common.sh
enable_call_audio_mode() {
pactl set-card-profile alsa_card.comprC0 off >/dev/null 2>&1 || true
pactl set-card-profile alsa_card.platform-7702000.sound "HiFi (Earpiece, Mic1)" >/dev/null 2>&1 || true
wpctl set-mute @DEFAULT_AUDIO_SINK@ 0 >/dev/null 2>&1 || true
wpctl set-volume @DEFAULT_AUDIO_SINK@ 100% >/dev/null 2>&1 || true
if command -v amixer >/dev/null 2>&1; then
amixer -c 0 sset 'SPK DAC Switch' off >/dev/null 2>&1 || true
amixer -c 0 sset 'RX3 MIX1 INP1' 'ZERO' >/dev/null 2>&1 || true
amixer -c 0 sset 'PRI_MI2S_RX Voice Mixer VoiceMMode1' on >/dev/null 2>&1 || true
amixer -c 0 sset 'VoiceMMode1 Capture Mixer TERT_MI2S_TX' on >/dev/null 2>&1 || true
amixer -c 0 sset 'MultiMedia2 Mixer TERT_MI2S_TX' on >/dev/null 2>&1 || true
amixer -c 0 sset 'RX1 MIX1 INP1' 'RX1' >/dev/null 2>&1 || true
amixer -c 0 sset 'RDAC2 MUX' 'RX1' >/dev/null 2>&1 || true
amixer -c 0 sset 'EAR_S' 'Switch' >/dev/null 2>&1 || true
amixer -c 0 sset 'CIC1 MUX' 'AMIC' >/dev/null 2>&1 || true
amixer -c 0 sset 'DEC1 MUX' 'ADC1' >/dev/null 2>&1 || true
amixer -c 0 sset 'ADC1 Volume' 6 >/dev/null 2>&1 || true
amixer -c 0 sset 'RX1 Digital Volume' 84 >/dev/null 2>&1 || true
amixer -c 0 cset "name='SPK DAC Switch'" 0 >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX3 MIX1 INP1'" 'ZERO' >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX3 Digital Volume'" 0 >/dev/null 2>&1 || true
amixer -c 0 cset "name='PRI_MI2S_RX Voice Mixer VoiceMMode1'" 1 >/dev/null 2>&1 || true
amixer -c 0 cset "name='VoiceMMode1 Capture Mixer TERT_MI2S_TX'" 1 >/dev/null 2>&1 || true
amixer -c 0 cset "name='MultiMedia2 Mixer TERT_MI2S_TX'" 0 >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX1 MIX1 INP1'" 'RX1' >/dev/null 2>&1 || true
amixer -c 0 cset "name='RDAC2 MUX'" 'RX1' >/dev/null 2>&1 || true
amixer -c 0 cset "name='EAR_S'" 'Switch' >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX1 Mute Switch'" 0 >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX1 Digital Volume'" 88 >/dev/null 2>&1 || true
amixer -c 0 cset "name='CIC1 MUX'" 'AMIC' >/dev/null 2>&1 || true
amixer -c 0 cset "name='DEC1 MUX'" 'ADC1' >/dev/null 2>&1 || true
amixer -c 0 cset "name='ADC1 Volume'" 8 >/dev/null 2>&1 || true
amixer -c 0 cset "name='TX1 Digital Volume'" 88 >/dev/null 2>&1 || true
fi
sxmo_log "Enabled ALSA voice call audio mode (Earpiece)."
sxmo_hook_statusbar.sh volume >/dev/null 2>&1 || true
@@ -38,18 +45,21 @@ disable_call_audio_mode() {
pactl set-card-profile alsa_card.platform-7702000.sound "HiFi (Mic1, Speaker)" >/dev/null 2>&1 || true
fi
if command -v amixer >/dev/null 2>&1; then
amixer -c 0 sset 'PRI_MI2S_RX Voice Mixer VoiceMMode1' off >/dev/null 2>&1 || true
amixer -c 0 sset 'VoiceMMode1 Capture Mixer TERT_MI2S_TX' off >/dev/null 2>&1 || true
amixer -c 0 sset 'EAR_S' 'ZERO' >/dev/null 2>&1 || true
amixer -c 0 sset 'RX1 MIX1 INP1' 'ZERO' >/dev/null 2>&1 || true
amixer -c 0 sset 'RX3 MIX1 INP1' 'RX1' >/dev/null 2>&1 || true
amixer -c 0 cset "name='PRI_MI2S_RX Voice Mixer VoiceMMode1'" 0 >/dev/null 2>&1 || true
amixer -c 0 cset "name='VoiceMMode1 Capture Mixer TERT_MI2S_TX'" 0 >/dev/null 2>&1 || true
amixer -c 0 cset "name='MultiMedia2 Mixer TERT_MI2S_TX'" 1 >/dev/null 2>&1 || true
amixer -c 0 cset "name='EAR_S'" 'ZERO' >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX1 MIX1 INP1'" 'ZERO' >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX1 Digital Volume'" 84 >/dev/null 2>&1 || true
amixer -c 0 cset "name='TX1 Digital Volume'" 84 >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX3 MIX1 INP1'" 'RX1' >/dev/null 2>&1 || true
if [ "$spk_vol" -gt 0 ]; then
rx3_hw=$(( 60 + spk_vol * 32 / 100 ))
amixer -c 0 sset 'SPK DAC Switch' on >/dev/null 2>&1 || true
amixer -c 0 sset 'RX3 Digital Volume' "$rx3_hw" >/dev/null 2>&1 || true
amixer -c 0 cset "name='SPK DAC Switch'" 1 >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX3 Digital Volume'" "$rx3_hw" >/dev/null 2>&1 || true
else
amixer -c 0 sset 'SPK DAC Switch' off >/dev/null 2>&1 || true
amixer -c 0 sset 'RX3 Digital Volume' 0 >/dev/null 2>&1 || true
amixer -c 0 cset "name='SPK DAC Switch'" 0 >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX3 Digital Volume'" 0 >/dev/null 2>&1 || true
fi
fi
wpctl set-mute @DEFAULT_AUDIO_SINK@ "$([ "$spk_vol" -le 0 ] && echo 1 || echo 0)" >/dev/null 2>&1 || true
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,27 @@
SectionDevice."Earpiece" {
Comment "Earpiece playback"
ConflictingDevice [
"Headphones"
]
EnableSequence [
cset "name='RX1 MIX1 INP1' RX1"
cset "name='RDAC2 MUX' RX1"
cset "name='EAR_S' 1"
## gain to +6dB
cset "name='RX1 Digital Volume' 90"
]
DisableSequence [
cset "name='RX1 Digital Volume' 0"
cset "name='EAR_S' 0"
cset "name='RX1 MIX1 INP1' ZERO"
]
Value {
PlaybackPCM "${var:WcdPlaybackPCM}"
PlaybackChannels 2
PlaybackPriority 100
}
}
@@ -4,13 +4,14 @@
# Copyright 2022 Sxmo Contributors
# This script is executed (asynchronously) when you get an incoming call
# You can use it to play a ring tone
# $1 = Contact Name or Number (if not in contacts)
# shellcheck source=scripts/core/sxmo_common.sh
. sxmo_common.sh
export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-${HOME:-/home/user}/.config}"
export XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
if [ -z "${SXMO_VIBRATE_DEV:-}" ] && [ ! -e /dev/input/by-path/platform-vibrator-event ]; then
for vdev in /dev/input/by-path/*vibrator*-event; do
if [ -e "$vdev" ]; then
@@ -25,33 +26,61 @@ if [ -f "$XDG_CONFIG_HOME/sxmo/ringsettings" ]; then
. "$XDG_CONFIG_HOME/sxmo/ringsettings"
fi
# pm8xxx-vib shifts FF_RUMBLE strong_magnitude right by 8 bits (valid 256..65535)
case "${SXMO_VIBRATE_STRENGTH:-}" in
1) SXMO_VIBRATE_STRENGTH=8000 ;;
2|"") SXMO_VIBRATE_STRENGTH=32000 ;;
3) SXMO_VIBRATE_STRENGTH=65535 ;;
case "${SXMO_VIBRATE_STRENGTH:-2}" in
1) SXMO_VIBRATE_STRENGTH=1 ;;
3) SXMO_VIBRATE_STRENGTH=3 ;;
*)
if [ "${SXMO_VIBRATE_STRENGTH:-2}" -gt 45000 ] 2>/dev/null; then
SXMO_VIBRATE_STRENGTH=3
elif [ "${SXMO_VIBRATE_STRENGTH:-2}" -gt 3 ] && [ "${SXMO_VIBRATE_STRENGTH:-2}" -le 16000 ] 2>/dev/null; then
SXMO_VIBRATE_STRENGTH=1
else
SXMO_VIBRATE_STRENGTH=2
fi
;;
esac
export SXMO_VIBRATE_STRENGTH
if [ -f "$XDG_CONFIG_HOME/sxmo/ringtone" ]; then
custom_ring="$(head -n 1 "$XDG_CONFIG_HOME/sxmo/ringtone" 2>/dev/null)"
custom_ring="$(head -n 1 "$XDG_CONFIG_HOME/sxmo/ringtone" 2>/dev/null | tr -d '\r')"
if [ -n "$custom_ring" ] && [ -f "$custom_ring" ]; then
SXMO_RINGTONE="$custom_ring"
fi
fi
# Only vibrate if you already got an active call
if sxmo_modemcall.sh list_active_calls \
| grep -v ringing-in \
| grep -q .; then
sxmo_vibrate 1500 "${SXMO_VIBRATE_STRENGTH:-1}"
exit
if [ -z "${SXMO_RINGTONE:-}" ] || [ ! -f "${SXMO_RINGTONE:-}" ]; then
if [ -f /usr/share/sxmo/ringtones/Banana_Chime.wav ]; then
SXMO_RINGTONE="/usr/share/sxmo/ringtones/Banana_Chime.wav"
elif [ -f /usr/share/sxmo/ring.ogg ]; then
SXMO_RINGTONE="/usr/share/sxmo/ring.ogg"
else
for f in /usr/share/sxmo/ringtones/*; do
if [ -f "$f" ]; then
SXMO_RINGTONE="$f"
break
fi
done
fi
fi
export SXMO_RINGTONE
# DND / BUSY MODE
if [ -f "$XDG_RUNTIME_DIR/sxmo.busy" ]; then
exit 0
fi
if [ -f "$XDG_CONFIG_HOME/sxmo/.busy" ]; then
end="$(cat "$XDG_CONFIG_HOME/sxmo/.busy" 2>/dev/null)"
if [ -z "$end" ] || [ "$(date +%s)" -lt "$end" ]; then
exit 0
fi
fi
# Shallow if you have more than one ringing call
if ! sxmo_modemcall.sh list_active_calls \
| grep -c ringing-in \
| grep -q 1; then
exit
# Only vibrate once if a call is already active
if [ "$(cat /tmp/sxmo_active_call 2>/dev/null)" = "2" ]; then
if [ ! -f "$XDG_CONFIG_HOME/sxmo/.novibrate" ]; then
sxmo_vibrate 1500 "$SXMO_VIBRATE_STRENGTH"
fi
exit 0
fi
case "${SXMO_RINGVOL:-100}" in
@@ -59,90 +88,167 @@ case "${SXMO_RINGVOL:-100}" in
esac
[ "$SXMO_RINGVOL" -gt 100 ] && SXMO_RINGVOL=100
SAVED_RX3="$(amixer -c 0 cget "name='RX3 Digital Volume'" 2>/dev/null | awk -F= '/: values=/ {print $2; exit}')"
SAVED_SPK_VOL=100
SAVED_SPK_VOL=85
if [ -r "$XDG_CONFIG_HOME/sxmo/speaker_vol" ]; then
read -r SAVED_SPK_VOL < "$XDG_CONFIG_HOME/sxmo/speaker_vol" 2>/dev/null || SAVED_SPK_VOL=100
read -r SAVED_SPK_VOL < "$XDG_CONFIG_HOME/sxmo/speaker_vol" 2>/dev/null || SAVED_SPK_VOL=85
fi
case "$SAVED_SPK_VOL" in ''|*[!0-9]*) SAVED_SPK_VOL=100 ;; esac
case "$SAVED_SPK_VOL" in ''|*[!0-9]*) SAVED_SPK_VOL=85 ;; esac
SAVED_RX3=$(( 60 + SAVED_SPK_VOL * 32 / 100 ))
RING_PID=""
VIB_PID=""
is_call_picked_up() {
[ "$(cat /tmp/sxmo_active_call 2>/dev/null)" = "2" ] && return 0
for f in "$XDG_RUNTIME_DIR"/sxmo_calls/*.pickedupcall "$XDG_RUNTIME_DIR"/sxmo_calls/*.initiatedcall; do
[ -e "$f" ] && return 0
done
return 1
}
finish() {
trap - INT TERM EXIT
jobs -p | xargs -r kill 2>/dev/null || true
wait 2>/dev/null || true
if [ -n "${SAVED_RX3:-}" ]; then
[ -n "$RING_PID" ] && pkill -TERM -P "$RING_PID" 2>/dev/null || true
[ -n "$VIB_PID" ] && pkill -TERM -P "$VIB_PID" 2>/dev/null || true
[ -n "$RING_PID" ] && kill -TERM "$RING_PID" 2>/dev/null || true
[ -n "$VIB_PID" ] && kill -TERM "$VIB_PID" 2>/dev/null || true
pkill -TERM -P "$$" 2>/dev/null || true
if ! is_call_picked_up; then
amixer -c 0 cset "name='RX3 Digital Volume'" "$SAVED_RX3" >/dev/null 2>&1 || true
wpctl set-volume @DEFAULT_AUDIO_SINK@ "${SAVED_SPK_VOL}%" >/dev/null 2>&1 || true
fi
wpctl set-volume @DEFAULT_AUDIO_SINK@ "${SAVED_SPK_VOL}%" >/dev/null 2>&1 || true
exit
exit 0
}
pause_media_async() {
if [ -p /tmp/dwm_plugin_music.fifo ]; then
echo "PAUSE" > /tmp/dwm_plugin_music.fifo 2>/dev/null || true
fi
mpc -q pause >/dev/null 2>&1 &
sxmo_playerctl.sh pause_all >/dev/null 2>&1 &
}
ring() {
if [ "${SXMO_RINGVOL:-100}" -le 0 ]; then
if [ "${SXMO_RINGVOL:-100}" -le 0 ] || [ -z "${SXMO_RINGTONE:-}" ] || [ ! -f "$SXMO_RINGTONE" ]; then
return 0
fi
ring_rx3=$(( 60 + SXMO_RINGVOL * 34 / 100 ))
mpv_vol=$(( SXMO_RINGVOL * 130 / 100 ))
amixer -c 0 cset "name='SPK DAC Switch'" 1 >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX3 MIX1 INP1'" 3 >/dev/null 2>&1 || true
amixer -c 0 cset "name='RX3 Digital Volume'" "$ring_rx3" >/dev/null 2>&1 || true
wpctl set-mute @DEFAULT_AUDIO_SINK@ 0 >/dev/null 2>&1 || true
wpctl set-volume @DEFAULT_AUDIO_SINK@ 100% >/dev/null 2>&1 || true
mpv --no-resume-playback --quiet --no-video \
--ao=pipewire,pulse,alsa --audio-channels=stereo --audio-samplerate=48000 \
--volume-max=150 --volume="$mpv_vol" \
--loop="${SXMO_RINGNUMBER:-10}" "$SXMO_RINGTONE" >/dev/null &
pw_vol="$(awk -v v="$SXMO_RINGVOL" 'BEGIN { printf "%.2f", v / 100.0 }')"
(
rchild=""
vhelper=""
trap '[ -n "$rchild" ] && kill -TERM "$rchild" 2>/dev/null; [ -n "$vhelper" ] && kill -TERM "$vhelper" 2>/dev/null; exit 0' INT TERM EXIT
amixer -c 0 -s >/dev/null 2>&1 <<EOF || true
cset "name='EAR_S'" 0
cset "name='RX1 MIX1 INP1'" 0
cset "name='PRI_MI2S_RX Audio Mixer MultiMedia1'" 1
cset "name='SPK DAC Switch'" 1
cset "name='RX3 MIX1 INP1'" 3
cset "name='RX3 Digital Volume'" $ring_rx3
EOF
wpctl set-mute @DEFAULT_AUDIO_SINK@ 0 >/dev/null 2>&1 || true
wpctl set-volume @DEFAULT_AUDIO_SINK@ "${SXMO_RINGVOL}%" >/dev/null 2>&1 || true
(
for d in 0.15 0.40; do
sleep "$d" || exit 0
is_call_picked_up && exit 0
amixer -c 0 -s >/dev/null 2>&1 <<EOF || true
cset "name='SPK DAC Switch'" 1
cset "name='RX3 MIX1 INP1'" 3
cset "name='RX3 Digital Volume'" $ring_rx3
EOF
wpctl set-volume @DEFAULT_AUDIO_SINK@ "${SXMO_RINGVOL}%" >/dev/null 2>&1 || true
done
) &
vhelper="$!"
ext="$(printf '%s' "${SXMO_RINGTONE##*.}" | tr '[:upper:]' '[:lower:]')"
use_pw=0
case "$ext" in
wav|ogg|oga|mp3|flac|aiff|aif)
command -v pw-play >/dev/null 2>&1 && use_pw=1
;;
esac
loops="${SXMO_RINGNUMBER:-10}"
if [ "$use_pw" -eq 1 ]; then
i=0
while [ "$i" -lt "$loops" ]; do
is_call_picked_up && break
pw-play --volume="$pw_vol" "$SXMO_RINGTONE" >/dev/null 2>&1 &
rchild="$!"
wait "$rchild" 2>/dev/null
rc="$?"
rchild=""
if [ "$rc" -ne 0 ]; then
use_pw=0
break
fi
i=$(( i + 1 ))
sleep 0.2 &
rchild="$!"
wait "$rchild" 2>/dev/null || break
rchild=""
done
fi
if [ "$use_pw" -eq 0 ] && ! is_call_picked_up; then
mpv --no-config --no-terminal --no-resume-playback --quiet --vo=null --no-video \
--ao=pipewire,pulse,alsa --audio-channels=stereo --audio-samplerate=48000 \
--volume-max=150 --volume="$SXMO_RINGVOL" \
--loop="$loops" "$SXMO_RINGTONE" </dev/null >/dev/null 2>&1 &
rchild="$!"
wait "$rchild" 2>/dev/null || true
rchild=""
fi
) &
RING_PID="$!"
}
vibrate() {
while : ; do
trap 'finish' INT TERM EXIT
sxmo_vibrate 1500 "${SXMO_VIBRATE_STRENGTH:-1}" &
wait "$!"
(
vchild=""
trap '[ -n "$vchild" ] && kill -TERM "$vchild" 2>/dev/null; exit 0' INT TERM EXIT
while : ; do
is_call_picked_up && exit 0
sxmo_vibrate 1500 "$SXMO_VIBRATE_STRENGTH" &
vchild="$!"
wait "$vchild" 2>/dev/null || exit 0
vchild=""
sleep 0.5 &
wait "$!"
done &
sleep 0.5 &
vchild="$!"
wait "$vchild" 2>/dev/null || exit 0
vchild=""
done
) &
VIB_PID="$!"
}
# SILENT MODE
if [ -f "$XDG_CONFIG_HOME"/sxmo/.busy ]; then
end="$(cat "$XDG_CONFIG_HOME"/sxmo/.busy)"
if [ -z "$end" ] || [ "$(date +%s)" -lt "$end" ]; then
exit
fi
fi
trap 'finish' INT TERM EXIT
# RING & VIBRATE MODE (DEFAULT)
if [ ! -f "$XDG_CONFIG_HOME"/sxmo/.noring ] && [ ! -f "$XDG_CONFIG_HOME"/sxmo/.novibrate ]; then
sxmo_log "RING AND VIBRATE"
sxmo_playerctl.sh pause_all
if [ -p /tmp/dwm_plugin_music.fifo ]; then
echo "PAUSE" > /tmp/dwm_plugin_music.fifo 2>/dev/null || true
fi
ring
if [ ! -f "$XDG_CONFIG_HOME/sxmo/.noring" ] && [ ! -f "$XDG_CONFIG_HOME/sxmo/.novibrate" ]; then
sxmo_log "RING AND VIBRATE ($SXMO_RINGTONE, vol=${SXMO_RINGVOL}%, vib=${SXMO_VIBRATE_STRENGTH})"
pause_media_async
vibrate
ring
# RING-ONLY MODE
elif [ ! -f "$XDG_CONFIG_HOME"/sxmo/.noring ] && [ -f "$XDG_CONFIG_HOME"/sxmo/.novibrate ]; then
sxmo_log "RING ONLY"
sxmo_playerctl.sh pause_all
if [ -p /tmp/dwm_plugin_music.fifo ]; then
echo "PAUSE" > /tmp/dwm_plugin_music.fifo 2>/dev/null || true
fi
elif [ ! -f "$XDG_CONFIG_HOME/sxmo/.noring" ] && [ -f "$XDG_CONFIG_HOME/sxmo/.novibrate" ]; then
sxmo_log "RING ONLY ($SXMO_RINGTONE, vol=${SXMO_RINGVOL}%)"
pause_media_async
ring
# VIBRATE-ONLY MODE
elif [ ! -f "$XDG_CONFIG_HOME"/sxmo/.novibrate ] && [ -f "$XDG_CONFIG_HOME"/sxmo/.noring ]; then
sxmo_log "VIBRATE ONLY"
elif [ ! -f "$XDG_CONFIG_HOME/sxmo/.novibrate" ] && [ -f "$XDG_CONFIG_HOME/sxmo/.noring" ]; then
sxmo_log "VIBRATE ONLY (vib=${SXMO_VIBRATE_STRENGTH})"
vibrate
fi
trap 'finish' INT TERM EXIT
sleep "${SXMO_RINGTIME:-20}" &
wait "$!"
finish