chatgui: add sound playback via miniaudio (MP3 notification sounds)

- SoundManager singleton wraps ma_engine + ma_sound (non-blocking, background thread)
- MP3 files embedded in QRC, decoded to PCM at startup with MA_SOUND_FLAG_DECODE
- miniaudio.h (MIT) in lib/, IMPLEMENTATION in separate miniaudio_impl.c
- Sound settings page in SettingsDialog: enable/disable, volume slider (0-100%)
- Config keys [gui] sound_enabled, sound_volume
- Incoming messages trigger msg_incoming.mp3 sound
This commit is contained in:
Evgeny committed 2026-07-19 14:46:21 +03:00
1 parent f6f7e12192
commit c2ad2e78c3
25 files changed
+101647 -2

No files matched your search

+27
View File
@@ -7,6 +7,7 @@
#include "settingsdialog.h"
#include "creategroupdialog.h"
#include "invite_link.h"
#include "sound_manager.h"
#include "../db/db_manager.h"
#include "../transport/utun_node.h"
#include "../transport/gui_bridge.h"
@@ -18,6 +19,8 @@
#include <QMessageBox>
#include <QDebug>
#include <QSettings>
#include <QFile>
#include <QTextStream>
extern "C" {
#include "../transport/chat_core.h"
@@ -80,6 +83,29 @@ MainWindow::MainWindow(QWidget *parent, DbManager* db, const QString& cfgPath,
setupUi();
setupTray();
SoundManager* sm = SoundManager::instance();
if (sm->init()) {
QFile cfgFile(m_cfgPath);
if (cfgFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
bool inGui = false; bool enabled = true; int volume = 80;
QTextStream in(&cfgFile);
while (!in.atEnd()) {
QString line = in.readLine().trimmed();
if (line == "[gui]") { inGui = true; continue; }
if (line.startsWith("[") && line.endsWith("]")) inGui = false;
if (!inGui) continue;
if (line.startsWith("sound_enabled="))
enabled = line.mid(15).trimmed() != "0";
else if (line.startsWith("sound_volume="))
volume = line.mid(13).trimmed().toInt();
}
cfgFile.close();
sm->setEnabled(enabled);
sm->setVolume(volume / 100.0f);
}
sm->loadSound("msg_incoming", ":/sounds/msg_incoming.mp3");
}
if (m_db) {
s_mainWindow = this;
gui_bridge_set_msg_received_cb(onMsgReceivedCallback);
@@ -277,6 +303,7 @@ void MainWindow::showSettings() {
void MainWindow::onMessageReceived(const char* ch_id) {
DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "MainWindow: msg received ch=%s", ch_id);
SoundManager::instance()->play("msg_incoming");
if (m_messageList)
m_messageList->refresh();
}