1 #include "InstanceImpl.h"
2 
3 #include "LogSinkImpl.h"
4 #include "Manager.h"
5 #include "MediaManager.h"
6 #include "VideoCaptureInterfaceImpl.h"
7 #include "VideoCapturerInterface.h"
8 
9 namespace tgcalls {
10 namespace {
11 
makeManagerThread()12 rtc::Thread *makeManagerThread() {
13 	static std::unique_ptr<rtc::Thread> value = rtc::Thread::Create();
14 	value->SetName("WebRTC-Manager", nullptr);
15 	value->Start();
16 	return value.get();
17 }
18 
19 
getManagerThread()20 rtc::Thread *getManagerThread() {
21 	static rtc::Thread *value = makeManagerThread();
22 	return value;
23 }
24 
25 } // namespace
26 
InstanceImpl(Descriptor && descriptor)27 InstanceImpl::InstanceImpl(Descriptor &&descriptor)
28 : _logSink(std::make_unique<LogSinkImpl>(descriptor.config.logPath)) {
29     rtc::LogMessage::LogToDebug(rtc::LS_INFO);
30     rtc::LogMessage::SetLogToStderr(false);
31 	rtc::LogMessage::AddLogToStream(_logSink.get(), rtc::LS_INFO);
32 
33     auto networkType = descriptor.initialNetworkType;
34 
35 	_manager.reset(new ThreadLocalObject<Manager>(getManagerThread(), [descriptor = std::move(descriptor)]() mutable {
36 		return new Manager(getManagerThread(), std::move(descriptor));
37 	}));
38 	_manager->perform(RTC_FROM_HERE, [](Manager *manager) {
39 		manager->start();
40 	});
41 
42     setNetworkType(networkType);
43 }
44 
~InstanceImpl()45 InstanceImpl::~InstanceImpl() {
46 	rtc::LogMessage::RemoveLogToStream(_logSink.get());
47 }
48 
receiveSignalingData(const std::vector<uint8_t> & data)49 void InstanceImpl::receiveSignalingData(const std::vector<uint8_t> &data) {
50 	_manager->perform(RTC_FROM_HERE, [data](Manager *manager) {
51 		manager->receiveSignalingData(data);
52 	});
53 };
54 
setVideoCapture(std::shared_ptr<VideoCaptureInterface> videoCapture)55 void InstanceImpl::setVideoCapture(std::shared_ptr<VideoCaptureInterface> videoCapture) {
56     _manager->perform(RTC_FROM_HERE, [videoCapture](Manager *manager) {
57         manager->setVideoCapture(videoCapture);
58     });
59 }
60 
sendVideoDeviceUpdated()61 void InstanceImpl::sendVideoDeviceUpdated() {
62     _manager->perform(RTC_FROM_HERE, [](Manager *manager) {
63         manager->sendVideoDeviceUpdated();
64     });
65 }
66 
setRequestedVideoAspect(float aspect)67 void InstanceImpl::setRequestedVideoAspect(float aspect) {
68     _manager->perform(RTC_FROM_HERE, [aspect](Manager *manager) {
69         manager->setRequestedVideoAspect(aspect);
70     });
71 }
72 
setNetworkType(NetworkType networkType)73 void InstanceImpl::setNetworkType(NetworkType networkType) {
74     bool isLowCostNetwork = false;
75     switch (networkType) {
76         case NetworkType::WiFi:
77         case NetworkType::Ethernet:
78             isLowCostNetwork = true;
79             break;
80         default:
81             break;
82     }
83 
84     _manager->perform(RTC_FROM_HERE, [isLowCostNetwork](Manager *manager) {
85         manager->setIsLocalNetworkLowCost(isLowCostNetwork);
86     });
87 }
88 
setMuteMicrophone(bool muteMicrophone)89 void InstanceImpl::setMuteMicrophone(bool muteMicrophone) {
90 	_manager->perform(RTC_FROM_HERE, [muteMicrophone](Manager *manager) {
91 		manager->setMuteOutgoingAudio(muteMicrophone);
92 	});
93 }
94 
setIncomingVideoOutput(std::shared_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> sink)95 void InstanceImpl::setIncomingVideoOutput(std::shared_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> sink) {
96 	_manager->perform(RTC_FROM_HERE, [sink](Manager *manager) {
97 		manager->setIncomingVideoOutput(sink);
98 	});
99 }
100 
setAudioOutputGainControlEnabled(bool enabled)101 void InstanceImpl::setAudioOutputGainControlEnabled(bool enabled) {
102 }
103 
setEchoCancellationStrength(int strength)104 void InstanceImpl::setEchoCancellationStrength(int strength) {
105 }
106 
setAudioInputDevice(std::string id)107 void InstanceImpl::setAudioInputDevice(std::string id) {
108 	_manager->perform(RTC_FROM_HERE, [id](Manager *manager) {
109 		manager->setAudioInputDevice(id);
110 	});
111 }
112 
setAudioOutputDevice(std::string id)113 void InstanceImpl::setAudioOutputDevice(std::string id) {
114 	_manager->perform(RTC_FROM_HERE, [id](Manager *manager) {
115 		manager->setAudioOutputDevice(id);
116 	});
117 }
118 
setInputVolume(float level)119 void InstanceImpl::setInputVolume(float level) {
120 	_manager->perform(RTC_FROM_HERE, [level](Manager *manager) {
121 		manager->setInputVolume(level);
122 	});
123 }
124 
setOutputVolume(float level)125 void InstanceImpl::setOutputVolume(float level) {
126 	_manager->perform(RTC_FROM_HERE, [level](Manager *manager) {
127 		manager->setOutputVolume(level);
128 	});
129 }
130 
setAudioOutputDuckingEnabled(bool enabled)131 void InstanceImpl::setAudioOutputDuckingEnabled(bool enabled) {
132 	// TODO: not implemented
133 }
134 
addExternalAudioSamples(std::vector<uint8_t> && samples)135 void InstanceImpl::addExternalAudioSamples(std::vector<uint8_t> &&samples) {
136     _manager->perform(RTC_FROM_HERE, [samples = std::move(samples)](Manager *manager) mutable {
137         manager->addExternalAudioSamples(std::move(samples));
138     });
139 }
140 
setIsLowBatteryLevel(bool isLowBatteryLevel)141 void InstanceImpl::setIsLowBatteryLevel(bool isLowBatteryLevel) {
142     _manager->perform(RTC_FROM_HERE, [isLowBatteryLevel](Manager *manager) {
143         manager->setIsLowBatteryLevel(isLowBatteryLevel);
144     });
145 }
146 
getLastError()147 std::string InstanceImpl::getLastError() {
148 	return "";  // TODO: not implemented
149 }
150 
getDebugInfo()151 std::string InstanceImpl::getDebugInfo() {
152 	return "";  // TODO: not implemented
153 }
154 
getPreferredRelayId()155 int64_t InstanceImpl::getPreferredRelayId() {
156 	return 0;  // we don't have endpoint ids
157 }
158 
getTrafficStats()159 TrafficStats InstanceImpl::getTrafficStats() {
160 	return TrafficStats{};  // TODO: not implemented
161 }
162 
getPersistentState()163 PersistentState InstanceImpl::getPersistentState() {
164 	return PersistentState{};  // we dont't have such information
165 }
166 
stop(std::function<void (FinalState)> completion)167 void InstanceImpl::stop(std::function<void(FinalState)> completion) {
168     std::string debugLog = _logSink->result();
169 
170     _manager->perform(RTC_FROM_HERE, [completion, debugLog = std::move(debugLog)](Manager *manager) {
171         manager->getNetworkStats([completion, debugLog = std::move(debugLog)](TrafficStats stats, CallStats callStats) {
172             FinalState finalState;
173             finalState.debugLog = debugLog;
174             finalState.isRatingSuggested = false;
175             finalState.trafficStats = stats;
176             finalState.callStats = callStats;
177 
178             completion(finalState);
179         });
180     });
181 }
182 
GetConnectionMaxLayer()183 int InstanceImpl::GetConnectionMaxLayer() {
184 	return 92;
185 }
186 
GetVersions()187 std::vector<std::string> InstanceImpl::GetVersions() {
188     std::vector<std::string> result;
189     result.push_back("2.7.7");
190     result.push_back("3.0.0");
191     return result;
192 }
193 
194 template <>
Register()195 bool Register<InstanceImpl>() {
196 	return Meta::RegisterOne<InstanceImpl>();
197 }
198 
199 } // namespace tgcalls
200