Merge pull request #237 from trilene/voip
Support voice calls
1 files changed, 75 insertions, 0 deletions
diff --git a/src/CallManager.h b/src/CallManager.h
new file mode 100644
index 00000000..3a406438
--- /dev/null
+++ b/src/CallManager.h
@@ -0,0 +1,75 @@
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include <QMediaPlayer>
+#include <QObject>
+#include <QSharedPointer>
+#include <QString>
+#include <QTimer>
+
+#include "mtx/events/collections.hpp"
+#include "mtx/events/voip.hpp"
+
+namespace mtx::responses {
+struct TurnServer;
+}
+
+class UserSettings;
+class WebRTCSession;
+
+class CallManager : public QObject
+{
+ Q_OBJECT
+
+public:
+ CallManager(QSharedPointer<UserSettings>);
+
+ void sendInvite(const QString &roomid);
+ void hangUp(
+ mtx::events::msg::CallHangUp::Reason = mtx::events::msg::CallHangUp::Reason::User);
+ bool onActiveCall();
+ void refreshTurnServer();
+
+public slots:
+ void syncEvent(const mtx::events::collections::TimelineEvents &event);
+
+signals:
+ void newMessage(const QString &roomid, const mtx::events::msg::CallInvite &);
+ void newMessage(const QString &roomid, const mtx::events::msg::CallCandidates &);
+ void newMessage(const QString &roomid, const mtx::events::msg::CallAnswer &);
+ void newMessage(const QString &roomid, const mtx::events::msg::CallHangUp &);
+ void turnServerRetrieved(const mtx::responses::TurnServer &);
+ void newCallParty(const QString &userid,
+ const QString &displayName,
+ const QString &roomName,
+ const QString &avatarUrl);
+
+private slots:
+ void retrieveTurnServer();
+
+private:
+ WebRTCSession &session_;
+ QString roomid_;
+ std::string callid_;
+ const uint32_t timeoutms_ = 120000;
+ std::vector<mtx::events::msg::CallCandidates::Candidate> remoteICECandidates_;
+ std::vector<std::string> turnURIs_;
+ QTimer turnServerTimer_;
+ QSharedPointer<UserSettings> settings_;
+ QMediaPlayer player_;
+
+ template<typename T>
+ bool handleEvent_(const mtx::events::collections::TimelineEvents &event);
+ void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallInvite> &);
+ void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallCandidates> &);
+ void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallAnswer> &);
+ void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallHangUp> &);
+ void answerInvite(const mtx::events::msg::CallInvite &);
+ void generateCallID();
+ void clear();
+ void endCall();
+ void playRingtone(const QString &ringtone, bool repeat);
+ void stopRingtone();
+};
|