| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- /*
- This file is part of Telegram Desktop,
- the official desktop application for the Telegram messaging service.
- For license and copyright information please follow this link:
- https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
- */
- #include "calls/calls_controller_webrtc.h"
- #include "webrtc/webrtc_call_context.h"
- namespace Calls {
- namespace {
- using namespace Webrtc;
- [[nodiscard]] CallConnectionDescription ConvertEndpoint(const TgVoipEndpoint &data) {
- return CallConnectionDescription{
- .ip = QString::fromStdString(data.host.ipv4),
- .ipv6 = QString::fromStdString(data.host.ipv6),
- .peerTag = QByteArray(
- reinterpret_cast<const char*>(data.peerTag),
- base::array_size(data.peerTag)),
- .connectionId = data.endpointId,
- .port = data.port,
- };
- }
- [[nodiscard]] CallContext::Config MakeContextConfig(
- const TgVoipConfig &config,
- const TgVoipPersistentState &persistentState,
- const std::vector<TgVoipEndpoint> &endpoints,
- const TgVoipProxy *proxy,
- TgVoipNetworkType initialNetworkType,
- const TgVoipEncryptionKey &encryptionKey,
- Fn<void(QByteArray)> sendSignalingData,
- Fn<void(QImage)> displayNextFrame) {
- Expects(!endpoints.empty());
- auto result = CallContext::Config{
- .proxy = (proxy
- ? ProxyServer{
- .host = QString::fromStdString(proxy->host),
- .username = QString::fromStdString(proxy->login),
- .password = QString::fromStdString(proxy->password),
- .port = proxy->port }
- : ProxyServer()),
- .dataSaving = (config.dataSaving != TgVoipDataSaving::Never),
- .key = QByteArray(
- reinterpret_cast<const char*>(encryptionKey.value.data()),
- encryptionKey.value.size()),
- .outgoing = encryptionKey.isOutgoing,
- .primary = ConvertEndpoint(endpoints.front()),
- .alternatives = endpoints | ranges::views::drop(
- 1
- ) | ranges::views::transform(ConvertEndpoint) | ranges::to_vector,
- .maxLayer = config.maxApiLayer,
- .allowP2P = config.enableP2P,
- .sendSignalingData = std::move(sendSignalingData),
- .displayNextFrame = std::move(displayNextFrame),
- };
- return result;
- }
- } // namespace
- WebrtcController::WebrtcController(
- const TgVoipConfig &config,
- const TgVoipPersistentState &persistentState,
- const std::vector<TgVoipEndpoint> &endpoints,
- const TgVoipProxy *proxy,
- TgVoipNetworkType initialNetworkType,
- const TgVoipEncryptionKey &encryptionKey,
- Fn<void(QByteArray)> sendSignalingData,
- Fn<void(QImage)> displayNextFrame)
- : _impl(std::make_unique<CallContext>(MakeContextConfig(
- config,
- persistentState,
- endpoints,
- proxy,
- initialNetworkType,
- encryptionKey,
- std::move(sendSignalingData),
- std::move(displayNextFrame)))) {
- }
- WebrtcController::~WebrtcController() = default;
- std::string WebrtcController::Version() {
- return CallContext::Version().toStdString();
- }
- std::string WebrtcController::version() {
- return Version();
- }
- void WebrtcController::setNetworkType(TgVoipNetworkType networkType) {
- }
- void WebrtcController::setMuteMicrophone(bool muteMicrophone) {
- _impl->setIsMuted(muteMicrophone);
- }
- void WebrtcController::setAudioOutputGainControlEnabled(bool enabled) {
- }
- void WebrtcController::setEchoCancellationStrength(int strength) {
- }
- void WebrtcController::setAudioInputDevice(std::string id) {
- }
- void WebrtcController::setAudioOutputDevice(std::string id) {
- }
- void WebrtcController::setInputVolume(float level) {
- }
- void WebrtcController::setOutputVolume(float level) {
- }
- void WebrtcController::setAudioOutputDuckingEnabled(bool enabled) {
- }
- bool WebrtcController::receiveSignalingData(const QByteArray &data) {
- return _impl->receiveSignalingData(data);
- }
- std::string WebrtcController::getLastError() {
- return {};
- }
- std::string WebrtcController::getDebugInfo() {
- return _impl->getDebugInfo().toStdString();
- }
- int64_t WebrtcController::getPreferredRelayId() {
- return 0;
- }
- TgVoipTrafficStats WebrtcController::getTrafficStats() {
- return {};
- }
- TgVoipPersistentState WebrtcController::getPersistentState() {
- return TgVoipPersistentState{};
- }
- void WebrtcController::setOnStateUpdated(
- Fn<void(TgVoipState)> onStateUpdated) {
- _stateUpdatedLifetime.destroy();
- _impl->state().changes(
- ) | rpl::start_with_next([=](CallState state) {
- onStateUpdated([&] {
- switch (state) {
- case CallState::Initializing: return TgVoipState::WaitInit;
- case CallState::Reconnecting: return TgVoipState::Reconnecting;
- case CallState::Connected: return TgVoipState::Established;
- case CallState::Failed: return TgVoipState::Failed;
- }
- Unexpected("State value in Webrtc::CallContext::state.");
- }());
- }, _stateUpdatedLifetime);
- }
- void WebrtcController::setOnSignalBarsUpdated(
- Fn<void(int)> onSignalBarsUpdated) {
- }
- TgVoipFinalState WebrtcController::stop() {
- _impl->stop();
- return TgVoipFinalState();
- }
- } // namespace Calls
|