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
+33 -15
View File
@@ -46,7 +46,7 @@ struct RingSettings {
int ringVol = 100;
int ringTimeSec = 20;
int ringLoops = 10;
int vibrateStrength = 1;
int vibrateStrength = 2;
};
constexpr int kRingTimeSteps[] = {10, 15, 20, 25, 30, 45, 60};
@@ -164,6 +164,10 @@ std::string loadActiveRingtonePath() {
}
const char* envRing = std::getenv("SXMO_RINGTONE");
if (envRing && *envRing) return envRing;
struct stat stDef {};
if (::stat("/usr/share/sxmo/ringtones/Banana_Chime.wav", &stDef) == 0) {
return "/usr/share/sxmo/ringtones/Banana_Chime.wav";
}
return "/usr/share/sxmo/ring.ogg";
}
@@ -386,15 +390,22 @@ int runRingtonesApp(int argc, char** argv) {
settings = loadRingSettings();
int rvol = std::clamp(settings.ringVol, 0, 100);
int rx3 = (rvol <= 0) ? 0 : (60 + rvol * 34 / 100);
int mpvVol = rvol * 130 / 100;
int mpvVol = rvol;
std::string volArg = "--volume=" + std::to_string(mpvVol);
runAsyncCmd("amixer -c 0 cset \"name='EAR_S'\" 0 >/dev/null 2>&1; "
"amixer -c 0 cset \"name='RX1 MIX1 INP1'\" 0 >/dev/null 2>&1; "
"amixer -c 0 cset \"name='PRI_MI2S_RX Audio Mixer MultiMedia1'\" 1 >/dev/null 2>&1; "
"amixer -c 0 cset \"name='SPK DAC Switch'\" 1 >/dev/null 2>&1; "
"amixer -c 0 cset \"name='RX3 MIX1 INP1'\" 3 >/dev/null 2>&1; "
"amixer -c 0 cset \"name='RX3 Digital Volume'\" " +
std::to_string(rx3) + " >/dev/null 2>&1; "
"wpctl set-mute @DEFAULT_AUDIO_SINK@ 0 >/dev/null 2>&1; "
"wpctl set-volume @DEFAULT_AUDIO_SINK@ 100% >/dev/null 2>&1");
"wpctl set-volume @DEFAULT_AUDIO_SINK@ " +
std::to_string(rvol) + "% >/dev/null 2>&1; "
"(sleep 0.25; amixer -c 0 cset \"name='RX3 Digital Volume'\" " +
std::to_string(rx3) + " >/dev/null 2>&1; "
"wpctl set-volume @DEFAULT_AUDIO_SINK@ " +
std::to_string(rvol) + "% >/dev/null 2>&1) &");
pid_t pid = ::fork();
if (pid == 0) {
std::string runtimeDir = "/run/user/" + std::to_string(::getuid());
@@ -410,7 +421,8 @@ int runRingtonesApp(int argc, char** argv) {
::dup2(devNull, STDERR_FILENO);
if (devNull > 2) ::close(devNull);
}
::execlp("mpv", "mpv", "--no-resume-playback", "--quiet",
::execlp("mpv", "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", volArg.c_str(),
@@ -564,6 +576,8 @@ int runRingtonesApp(int argc, char** argv) {
"Vibrate Only",
"Silent",
};
const char* vibLabels[3] = {"1 (Light)", "2 (Medium)", "3 (Strong)"};
int vIdx = std::clamp(settings.vibrateStrength, 1, 3) - 1;
std::string rows[6][2] = {
{"Ringer Mode",
"< " + std::string(modeLabels[settings.ringerMode % 4]) + " >"},
@@ -574,7 +588,7 @@ int runRingtonesApp(int argc, char** argv) {
{"Ring Loop Count",
"< " + std::to_string(settings.ringLoops) + " loops >"},
{"Vibrate Strength",
"< Level " + std::to_string(settings.vibrateStrength) + " >"},
"< Level " + std::string(vibLabels[vIdx]) + " >"},
{"Test Vibration", "Press OK to vibrate"},
};
@@ -665,6 +679,13 @@ int runRingtonesApp(int argc, char** argv) {
} else if (settingsRow == 1) {
settings.ringVol = std::clamp(settings.ringVol + delta * 5, 0, 100);
saveRingSettings(settings);
if (previewPid > 0) {
int rx3 = (settings.ringVol <= 0) ? 0 : (60 + settings.ringVol * 34 / 100);
runAsyncCmd("amixer -c 0 cset \"name='RX3 Digital Volume'\" " +
std::to_string(rx3) + " >/dev/null 2>&1; "
"wpctl set-volume @DEFAULT_AUDIO_SINK@ " +
std::to_string(settings.ringVol) + "% >/dev/null 2>&1");
}
setBanner("Ring volume: " + std::to_string(settings.ringVol) + "%");
} else if (settingsRow == 2) {
int curIdx = 2;
@@ -692,17 +713,14 @@ int runRingtonesApp(int argc, char** argv) {
settings.vibrateStrength =
((settings.vibrateStrength - 1 + 3 + delta) % 3) + 1;
saveRingSettings(settings);
runAsyncCmd("SXMO_VIBRATE_FORCE=1 sxmo_vibrate 450 " +
std::to_string(settings.vibrateStrength) + " >/dev/null 2>&1");
setBanner("Vibration level: " + std::to_string(settings.vibrateStrength));
} else if (settingsRow == 5) {
int mag = (settings.vibrateStrength == 1)
? 8000
: (settings.vibrateStrength == 3 ? 65535 : 32000);
runAsyncCmd(
"for d in /dev/input/by-path/platform-vibrator-event "
"/dev/input/by-path/*vibrator*-event; do "
"[ -e \"$d\" ] && export SXMO_VIBRATE_DEV=\"$d\" && break; done; "
"sxmo_vibrate 600 " +
std::to_string(mag) + " >/dev/null 2>&1");
setBanner("Testing vibration...");
runAsyncCmd("SXMO_VIBRATE_FORCE=1 sxmo_vibrate 800 " +
std::to_string(settings.vibrateStrength) + " >/dev/null 2>&1");
setBanner("Testing vibration (Level " +
std::to_string(settings.vibrateStrength) + ")...");
}
};