2025-12-28 17:45:06 +01:00
|
|
|
mod backend;
|
|
|
|
|
mod interne;
|
2026-01-03 08:19:23 +01:00
|
|
|
mod music_queue;
|
|
|
|
|
mod openhome;
|
|
|
|
|
mod snapshot;
|
2025-12-28 17:45:06 +01:00
|
|
|
|
2025-12-30 16:50:26 +01:00
|
|
|
use std::sync::{Arc, Mutex};
|
|
|
|
|
|
2026-04-12 19:20:43 +02:00
|
|
|
pub use backend::{EnqueueMode, QueueBackend};
|
2026-04-09 11:19:54 +02:00
|
|
|
pub use music_queue::{MusicQueue, SyncScheduleOutcome};
|
2025-12-30 16:50:26 +01:00
|
|
|
pub use snapshot::{PlaybackItem, QueueSnapshot};
|
|
|
|
|
|
|
|
|
|
// Internal queue implementations - not part of the public API
|
|
|
|
|
pub(crate) use interne::InternalQueue;
|
2026-01-03 08:19:23 +01:00
|
|
|
pub(crate) use openhome::OpenHomeQueue;
|
2025-12-30 16:50:26 +01:00
|
|
|
|
2026-04-06 16:59:23 +02:00
|
|
|
use crate::music_renderer::time_utils::parse_time_flexible;
|
2026-04-09 11:19:54 +02:00
|
|
|
use crate::{errors::ControlPointError, RendererInfo};
|
2026-04-06 16:59:23 +02:00
|
|
|
|
|
|
|
|
/// Returns true if `new_dur` < `old_dur` (both parseable as HH:MM:SS/MM:SS/SS).
|
|
|
|
|
/// Used to protect stream durations from decreasing for the same track.
|
2026-04-12 20:17:05 +02:00
|
|
|
pub(crate) fn stream_duration_decreased(old_dur: &str, new_dur: &str) -> bool {
|
2026-04-09 11:19:54 +02:00
|
|
|
match (
|
|
|
|
|
parse_time_flexible(old_dur).ok(),
|
|
|
|
|
parse_time_flexible(new_dur).ok(),
|
|
|
|
|
) {
|
2026-04-06 16:59:23 +02:00
|
|
|
(Some(old_secs), Some(new_secs)) => new_secs < old_secs,
|
|
|
|
|
_ => false,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Returns true if `new_dur` > `old_dur` (both parseable as HH:MM:SS/MM:SS/SS).
|
2026-04-12 20:17:05 +02:00
|
|
|
pub(crate) fn stream_duration_increased(old_dur: &str, new_dur: &str) -> bool {
|
2026-04-09 11:19:54 +02:00
|
|
|
match (
|
|
|
|
|
parse_time_flexible(old_dur).ok(),
|
|
|
|
|
parse_time_flexible(new_dur).ok(),
|
|
|
|
|
) {
|
2026-04-06 16:59:23 +02:00
|
|
|
(Some(old_secs), Some(new_secs)) => new_secs > old_secs,
|
|
|
|
|
_ => false,
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-12-30 16:50:26 +01:00
|
|
|
|
|
|
|
|
pub trait QueueFromRendererInfo {
|
|
|
|
|
fn from_renderer_info(renderer: &RendererInfo) -> Result<Self, ControlPointError>
|
|
|
|
|
where
|
|
|
|
|
Self: Sized;
|
|
|
|
|
|
|
|
|
|
fn to_backend(self) -> MusicQueue;
|
|
|
|
|
|
2026-01-03 08:19:23 +01:00
|
|
|
fn build_from_renderer_info(renderer: &RendererInfo) -> Result<MusicQueue, ControlPointError>
|
2025-12-30 16:50:26 +01:00
|
|
|
where
|
|
|
|
|
Self: Sized,
|
|
|
|
|
{
|
|
|
|
|
let instance = Self::from_renderer_info(renderer)?;
|
|
|
|
|
Ok(instance.to_backend())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn make_from_renderer_info(
|
|
|
|
|
renderer: &RendererInfo,
|
|
|
|
|
) -> Result<Arc<Mutex<MusicQueue>>, ControlPointError>
|
|
|
|
|
where
|
|
|
|
|
Self: Sized,
|
|
|
|
|
{
|
|
|
|
|
let backend = Self::build_from_renderer_info(renderer)?;
|
|
|
|
|
Ok(Arc::new(Mutex::new(backend)))
|
|
|
|
|
}
|
2026-01-03 08:19:23 +01:00
|
|
|
}
|