Skip to main content

audio3d/
audio3d.rs

1//! Positional procedural audio. Build only in CI; running opens audio/window.
2use ponko::*;
3
4// ANCHOR: sound3d
5fn setup(ctx: &mut Ctx) {
6    let samples: Vec<f32> = (0..44100)
7        .map(|i| (i as f32 * 220.0 * std::f32::consts::TAU / 44100.0).sin() * 0.1)
8        .collect();
9    let hum = ctx.create_sound(44100, &samples);
10    let settings = AudioSettings3D {
11        sound: SoundParams {
12            volume: 0.4,
13            looping: true,
14            ..Default::default()
15        },
16        min_distance: 2.0,
17        max_distance: 60.0,
18        rolloff: AudioRolloff::Linear,
19        ..Default::default()
20    };
21    ctx.world
22        .spawn((Transform3D::at(vec3(4.0, 0.0, 0.0)), AudioSource3D::new(hum, settings)));
23    ctx.play_sound_at(&hum, vec3(-4.0, 0.0, 0.0), AudioSettings3D::default());
24}
25
26fn main() {
27    // The sounds follow their entities and the listener (ctx.camera3d) by themselves.
28    Game::new("Spatial audio", 800, 600).run(setup);
29}
30// ANCHOR_END: sound3d
31
32// ANCHOR: audio_mixer
33#[allow(dead_code)]
34fn buses_and_effects(ctx: &mut Ctx, sound: Sound) {
35    let music = ctx.audio_bus("music"); // Save this handle; names are looked up once.
36    ctx.set_audio_bus_volume(music, 0.6);
37    let voice = ctx.play_sound_on(
38        &sound,
39        SoundParams {
40            looping: true,
41            ..Default::default()
42        },
43        music,
44        AudioEffects {
45            low_pass_hz: 4_000.0,
46            reverb: 0.2,
47        },
48    );
49    ctx.set_sound_effects(
50        voice,
51        AudioEffects {
52            low_pass_hz: 800.0,
53            reverb: 0.5,
54        },
55    );
56    ctx.mute_audio_bus(music, true);
57    ctx.mute_audio_bus(music, false); // Restores the configured gain.
58    let settings = AudioSettings3D {
59        bus: music,
60        effects: AudioEffects {
61            low_pass_hz: 2_000.0,
62            reverb: 0.3,
63        },
64        ..Default::default()
65    };
66    ctx.play_sound_at(&sound, vec3(3.0, 0.0, 0.0), settings);
67}
68// ANCHOR_END: audio_mixer
69
70// ANCHOR: audio_stream
71#[allow(dead_code)]
72fn streaming_music(ctx: &mut Ctx) {
73    let music = ctx.audio_bus("music");
74    let song = ctx.load_stream("music.ogg");
75    let voice = ctx.play_sound_on(
76        &song,
77        SoundParams {
78            looping: true,
79            ..Default::default()
80        },
81        music,
82        AudioEffects::default(),
83    );
84    ctx.stop_sound(voice);
85}
86// ANCHOR_END: audio_stream