Mercurial > molko
annotate examples/example-audio/main.c @ 379:67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 05 Jan 2022 12:45:17 +0100 |
parents | 460c78706989 |
children | ae2dcf40c1eb |
rev | line source |
---|---|
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
2 * example-audio.c -- show how to use sounds and music |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
378
460c78706989
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
366
diff
changeset
|
4 * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr> |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
156
c3a40062acc2
misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
153
diff
changeset
|
19 #include <core/core.h> |
125
d59efa737fcc
cmake: add examples and fix
David Demelier <markand@malikania.fr>
parents:
115
diff
changeset
|
20 #include <core/event.h> |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
21 #include <core/game.h> |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
22 #include <core/music.h> |
125
d59efa737fcc
cmake: add examples and fix
David Demelier <markand@malikania.fr>
parents:
115
diff
changeset
|
23 #include <core/painter.h> |
d59efa737fcc
cmake: add examples and fix
David Demelier <markand@malikania.fr>
parents:
115
diff
changeset
|
24 #include <core/panic.h> |
d59efa737fcc
cmake: add examples and fix
David Demelier <markand@malikania.fr>
parents:
115
diff
changeset
|
25 #include <core/sound.h> |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
26 #include <core/state.h> |
125
d59efa737fcc
cmake: add examples and fix
David Demelier <markand@malikania.fr>
parents:
115
diff
changeset
|
27 #include <core/sys.h> |
d59efa737fcc
cmake: add examples and fix
David Demelier <markand@malikania.fr>
parents:
115
diff
changeset
|
28 #include <core/util.h> |
d59efa737fcc
cmake: add examples and fix
David Demelier <markand@malikania.fr>
parents:
115
diff
changeset
|
29 #include <core/window.h> |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 |
148
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
145
diff
changeset
|
31 #include <ui/label.h> |
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
145
diff
changeset
|
32 #include <ui/theme.h> |
156
c3a40062acc2
misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
153
diff
changeset
|
33 #include <ui/ui.h> |
148
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
145
diff
changeset
|
34 |
364
570ab19bf268
misc: start removing adventure from library
David Demelier <markand@malikania.fr>
parents:
325
diff
changeset
|
35 #include <assets/music/vabsounds-romance.h> |
570ab19bf268
misc: start removing adventure from library
David Demelier <markand@malikania.fr>
parents:
325
diff
changeset
|
36 #include <assets/sounds/fire.h> |
570ab19bf268
misc: start removing adventure from library
David Demelier <markand@malikania.fr>
parents:
325
diff
changeset
|
37 |
263
cd5bdb995052
cmake: create a new libmlk-data library
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
38 #define W 1280 |
cd5bdb995052
cmake: create a new libmlk-data library
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
39 #define H 720 |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
41 static struct music music; |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 static struct sound sound; |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
43 |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
44 static struct label label_music = { |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
45 .text = "Music: <Space> play, <p> pause, <r> resume, <q> stop, <l> loop.", |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 .x = 10, |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 .y = 10, |
145
7f1af54bb35a
core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents:
135
diff
changeset
|
48 .flags = LABEL_FLAGS_SHADOW |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 }; |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
51 static struct label label_sound = { |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
52 .text = "Sound: click anywhere to pop a sound.", |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
53 .x = 10, |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
54 .y = 30, |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
55 .flags = LABEL_FLAGS_SHADOW |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
56 }; |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
57 |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 static void |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 init(void) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 { |
366
19782ea1cf4a
misc: start rebranding
David Demelier <markand@malikania.fr>
parents:
364
diff
changeset
|
61 if (core_init("fr.malikania", "example-audio") < 0 || ui_init() < 0) |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 panic(); |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
263
diff
changeset
|
63 if (window_open("Example - Audio", W, H) < 0) |
156
c3a40062acc2
misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
153
diff
changeset
|
64 panic(); |
364
570ab19bf268
misc: start removing adventure from library
David Demelier <markand@malikania.fr>
parents:
325
diff
changeset
|
65 if (music_openmem(&music, assets_music_vabsounds_romance, sizeof (assets_music_vabsounds_romance)) < 0 || |
570ab19bf268
misc: start removing adventure from library
David Demelier <markand@malikania.fr>
parents:
325
diff
changeset
|
66 sound_openmem(&sound, assets_sounds_fire, sizeof (assets_sounds_fire)) < 0) |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 panic(); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 static void |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 quit(void) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 { |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 window_finish(); |
156
c3a40062acc2
misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
153
diff
changeset
|
74 ui_finish(); |
c3a40062acc2
misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
153
diff
changeset
|
75 core_finish(); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 static void |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
79 handle(struct state *st, const union event *ev) |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
80 { |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
81 (void)st; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
82 |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
83 switch (ev->type) { |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
84 case EVENT_CLICKDOWN: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
85 if (sound_play(&sound) < 0) |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
86 panic(); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
87 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
88 case EVENT_KEYDOWN: |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
89 switch (ev->key.key) { |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
90 case KEY_p: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
91 music_pause(&music); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
92 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
93 case KEY_r: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
94 music_resume(&music); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
95 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
96 case KEY_q: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
97 music_stop(&music); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
98 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
99 case KEY_l: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
100 music_play(&music, MUSIC_LOOP); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
101 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
102 case KEY_SPACE: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
103 music_play(&music, 0); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
104 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
105 default: |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
106 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
107 } |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
108 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
109 case EVENT_QUIT: |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
110 game_quit(); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
111 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
112 default: |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
113 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
114 } |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
115 } |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
116 |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
117 static void |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
118 draw(struct state *st) |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
119 { |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
120 (void)st; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
121 |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
122 painter_set_color(0x006554ff); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
123 painter_clear(); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
124 label_draw(&label_music); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
125 label_draw(&label_sound); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
126 painter_present(); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
127 } |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
128 |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
129 static void |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 run(void) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 { |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
132 struct state state = { |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
133 .handle = handle, |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
134 .draw = draw |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
135 }; |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 |
300
3638b39ef2bf
examples: fix with new game_push function
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
137 game_push(&state); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
138 game_loop(); |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
139 |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
140 music_finish(&music); |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
141 sound_finish(&sound); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 int |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 main(int argc, char **argv) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 { |
135
eadfed7674ac
misc: fix all warnings
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
147 (void)argc; |
eadfed7674ac
misc: fix all warnings
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
148 (void)argv; |
eadfed7674ac
misc: fix all warnings
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
149 |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 init(); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 run(); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 quit(); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 } |