Skip to main content

phemios_core/playback/
cd.rs

1//! A CD is a temporary native source, never an Aède catalogue entry or a listening-history claim.
2use super::*;
3impl Player {
4    /// Whether the retained selection comes from a physical CD, including Pause/Stop.
5    pub fn is_cd(&self) -> Result<bool, String> {
6        Ok(self
7            .state
8            .lock()
9            .map_err(|_| "État audio indisponible.")?
10            .local_cd)
11    }
12    /// Start only discovered audio tracks, reusing the output, queue, repeat, shuffle and spectrum.
13    /// Optional account checks run away from the output callback; guests require no server.
14    pub fn start_cd(
15        &self,
16        disc: phemios_cd::Disc,
17        tracks: Vec<String>,
18        device: String,
19        index: usize,
20        permission: Option<Box<dyn Fn() -> Result<(), String> + Send>>,
21    ) -> Result<(), String> {
22        if tracks.is_empty()
23            || tracks.len() > 4096
24            || index >= tracks.len()
25            || device.len() > 2048
26            || device == crate::hqplayer::OUTPUT
27            || tracks
28                .iter()
29                .any(|reference| disc.track(reference).is_err())
30        {
31            return Err("Sélection CD ou sortie audio invalide.".into());
32        }
33        self.launch(
34            actor::Source::Disc(disc, Arc::default()),
35            tracks,
36            device,
37            index,
38            Policy::WithoutEffects,
39            permission,
40        )
41    }
42}