обновление

This commit is contained in:
2026-10-15 15:54:31 +02:00
parent 4c7f46e105
commit 07baff09c4
9 changed files with 571 additions and 196 deletions

View File

@@ -124,7 +124,6 @@ where
fn total_duration(&self) -> Option<Duration> {
self.inner.total_duration()
}
// ВАЖНО: пробрасываем try_seek, иначе Sink::try_seek вернёт NotSupported
fn try_seek(&mut self, pos: Duration) -> Result<(), rodio::source::SeekError> {
self.inner.try_seek(pos)
}
@@ -150,17 +149,31 @@ impl AudioPlayer {
})
}
pub fn play(&mut self, path: &PathBuf) -> Result<(), Box<dyn std::error::Error>> {
/// Запускает трек, опционально перематывая в `start_pos` ДО начала воспроизведения.
/// Перемотка делается на декодере — это предотвращает щелчок на старте.
pub fn play(
&mut self,
path: &PathBuf,
start_pos: Option<Duration>,
) -> Result<(), Box<dyn std::error::Error>> {
self.sink.stop();
self.paused_pos = None;
let file = File::open(path)?;
// Decoder::try_from автоматически настраивает seekable и byte_len[citation:1][citation:19]
let decoder = Decoder::try_from(file)?;
let mut decoder = Decoder::try_from(file)?;
if let Some(pos) = start_pos {
if !pos.is_zero() {
let _ = decoder.try_seek(pos);
}
}
let tapped = TapSource {
inner: decoder,
bus: self.spectrum.clone(),
};
self.sink.append(tapped);
// ВАЖНО: явно снимаем паузу — sink.stop() не сбрасывает состояние pause.
self.sink.play();
Ok(())
}