summary refs log tree commit diff
path: root/src/CallManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/CallManager.cpp')
-rw-r--r--src/CallManager.cpp142
1 files changed, 90 insertions, 52 deletions
diff --git a/src/CallManager.cpp b/src/CallManager.cpp

index 89cfeaf9..f725d49f 100644 --- a/src/CallManager.cpp +++ b/src/CallManager.cpp
@@ -10,11 +10,9 @@ #include "CallManager.h" #include "ChatPage.h" #include "Logging.h" -#include "MainWindow.h" #include "MatrixClient.h" +#include "UserSettingsPage.h" #include "Utils.h" -#include "WebRTCSession.h" -#include "dialogs/AcceptCall.h" #include "mtx/responses/turn_server.hpp" @@ -112,6 +110,23 @@ CallManager::CallManager(QObject *parent) default: break; } + emit newCallState(); + }); + + connect(&session_, &WebRTCSession::devicesChanged, this, [this]() { + if (ChatPage::instance()->userSettings()->microphone().isEmpty()) { + auto mics = session_.getDeviceNames(false, std::string()); + if (!mics.empty()) + ChatPage::instance()->userSettings()->setMicrophone( + QString::fromStdString(mics.front())); + } + if (ChatPage::instance()->userSettings()->camera().isEmpty()) { + auto cameras = session_.getDeviceNames(true, std::string()); + if (!cameras.empty()) + ChatPage::instance()->userSettings()->setCamera( + QString::fromStdString(cameras.front())); + } + emit devicesChanged(); }); connect(&player_, @@ -144,7 +159,7 @@ CallManager::CallManager(QObject *parent) void CallManager::sendInvite(const QString &roomid, bool isVideo) { - if (onActiveCall()) + if (isOnCall()) return; auto roomInfo = cache::singleRoomInfo(roomid.toStdString()); @@ -160,7 +175,8 @@ CallManager::sendInvite(const QString &roomid, bool isVideo) return; } - roomid_ = roomid; + isVideo_ = isVideo; + roomid_ = roomid; session_.setTurnServers(turnURIs_); generateCallID(); nhlog::ui()->debug( @@ -168,16 +184,14 @@ CallManager::sendInvite(const QString &roomid, bool isVideo) std::vector<RoomMember> members(cache::getMembers(roomid.toStdString())); const RoomMember &callee = members.front().user_id == utils::localUser() ? members.back() : members.front(); - callPartyName_ = callee.display_name.isEmpty() ? callee.user_id : callee.display_name; + callParty_ = callee.display_name.isEmpty() ? callee.user_id : callee.display_name; callPartyAvatarUrl_ = QString::fromStdString(roomInfo.avatar_url); - emit newCallParty(); + emit newInviteState(); playRingtone(QUrl("qrc:/media/media/ringback.ogg"), true); if (!session_.createOffer(isVideo)) { emit ChatPage::instance()->showNotification("Problem setting up call."); endCall(); } - if (isVideo) - emit newVideoCallState(); } namespace { @@ -206,12 +220,6 @@ CallManager::hangUp(CallHangUp::Reason reason) } } -bool -CallManager::onActiveCall() const -{ - return session_.state() != webrtc::State::DISCONNECTED; -} - void CallManager::syncEvent(const mtx::events::collections::TimelineEvents &event) { @@ -257,7 +265,7 @@ CallManager::handleEvent(const RoomEvent<CallInvite> &callInviteEvent) return; auto roomInfo = cache::singleRoomInfo(callInviteEvent.room_id); - if (onActiveCall() || roomInfo.member_count != 2) { + if (isOnCall() || roomInfo.member_count != 2) { emit newMessage(QString::fromStdString(callInviteEvent.room_id), CallHangUp{callInviteEvent.content.call_id, 0, @@ -277,48 +285,41 @@ CallManager::handleEvent(const RoomEvent<CallInvite> &callInviteEvent) std::vector<RoomMember> members(cache::getMembers(callInviteEvent.room_id)); const RoomMember &caller = members.front().user_id == utils::localUser() ? members.back() : members.front(); - callPartyName_ = caller.display_name.isEmpty() ? caller.user_id : caller.display_name; + callParty_ = caller.display_name.isEmpty() ? caller.user_id : caller.display_name; callPartyAvatarUrl_ = QString::fromStdString(roomInfo.avatar_url); - emit newCallParty(); - auto dialog = new dialogs::AcceptCall(caller.user_id, - caller.display_name, - QString::fromStdString(roomInfo.name), - QString::fromStdString(roomInfo.avatar_url), - isVideo, - MainWindow::instance()); - connect(dialog, &dialogs::AcceptCall::accept, this, [this, callInviteEvent, isVideo]() { - MainWindow::instance()->hideOverlay(); - answerInvite(callInviteEvent.content, isVideo); - }); - connect(dialog, &dialogs::AcceptCall::reject, this, [this]() { - MainWindow::instance()->hideOverlay(); - hangUp(); - }); - MainWindow::instance()->showSolidOverlayModal(dialog); + + haveCallInvite_ = true; + isVideo_ = isVideo; + inviteSDP_ = callInviteEvent.content.sdp; + session_.refreshDevices(); + emit newInviteState(); } void -CallManager::answerInvite(const CallInvite &invite, bool isVideo) +CallManager::acceptInvite() { + if (!haveCallInvite_) + return; + stopRingtone(); std::string errorMessage; if (!session_.havePlugins(false, &errorMessage) || - (isVideo && !session_.havePlugins(true, &errorMessage))) { + (isVideo_ && !session_.havePlugins(true, &errorMessage))) { emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage)); hangUp(); return; } session_.setTurnServers(turnURIs_); - if (!session_.acceptOffer(invite.sdp)) { + if (!session_.acceptOffer(inviteSDP_)) { emit ChatPage::instance()->showNotification("Problem setting up call."); hangUp(); return; } session_.acceptICECandidates(remoteICECandidates_); remoteICECandidates_.clear(); - if (isVideo) - emit newVideoCallState(); + haveCallInvite_ = false; + emit newInviteState(); } void @@ -332,7 +333,7 @@ CallManager::handleEvent(const RoomEvent<CallCandidates> &callCandidatesEvent) callCandidatesEvent.sender); if (callid_ == callCandidatesEvent.content.call_id) { - if (onActiveCall()) + if (isOnCall()) session_.acceptICECandidates(callCandidatesEvent.content.candidates); else { // CallInvite has been received and we're awaiting localUser to accept or @@ -350,15 +351,19 @@ CallManager::handleEvent(const RoomEvent<CallAnswer> &callAnswerEvent) callAnswerEvent.content.call_id, callAnswerEvent.sender); - if (!onActiveCall() && callAnswerEvent.sender == utils::localUser().toStdString() && + if (callAnswerEvent.sender == utils::localUser().toStdString() && callid_ == callAnswerEvent.content.call_id) { - emit ChatPage::instance()->showNotification("Call answered on another device."); - stopRingtone(); - MainWindow::instance()->hideOverlay(); + if (!isOnCall()) { + emit ChatPage::instance()->showNotification( + "Call answered on another device."); + stopRingtone(); + haveCallInvite_ = false; + emit newInviteState(); + } return; } - if (onActiveCall() && callid_ == callAnswerEvent.content.call_id) { + if (isOnCall() && callid_ == callAnswerEvent.content.call_id) { stopRingtone(); if (!session_.acceptAnswer(callAnswerEvent.content.sdp)) { emit ChatPage::instance()->showNotification("Problem setting up call."); @@ -375,10 +380,42 @@ CallManager::handleEvent(const RoomEvent<CallHangUp> &callHangUpEvent) callHangUpReasonString(callHangUpEvent.content.reason), callHangUpEvent.sender); - if (callid_ == callHangUpEvent.content.call_id) { - MainWindow::instance()->hideOverlay(); + if (callid_ == callHangUpEvent.content.call_id) endCall(); - } +} + +void +CallManager::toggleMicMute() +{ + session_.toggleMicMute(); + emit micMuteChanged(); +} + +bool +CallManager::callsSupported() const +{ +#ifdef GSTREAMER_AVAILABLE + return true; +#else + return false; +#endif +} + +QStringList +CallManager::devices(bool isVideo) const +{ + QStringList ret; + const QString &defaultDevice = isVideo ? ChatPage::instance()->userSettings()->camera() + : ChatPage::instance()->userSettings()->microphone(); + std::vector<std::string> devices = + session_.getDeviceNames(isVideo, defaultDevice.toStdString()); + ret.reserve(devices.size()); + std::transform(devices.cbegin(), + devices.cend(), + std::back_inserter(ret), + [](const auto &d) { return QString::fromStdString(d); }); + + return ret; } void @@ -393,9 +430,13 @@ void CallManager::clear() { roomid_.clear(); - callPartyName_.clear(); + callParty_.clear(); callPartyAvatarUrl_.clear(); callid_.clear(); + isVideo_ = false; + haveCallInvite_ = false; + emit newInviteState(); + inviteSDP_.clear(); remoteICECandidates_.clear(); } @@ -403,11 +444,8 @@ void CallManager::endCall() { stopRingtone(); - clear(); - bool isVideo = session_.isVideo(); session_.end(); - if (isVideo) - emit newVideoCallState(); + clear(); } void