sound/
sound.rs

1//! Sound and music example. The code is public domain, the
2//! wav file is from Warcraft 2 audio setup, the midi file
3//! is from Simon the Sorcerer, the mus file is from Doom.
4//! Direct Rust port.
5
6#![no_main]
7
8use dos_like::{
9    curs_off, dos_like_sys::*, goto_xy, install_user_soundbank, key_state, load_wav, play_sound,
10    put_str, set_sound_mode, set_soundbank, shutting_down, stop_music, stop_sound, KeyCode, Music,
11    SoundMode, Soundbank,
12};
13
14#[no_mangle]
15pub extern "C" fn dosmain() -> i32 {
16    unsafe {
17        let mus = Music::load_mus("dos-like-sys/dos-like/files/sound/doom.mus")
18            .expect("Could not load doom.mus");
19        let mid = Music::load_mid("dos-like-sys/dos-like/files/sound/simon.mid")
20            .expect("Could not load simon.mid");
21        let r#mod = Music::load_mod("dos-like-sys/dos-like/files/sound/cfodder.mod")
22            .expect("Could not load cfodder.mod");
23        let opb = Music::load_opb("dos-like-sys/dos-like/files/sound/doom.opb")
24            .expect("Could not load doom.opb");
25        let wav = load_wav("dos-like-sys/dos-like/files/sound/soundcard.wav")
26            .expect("Could not load soundcard.wav");
27        let doom_soundbank = install_user_soundbank("dos-like-sys/dos-like/files/sound/doom.op2")
28            .expect("Could not load doom.op2");
29
30        let mut use_awe32 = true;
31
32        put_str("SOUND DEMO");
33        goto_xy(0, 2);
34        put_str("1 - Play MIDI song");
35        goto_xy(0, 3);
36        put_str("2 - Play MUS song");
37        goto_xy(0, 4);
38        put_str("3 - Play MOD song");
39        goto_xy(0, 5);
40        put_str("4 - Play WAV sound on channel 1");
41        goto_xy(0, 6);
42        put_str("5 - Play WAV sound on channel 2");
43        goto_xy(0, 7);
44        put_str("6 - Play WAV sound on channel 3");
45        goto_xy(0, 8);
46        put_str("7 - Stop sound and music");
47        goto_xy(0, 9);
48        put_str("8 - Sound mode 11khz 8bit mono (default)");
49        goto_xy(0, 10);
50        put_str("9 - Sound mode 44khz 16bit stereo");
51        goto_xy(0, 11);
52        put_str("0 - Sound mode 5khz 8bit mono");
53        goto_xy(0, 12);
54        put_str("A - Use AWE32 for MIDI/MUS (default)");
55        goto_xy(0, 13);
56        put_str("S - Use SoundBlaster16 for MIDI/MUS");
57        goto_xy(0, 14);
58        put_str("O - Play OPB song");
59        goto_xy(0, 16);
60        put_str("ESC - quit");
61        curs_off();
62        while !shutting_down() {
63            let key = *readchars() as u8;
64            match key {
65                b'1' => {
66                    if use_awe32 {
67                        set_soundbank(&Soundbank::DEFAULT_AWE32);
68                    } else {
69                        set_soundbank(&Soundbank::DEFAULT_SB16);
70                    }
71                    mid.play(false, 255);
72                }
73                b'2' => {
74                    if use_awe32 {
75                        set_soundbank(&Soundbank::DEFAULT_AWE32);
76                    } else {
77                        set_soundbank(&doom_soundbank);
78                    }
79                    mus.play(false, 255);
80                }
81                b'3' => {
82                    r#mod.play(false, 255);
83                }
84                b'O' | b'o' => {
85                    opb.play(false, 255);
86                }
87                b'4' => {
88                    play_sound(0, &wav, false, 128);
89                }
90                b'5' => {
91                    play_sound(1, &wav, false, 128);
92                }
93                b'6' => {
94                    play_sound(2, &wav, false, 128);
95                }
96                b'7' => {
97                    stop_music();
98                    stop_sound(0);
99                    stop_sound(1);
100                    stop_sound(2);
101                }
102                b'8' => {
103                    set_sound_mode(SoundMode::Mono8bit11025);
104                }
105                b'9' => {
106                    set_sound_mode(SoundMode::Mono16Bit44100);
107                }
108                b'0' => {
109                    set_sound_mode(SoundMode::Mono8bit5000);
110                }
111                b'A' | b'a' => {
112                    if !use_awe32 {
113                        use_awe32 = true;
114                        stop_music();
115                    }
116                }
117                b'S' | b's' => {
118                    if use_awe32 {
119                        use_awe32 = false;
120                        stop_music();
121                    }
122                }
123                _ => {}
124            }
125            if key_state(KeyCode::KEY_ESCAPE) {
126                break;
127            }
128        }
129    }
130    0
131}