pub mod audio_device;
pub mod realtime;
pub mod ring_buffer;
pub use audio_device::AudioDevice;
pub use realtime::{PlaybackStats, RealtimePlayer};
pub use ring_buffer::RingBuffer;
pub use ym2149_common::DEFAULT_SAMPLE_RATE;
pub const VISUALIZATION_UPDATE_MS: u64 = 50;
pub const BUFFER_BACKOFF_MICROS: u64 = 100;
#[derive(Debug, Clone, Copy)]
pub struct StreamConfig {
pub ring_buffer_size: usize,
pub sample_rate: u32,
pub channels: u16,
}
impl StreamConfig {
pub fn low_latency(sample_rate: u32) -> Self {
StreamConfig {
ring_buffer_size: 4096,
sample_rate,
channels: 2, }
}
pub fn stable(sample_rate: u32) -> Self {
StreamConfig {
ring_buffer_size: 16384,
sample_rate,
channels: 2, }
}
pub fn latency_ms(&self) -> f32 {
((self.ring_buffer_size as f32) / (self.sample_rate as f32)) * 1000.0
}
}
impl Default for StreamConfig {
fn default() -> Self {
Self::stable(44100)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_stream_config_latency() {
let config = StreamConfig::low_latency(44100);
let latency = config.latency_ms();
assert!(latency > 90.0 && latency < 95.0);
}
}