jugar-audio

Spatial 2D audio with channel mixing.

Basic Playback

#![allow(unused)]
fn main() {
use jugar_audio::prelude::*;

let mut audio = AudioEngine::new();

// Load sound
let sound = audio.load_sound("explosion.wav");

// Play sound
audio.play(sound);

// Play with volume
audio.play_with_volume(sound, 0.5);
}

Channels

#![allow(unused)]
fn main() {
// Audio channels
pub enum Channel {
    Master,   // Overall volume
    Music,    // Background music
    Effects,  // Sound effects
    Voice,    // Dialogue
    Ambient,  // Environmental sounds
}

// Set channel volume
audio.set_channel_volume(Channel::Music, 0.7);
audio.set_channel_volume(Channel::Effects, 1.0);

// Play on specific channel
audio.play_on_channel(sound, Channel::Effects);
}

Spatial Audio

#![allow(unused)]
fn main() {
// Create audio source at position
let source = audio.create_source(Position::new(500.0, 300.0));
audio.play_at_source(sound, source);

// Set listener position (usually player)
audio.set_listener_position(player_position);

// Update source position
audio.set_source_position(source, enemy_position);
}

Attenuation

#![allow(unused)]
fn main() {
// Configure distance attenuation
let source = audio.create_source_with_config(
    position,
    SpatialConfig {
        min_distance: 50.0,   // Full volume within this range
        max_distance: 500.0,  // Inaudible beyond this range
        rolloff: Rolloff::Linear,
    },
);
}

Rolloff Models

ModelDescription
LinearLinear falloff between min and max
Inverse1/distance falloff
InverseSquare1/distance² (realistic)
NoneNo distance attenuation

Stereo Panning

#![allow(unused)]
fn main() {
// Automatic panning based on position
// Sounds to the left of listener pan left
// Sounds to the right pan right

// Manual pan (-1.0 = left, 0.0 = center, 1.0 = right)
audio.set_pan(source, -0.5);
}

Music

#![allow(unused)]
fn main() {
// Background music (loops by default)
let music = audio.load_music("background.ogg");
audio.play_music(music);

// Crossfade to new track
audio.crossfade_music(new_music, 2.0);  // 2 second fade

// Pause/resume
audio.pause_music();
audio.resume_music();
}

Sound Groups

#![allow(unused)]
fn main() {
// Create a group for related sounds
let footsteps = SoundGroup::new()
    .add(audio.load_sound("step1.wav"))
    .add(audio.load_sound("step2.wav"))
    .add(audio.load_sound("step3.wav"));

// Play random sound from group
footsteps.play_random(&mut audio);

// Play sequential
footsteps.play_next(&mut audio);
}

Example: Complete Setup

#![allow(unused)]
fn main() {
fn setup_audio(audio: &mut AudioEngine) {
    // Set channel volumes
    audio.set_channel_volume(Channel::Master, 0.8);
    audio.set_channel_volume(Channel::Music, 0.5);
    audio.set_channel_volume(Channel::Effects, 1.0);

    // Start background music
    let music = audio.load_music("theme.ogg");
    audio.play_music(music);
}

fn update_audio(audio: &mut AudioEngine, player_pos: Position) {
    // Update listener to follow player
    audio.set_listener_position(player_pos);
}

fn play_explosion(audio: &mut AudioEngine, position: Position) {
    let sound = audio.load_sound("explosion.wav");
    let source = audio.create_source(position);
    audio.play_at_source_on_channel(sound, source, Channel::Effects);
}
}