Skip to main content

sim_lib_stream_host/
placement.rs

1//! Host stream placement vocabulary and LAN peer placement policy.
2
3use std::fmt;
4
5mod audio;
6mod device;
7mod lan;
8
9use crate::site::DeviceSite;
10
11pub use audio::{AudioDeviceCard, AudioPlacementRequest, AudioSiteKey};
12pub use device::{DeviceDirection, DeviceKind, DeviceRecord, Placement};
13pub use lan::{
14    LanPlacementMode, LanPlacementReport, LanPlacementRequest, lan_bar_delay_mode_symbol,
15    lan_experimental_remote_sample_capability, lan_jitter_buffered_mode_symbol,
16    lan_peer_site_symbol, lan_pinned_sample_experimental_diagnostic,
17    lan_pinned_sample_refusal_diagnostic,
18};
19
20/// Placement plan for a device surface encoder and adapter pair.
21#[derive(Clone, Debug, PartialEq, Eq)]
22pub struct DevicePlacement {
23    /// Site that encodes samples and commands for the selected surface codec.
24    pub encoder: DeviceSite,
25    /// Latency-critical adapter site placed at the device edge.
26    pub adapter: DeviceSite,
27}
28
29impl DevicePlacement {
30    /// Builds a device placement plan from an encoder and adapter site.
31    pub fn new(encoder: DeviceSite, adapter: DeviceSite) -> Self {
32        Self { encoder, adapter }
33    }
34
35    /// Validates placement invariants for live device operation.
36    pub fn validate(&self) -> std::result::Result<(), PlacementError> {
37        if self.adapter.is_edge_local() {
38            Ok(())
39        } else {
40            Err(PlacementError::AdapterMustBeEdgeLocal)
41        }
42    }
43}
44
45/// Device placement validation error.
46#[derive(Clone, Copy, Debug, PartialEq, Eq)]
47pub enum PlacementError {
48    /// The latency-critical adapter is not device or edge local.
49    AdapterMustBeEdgeLocal,
50}
51
52impl fmt::Display for PlacementError {
53    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
54        match self {
55            Self::AdapterMustBeEdgeLocal => f.write_str("device adapter must be edge-local"),
56        }
57    }
58}
59
60impl std::error::Error for PlacementError {}