Feature(web): Add toolbar audio toggle button
This commit is contained in:
@@ -396,6 +396,8 @@ void CWebService::ServerThread(int port) {
|
||||
HandleKey(ws_ptr, msg);
|
||||
} else if (cmd == "rdp_reset") {
|
||||
HandleRdpReset(ws_ptr, token);
|
||||
} else if (cmd == "audio_toggle") {
|
||||
HandleAudioToggle(ws_ptr, token);
|
||||
} else if (cmd == "get_salt") {
|
||||
HandleGetSalt(ws_ptr, msg);
|
||||
} else if (cmd == "create_user") {
|
||||
@@ -689,14 +691,16 @@ void CWebService::HandleConnect(void* ws_ptr, const std::string& token, uint64_t
|
||||
}
|
||||
}
|
||||
|
||||
// Get screen dimensions from device info cache (may not be available yet)
|
||||
// Get screen dimensions + audio state from device info cache (may not be ready)
|
||||
int width = 0, height = 0;
|
||||
int audio_enabled = -1; // -1 = unknown yet (前端走 audio_state 事件兜底)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_DeviceCacheMutex);
|
||||
auto it = m_DeviceCache.find(device_id);
|
||||
if (it != m_DeviceCache.end()) {
|
||||
width = it->second->screen_width;
|
||||
height = it->second->screen_height;
|
||||
audio_enabled = it->second->audio_enabled;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -710,6 +714,9 @@ void CWebService::HandleConnect(void* ws_ptr, const std::string& token, uint64_t
|
||||
res["width"] = width;
|
||||
res["height"] = height;
|
||||
}
|
||||
if (audio_enabled >= 0) {
|
||||
res["audio_enabled"] = (audio_enabled != 0);
|
||||
}
|
||||
res["algorithm"] = "h264";
|
||||
|
||||
Json::StreamWriterBuilder builder;
|
||||
@@ -1002,6 +1009,33 @@ void CWebService::HandleRdpReset(void* ws_ptr, const std::string& token) {
|
||||
}
|
||||
}
|
||||
|
||||
void CWebService::HandleAudioToggle(void* ws_ptr, const std::string& token) {
|
||||
std::string username, role;
|
||||
if (!ValidateToken(token, username, role)) {
|
||||
SendText(ws_ptr, BuildJsonResponse("audio_toggle_result", false, "Invalid token"));
|
||||
return;
|
||||
}
|
||||
|
||||
uint64_t device_id = 0;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_ClientsMutex);
|
||||
auto it = m_Clients.find(ws_ptr);
|
||||
if (it != m_Clients.end()) device_id = it->second.watch_device_id;
|
||||
}
|
||||
if (device_id == 0) {
|
||||
SendText(ws_ptr, BuildJsonResponse("audio_toggle_result", false, "No device connected"));
|
||||
return;
|
||||
}
|
||||
|
||||
// 投递到 ScreenSpyDlg 的 UI 线程;那边会调用 Enable/DisableAudio 并通过
|
||||
// NotifyAudioState 把新状态广播给所有 watching 的 web 客户端
|
||||
if (!m_pParentDlg || !m_pParentDlg->PostWebAudioToggle(device_id)) {
|
||||
SendText(ws_ptr, BuildJsonResponse("audio_toggle_result", false, "No active screen session"));
|
||||
return;
|
||||
}
|
||||
SendText(ws_ptr, BuildJsonResponse("audio_toggle_result", true));
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// User Management Handlers
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@@ -1699,6 +1733,37 @@ void CWebService::NotifyResolutionChange(uint64_t device_id, int width, int heig
|
||||
}
|
||||
}
|
||||
|
||||
void CWebService::NotifyAudioState(uint64_t device_id, bool enabled) {
|
||||
if (m_bStopping) return;
|
||||
|
||||
// 缓存最新状态,新加入的 web 客户端通过 connect_result 取到初值
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_DeviceCacheMutex);
|
||||
auto it = m_DeviceCache.find(device_id);
|
||||
if (it == m_DeviceCache.end()) {
|
||||
m_DeviceCache[device_id] = std::make_shared<WebDeviceInfo>();
|
||||
it = m_DeviceCache.find(device_id);
|
||||
}
|
||||
it->second->audio_enabled = enabled ? 1 : 0;
|
||||
}
|
||||
|
||||
Json::Value res;
|
||||
res["cmd"] = "audio_state";
|
||||
res["id"] = device_id;
|
||||
res["enabled"] = enabled;
|
||||
|
||||
Json::StreamWriterBuilder builder;
|
||||
builder["indentation"] = "";
|
||||
std::string json = Json::writeString(builder, res);
|
||||
|
||||
std::lock_guard<std::mutex> lock(m_ClientsMutex);
|
||||
for (auto& [ws_ptr, client] : m_Clients) {
|
||||
if (client.watch_device_id == device_id) {
|
||||
SendText(ws_ptr, json);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CWebService::BroadcastCursor(uint64_t device_id, uint8_t cursor_index) {
|
||||
if (m_bStopping) return;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user