call: две фазы исходящего вызова — индикация + разные гудки (desktop/Android)
This commit is contained in:
1 parent
7198154106
commit
b90dc752d2
21 files changed
+170
-21
No files matched your search
@@ -328,16 +328,20 @@ void MainWindow::setupSoundFromConfig() {
|
||||
else
|
||||
sm->loadSound("call_incoming", resolvePath(callInFile));
|
||||
|
||||
sm->loadSound("call_connecting", ":/sounds/call_connecting.mp3");
|
||||
sm->loadSound("call_ringing", ":/sounds/call_ringing.mp3");
|
||||
|
||||
if (!msgOutFile.isEmpty()) sm->loadSound("msg_outgoing", resolvePath(msgOutFile));
|
||||
if (!connectFile.isEmpty()) sm->loadSound("connect", resolvePath(connectFile));
|
||||
if (!disconnectFile.isEmpty()) sm->loadSound("disconnect", resolvePath(disconnectFile));
|
||||
if (m_db && m_db->isOpen()) {
|
||||
sm->setEnabled(m_db->getUiStateInt("sound_enabled", 1));
|
||||
sm->setVolume(m_db->getUiStateInt("sound_volume", 80) / 100.0f);
|
||||
QString se[] = {"msg_incoming", "msg_outgoing", "connect", "disconnect", "call_incoming"};
|
||||
for (int i = 0; i < 5; i++) {
|
||||
QString se[] = {"msg_incoming", "msg_outgoing", "connect", "disconnect",
|
||||
"call_incoming", "call_connecting", "call_ringing"};
|
||||
for (int i = 0; i < 7; i++) {
|
||||
const QString& ek = se[i];
|
||||
sm->setEvent(ek, m_db->getUiStateInt(QStringLiteral("sound_%1_on").arg(ek), (i == 0 || i == 4) ? 1 : 0),
|
||||
sm->setEvent(ek, m_db->getUiStateInt(QStringLiteral("sound_%1_on").arg(ek), (i == 0 || i >= 4) ? 1 : 0),
|
||||
m_db->getUiStateInt(QStringLiteral("sound_%1_vol").arg(ek), 80) / 100.0f);
|
||||
}
|
||||
}
|
||||
@@ -448,6 +452,10 @@ void MainWindow::setupBridgeCallbacks() {
|
||||
gui_bridge_set_call_declined_cb([](uint64_t call_id, uint8_t reason) {
|
||||
if (s_mainWindow) s_mainWindow->onCallEnded(call_id, reason);
|
||||
});
|
||||
gui_bridge_set_call_error_cb([](uint64_t call_id, uint8_t err, const char* text, int len) {
|
||||
Q_UNUSED(text); Q_UNUSED(len);
|
||||
if (s_mainWindow) s_mainWindow->onCallError(call_id, err);
|
||||
});
|
||||
gui_bridge_set_call_path_cb([](uint64_t call_id, const char* text, int len) {
|
||||
if (s_mainWindow) s_mainWindow->onCallPath(call_id, QString::fromUtf8(text, len));
|
||||
});
|
||||
@@ -537,6 +545,8 @@ void MainWindow::onCallRequested(const QString& chId, quint64 nodeId, const QStr
|
||||
connect(w, &CallWindow::closed, this, &MainWindow::closeCallWindow);
|
||||
m_activeCalls.insert(callId, w);
|
||||
w->show();
|
||||
|
||||
SoundManager::instance()->playLoop("call_connecting");
|
||||
}
|
||||
|
||||
void MainWindow::onCallIncoming(const QString& chId, quint64 caller, quint64 callId) {
|
||||
@@ -563,8 +573,11 @@ void MainWindow::onCallIncoming(const QString& chId, quint64 caller, quint64 cal
|
||||
}
|
||||
|
||||
void MainWindow::onCallRinging(quint64 callId) {
|
||||
/* caller слышит гудок — окно уже показано в Outgoing */
|
||||
Q_UNUSED(callId);
|
||||
/* caller: INVITE доставлен, у пира идёт вызов — фаза 2 (гудки) */
|
||||
CallWindow* w = m_activeCalls.value(callId, nullptr);
|
||||
if (w && w->state() == CallWindow::Outgoing)
|
||||
w->setState(CallWindow::Ringing);
|
||||
SoundManager::instance()->playLoop("call_ringing");
|
||||
}
|
||||
|
||||
void MainWindow::onCallAccepted(quint64 callId) {
|
||||
@@ -584,6 +597,12 @@ void MainWindow::onCallEnded(quint64 callId, uint8_t reason) {
|
||||
closeCallWindow(callId);
|
||||
}
|
||||
|
||||
void MainWindow::onCallError(quint64 callId, uint8_t err) {
|
||||
/* пир офлайн / нет маршрута — звонок не состоялся */
|
||||
DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "MainWindow: call error id=%016llx err=%u", (unsigned long long)callId, (unsigned)err);
|
||||
closeCallWindow(callId);
|
||||
}
|
||||
|
||||
void MainWindow::onCallPath(quint64 callId, const QString& path) {
|
||||
CallWindow* w = m_activeCalls.value(callId, nullptr);
|
||||
if (w) w->setBgpPath(path);
|
||||
|
||||
Reference in new issue
Block a user