[refactor] build host information in the wire library

This commit is contained in:
dijunkun
2026-09-21 00:56:16 +08:00
parent 485e347337
commit 1a59a6ac2e
9 changed files with 118 additions and 241 deletions
@@ -6,6 +6,7 @@
#include <algorithm>
#include <chrono>
#include <cstdlib>
#include <utility>
#include "platform.h"
#include "rd_log.h"
@@ -146,7 +147,7 @@ int SessionDeviceManager::InitializeScreenCapturer() {
? 30
: 60;
LOG_INFO("Init screen capturer with {} fps", fps);
display_info_list_.clear();
SetDisplayInfoList({});
registered_display_stream_count_ = 0;
last_video_frame_stream_id_.clear();
invalid_video_stream_id_logged_ = false;
@@ -256,11 +257,11 @@ int SessionDeviceManager::InitializeScreenCapturer() {
if (init_ret == 0) {
LOG_INFO("Init screen capturer success");
const auto latest_display_info = screen_capturer_->GetDisplayInfoList();
auto latest_display_info = screen_capturer_->GetDisplayInfoList();
registered_display_stream_count_ = latest_display_info.size();
if (!latest_display_info.empty()) {
display_info_list_ = latest_display_info;
SetDisplayInfoList(std::move(latest_display_info));
}
registered_display_stream_count_ = display_info_list_.size();
return 0;
}
@@ -329,6 +330,11 @@ void SessionDeviceManager::StopSpeakerCapturer() {
speaker_capture_.SetEnabled(false);
}
void SessionDeviceManager::SetDisplayInfoList(std::vector<DisplayInfo> displays) {
std::lock_guard<std::mutex> lock(display_info_mutex_);
display_info_list_ = std::move(displays);
}
int SessionDeviceManager::StartMouseController() {
#ifdef __APPLE__
if (!owner_.EnsureMacAccessibilityPermission()) {
@@ -657,11 +663,22 @@ void SessionDeviceManager::ResetToInitialDisplay() {
owner_.selected_display_ = 0;
}
const std::vector<DisplayInfo> &
SessionDeviceManager::display_info_list() const {
std::vector<DisplayInfo> SessionDeviceManager::display_info_list() const {
std::lock_guard<std::mutex> lock(display_info_mutex_);
return display_info_list_;
}
std::vector<HostDisplay> SessionDeviceManager::host_display_list() const {
std::lock_guard<std::mutex> lock(display_info_mutex_);
std::vector<HostDisplay> displays;
displays.reserve(display_info_list_.size());
for (const auto &display : display_info_list_) {
displays.push_back({display.name, display.left, display.top, display.right,
display.bottom});
}
return displays;
}
void SessionDeviceManager::DestroyDevices() {
speaker_capture_.Shutdown();
if (mouse_controller_) {
@@ -74,7 +74,12 @@ public:
int SwitchDisplay(int display_id);
void ResetToInitialDisplay();
const std::vector<DisplayInfo> &display_info_list() const;
// Snapshot of the capture displays. The UI thread refreshes the list every
// tick while transport threads build host information and map mouse input
// from it, so callers get a copy taken under the lock.
std::vector<DisplayInfo> display_info_list() const;
// The same snapshot in the wire's host information form.
std::vector<HostDisplay> host_display_list() const;
private:
struct CapturedKeyboardInput {
@@ -91,6 +96,7 @@ private:
bool ShouldSendCapturedFrame(std::chrono::steady_clock::time_point now,
int fps);
bool ShouldCaptureCursor() const;
void SetDisplayInfoList(std::vector<DisplayInfo> displays);
void RecordCaptureCadence(std::chrono::steady_clock::time_point now, int fps,
bool from_secure_desktop);
@@ -103,6 +109,8 @@ private:
DeviceControllerFactory *device_controller_factory_ = nullptr;
MouseController *mouse_controller_ = nullptr;
KeyboardCapturer *keyboard_capturer_ = nullptr;
// Guards display_info_list_ (UI thread writes, transport threads read).
mutable std::mutex display_info_mutex_;
std::vector<DisplayInfo> display_info_list_;
size_t registered_display_stream_count_ = 0;
std::deque<CapturedKeyboardInput> captured_keyboard_inputs_;