diff --git a/server/src/bin/lesavka-uvc.rs b/server/src/bin/lesavka-uvc.rs index 0121dcd..c4abaf3 100644 --- a/server/src/bin/lesavka-uvc.rs +++ b/server/src/bin/lesavka-uvc.rs @@ -349,7 +349,8 @@ fn handle_setup( ) { let interface_lo = (req.w_index & 0xff) as u8; let interface_hi = (req.w_index >> 8) as u8; - let interface = if interface_lo == interfaces.streaming || interface_lo == interfaces.control { + let interface_raw = if interface_lo == interfaces.streaming || interface_lo == interfaces.control + { interface_lo } else if interface_hi == interfaces.streaming || interface_hi == interfaces.control { interface_hi @@ -358,6 +359,7 @@ fn handle_setup( }; let selector = (req.w_value >> 8) as u8; let is_in = (req.b_request_type & USB_DIR_IN) != 0; + let interface = map_interface(interface_raw, selector, interfaces, debug); if !is_in && req.b_request == UVC_SET_CUR { if interface != interfaces.streaming { @@ -382,8 +384,14 @@ fn handle_setup( return; } - let payload = - build_in_response(state, interfaces, interface, selector, req.b_request, req.w_length); + let payload = build_in_response( + state, + interfaces, + interface, + selector, + req.b_request, + req.w_length, + ); match payload { Some(bytes) => { let _ = send_response(fd, uvc_send_response, &bytes); @@ -394,6 +402,29 @@ fn handle_setup( } } +fn map_interface(raw: u8, selector: u8, interfaces: UvcInterfaces, debug: bool) -> u8 { + if raw == interfaces.streaming || raw == interfaces.control { + return raw; + } + + let mapped = if matches!(selector, UVC_VS_PROBE_CONTROL | UVC_VS_COMMIT_CONTROL) { + interfaces.streaming + } else if selector == UVC_VC_REQUEST_ERROR_CODE_CONTROL { + interfaces.control + } else { + raw + }; + + if debug && mapped != raw { + eprintln!( + "[lesavka-uvc] remapped interface {} -> {} for selector {selector}", + raw, mapped + ); + } + + mapped +} + fn handle_data( state: &mut UvcState, pending: &mut Option,