mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 07:15:47 +00:00
41e75663f1
Moves all audio playback code (Symphonia decode, rodio output, HTTP
streaming, gapless, previews, and the seven stream/ source-type
submodules from the prior split) out of the top crate into a new
psysonic-audio crate.
crates/psysonic-audio/ new lib crate, depends on
psysonic-core + psysonic-analysis
src/{engine,helpers,decode,…}.rs flattened layout (no more
extra audio/ namespace level)
src/stream/ seven submodules from M0
src/lib.rs re-exports macros from
psysonic-core and the public
API surface
The audio↔analysis edges identified in the dep survey are now real
crate deps (audio depends on analysis directly: AnalysisCache reads,
recommended_gain_for_target, submit_analysis_cpu_seed). Only the
analysis→audio back-edge goes through the PlaybackQueryHandle port
registered in M2.
Cross-crate ref migrations applied via batch sed:
crate::audio::* → crate::* (intra-crate)
crate::analysis_cache::* → psysonic_analysis::analysis_cache::*
crate::submit_analysis_cpu_seed → psysonic_analysis::analysis_runtime::*
crate::subsonic_wire_user_agent → psysonic_core::user_agent::*
Top crate keeps `crate::audio::*` paths working via
`pub use psysonic_audio as audio;` — lib_commands/cli callers untouched.
`stop_audio_engine` (mac process-exit cleanup) moved into the audio
crate as `pub fn stop_audio_engine` since it reaches AudioEngine
internals; tray.rs now re-exports the moved fn.
Two small visibility promotions in engine.rs:
pub(crate) fn analysis_track_id_is_current_playback → pub
pub(crate) fn ranged_loudness_backfill_should_defer → pub
Behaviour preserving. Cargo check + clippy --workspace clean.
33 lines
1001 B
Rust
33 lines
1001 B
Rust
//! `LocalFileSource` — seekable `MediaSource` backed directly by `std::fs::File`.
|
|
//!
|
|
//! Used for `psysonic-local://` URLs (offline library + hot playback cache hits).
|
|
//! Lets Symphonia read on-demand from disk during the probe (~64 KB) instead of
|
|
//! the previous behaviour of `tokio::fs::read` blocking until the entire file
|
|
//! (often 100+ MB for hi-res FLAC) was loaded into RAM. Track-start is instant.
|
|
|
|
use std::io::{Read, Seek, SeekFrom};
|
|
|
|
use symphonia::core::io::MediaSource;
|
|
|
|
pub(crate) struct LocalFileSource {
|
|
pub(crate) file: std::fs::File,
|
|
pub(crate) len: u64,
|
|
}
|
|
|
|
impl Read for LocalFileSource {
|
|
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
|
|
self.file.read(buf)
|
|
}
|
|
}
|
|
|
|
impl Seek for LocalFileSource {
|
|
fn seek(&mut self, pos: SeekFrom) -> std::io::Result<u64> {
|
|
self.file.seek(pos)
|
|
}
|
|
}
|
|
|
|
impl MediaSource for LocalFileSource {
|
|
fn is_seekable(&self) -> bool { true }
|
|
fn byte_len(&self) -> Option<u64> { Some(self.len) }
|
|
}
|