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 ( ) ; }