Fix WAV call recording/playback, ALSA call audio routing, and tracker ringtones

This commit is contained in:
Luxferre
2026-10-25 18:15:36 +02:00
parent b706865ee8
commit f4fe5ce8e9
21 changed files with 339 additions and 33 deletions
+20 -3
View File
@@ -70,7 +70,13 @@ bool isAudioExtension(const std::string& name, std::string* extUpperOut = nullpt
if (dot == std::string::npos || dot + 1 >= name.size()) return false;
std::string ext = toLowerStr(name.substr(dot + 1));
if (ext == "wav" || ext == "ogg" || ext == "mp3" ||
ext == "flac" || ext == "opus" || ext == "m4a") {
ext == "flac" || ext == "opus" || ext == "m4a" ||
ext == "aac" || ext == "wma" || ext == "aiff" || ext == "aif" ||
ext == "mod" || ext == "xm" || ext == "it" || ext == "s3m" ||
ext == "mptm" || ext == "stm" || ext == "med" || ext == "okt" ||
ext == "669" || ext == "ult" || ext == "far" || ext == "mtm" ||
ext == "ptm" || ext == "amf" || ext == "dsm" || ext == "imf" ||
ext == "gdm" || ext == "stx" || ext == "umx" || ext == "mo3") {
if (extUpperOut) {
*extUpperOut = ext;
for (char& c : *extUpperOut) {
@@ -139,6 +145,7 @@ std::vector<RingtoneEntry> discoverRingtones() {
scanDirectoryForRingtones(home + "/Ringtones", "User", list);
scanDirectoryForRingtones(home + "/Music/Ringtones", "User", list);
scanDirectoryForRingtones(home + "/Music", "Music", list);
scanDirectoryForRingtones("/usr/share/sxmo/music", "Tracker", list);
return list;
}
@@ -381,13 +388,21 @@ int runRingtonesApp(int argc, char** argv) {
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; "
runAsyncCmd("amixer -c 0 cset \"name='EAR_S'\" 0 >/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");
pid_t pid = ::fork();
if (pid == 0) {
std::string runtimeDir = "/run/user/" + std::to_string(::getuid());
const char* xdg = std::getenv("XDG_RUNTIME_DIR");
struct stat stRuntime {};
if (!xdg || !*xdg || ::stat(xdg, &stRuntime) != 0) {
::setenv("XDG_RUNTIME_DIR", runtimeDir.c_str(), 1);
}
int devNull = ::open("/dev/null", O_RDWR);
if (devNull >= 0) {
::dup2(devNull, STDIN_FILENO);
@@ -396,7 +411,9 @@ int runRingtonesApp(int argc, char** argv) {
if (devNull > 2) ::close(devNull);
}
::execlp("mpv", "mpv", "--no-resume-playback", "--quiet",
"--no-video", "--volume-max=150", volArg.c_str(),
"--no-video", "--ao=pipewire,pulse,alsa",
"--audio-channels=stereo", "--audio-samplerate=48000",
"--volume-max=150", volArg.c_str(),
"--loop=2", path.c_str(), nullptr);
::_exit(127);
} else if (pid > 0) {