use super::audio::{AudioMetadata, ReceivedAudio, TelepresenceAudioSettings};
use super::network::{NetworkConditions, NetworkSettings};
use super::quality::{PerformanceStats, QualitySettings};
use super::security::PrivacySettings;
use super::spatial::{SpatialAudioStats, SpatialTelepresenceSettings};
use super::types::*;
use crate::{Position3D, Result};
use serde::{Deserialize, Serialize};
use std::time::{Duration, SystemTime};
pub trait TelepresenceSession: Send + Sync {
fn join(&mut self, user_config: &UserConfig) -> Result<SessionJoinResult>;
fn leave(&mut self) -> Result<()>;
fn send_audio(&mut self, audio_data: &[f32], metadata: &AudioMetadata) -> Result<()>;
fn receive_audio(&mut self) -> Result<Vec<ReceivedAudio>>;
fn update_position(&mut self, position: Position3D, orientation: Orientation) -> Result<()>;
fn session_state(&self) -> SessionState;
fn statistics(&self) -> SessionStatistics;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserConfig {
pub user_id: String,
pub display_name: String,
pub audio_settings: TelepresenceAudioSettings,
pub spatial_settings: SpatialTelepresenceSettings,
pub network_settings: NetworkSettings,
pub quality_settings: QualitySettings,
pub privacy_settings: PrivacySettings,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionJoinResult {
pub success: bool,
pub session_id: String,
pub user_session_id: String,
pub assigned_position: Option<Position3D>,
pub capabilities: SessionCapabilities,
pub other_users: Vec<SessionUser>,
pub error_message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionCapabilities {
pub max_users: usize,
pub supported_codecs: Vec<AudioCodec>,
pub quality_levels: Vec<QualityLevel>,
pub spatial_audio: bool,
pub recording_capable: bool,
pub screen_sharing: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionUser {
pub user_id: String,
pub display_name: String,
pub position: Position3D,
pub orientation: Orientation,
pub state: UserState,
pub capabilities: UserCapabilities,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserCapabilities {
pub can_speak: bool,
pub can_move: bool,
pub spatial_audio: bool,
pub can_record: bool,
pub quality_level: QualityLevel,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionState {
pub session_id: String,
pub status: SessionStatus,
pub connected_users: Vec<String>,
pub start_time: SystemTime,
pub duration: Duration,
pub current_quality: QualityLevel,
pub network_conditions: NetworkConditions,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionStatistics {
pub data_sent: u64,
pub data_received: u64,
pub packets_sent: u64,
pub packets_received: u64,
pub packets_lost: u64,
pub avg_latency: f32,
pub peak_latency: f32,
pub audio_quality_stats: super::audio::AudioQualityStats,
pub spatial_stats: SpatialAudioStats,
pub performance_stats: PerformanceStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionConfig {
pub name: String,
pub description: Option<String>,
pub max_users: usize,
pub privacy: SessionPrivacy,
pub recording: SessionRecordingSettings,
pub virtual_room: Option<super::room::VirtualRoomParameters>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionRecordingSettings {
pub allow_recording: bool,
pub auto_record: bool,
pub quality: QualityLevel,
pub include_video: bool,
}
impl Default for UserConfig {
fn default() -> Self {
Self {
user_id: "default_user".to_string(),
display_name: "User".to_string(),
audio_settings: TelepresenceAudioSettings::default(),
spatial_settings: SpatialTelepresenceSettings::default(),
network_settings: NetworkSettings::default(),
quality_settings: QualitySettings::default(),
privacy_settings: PrivacySettings::default(),
}
}
}