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