InstanceImpl.cpp 5.3 KB

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