обновление
This commit is contained in:
21
src/audio.rs
21
src/audio.rs
@@ -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(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user