Skip to content

Commit 4315d8f

Browse files
fix(audio): use Decoder::try_from(File) for M4A/AAC playback
Decoder::new(BufReader) creates a non-seekable MediaSource with no byte_len, which prevents the Symphonia ISO MP4 demuxer from parsing the container structure. Decoder::try_from(File) sets byte_len and is_seekable from file metadata, fixing M4A/AAC decode failures. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2a6a751 commit 4315d8f

1 file changed

Lines changed: 2 additions & 5 deletions

File tree

crates/mt-tauri/src/audio/engine.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use crate::audio::error::AudioError;
22
use rodio::{Decoder, OutputStream, OutputStreamBuilder, Sink, Source};
33
use serde::{Deserialize, Serialize};
44
use std::fs::File;
5-
use std::io::BufReader;
65
use std::path::Path;
76
use std::time::Duration;
87
use tracing::{debug, error, info};
@@ -64,8 +63,7 @@ impl AudioEngine {
6463
}
6564

6665
let file = File::open(path)?;
67-
let reader = BufReader::new(file);
68-
let source = Decoder::new(reader)
66+
let source = Decoder::try_from(file)
6967
.map_err(|e| {
7068
error!(path, error = %e, "Failed to decode track");
7169
AudioError::Decode(e.to_string())
@@ -169,8 +167,7 @@ impl AudioEngine {
169167
let was_playing = self.state == PlaybackState::Playing;
170168

171169
let file = File::open(&track_info.path)?;
172-
let reader = BufReader::new(file);
173-
let source = Decoder::new(reader)
170+
let source = Decoder::try_from(file)
174171
.map_err(|e| {
175172
error!(path = %track_info.path, error = %e, "Decode failed during seek-by-reload");
176173
AudioError::Decode(e.to_string())

0 commit comments

Comments
 (0)