From ac48c332867e773e0e0eb9ad0139b7b625e26851 Mon Sep 17 00:00:00 2001 From: Rohit Sutradhar Date: Fri, 14 Oct 2022 19:19:05 +0530 Subject: VoIP v1 implementation (#1161) * Initial commit for VoIP v1 implementation * Added draft of event handlers for voip methods * Added event handlers for VoIP events, added rejectCall, added version tracking for call version for V0 and V1 compatibility * Added call events to the general message pipeline. Modified Call Reject mechanism * Added message delegates for new events. Modified hidden events. Updated handle events. * Updated implementation to keep track of calls on other devices * Fixed linting * Fixed code warnings * Fixed minor bugs * fixed ci * Added acceptNegotiation method definition when missing gstreamer * Fixed warnings * Fixed linting --- src/voip/CallManager.h | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) (limited to 'src/voip/CallManager.h') diff --git a/src/voip/CallManager.h b/src/voip/CallManager.h index 8f1615f8..3011444f 100644 --- a/src/voip/CallManager.h +++ b/src/voip/CallManager.h @@ -18,6 +18,7 @@ #include "WebRTCSession.h" #include "mtx/events/collections.hpp" #include "mtx/events/voip.hpp" +#include namespace mtx::responses { struct TurnServer; @@ -30,6 +31,7 @@ class CallManager final : public QObject Q_OBJECT Q_PROPERTY(bool haveCallInvite READ haveCallInvite NOTIFY newInviteState) Q_PROPERTY(bool isOnCall READ isOnCall NOTIFY newCallState) + Q_PROPERTY(bool isOnCallOnOtherDevice READ isOnCallOnOtherDevice NOTIFY newCallDeviceState) Q_PROPERTY(webrtc::CallType callType READ callType NOTIFY newInviteState) Q_PROPERTY(webrtc::State callState READ callState NOTIFY newCallState) Q_PROPERTY(QString callParty READ callParty NOTIFY newInviteState) @@ -46,7 +48,9 @@ public: CallManager(QObject *); bool haveCallInvite() const { return haveCallInvite_; } - bool isOnCall() const { return session_.state() != webrtc::State::DISCONNECTED; } + bool isOnCall() const { return (session_.state() != webrtc::State::DISCONNECTED); } + bool isOnCallOnOtherDevice() const { return (isOnCallOnOtherDevice_ != ""); } + bool checkSharesRoom(QString roomid_, std::string invitee) const; webrtc::CallType callType() const { return callType_; } webrtc::State callState() const { return session_.state(); } QString callParty() const { return callParty_; } @@ -67,8 +71,9 @@ public slots: void toggleMicMute(); void toggleLocalPiP() { session_.toggleLocalPiP(); } void acceptInvite(); - void - hangUp(mtx::events::voip::CallHangUp::Reason = mtx::events::voip::CallHangUp::Reason::User); + void hangUp( + mtx::events::voip::CallHangUp::Reason = mtx::events::voip::CallHangUp::Reason::UserHangUp); + void rejectInvite(); QStringList windowList(); void previewWindow(unsigned int windowIndex) const; @@ -77,8 +82,12 @@ signals: void newMessage(const QString &roomid, const mtx::events::voip::CallCandidates &); void newMessage(const QString &roomid, const mtx::events::voip::CallAnswer &); void newMessage(const QString &roomid, const mtx::events::voip::CallHangUp &); + void newMessage(const QString &roomid, const mtx::events::voip::CallSelectAnswer &); + void newMessage(const QString &roomid, const mtx::events::voip::CallReject &); + void newMessage(const QString &roomid, const mtx::events::voip::CallNegotiate &); void newInviteState(); void newCallState(); + void newCallDeviceState(); void micMuteChanged(); void devicesChanged(); void turnServerRetrieved(const mtx::responses::TurnServer &); @@ -92,18 +101,23 @@ private: QString callParty_; QString callPartyDisplayName_; QString callPartyAvatarUrl_; + std::string callPartyVersion_ = "1"; std::string callid_; - std::string partyid_ = ""; - std::string invitee_ = ""; - const uint32_t timeoutms_ = 120000; - webrtc::CallType callType_ = webrtc::CallType::VOICE; - bool haveCallInvite_ = false; + std::string partyid_ = mtx::client::utils::random_token(8, false); + std::string selectedpartyid_ = ""; + std::string invitee_ = ""; + const uint32_t timeoutms_ = 120000; + webrtc::CallType callType_ = webrtc::CallType::VOICE; + bool haveCallInvite_ = false; + bool answerSelected_ = false; + std::string isOnCallOnOtherDevice_ = ""; std::string inviteSDP_; std::vector remoteICECandidates_; std::vector turnURIs_; QTimer turnServerTimer_; QMediaPlayer player_; std::vector> windows_; + std::vector rejectCallPartyIDs_; template bool handleEvent(const mtx::events::collections::TimelineEvents &event); @@ -111,11 +125,14 @@ private: void handleEvent(const mtx::events::RoomEvent &); void handleEvent(const mtx::events::RoomEvent &); void handleEvent(const mtx::events::RoomEvent &); + void handleEvent(const mtx::events::RoomEvent &); + void handleEvent(const mtx::events::RoomEvent &); + void handleEvent(const mtx::events::RoomEvent &); void answerInvite(const mtx::events::voip::CallInvite &, bool isVideo); void generateCallID(); QStringList devices(bool isVideo) const; - void clear(); - void endCall(); + void clear(bool endAllCalls = true); + void endCall(bool endAllCalls = true); void playRingtone(const QUrl &ringtone, bool repeat); void stopRingtone(); }; -- cgit 1.5.1