Add xmusic tracker/audio player, xfiles media actions, ringtone volume & vibration fix

This commit is contained in:
Luxferre
2026-10-25 17:31:54 +02:00
parent ba2307d44c
commit 30c3e817dc
70 changed files with 2296 additions and 86 deletions
+38 -17
View File
@@ -43,6 +43,7 @@ struct RingtoneEntry {
struct RingSettings {
int ringerMode = 0; // 0 = Ring + Vibrate, 1 = Ring Only, 2 = Vibrate Only, 3 = Silent
int ringVol = 100;
int ringTimeSec = 20;
int ringLoops = 10;
int vibrateStrength = 1;
@@ -198,6 +199,8 @@ RingSettings loadRingSettings() {
s.ringLoops = val;
} else if (k == "SXMO_VIBRATE_STRENGTH" && val >= 1 && val <= 3) {
s.vibrateStrength = val;
} else if (k == "SXMO_RINGVOL" && val >= 0 && val <= 100) {
s.ringVol = (val / 5) * 5;
}
}
return s;
@@ -228,6 +231,7 @@ void saveRingSettings(const RingSettings& s) {
ofs << "SXMO_RINGTIME=" << s.ringTimeSec << "\n";
ofs << "SXMO_RINGNUMBER=" << s.ringLoops << "\n";
ofs << "SXMO_VIBRATE_STRENGTH=" << s.vibrateStrength << "\n";
ofs << "SXMO_RINGVOL=" << std::clamp(s.ringVol, 0, 100) << "\n";
}
runAsyncCmd("sxmo_hook_statusbar.sh audio >/dev/null 2>&1");
}
@@ -372,6 +376,16 @@ int runRingtonesApp(int argc, char** argv) {
return;
}
stopPreview();
settings = loadRingSettings();
int rvol = std::clamp(settings.ringVol, 0, 100);
int rx3 = (rvol <= 0) ? 0 : (60 + rvol * 34 / 100);
int mpvVol = rvol * 130 / 100;
std::string volArg = "--volume=" + std::to_string(mpvVol);
runAsyncCmd("amixer -c 0 cset \"name='SPK DAC Switch'\" 1 >/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");
pid_t pid = ::fork();
if (pid == 0) {
int devNull = ::open("/dev/null", O_RDWR);
@@ -382,7 +396,8 @@ int runRingtonesApp(int argc, char** argv) {
if (devNull > 2) ::close(devNull);
}
::execlp("mpv", "mpv", "--no-resume-playback", "--quiet",
"--no-video", "--loop=2", path.c_str(), nullptr);
"--no-video", "--volume-max=150", volArg.c_str(),
"--loop=2", path.c_str(), nullptr);
::_exit(127);
} else if (pid > 0) {
previewPid = pid;
@@ -532,9 +547,11 @@ int runRingtonesApp(int argc, char** argv) {
"Vibrate Only",
"Silent",
};
std::string rows[5][2] = {
std::string rows[6][2] = {
{"Ringer Mode",
"< " + std::string(modeLabels[settings.ringerMode % 4]) + " >"},
{"Ring Volume",
"< " + std::to_string(settings.ringVol) + "% >"},
{"Ring Duration",
"< " + std::to_string(settings.ringTimeSec) + " sec >"},
{"Ring Loop Count",
@@ -544,18 +561,18 @@ int runRingtonesApp(int argc, char** argv) {
{"Test Vibration", "Press OK to vibrate"},
};
for (int i = 0; i < 5; ++i) {
int ry = 32 + i * 42;
for (int i = 0; i < 6; ++i) {
int ry = 30 + i * 35;
bool isSel = (settingsRow == i);
XSetForeground(dpy, gc, isSel ? pt.spec.selBg : pt.spec.bgAltEven);
XFillRectangle(dpy, pix, gc, 4, ry, kWinWidth - 8, 38);
XFillRectangle(dpy, pix, gc, 4, ry, kWinWidth - 8, 33);
if (isSel) {
XSetForeground(dpy, gc, pt.spec.accent);
XDrawRectangle(dpy, pix, gc, 4, ry, kWinWidth - 9, 37);
XDrawRectangle(dpy, pix, gc, 4, ry, kWinWidth - 9, 32);
}
drawPango(layoutSmall, isSel ? &colWhite : &colMuted, 10, ry + 2, 17,
drawPango(layoutSmall, isSel ? &colWhite : &colMuted, 10, ry + 1, 15,
rows[i][0], kWinWidth - 20);
drawPango(layoutMain, isSel ? &colYellow : &colBlue, 10, ry + 18, 19,
drawPango(layoutMain, isSel ? &colYellow : &colBlue, 10, ry + 15, 17,
rows[i][1], kWinWidth - 20);
}
drawSoftkeyBar("Change", "Select", "Close");
@@ -629,6 +646,10 @@ int runRingtonesApp(int argc, char** argv) {
saveRingSettings(settings);
setBanner("Ringer mode updated");
} else if (settingsRow == 1) {
settings.ringVol = std::clamp(settings.ringVol + delta * 5, 0, 100);
saveRingSettings(settings);
setBanner("Ring volume: " + std::to_string(settings.ringVol) + "%");
} else if (settingsRow == 2) {
int curIdx = 2;
for (int i = 0; i < kNumRingTimeSteps; ++i) {
if (kRingTimeSteps[i] == settings.ringTimeSec) {
@@ -639,7 +660,7 @@ int runRingtonesApp(int argc, char** argv) {
curIdx = (curIdx + kNumRingTimeSteps + delta) % kNumRingTimeSteps;
settings.ringTimeSec = kRingTimeSteps[curIdx];
saveRingSettings(settings);
} else if (settingsRow == 2) {
} else if (settingsRow == 3) {
int curIdx = 2;
for (int i = 0; i < kNumRingLoopSteps; ++i) {
if (kRingLoopSteps[i] == settings.ringLoops) {
@@ -650,14 +671,14 @@ int runRingtonesApp(int argc, char** argv) {
curIdx = (curIdx + kNumRingLoopSteps + delta) % kNumRingLoopSteps;
settings.ringLoops = kRingLoopSteps[curIdx];
saveRingSettings(settings);
} else if (settingsRow == 3) {
} else if (settingsRow == 4) {
settings.vibrateStrength =
((settings.vibrateStrength - 1 + 3 + delta) % 3) + 1;
saveRingSettings(settings);
} else if (settingsRow == 4) {
} else if (settingsRow == 5) {
int mag = (settings.vibrateStrength == 1)
? 20000
: (settings.vibrateStrength == 3 ? 65535 : 40000);
? 8000
: (settings.vibrateStrength == 3 ? 65535 : 32000);
runAsyncCmd(
"for d in /dev/input/by-path/platform-vibrator-event "
"/dev/input/by-path/*vibrator*-event; do "
@@ -744,7 +765,7 @@ int runRingtonesApp(int argc, char** argv) {
}
if (sym == XK_Left || sym == XK_KP_Left) {
if (activeTab == TabId::Settings && settingsRow < 4) {
if (activeTab == TabId::Settings && settingsRow < 5) {
adjustSettingRow(-1);
} else {
activeTab = (activeTab == TabId::Ringtones) ? TabId::Settings
@@ -752,7 +773,7 @@ int runRingtonesApp(int argc, char** argv) {
}
render();
} else if (sym == XK_Right || sym == XK_KP_Right) {
if (activeTab == TabId::Settings && settingsRow < 4) {
if (activeTab == TabId::Settings && settingsRow < 5) {
adjustSettingRow(1);
} else {
activeTab = (activeTab == TabId::Ringtones) ? TabId::Settings
@@ -764,14 +785,14 @@ int runRingtonesApp(int argc, char** argv) {
selIdx = (selIdx + static_cast<int>(tones.size()) - 1) %
static_cast<int>(tones.size());
} else if (activeTab == TabId::Settings) {
settingsRow = (settingsRow + 4) % 5;
settingsRow = (settingsRow + 5) % 6;
}
render();
} else if (sym == XK_Down || sym == XK_KP_Down) {
if (activeTab == TabId::Ringtones && !tones.empty()) {
selIdx = (selIdx + 1) % static_cast<int>(tones.size());
} else if (activeTab == TabId::Settings) {
settingsRow = (settingsRow + 1) % 5;
settingsRow = (settingsRow + 1) % 6;
}
render();
} else if (sym == XK_Return || sym == XK_KP_Enter) {