| Crates.io | moosicbox_audio_output |
| lib.rs | moosicbox_audio_output |
| version | 0.1.4 |
| created_at | 2024-10-04 03:18:45.04347+00 |
| updated_at | 2025-07-21 19:19:40.987583+00 |
| description | MoosicBox audio outputs package |
| homepage | |
| repository | https://github.com/MoosicBox/MoosicBox |
| max_upload_size | |
| id | 1396030 |
| size | 236,876 |
A cross-platform audio output abstraction layer supporting multiple audio backends for high-quality audio playback.
The MoosicBox Audio Output package provides:
use moosicbox_audio_output::{AudioOutput, AudioOutputConfig, AudioBackend};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create audio output configuration
let config = AudioOutputConfig {
backend: AudioBackend::Cpal,
sample_rate: 44100,
channels: 2,
bit_depth: 16,
buffer_size: 1024,
device_name: None, // Use default device
};
// Initialize audio output
let mut audio_output = AudioOutput::new(config).await?;
// Play audio samples
let samples = vec![0.0f32; 1024]; // Silent audio
audio_output.write_samples(&samples).await?;
Ok(())
}
use moosicbox_audio_output::{AudioOutput, list_audio_devices};
async fn list_available_devices() -> Result<(), Box<dyn std::error::Error>> {
// List all available audio devices
let devices = list_audio_devices(AudioBackend::Cpal).await?;
for device in devices {
println!("Device: {} ({})", device.name, device.id);
println!(" Channels: {}", device.max_channels);
println!(" Sample rates: {:?}", device.supported_sample_rates);
println!(" Default: {}", device.is_default);
}
Ok(())
}
use moosicbox_audio_output::{AudioOutputConfig, AudioBackend, AudioLatency};
fn create_low_latency_config() -> AudioOutputConfig {
AudioOutputConfig {
backend: AudioBackend::Jack, // Use JACK for low latency
sample_rate: 48000,
channels: 2,
bit_depth: 24,
buffer_size: 64, // Small buffer for low latency
device_name: Some("JACK Audio".to_string()),
latency: AudioLatency::Minimal,
exclusive_mode: true, // Request exclusive access
}
}
fn create_high_quality_config() -> AudioOutputConfig {
AudioOutputConfig {
backend: AudioBackend::Asio, // Use ASIO for best quality
sample_rate: 192000, // High sample rate
channels: 8, // Surround sound
bit_depth: 32,
buffer_size: 2048, // Larger buffer for stability
device_name: Some("RME Audio Interface".to_string()),
latency: AudioLatency::Quality,
exclusive_mode: true,
}
}
use moosicbox_audio_output::{AudioOutput, AudioProcessor};
struct CustomAudioProcessor {
// Your audio processing state
}
impl AudioProcessor for CustomAudioProcessor {
fn process_samples(&mut self, input: &[f32], output: &mut [f32]) {
// Apply audio effects, volume control, etc.
for (i, sample) in input.iter().enumerate() {
output[i] = sample * 0.8; // Simple volume reduction
}
}
}
async fn setup_real_time_processing() -> Result<(), Box<dyn std::error::Error>> {
let config = AudioOutputConfig::default();
let mut audio_output = AudioOutput::new(config).await?;
let processor = CustomAudioProcessor {};
audio_output.set_processor(Box::new(processor))?;
// Audio will now be processed in real-time
Ok(())
}
cpal - Enable CPAL backend (cross-platform)jack - Enable JACK backend (professional audio)asio - Enable ASIO backend (Windows professional)aac - Support for AAC audio formatflac - Support for FLAC audio formatmp3 - Support for MP3 audio formatopus - Support for Opus audio formatall-backends - Enable all available audio backendsdefault-backend - Enable the recommended backend for the platform// CD Quality
let cd_quality = AudioOutputConfig {
sample_rate: 44100,
bit_depth: 16,
channels: 2,
..Default::default()
};
// Hi-Res Audio
let hires_quality = AudioOutputConfig {
sample_rate: 96000,
bit_depth: 24,
channels: 2,
..Default::default()
};
// Studio Quality
let studio_quality = AudioOutputConfig {
sample_rate: 192000,
bit_depth: 32,
channels: 2,
..Default::default()
};
// Low latency for real-time applications
let low_latency = AudioOutputConfig {
buffer_size: 64, // Very small buffer
latency: AudioLatency::Minimal,
backend: AudioBackend::Jack,
..Default::default()
};
// Balanced latency and stability
let balanced = AudioOutputConfig {
buffer_size: 512, // Medium buffer
latency: AudioLatency::Balanced,
backend: AudioBackend::Cpal,
..Default::default()
};
// High stability for background playback
let stable = AudioOutputConfig {
buffer_size: 4096, // Large buffer
latency: AudioLatency::Quality,
backend: AudioBackend::PulseAudio,
..Default::default()
};
# Install PulseAudio development headers
sudo apt-get install libpulse-dev
# Install JACK development headers
sudo apt-get install libjack-jackd2-dev
# Install JACK (optional)
brew install jack
For ASIO support, you need:
use moosicbox_audio_output::error::AudioOutputError;
match audio_output.write_samples(&samples).await {
Ok(()) => println!("Audio written successfully"),
Err(AudioOutputError::DeviceNotFound(device)) => {
eprintln!("Audio device not found: {}", device);
},
Err(AudioOutputError::UnsupportedFormat { sample_rate, channels, bit_depth }) => {
eprintln!("Unsupported format: {}Hz, {} channels, {} bits",
sample_rate, channels, bit_depth);
},
Err(AudioOutputError::BufferUnderrun) => {
eprintln!("Audio buffer underrun - increase buffer size");
},
Err(AudioOutputError::DeviceBusy) => {
eprintln!("Audio device is busy - try exclusive_mode: false");
},
Err(e) => {
eprintln!("Audio output error: {}", e);
}
}
use moosicbox_audio_output::AudioOutput;
use moosicbox_player::Player;
async fn setup_player_with_audio_output() -> Result<(), Box<dyn std::error::Error>> {
// Create audio output
let audio_config = AudioOutputConfig {
backend: AudioBackend::Cpal,
sample_rate: 44100,
channels: 2,
bit_depth: 16,
buffer_size: 1024,
..Default::default()
};
let audio_output = AudioOutput::new(audio_config).await?;
// Create player with audio output
let player = Player::with_audio_output(audio_output).await?;
Ok(())
}
# Enable audio output debugging
RUST_LOG=moosicbox_audio_output=debug cargo run
# List available audio devices
RUST_LOG=moosicbox_audio_output=debug cargo run -- --list-devices
# Test audio output
RUST_LOG=moosicbox_audio_output=debug cargo run -- --test-audio
# Check PulseAudio status
pulseaudio --check -v
# List PulseAudio devices
pactl list sinks
# Test JACK connection
jack_control status
# Check Windows audio devices
powershell "Get-WmiObject Win32_SoundDevice"
# List Core Audio devices
system_profiler SPAudioDataType