Skip to content

feat(akroasis-core): Symphonia decode pipeline#37

Merged
forkwright merged 2 commits intomainfrom
p1-02/decode
Mar 11, 2026
Merged

feat(akroasis-core): Symphonia decode pipeline#37
forkwright merged 2 commits intomainfrom
p1-02/decode

Conversation

@forkwright
Copy link
Owner

Summary

  • SymphoniaDecoder (decode/symphonia.rs): packet-by-packet streaming decode via symphonia 0.5. Handles all AudioBufferRef sample formats (U8–F64) normalized to interleaved f64 [-1.0, 1.0]. ResetRequired errors restart the decoder for chained OGG streams; DecodeError frames are logged via tracing and skipped to preserve playback continuity. Gapless metadata read from symphonia codec params (delay/padding); Vorbis pre-skip hardcoded to 3456 per symphonia issue #418.
  • probe.rs (decode/probe.rs): open_decoder and probe_codec open files via MediaSourceStream + extension Hint, route everything symphonia can probe to SymphoniaDecoder.
  • metadata.rs (decode/metadata.rs): read_gapless_info (codec-routed; lossless formats short-circuit to None), read_track_metadata (lofty 0.22; parses ReplayGain and R128 string tags), TrackMetadata struct.
  • Trait change: AudioDecoder methods next_frame / seek now return Pin<Box<dyn Future>> for dyn-compatibility (Box<dyn AudioDecoder> required by open_decoder).
  • Type change: DecodedFrame.samples changed from Vec<f64> to Box<[f64]>.

Test plan

  • cargo check — clean
  • cargo test — 52 tests pass (17 new decode tests added)
  • cargo clippy -- -D warnings — clean

Claude (Verda) added 2 commits March 11, 2026 22:34
- SymphoniaDecoder: packet-by-packet streaming decode, all AudioBufferRef
  sample formats normalized to interleaved f64 [-1.0, 1.0]
- ResetRequired handled for chained OGG streams; DecodeError frames
  logged and skipped to preserve playback continuity
- Gapless metadata extracted from symphonia codec params (delay/padding);
  Vorbis pre-skip hardcoded to 3456 per symphonia issue #418
- probe.rs: open_decoder and probe_codec via MediaSourceStream + Hint
- metadata.rs: read_gapless_info (codec-routed, lossless short-circuits),
  read_track_metadata (lofty; ReplayGain + R128 tag parsing), TrackMetadata type
- AudioDecoder trait changed to Pin<Box<dyn Future>> returns for dyn compat
- DecodedFrame.samples changed to Box<[f64]>
- 52 tests pass (cargo check, test, clippy -D warnings all green)
@forkwright forkwright merged commit 14d2809 into main Mar 11, 2026
2 checks passed
@forkwright forkwright deleted the p1-02/decode branch March 11, 2026 22:37
This was referenced Mar 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant