mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
There is an issue in the id allocation mechanism which can result in the different devices having the same id. Specifically, consider the scenario where there are only two cameras, which have just been added. In this case `impl::devices` looks like this: (0, camA) | (1, camB) | (?, nullptr) | ... Now assume that `camA` is removed, after which the array appears as follows: (1, camB) | (1, nullptr) | (?, nullptr) | ... Then assume that a new camera appears. When `get_free_id()` runs, when `i == 1`, it will observe that `devices[i].camera == nullptr`, so it selects `1` as the id. Leading to the following: (1, camB) | (1, camC) | (?, nullptr) | ... This is of course incorrect. The set of ids must be unique. When wireplumber is faced with this situation it destroys the device object for `camB` when `camC` is emitted. Fix this by simply not moving elements in the `devices` array, leaving everything where it is. In which case the array looks like this: (nullptr) | (camB) | (nullptr) | ... // after `camA` removal (camC) | (camB) | (nullptr) | ... // after `camC` appearance Note that `device::id` is removed, and the id is now derived from the position in `impl::devices`. |
||
|---|---|---|
| .. | ||
| libcamera-device.cpp | ||
| libcamera-manager.cpp | ||
| libcamera-manager.hpp | ||
| libcamera-source.cpp | ||
| libcamera.c | ||
| libcamera.h | ||
| meson.build | ||