From 001d8df3eadf516bbc42255221347ede5b166451 Mon Sep 17 00:00:00 2001 From: Roderick van Domburg Date: Tue, 11 Feb 2025 21:06:48 +0100 Subject: [PATCH] refactor: update decoder initialization to use try_from API in tests and examples Use Decoder::try_from() instead of Decoder::new(). This new API is the preferre way to decode files as it automatically: - Wraps files in BufReader for better performance - Sets file length from metadata for improved seeking - Enables seeking by default The functionality remains the same but uses the more optimized path. --- examples/automatic_gain_control.rs | 5 ++--- examples/callback_on_end.rs | 3 +-- examples/into_file.rs | 3 +-- examples/music_flac.rs | 3 +-- examples/music_m4a.rs | 3 +-- examples/music_mp3.rs | 3 +-- examples/music_ogg.rs | 3 +-- examples/music_wav.rs | 3 +-- examples/reverb.rs | 3 +-- examples/seek_mp3.rs | 3 +-- examples/spatial.rs | 3 +-- examples/stereo.rs | 3 +-- src/lib.rs | 9 +++------ src/source/speed.rs | 5 ++--- tests/flac_test.rs | 6 ++---- tests/mp4a_test.rs | 3 +-- tests/wav_test.rs | 14 ++++++-------- 17 files changed, 27 insertions(+), 48 deletions(-) diff --git a/examples/automatic_gain_control.rs b/examples/automatic_gain_control.rs index 3387679c..aa0e36df 100644 --- a/examples/automatic_gain_control.rs +++ b/examples/automatic_gain_control.rs @@ -2,7 +2,6 @@ use rodio::source::Source; use rodio::Decoder; use std::error::Error; use std::fs::File; -use std::io::BufReader; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::thread; @@ -13,8 +12,8 @@ fn main() -> Result<(), Box> { let sink = rodio::Sink::connect_new(&stream_handle.mixer()); // Decode the sound file into a source - let file = BufReader::new(File::open("assets/music.flac")?); - let source = Decoder::new(file)?; + let file = File::open("assets/music.flac")?; + let source = Decoder::try_from(file)?; // Apply automatic gain control to the source let agc_source = source.automatic_gain_control(1.0, 4.0, 0.005, 5.0); diff --git a/examples/callback_on_end.rs b/examples/callback_on_end.rs index 53b45765..d62f8b59 100644 --- a/examples/callback_on_end.rs +++ b/examples/callback_on_end.rs @@ -1,5 +1,4 @@ use std::error::Error; -use std::io::BufReader; use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Arc; @@ -8,7 +7,7 @@ fn main() -> Result<(), Box> { let sink = rodio::Sink::connect_new(&stream_handle.mixer()); let file = std::fs::File::open("assets/music.wav")?; - sink.append(rodio::Decoder::new(BufReader::new(file))?); + sink.append(rodio::Decoder::try_from(file)?); // lets increment a number after `music.wav` has played. We are going to use atomics // however you could also use a `Mutex` or send a message through a `std::sync::mpsc`. diff --git a/examples/into_file.rs b/examples/into_file.rs index 193932b2..bedd8f8a 100644 --- a/examples/into_file.rs +++ b/examples/into_file.rs @@ -1,13 +1,12 @@ use rodio::{output_to_wav, Source}; use std::error::Error; -use std::io::BufReader; /// Converts mp3 file to a wav file. /// This example does not use any audio devices /// and can be used in build configurations without `cpal` feature enabled. fn main() -> Result<(), Box> { let file = std::fs::File::open("assets/music.mp3")?; - let mut audio = rodio::Decoder::new(BufReader::new(file))? + let mut audio = rodio::Decoder::try_from(file)? .automatic_gain_control(1.0, 4.0, 0.005, 3.0) .speed(0.8); diff --git a/examples/music_flac.rs b/examples/music_flac.rs index 13013bab..5a949273 100644 --- a/examples/music_flac.rs +++ b/examples/music_flac.rs @@ -1,12 +1,11 @@ use std::error::Error; -use std::io::BufReader; fn main() -> Result<(), Box> { let stream_handle = rodio::OutputStreamBuilder::open_default_stream()?; let sink = rodio::Sink::connect_new(&stream_handle.mixer()); let file = std::fs::File::open("assets/music.flac")?; - sink.append(rodio::Decoder::new(BufReader::new(file))?); + sink.append(rodio::Decoder::try_from(file)?); sink.sleep_until_end(); diff --git a/examples/music_m4a.rs b/examples/music_m4a.rs index 15b58432..ca7c4391 100644 --- a/examples/music_m4a.rs +++ b/examples/music_m4a.rs @@ -1,12 +1,11 @@ use std::error::Error; -use std::io::BufReader; fn main() -> Result<(), Box> { let stream_handle = rodio::OutputStreamBuilder::open_default_stream()?; let sink = rodio::Sink::connect_new(&stream_handle.mixer()); let file = std::fs::File::open("assets/music.m4a")?; - sink.append(rodio::Decoder::new(BufReader::new(file))?); + sink.append(rodio::Decoder::try_from(file)?); sink.sleep_until_end(); diff --git a/examples/music_mp3.rs b/examples/music_mp3.rs index cb94159f..209848e2 100644 --- a/examples/music_mp3.rs +++ b/examples/music_mp3.rs @@ -1,12 +1,11 @@ use std::error::Error; -use std::io::BufReader; fn main() -> Result<(), Box> { let stream_handle = rodio::OutputStreamBuilder::open_default_stream()?; let sink = rodio::Sink::connect_new(&stream_handle.mixer()); let file = std::fs::File::open("assets/music.mp3")?; - sink.append(rodio::Decoder::new(BufReader::new(file))?); + sink.append(rodio::Decoder::try_from(file)?); sink.sleep_until_end(); diff --git a/examples/music_ogg.rs b/examples/music_ogg.rs index 74c36229..bd7e7b9b 100644 --- a/examples/music_ogg.rs +++ b/examples/music_ogg.rs @@ -1,12 +1,11 @@ use std::error::Error; -use std::io::BufReader; fn main() -> Result<(), Box> { let stream_handle = rodio::OutputStreamBuilder::open_default_stream()?; let sink = rodio::Sink::connect_new(&stream_handle.mixer()); let file = std::fs::File::open("assets/music.ogg")?; - sink.append(rodio::Decoder::new(BufReader::new(file))?); + sink.append(rodio::Decoder::try_from(file)?); sink.sleep_until_end(); diff --git a/examples/music_wav.rs b/examples/music_wav.rs index a29d929b..b482849a 100644 --- a/examples/music_wav.rs +++ b/examples/music_wav.rs @@ -1,12 +1,11 @@ use std::error::Error; -use std::io::BufReader; fn main() -> Result<(), Box> { let stream_handle = rodio::OutputStreamBuilder::open_default_stream()?; let sink = rodio::Sink::connect_new(&stream_handle.mixer()); let file = std::fs::File::open("assets/music.wav")?; - sink.append(rodio::Decoder::new(BufReader::new(file))?); + sink.append(rodio::Decoder::try_from(file)?); sink.sleep_until_end(); diff --git a/examples/reverb.rs b/examples/reverb.rs index dc74e71d..8bd30bdf 100644 --- a/examples/reverb.rs +++ b/examples/reverb.rs @@ -1,6 +1,5 @@ use rodio::Source; use std::error::Error; -use std::io::BufReader; use std::time::Duration; fn main() -> Result<(), Box> { @@ -8,7 +7,7 @@ fn main() -> Result<(), Box> { let sink = rodio::Sink::connect_new(&stream_handle.mixer()); let file = std::fs::File::open("assets/music.ogg")?; - let source = rodio::Decoder::new(BufReader::new(file))?; + let source = rodio::Decoder::try_from(file)?; let with_reverb = source.buffered().reverb(Duration::from_millis(40), 0.7); sink.append(with_reverb); diff --git a/examples/seek_mp3.rs b/examples/seek_mp3.rs index a78238bc..e98c7a46 100644 --- a/examples/seek_mp3.rs +++ b/examples/seek_mp3.rs @@ -1,5 +1,4 @@ use std::error::Error; -use std::io::BufReader; use std::time::Duration; fn main() -> Result<(), Box> { @@ -7,7 +6,7 @@ fn main() -> Result<(), Box> { let sink = rodio::Sink::connect_new(&stream_handle.mixer()); let file = std::fs::File::open("assets/music.mp3")?; - sink.append(rodio::Decoder::new(BufReader::new(file))?); + sink.append(rodio::Decoder::try_from(file)?); std::thread::sleep(std::time::Duration::from_secs(2)); sink.try_seek(Duration::from_secs(0))?; diff --git a/examples/spatial.rs b/examples/spatial.rs index 31505ecc..6edf3f0b 100644 --- a/examples/spatial.rs +++ b/examples/spatial.rs @@ -1,5 +1,4 @@ use std::error::Error; -use std::io::BufReader; use std::thread; use std::time::Duration; @@ -30,7 +29,7 @@ fn main() -> Result<(), Box> { ); let file = std::fs::File::open("assets/music.ogg")?; - let source = rodio::Decoder::new(BufReader::new(file))? + let source = rodio::Decoder::try_from(file)? .repeat_infinite() .take_duration(total_duration); sink.append(source); diff --git a/examples/stereo.rs b/examples/stereo.rs index 5b5ec500..c7f82182 100644 --- a/examples/stereo.rs +++ b/examples/stereo.rs @@ -2,14 +2,13 @@ use rodio::Source; use std::error::Error; -use std::io::BufReader; fn main() -> Result<(), Box> { let stream_handle = rodio::OutputStreamBuilder::open_default_stream()?; let sink = rodio::Sink::connect_new(&stream_handle.mixer()); let file = std::fs::File::open("assets/RL.ogg")?; - sink.append(rodio::Decoder::new(BufReader::new(file))?.amplify(0.2)); + sink.append(rodio::Decoder::try_from(file)?.amplify(0.2)); sink.sleep_until_end(); diff --git a/src/lib.rs b/src/lib.rs index 9663887f..385e3d9a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,7 +17,6 @@ //! //! ```no_run //! use std::fs::File; -//! use std::io::BufReader; //! use rodio::{Decoder, OutputStream, source::Source}; //! //! // Get an output stream handle to the default physical sound device. @@ -26,9 +25,9 @@ //! .expect("open default audio stream"); //! let sink = rodio::Sink::connect_new(&stream_handle.mixer()); //! // Load a sound from a file, using a path relative to Cargo.toml -//! let file = BufReader::new(File::open("examples/music.ogg").unwrap()); +//! let file = File::open("examples/music.ogg").unwrap(); //! // Decode that sound file into a source -//! let source = Decoder::new(file).unwrap(); +//! let source = Decoder::try_from(file).unwrap(); //! // Play the sound directly on the device //! stream_handle.mixer().add(source.convert_samples()); //! @@ -68,10 +67,8 @@ //! and [`.append()`](Sink::append) your sound to it. //! //! ```no_run -//! use std::fs::File; -//! use std::io::BufReader; //! use std::time::Duration; -//! use rodio::{Decoder, OutputStream, Sink}; +//! use rodio::{OutputStream, Sink}; //! use rodio::source::{SineWave, Source}; //! //! // _stream must live as long as the sink diff --git a/src/source/speed.rs b/src/source/speed.rs index 6409dff2..419c7858 100644 --- a/src/source/speed.rs +++ b/src/source/speed.rs @@ -13,7 +13,6 @@ //! //! ```no_run //!# use std::fs::File; -//!# use std::io::BufReader; //!# use rodio::{Decoder, Sink, OutputStream, source::{Source, SineWave}}; //! //! // Get an output stream handle to the default physical sound device. @@ -21,9 +20,9 @@ //! let stream_handle = rodio::OutputStreamBuilder::open_default_stream() //! .expect("open default audio stream"); //! // Load a sound from a file, using a path relative to `Cargo.toml` -//! let file = BufReader::new(File::open("examples/music.ogg").unwrap()); +//! let file = File::open("examples/music.ogg").unwrap(); //! // Decode that sound file into a source -//! let source = Decoder::new(file).unwrap(); +//! let source = Decoder::try_from(file).unwrap(); //! // Play the sound directly on the device 2x faster //! stream_handle.mixer().add(source.convert_samples().speed(2.0)); //! std::thread::sleep(std::time::Duration::from_secs(5)); diff --git a/tests/flac_test.rs b/tests/flac_test.rs index 3db42abc..87f2e84b 100644 --- a/tests/flac_test.rs +++ b/tests/flac_test.rs @@ -8,11 +8,9 @@ use std::time::Duration; #[cfg(any(feature = "flac", feature = "symphonia-flac"))] #[test] fn test_flac_encodings() { - use std::io::BufReader; - // 16 bit FLAC file exported from Audacity (2 channels, compression level 5) let file = std::fs::File::open("assets/audacity16bit_level5.flac").unwrap(); - let mut decoder = rodio::Decoder::new(BufReader::new(file)).unwrap(); + let mut decoder = rodio::Decoder::try_from(file).unwrap(); // File is not just silence assert!(!decoder.all(|x| x.is_zero())); @@ -23,7 +21,7 @@ fn test_flac_encodings() { // 24 bit FLAC file exported from Audacity (2 channels, various compression levels) for level in &[0, 5, 8] { let file = std::fs::File::open(format!("assets/audacity24bit_level{level}.flac")).unwrap(); - let mut decoder = rodio::Decoder::new(BufReader::new(file)).unwrap(); + let mut decoder = rodio::Decoder::try_from(file).unwrap(); assert!(!decoder.all(|x| x.is_zero())); #[cfg(all(feature = "flac", not(feature = "symphonia-flac")))] assert_eq!(decoder.total_duration(), Some(Duration::from_secs(3))); diff --git a/tests/mp4a_test.rs b/tests/mp4a_test.rs index 2e2386e4..2f5483c2 100644 --- a/tests/mp4a_test.rs +++ b/tests/mp4a_test.rs @@ -1,5 +1,4 @@ #![cfg(all(feature = "symphonia-aac", feature = "symphonia-isomp4"))] -use std::io::BufReader; use rodio::Sample; @@ -11,6 +10,6 @@ fn test_mp4a_encodings() { // Licensed under Creative Commons: By Attribution 3.0 // http://creativecommons.org/licenses/by/3.0/ let file = std::fs::File::open("assets/monkeys.mp4a").unwrap(); - let mut decoder = rodio::Decoder::new(BufReader::new(file)).unwrap(); + let mut decoder = rodio::Decoder::try_from(file).unwrap(); assert!(!decoder.all(|x| x.is_zero())); // Assert not all zeros } diff --git a/tests/wav_test.rs b/tests/wav_test.rs index d86a175a..781d54fc 100644 --- a/tests/wav_test.rs +++ b/tests/wav_test.rs @@ -4,35 +4,33 @@ use rodio::Sample; #[cfg(feature = "wav")] #[test] fn test_wav_encodings() { - use std::io::BufReader; - // 16 bit wav file exported from Audacity (1 channel) let file = std::fs::File::open("assets/audacity16bit.wav").unwrap(); - let mut decoder = rodio::Decoder::new(BufReader::new(file)).unwrap(); + let mut decoder = rodio::Decoder::try_from(file).unwrap(); assert!(!decoder.all(|x| x.is_zero())); // Assert not all zeros // 16 bit wav file exported from LMMS (2 channels) let file = std::fs::File::open("assets/lmms16bit.wav").unwrap(); - let mut decoder = rodio::Decoder::new(BufReader::new(file)).unwrap(); + let mut decoder = rodio::Decoder::try_from(file).unwrap(); assert!(!decoder.all(|x| x.is_zero())); // 24 bit wav file exported from LMMS (2 channels) let file = std::fs::File::open("assets/lmms24bit.wav").unwrap(); - let mut decoder = rodio::Decoder::new(BufReader::new(file)).unwrap(); + let mut decoder = rodio::Decoder::try_from(file).unwrap(); assert!(!decoder.all(|x| x.is_zero())); // 32 bit wav file exported from Audacity (1 channel) let file = std::fs::File::open("assets/audacity32bit.wav").unwrap(); - let mut decoder = rodio::Decoder::new(BufReader::new(file)).unwrap(); + let mut decoder = rodio::Decoder::try_from(file).unwrap(); assert!(!decoder.all(|x| x.is_zero())); // 32 bit wav file exported from LMMS (2 channels) let file = std::fs::File::open("assets/lmms32bit.wav").unwrap(); - let mut decoder = rodio::Decoder::new(BufReader::new(file)).unwrap(); + let mut decoder = rodio::Decoder::try_from(file).unwrap(); assert!(!decoder.all(|x| x.is_zero())); // 32 bit signed integer wav file exported from Audacity (1 channel). let file = std::fs::File::open("assets/audacity32bit_int.wav").unwrap(); - let mut decoder = rodio::Decoder::new(BufReader::new(file)).unwrap(); + let mut decoder = rodio::Decoder::try_from(file).unwrap(); assert!(!decoder.all(|x| x.is_zero())); }