【tg】8: Manager的主要功能

编程入门 行业动态 更新时间:2024-10-19 04:32:23

【tg】8: Manager的<a href=https://www.elefans.com/category/jswz/34/1753128.html style=主要功能"/>

【tg】8: Manager的主要功能

Manager 提供的是media thread

  • 说明media thread 是主线程, 而 mediamgr里是worker thread
  • networkmgr是network thread了。

Manager 的功能重要,但是特别短

  • G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\Manager.cpp

class Manager final : public std::enable_shared_from_this<Manager> {
private:struct ResolvedNetworkStatus {bool isLowCost = false;bool isLowDataRequested = false;bool operator==(const ResolvedNetworkStatus &rhs) const;bool operator!=(const ResolvedNetworkStatus &rhs) const;};public:static rtc::Thread *getMediaThread();Manager(rtc::Thread *thread, Descriptor &&descriptor);~Manager();void start();void receiveSignalingData(const std::vector<uint8_t> &data);void setVideoCapture(std::shared_ptr<VideoCaptureInterface> videoCapture);void sendVideoDeviceUpdated();void setRequestedVideoAspect(float aspect);void setMuteOutgoingAudio(bool mute);void setIncomingVideoOutput(std::weak_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> sink);void setIsLowBatteryLevel(bool isLowBatteryLevel);void setIsLocalNetworkLowCost(bool isLocalNetworkLowCost);void getNetworkStats(std::function<void(TrafficStats, CallStats)> completion);void setAudioInputDevice(std::string id);void setAudioOutputDevice(std::string id);void setInputVolume(float level);void setOutputVolume(float level);void addExternalAudioSamples(std::vector<uint8_t> &&samples);private:void sendSignalingAsync(int delayMs, int cause);void receiveMessage(DecryptedMessage &&message);void updateCurrentResolvedNetworkStatus();void sendInitialSignalingMessages();rtc::Thread *_thread;EncryptionKey _encryptionKey;EncryptedConnection _signaling;bool _enableP2P = false;bool _enableTCP = false;bool _enableStunMarking = false;ProtocolVersion _protocolVersion = ProtocolVersion::V0;FilePath _statsLogPath;std::vector<RtcServer> _rtcServers;std::unique_ptr<Proxy> _proxy;MediaDevicesConfig _mediaDevicesConfig;std::shared_ptr<VideoCaptureInterface> _videoCapture;std::function<void(State)> _stateUpdated;std::function<void(AudioState, VideoState)> _remoteMediaStateUpdated;std::function<void(bool)> _remoteBatteryLevelIsLowUpdated;std::function<void(float)> _remotePrefferedAspectRatioUpdated;std::function<void(const std::vector<uint8_t> &)> _signalingDataEmitted;std::function<void(int)> _signalBarsUpdated;std::function<void(float)> _audioLevelUpdated;std::function<rtc::scoped_refptr<webrtc::AudioDeviceModule>(webrtc::TaskQueueFactory*)> _createAudioDeviceModule;std::function<uint32_t(const Message &)> _sendSignalingMessage;std::function<void(Message&&)> _sendTransportMessage;std::unique_ptr<ThreadLocalObject<NetworkManager>> _networkManager;std::unique_ptr<ThreadLocalObject<MediaManager>> _mediaManager;State _state = State::Reconnecting;bool _didConnectOnce = false;bool _enableHighBitrateVideo = false;DataSaving _dataSaving = DataSaving::Never;std::vector<std::string> _preferredCodecs;bool _localNetworkIsLowCost = false;bool _remoteNetworkIsLowCost = false;bool _remoteIsLowDataRequested = false;absl::optional<ResolvedNetworkStatus> _currentResolvedLocalNetworkStatus;absl::optional<ResolvedNetworkStatus> _currentResolvedNetworkStatus;};

信令

_signaling(EncryptedConnection::Type::Signaling,_encryptionKey,[=](int delayMs, int cause) { sendSignalingAsync(delayMs, cause); }),

信令发送方式 :_sendSignalingMessage

sendSignalingAsync : 扔到主线程(mediathread) 执行延迟任务?

void Manager::sendSignalingAsync(int delayMs, int cause) {auto task = [weak = std::weak_ptr<Manager>(shared_from_this()), cause] {const auto strong = weak.lock();if (!strong) {return;}if (const auto prepared = strong->_signaling.prepareForSendingService(cause)) {strong->_signalingDataEmitted(prepared->bytes);}};if (delayMs) {_thread->PostDelayedTask(std::move(task), delayMs);} else {_thread->PostTask(std::move(task));}
}

