diff --git a/examples/mix_multiple_sources.rs b/examples/mix_multiple_sources.rs index 55c3fb09..4aa5f823 100644 --- a/examples/mix_multiple_sources.rs +++ b/examples/mix_multiple_sources.rs @@ -1,3 +1,4 @@ +use rodio::constants::DEFAULT_SAMPLE_RATE; use rodio::mixer; use rodio::source::{SineWave, Source}; use std::error::Error; @@ -5,7 +6,7 @@ use std::time::Duration; 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..7f28cfef 100644 --- a/examples/noise_generator.rs +++ b/examples/noise_generator.rs @@ -1,5 +1,6 @@ //! Noise generator example. Use the "noise" feature to enable the noise generator sources. +use rodio::constants::DEFAULT_SAMPLE_RATE; use std::error::Error; #[cfg(feature = "noise")] @@ -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..34e7a3c1 100644 --- a/examples/signal_generator.rs +++ b/examples/signal_generator.rs @@ -1,5 +1,6 @@ //! Test signal generator example. +use rodio::constants::DEFAULT_SAMPLE_RATE; use std::error::Error; fn main() -> Result<(), Box> { @@ -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..366776da --- /dev/null +++ b/src/constants.rs @@ -0,0 +1,5 @@ +//! 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..61b0c641 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -161,6 +161,7 @@ mod spatial_sink; mod stream; pub mod buffer; +pub mod constants; pub mod decoder; pub mod mixer; pub mod queue; diff --git a/src/source/empty.rs b/src/source/empty.rs index d7b12980..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 super::SeekError; +use crate::constants::DEFAULT_SAMPLE_RATE; +use crate::{Sample, Source}; /// An empty source. #[derive(Debug, Copy, Clone)] @@ -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..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 super::SeekError; +use crate::constants::DEFAULT_SAMPLE_RATE; +use crate::{Sample, Source}; /// An empty source which executes a callback function pub struct EmptyCallback { @@ -53,7 +53,7 @@ where #[inline] fn sample_rate(&self) -> u32 { - 48000 + DEFAULT_SAMPLE_RATE } #[inline] diff --git a/src/source/sine.rs b/src/source/sine.rs index f8b054c7..8bba54e4 100644 --- a/src/source/sine.rs +++ b/src/source/sine.rs @@ -1,13 +1,13 @@ -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; /// An infinite source that produces a sine. /// -/// Always has a sample rate of 48kHz and one channel. +/// Always has default sample rate. /// /// This source is a thin interface on top of `SignalGenerator` provided for /// your convenience. @@ -17,12 +17,10 @@ pub struct SineWave { } 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), } @@ -51,7 +49,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.