From 633a41ff8edec405cefa109ac3c8f9662a020cc1 Mon Sep 17 00:00:00 2001 From: Jan Grulich Date: Tue, 11 Jun 2024 14:27:33 +0200 Subject: [PATCH] PipeWire camera: check for node existence before adding it to the list This avoids having duplicate camera entries presented to the user when PipeWire camera is being used. Bug: webrtc:346350844 Change-Id: I423db7fe0654cc1b1c91ee5264c6ba5dc4e24100 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/354320 Reviewed-by: Ilya Nikolaevskiy Reviewed-by: Andreas Pehrson Commit-Queue: Jan Grulich Cr-Commit-Position: refs/heads/main@{#42462} --- modules/video_capture/linux/pipewire_session.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/modules/video_capture/linux/pipewire_session.cc b/modules/video_capture/linux/pipewire_session.cc index 4d1b200aca..90ac4a3bdd 100644 --- a/modules/video_capture/linux/pipewire_session.cc +++ b/modules/video_capture/linux/pipewire_session.cc @@ -354,6 +354,13 @@ void PipeWireSession::OnRegistryGlobal(void* data, const spa_dict* props) { PipeWireSession* that = static_cast(data); + // Skip already added nodes to avoid duplicate camera entries + if (std::find_if(that->nodes_.begin(), that->nodes_.end(), + [id](const PipeWireNode& node) { + return node.id() == id; + }) != that->nodes_.end()) + return; + if (type != absl::string_view(PW_TYPE_INTERFACE_Node)) return; @@ -372,12 +379,10 @@ void PipeWireSession::OnRegistryGlobal(void* data, void PipeWireSession::OnRegistryGlobalRemove(void* data, uint32_t id) { PipeWireSession* that = static_cast(data); - for (auto it = that->nodes_.begin(); it != that->nodes().end(); ++it) { - if ((*it).id() == id) { - that->nodes_.erase(it); - break; - } - } + auto it = std::remove_if( + that->nodes_.begin(), that->nodes_.end(), + [id](const PipeWireNode& node) { return node.id() == id; }); + that->nodes_.erase(it, that->nodes_.end()); } void PipeWireSession::Finish(VideoCaptureOptions::Status status) {