媒体包发送 :_sendTransportMessage

	_sendTransportMessage = [=](Message &&message) {_networkManager->perform(RTC_FROM_HERE, [message = std::move(message)](NetworkManager *networkManager) {networkManager->sendMessage(message);});};

在Manager中完成对消息发送方的实现

  • 但是_sendSignalingMessage 是外部传递下来的:

收到消息的处理

void Manager::receiveMessage(DecryptedMessage &&message) {const auto data = &message.message.data;if (const auto candidatesList = absl::get_if<CandidatesListMessage>(data)) {_networkManager->perform(RTC_FROM_HERE, [message = std::move(message)](NetworkManager *networkManager) mutable {networkManager->receiveSignalingMessage(std::move(message));});} else if (const auto videoFormats = absl::get_if<VideoFormatsMessage>(data)) {_mediaManager->perform(RTC_FROM_HERE, [message = std::move(message)](MediaManager *mediaManager) mutable {mediaManager->receiveMessage(std::move(message));});} else if (const auto remoteMediaState = absl::get_if<RemoteMediaStateMessage>(data)) {if (_remoteMediaStateUpdated) {_remoteMediaStateUpdated(remoteMediaState->audio,remoteMediaState->video);}_mediaManager->perform(RTC_FROM_HERE, [video = remoteMediaState->video](MediaManager *mediaManager) {mediaManager->remoteVideoStateUpdated(video);});} else if (const auto remoteBatteryLevelIsLow = absl::get_if<RemoteBatteryLevelIsLowMessage>(data)) {if (_remoteBatteryLevelIsLowUpdated) {_remoteBatteryLevelIsLowUpdated(remoteBatteryLevelIsLow->batteryLow);}} else if (const auto remoteNetworkStatus = absl::get_if<RemoteNetworkStatusMessage>(data)) {_remoteNetworkIsLowCost = remoteNetworkStatus->isLowCost;_remoteIsLowDataRequested = remoteNetworkStatus->isLowDataRequested;updateCurrentResolvedNetworkStatus();} else {if (const auto videoParameters = absl::get_if<VideoParametersMessage>(data)) {float value = ((float)videoParameters->aspectRatio) / 1000.0;if (_remotePrefferedAspectRatioUpdated) {_remotePrefferedAspectRatioUpdated(value);}}_mediaManager->perform(RTC_FROM_HERE, [=, message = std::move(message)](MediaManager *mediaManager) mutable {mediaManager->receiveMessage(std::move(message));});}
}

candidatesList 给到networkManager

	if (const auto candidatesList = absl::get_if<CandidatesListMessage>(data)) {_networkManager->perform(RTC_FROM_HERE, [message = std::move(message)](NetworkManager *networkManager) mutable {networkManager->receiveSignalingMessage(std::move(message));});}

VideoFormatsMessage 给到mediaManager

	} else if (const auto videoFormats = absl::get_if<VideoFormatsMessage>(data)) {_mediaManager->perform(RTC_FROM_HERE, [message = std::move(message)](MediaManager *mediaManager) mutable {mediaManager->receiveMessage(std::move(message));});

RemoteMediaStateMessage

    } else if (const auto remoteMediaState = absl::get_if<RemoteMediaStateMessage>(data)) {if (_remoteMediaStateUpdated) {_remoteMediaStateUpdated(remoteMediaState->audio,remoteMediaState->video);}_mediaManager->perform(RTC_FROM_HERE, [video = remoteMediaState->video](MediaManager *mediaManager) {mediaManager->remoteVideoStateUpdated(video);});}

RemoteBatteryLevelIsLowMessage 对端的电池

	} else if (const auto remoteBatteryLevelIsLow = absl::get_if<RemoteBatteryLevelIsLowMessage>(data)) {if (_remoteBatteryLevelIsLowUpdated) {_remoteBatteryLevelIsLowUpdated(remoteBatteryLevelIsLow->batteryLow);}} 

对端的网络

    } else if (const auto remoteNetworkStatus = absl::get_if<RemoteNetworkStatusMessage>(data)) {_remoteNetworkIsLowCost = remoteNetworkStatus->isLowCost;_remoteIsLowDataRequested = remoteNetworkStatus->isLowDataRequested;updateCurrentResolvedNetworkStatus();} 

更多推荐

【tg】8: Manager的主要功能

本文发布于:2023-12-04 20:11:54,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1662090.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:主要功能   tg   Manager

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!