feat(camera): add Logitech webcam support#361
Conversation
48bc7d8 to
f0ce600
Compare
Greptile SummaryThis PR adds Logitech webcam support across the app. The main changes are:
Confidence Score: 5/5This looks safe to merge.
Important Files Changed
Reviews (5): Last reviewed commit: "Merge branch 'master' into feat/logitech..." | Re-trigger Greptile |
7a6ed85 to
0bb4827
Compare
0bb4827 to
fdc8528
Compare
| prev.into_device().close(); | ||
| } |
There was a problem hiding this comment.
When location_hint(unique_id) is None, this branch still keeps the first Logitech UVC device as a fallback. The GUI passes the selected camera's AVFoundation ID into this backend, so an ID this parser cannot turn into a location hint can still make controls for one Logitech webcam write to whichever Logitech webcam IOKit enumerates first. With two attached Logitech cameras, this should fail closed instead of picking a best-effort device.
| self.key = None; | ||
| cx.notify(); |
There was a problem hiding this comment.
When apply_settings() fails here, the panel rebuilds from live hardware but keeps the previous camera_active_profile in state. If a custom profile was active, applying another profile fails, and the user then edits a slider, sync_active_custom() still sees the old custom profile as active and overwrites that saved profile with the rebuilt live values. Clear or invalidate the active profile on this failure path before rebuilding.
AprilNEA
left a comment
There was a problem hiding this comment.
Fantastic feature — thanks for the thorough write-up and the end-to-end macOS testing on the StreamCam. A few things need to happen before it can land, and they're much easier from your side since you have the hardware:
1. Rebase onto master. It's ~60 commits behind and now conflicts (settings-page overhaul, Windows follow-ups, wheel/hotplug work, and the 20 locale files). Fresh conflict resolution from someone who knows the camera code will be far more reliable.
2. Move the macOS FFI to objc2. The whole workspace migrated off raw objc 0.2 to objc2 since you opened this — openlogi-hook, openlogi-inject, openlogi-agent, and openlogi-gui are all on it now — so openlogi-camera should match (the "same objc 0.2 as the GUI" note is now stale). That means Retained<T> for ownership, MainThreadMarker where the AVFoundation calls need the main thread, etc. The pattern in crates/openlogi-gui/src/platform/ and crates/openlogi-agent/src/tray.rs is the reference — it keeps the unsafe_code = "deny" + typed-ownership convention consistent across the workspace.
3. Windows is still untested on hardware — worth a pass on a real Logitech cam before shipping it first-class (or we land macOS-first and flag Windows experimental).
Happy to review again once it's rebased and on objc2. Really nice work.
Context
OpenLogi only managed HID++ devices — Logitech UVC webcams were invisible. This adds first-class webcam support: enumeration, live preview, and device-level image controls written over USB to the camera's own registers, so adjustments carry into Google Meet, Zoom, and OBS rather than living only in our preview.
Note
Platform support: macOS has the full feature (AVFoundation preview + IOKit controls) and is verified end-to-end on a StreamCam. Windows matches it — DirectShow enumeration and controls (
IAMVideoProcAmp/IAMCameraControl) plus a Media Foundation live preview/snapshot backend (IMFSourceReader, RGB32) — and compiles clean againstx86_64-pc-windows-msvc, but has not yet been exercised on real Windows hardware. Linux builds against stubs and shows no cameras.Demo
config.tomland re-apply after unplug/reboot.openlogi camera get,openlogi camera set brightness 140,openlogi snapshotChanges
openlogi-cameracrate — AVFoundation capture plus IOKit UVC controls on macOS (Processing Unit and Camera Terminal, 4-byte exposure payloads, AE-mode bitmap, batched into a single device-seize); Media Foundation capture plus DirectShow enumeration/controls on Windows:capture.rs,capture_windows.rs,uvc.rs,uvc_windows.rs,controls.rs,capture_types.rscamera_preview.rs,camera_controls.rs,app.rsdevice_camera_imagemanifest key and base-model variants fetch and resolve; marker-less camera metadata parses:asset/sync.rs,asset/images.rs,openlogi-assetsCameraControlsbecomes a name-keyed map (existing TOML loads unchanged) with per-camera profiles and active selection:config.rs,state.rsopenlogi camera get/setfor every control and auto toggle;openlogi snapshotwrites a PNG:cmd/camera.rs,cmd/snapshot.rscarousel.rsNotes