Mercurial > molko
diff examples/example-audio.c @ 203:d3ef968745f5
core: rework audio API
- sound: module to play sounds (several at once),
- music: loopable music that can only be played one at once.
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 09 Nov 2020 21:18:41 +0100 |
parents | examples/example-sound.c@c3a40062acc2 |
children | 133926e08d6e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/example-audio.c Mon Nov 09 21:18:41 2020 +0100 @@ -0,0 +1,155 @@ +/* + * example-sound.c -- show how to use sounds + * + * Copyright (c) 2020 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <core/clock.h> +#include <core/core.h> +#include <core/event.h> +#include <core/music.h> +#include <core/painter.h> +#include <core/panic.h> +#include <core/sound.h> +#include <core/sys.h> +#include <core/util.h> +#include <core/window.h> + +#include <ui/label.h> +#include <ui/theme.h> +#include <ui/ui.h> + +/* https://freesound.org/people/VABsounds/sounds/423658 */ +#include <assets/musics/vabsounds-romance.h> +#include <assets/sounds/fire.h> + +#define W 1280 +#define H 720 + +static struct music music; +static struct sound sound; + +static struct label label_music = { + .text = "Music: <Space> play, <f> fade in, <s> fade out, <p> pause, <r> resume, <q> stop, <l> loop.", + .x = 10, + .y = 10, + .flags = LABEL_FLAGS_SHADOW +}; + +static struct label label_sound = { + .text = "Sound: click anywhere to pop a sound.", + .x = 10, + .y = 30, + .flags = LABEL_FLAGS_SHADOW +}; + +static void +init(void) +{ + if (!core_init() || !ui_init()) + panic(); + if (!window_open("Example - Audio", W, H)) + panic(); + if (!music_openmem(&music, musics_vabsounds_romance, sizeof (musics_vabsounds_romance))) + panic(); + if (!sound_openmem(&sound, sounds_fire, sizeof (sounds_fire))) + panic(); +} + +static void +quit(void) +{ + window_finish(); + ui_finish(); + core_finish(); +} + +static void +run(void) +{ + struct clock clock = {0}; + + clock_start(&clock); + + for (;;) { + union event ev; + unsigned int elapsed = clock_elapsed(&clock); + + clock_start(&clock); + + while (event_poll(&ev)) { + switch (ev.type) { + case EVENT_CLICKDOWN: + if (!sound_play(&sound, -1, 0)) + panic(); + break; + case EVENT_KEYDOWN: + switch (ev.key.key) { + case KEY_f: + music_play(&music, 0, 500); + break; + case KEY_s: + music_stop(500); + break; + case KEY_p: + music_pause(); + break; + case KEY_r: + music_resume(); + break; + case KEY_q: + music_stop(0); + break; + case KEY_l: + music_play(&music, MUSIC_LOOP, 0); + break; + case KEY_SPACE: + music_play(&music, 0, 0); + break; + default: + break; + } + break; + case EVENT_QUIT: + return; + default: + break; + } + } + + painter_set_color(0x006554ff); + painter_clear(); + label_draw(&label_music); + label_draw(&label_sound); + painter_present(); + + if ((elapsed = clock_elapsed(&clock)) < 20) + delay(20 - elapsed); + } + + music_finish(&music); + sound_finish(&sound); +} + +int +main(int argc, char **argv) +{ + (void)argc; + (void)argv; + + init(); + run(); + quit(); +}