Files
qbz/crates/qconnect-app/src/lib.rs
T
vicrodh e5e8d4a853 feat(qconnect-app): add QconnectRendererEngine trait + qbz-player dep (slice 6)
The renderer-engine seam: a 16-method trait both frontends implement with
zero-cost forwards to their QbzCore/Player, so the hard-won renderer
orchestration (echo-seek rejection, cursor align, queue materialize, shuffle
deferral, load dedup window) can move UP into qconnect-app and be written once
against the trait instead of re-derived per frontend (slice 6, Phase T 1-2).

- Adds qbz-player as a qconnect-app dep, for PlaybackState (read by the echo
  gate + should_reload; it is not in qbz-models and not re-exported). qbz-player
  does NOT depend on qconnect-app -> no dependency cycle.
- The two protected bit-perfect seams (play_data / play_streaming_dynamic) are
  reached ONLY through the high-level start_track_stream method; BufferWriter +
  reqwest + the detached feeder spawn stay impl-side and never cross the crate
  boundary. play_data / play_streaming_dynamic are never modified.

No impls, no logic moved yet -- pure foundation. qconnect-app 38 green, src-tauri
cargo check green.

cc
2026-06-02 16:43:08 -06:00

47 lines
1.9 KiB
Rust

//! qconnect-app
//!
//! Application adapter that composes qconnect core + protocol + transport.
mod app;
mod error;
mod events;
mod feature_flags;
mod renderer_engine;
pub mod session;
mod state;
pub mod startup;
mod sync_state;
pub use app::{
queue_payload_track_preview, QconnectApp, SessionApplyOutcome, SessionLoopHost,
SessionStateTakeoverInput,
};
pub use startup::{compute_effective_startup, QconnectStartupMode};
pub use error::QconnectAppError;
pub use events::{NoOpEventSink, QconnectAppEvent, QconnectEventSink};
pub use session::{
compute_connection_state, deferred_join_reason, find_unique_renderer_id,
is_local_renderer_active, is_peer_renderer_active, normalize_active_renderer_id,
quality_from_max_audio_quality, refresh_local_renderer_id, renderer_allows_remote_volume,
should_arm_renderer_watchdog, should_reask_queue_state, ConnectionDecision, LocalIdentity,
QconnectFileAudioQualitySnapshot, QconnectLifecycleState, QconnectRendererInfo,
QconnectSessionRendererState, QconnectSessionState, RendererStatus, ServerActiveState,
JOIN_SESSION_REASON_CONTROLLER_REQUEST, JOIN_SESSION_REASON_RECONNECTION,
QCONNECT_RENDERER_LOST_TIMEOUT_MS,
};
pub use feature_flags::{
QBZ_QCONNECT_PANEL_SWITCH, QBZ_QCONNECT_QUEUE_MODEL, QBZ_QCONNECT_STRICT_DOMAIN_ISOLATION,
QBZ_QCONNECT_TRANSPORT,
};
pub use qconnect_core::{
evaluate_remote_queue_admission, resolve_handoff_intent, validate_track_origins_for_admission,
AdmissionDecision, HandoffIntent, QConnectQueueState, QConnectRendererState, QueueVersion,
RendererCommand, TrackOrigin,
};
pub use qconnect_protocol::{QueueCommandType, RendererReport, RendererReportType};
pub use renderer_engine::QconnectRendererEngine;
pub use state::QconnectRuntimeState;
pub use sync_state::{
ensure_session_renderer_state, sync_session_renderer_active_flags, QconnectRemoteSyncState,
};