From 4f88a5b009a144ed62394c91c0e1b62749be21b1 Mon Sep 17 00:00:00 2001 From: Petr Gladkikh Date: Sun, 1 Dec 2024 17:43:28 +0400 Subject: [PATCH 1/5] Introduce a public constant for Rodio's default sample rate Also partially relieves #208. The rate converter has to be fixed still but with default sample rate less resampling is needed. --- examples/mix_multiple_sources.rs | 3 ++- examples/noise_generator.rs | 5 +++-- examples/signal_generator.rs | 3 ++- src/constants.rs | 6 ++++++ src/conversions/mod.rs | 1 - src/lib.rs | 1 + src/source/sine.rs | 10 ++++------ src/stream.rs | 3 ++- 8 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 src/constants.rs diff --git a/examples/mix_multiple_sources.rs b/examples/mix_multiple_sources.rs index 55c3fb09..47f769d0 100644 --- a/examples/mix_multiple_sources.rs +++ b/examples/mix_multiple_sources.rs @@ -2,10 +2,11 @@ use rodio::mixer; use rodio::source::{SineWave, Source}; use std::error::Error; use std::time::Duration; +use rodio::constants::DEFAULT_SAMPLE_RATE; fn main() -> Result<(), Box> { // Construct a dynamic controller and mixer, stream_handle, and sink. - let (controller, mixer) = mixer::mixer::(2, 44_100); + let (controller, mixer) = mixer::mixer::(2, DEFAULT_SAMPLE_RATE); let stream_handle = rodio::OutputStreamBuilder::open_default_stream()?; let sink = rodio::Sink::connect_new(&stream_handle.mixer()); diff --git a/examples/noise_generator.rs b/examples/noise_generator.rs index 577f9d01..095634f1 100644 --- a/examples/noise_generator.rs +++ b/examples/noise_generator.rs @@ -1,6 +1,7 @@ //! Noise generator example. Use the "noise" feature to enable the noise generator sources. use std::error::Error; +use rodio::constants::DEFAULT_SAMPLE_RATE; #[cfg(feature = "noise")] fn main() -> Result<(), Box> { @@ -14,7 +15,7 @@ fn main() -> Result<(), Box> { let interval_duration = Duration::from_millis(1500); stream_handle.mixer().add( - white(cpal::SampleRate(48000)) + white(cpal::SampleRate(DEFAULT_SAMPLE_RATE)) .amplify(0.1) .take_duration(noise_duration), ); @@ -23,7 +24,7 @@ fn main() -> Result<(), Box> { thread::sleep(interval_duration); stream_handle.mixer().add( - pink(cpal::SampleRate(48000)) + pink(cpal::SampleRate(DEFAULT_SAMPLE_RATE)) .amplify(0.1) .take_duration(noise_duration), ); diff --git a/examples/signal_generator.rs b/examples/signal_generator.rs index e746692d..a95cf39c 100644 --- a/examples/signal_generator.rs +++ b/examples/signal_generator.rs @@ -1,6 +1,7 @@ //! Test signal generator example. use std::error::Error; +use rodio::constants::DEFAULT_SAMPLE_RATE; fn main() -> Result<(), Box> { use rodio::source::{chirp, Function, SignalGenerator, Source}; @@ -11,7 +12,7 @@ fn main() -> Result<(), Box> { let test_signal_duration = Duration::from_millis(1000); let interval_duration = Duration::from_millis(1500); - let sample_rate = cpal::SampleRate(48000); + let sample_rate = cpal::SampleRate(DEFAULT_SAMPLE_RATE); println!("Playing 1000 Hz tone"); stream_handle.mixer().add( diff --git a/src/constants.rs b/src/constants.rs new file mode 100644 index 00000000..d6596452 --- /dev/null +++ b/src/constants.rs @@ -0,0 +1,6 @@ +//! Rodio common constants + +/// The sample rate (Hz) output stream uses by default. +/// Prefer this one in the processing chain to minimize sample rate conversions. +pub const DEFAULT_SAMPLE_RATE: u32 = 44_100; + diff --git a/src/conversions/mod.rs b/src/conversions/mod.rs index e6ad817e..833372c6 100644 --- a/src/conversions/mod.rs +++ b/src/conversions/mod.rs @@ -2,7 +2,6 @@ This module contains function that will convert from one PCM format to another. This includes conversion between sample formats, channels or sample rates. - */ pub use self::channels::ChannelCountConverter; diff --git a/src/lib.rs b/src/lib.rs index ea0a3a35..78637a9c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -166,6 +166,7 @@ pub mod mixer; pub mod queue; pub mod source; pub mod static_buffer; +pub mod constants; pub use crate::conversions::Sample; pub use crate::decoder::Decoder; diff --git a/src/source/sine.rs b/src/source/sine.rs index da4f8b2c..f14da925 100644 --- a/src/source/sine.rs +++ b/src/source/sine.rs @@ -1,5 +1,5 @@ use std::time::Duration; - +use crate::constants::DEFAULT_SAMPLE_RATE; use crate::source::{Function, SignalGenerator}; use crate::Source; @@ -7,19 +7,17 @@ use super::SeekError; /// An infinite source that produces a sine. /// -/// Always has a rate of 48kHz and one channel. +/// Always has default sample rate and one channel. #[derive(Clone, Debug)] pub struct SineWave { test_sine: SignalGenerator, } impl SineWave { - const SAMPLE_RATE: u32 = 48000; - /// The frequency of the sine. #[inline] pub fn new(freq: f32) -> SineWave { - let sr = cpal::SampleRate(Self::SAMPLE_RATE); + let sr = cpal::SampleRate(DEFAULT_SAMPLE_RATE); SineWave { test_sine: SignalGenerator::new(sr, freq, Function::Sine), } @@ -48,7 +46,7 @@ impl Source for SineWave { #[inline] fn sample_rate(&self) -> u32 { - Self::SAMPLE_RATE + self.test_sine.sample_rate() } #[inline] diff --git a/src/stream.rs b/src/stream.rs index 246f0c98..94155714 100644 --- a/src/stream.rs +++ b/src/stream.rs @@ -3,6 +3,7 @@ use std::marker::Sync; use std::sync::Arc; use std::{error, fmt}; +use crate::constants::DEFAULT_SAMPLE_RATE; use crate::decoder; use crate::mixer::{mixer, Mixer, MixerSource}; use crate::sink::Sink; @@ -12,7 +13,7 @@ use cpal::{ SupportedBufferSize, }; -const HZ_44100: cpal::SampleRate = cpal::SampleRate(44_100); +const HZ_44100: cpal::SampleRate = cpal::SampleRate(DEFAULT_SAMPLE_RATE); /// `cpal::Stream` container. /// Use `mixer()` method to control output. From c8aec8af3e7fb35564c4b445d19f40227fc1b09a Mon Sep 17 00:00:00 2001 From: Petr Gladkikh Date: Sun, 1 Dec 2024 17:54:34 +0400 Subject: [PATCH 2/5] Correct rustdoc --- src/source/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/source/mod.rs b/src/source/mod.rs index ceac73bd..e24ff51a 100644 --- a/src/source/mod.rs +++ b/src/source/mod.rs @@ -170,7 +170,6 @@ where fn total_duration(&self) -> Option; /// Stores the source in a buffer in addition to returning it. This iterator can be cloned. - #[inline] fn buffered(self) -> Buffered where From 20e35e6b66f0f445a21cbff265ed9facf9bad4dd Mon Sep 17 00:00:00 2001 From: Petr Gladkikh Date: Sun, 1 Dec 2024 18:01:28 +0400 Subject: [PATCH 3/5] Reformat code --- examples/mix_multiple_sources.rs | 2 +- examples/noise_generator.rs | 2 +- examples/signal_generator.rs | 2 +- src/constants.rs | 1 - src/lib.rs | 2 +- src/source/sine.rs | 2 +- 6 files changed, 5 insertions(+), 6 deletions(-) diff --git a/examples/mix_multiple_sources.rs b/examples/mix_multiple_sources.rs index 47f769d0..4aa5f823 100644 --- a/examples/mix_multiple_sources.rs +++ b/examples/mix_multiple_sources.rs @@ -1,8 +1,8 @@ +use rodio::constants::DEFAULT_SAMPLE_RATE; use rodio::mixer; use rodio::source::{SineWave, Source}; use std::error::Error; use std::time::Duration; -use rodio::constants::DEFAULT_SAMPLE_RATE; fn main() -> Result<(), Box> { // Construct a dynamic controller and mixer, stream_handle, and sink. diff --git a/examples/noise_generator.rs b/examples/noise_generator.rs index 095634f1..7f28cfef 100644 --- a/examples/noise_generator.rs +++ b/examples/noise_generator.rs @@ -1,7 +1,7 @@ //! Noise generator example. Use the "noise" feature to enable the noise generator sources. -use std::error::Error; use rodio::constants::DEFAULT_SAMPLE_RATE; +use std::error::Error; #[cfg(feature = "noise")] fn main() -> Result<(), Box> { diff --git a/examples/signal_generator.rs b/examples/signal_generator.rs index a95cf39c..34e7a3c1 100644 --- a/examples/signal_generator.rs +++ b/examples/signal_generator.rs @@ -1,7 +1,7 @@ //! Test signal generator example. -use std::error::Error; use rodio::constants::DEFAULT_SAMPLE_RATE; +use std::error::Error; fn main() -> Result<(), Box> { use rodio::source::{chirp, Function, SignalGenerator, Source}; diff --git a/src/constants.rs b/src/constants.rs index d6596452..366776da 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -3,4 +3,3 @@ /// The sample rate (Hz) output stream uses by default. /// Prefer this one in the processing chain to minimize sample rate conversions. pub const DEFAULT_SAMPLE_RATE: u32 = 44_100; - diff --git a/src/lib.rs b/src/lib.rs index 78637a9c..61b0c641 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -161,12 +161,12 @@ mod spatial_sink; mod stream; pub mod buffer; +pub mod constants; pub mod decoder; pub mod mixer; pub mod queue; pub mod source; pub mod static_buffer; -pub mod constants; pub use crate::conversions::Sample; pub use crate::decoder::Decoder; diff --git a/src/source/sine.rs b/src/source/sine.rs index f14da925..e7ac9a97 100644 --- a/src/source/sine.rs +++ b/src/source/sine.rs @@ -1,7 +1,7 @@ -use std::time::Duration; use crate::constants::DEFAULT_SAMPLE_RATE; use crate::source::{Function, SignalGenerator}; use crate::Source; +use std::time::Duration; use super::SeekError; From c360a66fe600b0e81f110c719ba4cfa9e19b824a Mon Sep 17 00:00:00 2001 From: Petr Gladkikh Date: Sun, 1 Dec 2024 18:45:04 +0400 Subject: [PATCH 4/5] Use default sample rate in empty --- src/source/empty.rs | 4 ++-- src/source/empty_callback.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/source/empty.rs b/src/source/empty.rs index d7b12980..ef7243c3 100644 --- a/src/source/empty.rs +++ b/src/source/empty.rs @@ -2,7 +2,7 @@ use std::marker::PhantomData; use std::time::Duration; use crate::{Sample, Source}; - +use crate::constants::DEFAULT_SAMPLE_RATE; use super::SeekError; /// An empty source. @@ -50,7 +50,7 @@ where #[inline] fn sample_rate(&self) -> u32 { - 48000 + DEFAULT_SAMPLE_RATE } #[inline] diff --git a/src/source/empty_callback.rs b/src/source/empty_callback.rs index ad1c66b8..e828c903 100644 --- a/src/source/empty_callback.rs +++ b/src/source/empty_callback.rs @@ -2,7 +2,7 @@ use std::marker::PhantomData; use std::time::Duration; use crate::{Sample, Source}; - +use crate::constants::DEFAULT_SAMPLE_RATE; use super::SeekError; /// An empty source which executes a callback function @@ -53,7 +53,7 @@ where #[inline] fn sample_rate(&self) -> u32 { - 48000 + DEFAULT_SAMPLE_RATE } #[inline] From 14ca8852b0b477e3f19a354d6327de02c5c6802e Mon Sep 17 00:00:00 2001 From: Petr Gladkikh Date: Sun, 1 Dec 2024 18:45:38 +0400 Subject: [PATCH 5/5] Reformat code --- src/source/empty.rs | 4 ++-- src/source/empty_callback.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/source/empty.rs b/src/source/empty.rs index ef7243c3..b2b75117 100644 --- a/src/source/empty.rs +++ b/src/source/empty.rs @@ -1,9 +1,9 @@ use std::marker::PhantomData; use std::time::Duration; -use crate::{Sample, Source}; -use crate::constants::DEFAULT_SAMPLE_RATE; use super::SeekError; +use crate::constants::DEFAULT_SAMPLE_RATE; +use crate::{Sample, Source}; /// An empty source. #[derive(Debug, Copy, Clone)] diff --git a/src/source/empty_callback.rs b/src/source/empty_callback.rs index e828c903..5b782e69 100644 --- a/src/source/empty_callback.rs +++ b/src/source/empty_callback.rs @@ -1,9 +1,9 @@ use std::marker::PhantomData; use std::time::Duration; -use crate::{Sample, Source}; -use crate::constants::DEFAULT_SAMPLE_RATE; use super::SeekError; +use crate::constants::DEFAULT_SAMPLE_RATE; +use crate::{Sample, Source}; /// An empty source which executes a callback function pub struct EmptyCallback {