From a5cbade8ecad66912995f540a41978ba5d81638a Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 24 May 2018 19:42:57 +0300 Subject: [PATCH] Update libtgvoip. --- Telegram/SourceFiles/calls/calls_call.cpp | 82 ++++++++++++++++++----- Telegram/SourceFiles/calls/calls_call.h | 19 +++++- Telegram/ThirdParty/libtgvoip | 2 +- 3 files changed, 85 insertions(+), 18 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls_call.cpp b/Telegram/SourceFiles/calls/calls_call.cpp index 3ca5b5bed..980b3ae59 100644 --- a/Telegram/SourceFiles/calls/calls_call.cpp +++ b/Telegram/SourceFiles/calls/calls_call.cpp @@ -35,7 +35,7 @@ namespace Calls { namespace { constexpr auto kMinLayer = 65; -constexpr auto kMaxLayer = 65; // MTP::CurrentLayer? +constexpr auto kMaxLayer = 75; constexpr auto kHangupTimeoutMs = 5000; using tgvoip::Endpoint; @@ -57,7 +57,7 @@ void ConvertEndpoint( (uint16_t)mtc.vport.v, ipv4, ipv6, - EP_TYPE_UDP_RELAY, + tgvoip::Endpoint::TYPE_UDP_RELAY, (unsigned char*)mtc.vpeer_tag.v.data())); } @@ -77,6 +77,46 @@ uint64 ComputeFingerprint( } // namespace +void Call::ControllerPointer::create() { + Expects(_data == nullptr); + + _data = std::make_unique(); +} + +void Call::ControllerPointer::reset() { + if (const auto controller = base::take(_data)) { + controller->Stop(); + } +} + +bool Call::ControllerPointer::empty() const { + return (_data == nullptr); +} + +bool Call::ControllerPointer::operator==(std::nullptr_t) const { + return empty(); +} + +Call::ControllerPointer::operator bool() const { + return !empty(); +} + +tgvoip::VoIPController *Call::ControllerPointer::operator->() const { + Expects(!empty()); + + return _data.get(); +} + +tgvoip::VoIPController &Call::ControllerPointer::operator*() const { + Expects(!empty()); + + return *_data; +} + +Call::ControllerPointer::~ControllerPointer() { + reset(); +} + Call::Call( not_null delegate, not_null user, @@ -481,7 +521,7 @@ void Call::createAndStartController(const MTPDphoneCall &call) { } voip_config_t config = { 0 }; - config.data_saving = DATA_SAVING_NEVER; + config.data_saving = tgvoip::DATA_SAVING_NEVER; #ifdef Q_OS_MAC config.enableAEC = (QSysInfo::macVersion() < QSysInfo::MV_10_7); #else // Q_OS_MAC @@ -504,23 +544,30 @@ void Call::createAndStartController(const MTPDphoneCall &call) { } } - std::vector endpoints; + const auto &protocol = call.vprotocol.c_phoneCallProtocol(); + auto endpoints = std::vector(); ConvertEndpoint(endpoints, call.vconnection.c_phoneConnection()); for (int i = 0; i < call.valternative_connections.v.length(); i++) { ConvertEndpoint(endpoints, call.valternative_connections.v[i].c_phoneConnection()); } - _controller = std::make_unique(); + auto callbacks = tgvoip::VoIPController::Callbacks(); + callbacks.connectionStateChanged = []( + tgvoip::VoIPController *controller, + int state) { + const auto call = static_cast(controller->implData); + call->handleControllerStateChange(controller, state); + }; + + _controller.create(); if (_mute) { _controller->SetMicMute(_mute); } _controller->implData = static_cast(this); - _controller->SetRemoteEndpoints(endpoints, true); + _controller->SetRemoteEndpoints(endpoints, true, protocol.vmax_layer.v); _controller->SetConfig(&config); _controller->SetEncryptionKey(reinterpret_cast(_authKey.data()), (_type == Type::Outgoing)); - _controller->SetStateCallback([](tgvoip::VoIPController *controller, int state) { - static_cast(controller->implData)->handleControllerStateChange(controller, state); - }); + _controller->SetCallbacks(callbacks); if (Global::UseProxy() && Global::UseProxyForCalls()) { const auto proxy = Global::SelectedProxy(); if (proxy.supportsCalls()) { @@ -543,22 +590,22 @@ void Call::handleControllerStateChange(tgvoip::VoIPController *controller, int s Expects(controller->implData == static_cast(this)); switch (state) { - case STATE_WAIT_INIT: { + case tgvoip::STATE_WAIT_INIT: { DEBUG_LOG(("Call Info: State changed to WaitingInit.")); setStateQueued(State::WaitingInit); } break; - case STATE_WAIT_INIT_ACK: { + case tgvoip::STATE_WAIT_INIT_ACK: { DEBUG_LOG(("Call Info: State changed to WaitingInitAck.")); setStateQueued(State::WaitingInitAck); } break; - case STATE_ESTABLISHED: { + case tgvoip::STATE_ESTABLISHED: { DEBUG_LOG(("Call Info: State changed to Established.")); setStateQueued(State::Established); } break; - case STATE_FAILED: { + case tgvoip::STATE_FAILED: { auto error = controller->GetLastError(); LOG(("Call Info: State changed to Failed, error: %1.").arg(error)); setFailedQueued(error); @@ -714,9 +761,12 @@ void Call::handleRequestError(const RPCError &error) { } void Call::handleControllerError(int error) { - if (error == TGVOIP_ERROR_INCOMPATIBLE) { - Ui::show(Box(Lang::Hard::CallErrorIncompatible().replace("{user}", App::peerName(_user)))); - } else if (error == TGVOIP_ERROR_AUDIO_IO) { + if (error == tgvoip::ERROR_INCOMPATIBLE) { + Ui::show(Box( + Lang::Hard::CallErrorIncompatible().replace( + "{user}", + App::peerName(_user)))); + } else if (error == tgvoip::ERROR_AUDIO_IO) { Ui::show(Box(lang(lng_call_error_audio_io))); } finish(FinishType::Failed); diff --git a/Telegram/SourceFiles/calls/calls_call.h b/Telegram/SourceFiles/calls/calls_call.h index 48ce86e4d..a72d5150b 100644 --- a/Telegram/SourceFiles/calls/calls_call.h +++ b/Telegram/SourceFiles/calls/calls_call.h @@ -116,6 +116,23 @@ public: ~Call(); private: + class ControllerPointer { + public: + void create(); + void reset(); + bool empty() const; + + bool operator==(std::nullptr_t) const; + explicit operator bool() const; + tgvoip::VoIPController *operator->() const; + tgvoip::VoIPController &operator*() const; + + ~ControllerPointer(); + + private: + std::unique_ptr _data; + + }; enum class FinishType { None, Ended, @@ -170,7 +187,7 @@ private: uint64 _accessHash = 0; uint64 _keyFingerprint = 0; - std::unique_ptr _controller; + ControllerPointer _controller; std::unique_ptr _waitingTrack; diff --git a/Telegram/ThirdParty/libtgvoip b/Telegram/ThirdParty/libtgvoip index ed3a899bb..00851dc63 160000 --- a/Telegram/ThirdParty/libtgvoip +++ b/Telegram/ThirdParty/libtgvoip @@ -1 +1 @@ -Subproject commit ed3a899bbe26c56dc25e40730ca6d0e95f59717d +Subproject commit 00851dc6346d9c1e02d09885029e5ba32a4094e8