feat(avlivebody): consume hands and face frames

Route FrameTag.hands (=4) and FrameTag.face (=5) in USBSkeletonConsumer.
Decode each payload and publish on the main queue, mirroring the
existing .skeleton pattern. Add @Published hands/face properties so
SwiftUI views can observe them directly.
This commit is contained in:
L'électron rare
2026-06-26 11:49:38 +02:00
parent 1e9f711278
commit 242c8ec751
@@ -11,6 +11,10 @@ final class USBSkeletonConsumer: ObservableObject {
/// 91-joint skeleton payloads keyed by pid.
@Published var skeletons: [Int: SkeletonPayload] = [:]
@Published var connected = false
/// Latest Vision hand landmarks from the iPhone (tag=4).
@Published var hands: HandsPayload?
/// Latest Vision face landmarks from the iPhone (tag=5).
@Published var face: FacePayload?
/// Called on the main queue for every decoded camera frame.
var onVideoFrame: ((CVPixelBuffer) -> Void)?
@@ -94,6 +98,18 @@ final class USBSkeletonConsumer: ObservableObject {
guard let payload =
VideoPayload(decoding: frame.payload) else { return }
videoDecoder.decode(payload)
case .hands:
guard let payload = HandsPayload(decoding: frame.payload)
else { return }
DispatchQueue.main.async { [weak self] in
self?.hands = payload
}
case .face:
guard let payload = FacePayload(decoding: frame.payload)
else { return }
DispatchQueue.main.async { [weak self] in
self?.face = payload
}
case .meta:
break
}