Mercurial > molko
annotate examples/example-audio/main.c @ 406:107fc5c77df2
examples: fix ui
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 03 Apr 2022 08:05:30 +0200 |
parents | ae2dcf40c1eb |
children |
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 |
390
ae2dcf40c1eb
examples: fix with last game changes
David Demelier <markand@malikania.fr>
parents:
379
diff
changeset
|
41 static struct state *states[1]; |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
42 static struct music music; |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 static struct sound sound; |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
44 |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
45 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
|
46 .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
|
47 .x = 10, |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 .y = 10, |
145
7f1af54bb35a
core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents:
135
diff
changeset
|
49 .flags = LABEL_FLAGS_SHADOW |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 }; |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
52 static struct label label_sound = { |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
53 .text = "Sound: click anywhere to pop a sound.", |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
54 .x = 10, |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
55 .y = 30, |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
56 .flags = LABEL_FLAGS_SHADOW |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
57 }; |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
58 |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 static void |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 init(void) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 { |
366
19782ea1cf4a
misc: start rebranding
David Demelier <markand@malikania.fr>
parents:
364
diff
changeset
|
62 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
|
63 panic(); |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
263
diff
changeset
|
64 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
|
65 panic(); |
364
570ab19bf268
misc: start removing adventure from library
David Demelier <markand@malikania.fr>
parents:
325
diff
changeset
|
66 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
|
67 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
|
68 panic(); |
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 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 static void |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 quit(void) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 { |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 window_finish(); |
156
c3a40062acc2
misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
153
diff
changeset
|
75 ui_finish(); |
c3a40062acc2
misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
153
diff
changeset
|
76 core_finish(); |
103
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 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 static void |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
80 handle(struct state *st, const union event *ev) |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
81 { |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
82 (void)st; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
83 |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
84 switch (ev->type) { |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
85 case EVENT_CLICKDOWN: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
86 if (sound_play(&sound) < 0) |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
87 panic(); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
88 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
89 case EVENT_KEYDOWN: |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
90 switch (ev->key.key) { |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
91 case KEY_p: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
92 music_pause(&music); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
93 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
94 case KEY_r: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
95 music_resume(&music); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
96 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
97 case KEY_q: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
98 music_stop(&music); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
99 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
100 case KEY_l: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
101 music_play(&music, MUSIC_LOOP); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
102 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
103 case KEY_SPACE: |
379
67c1c46af2c8
core: replace SDL2_mixer with OpenAL, closes #2528 @3h
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
104 music_play(&music, 0); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
105 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
106 default: |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
107 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
108 } |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
109 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
110 case EVENT_QUIT: |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
111 game_quit(); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
112 break; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
113 default: |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
114 break; |
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 |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
118 static void |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
119 draw(struct state *st) |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
120 { |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
121 (void)st; |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
122 |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
123 painter_set_color(0x006554ff); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
124 painter_clear(); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
125 label_draw(&label_music); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
126 label_draw(&label_sound); |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
127 painter_present(); |
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 |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
130 static void |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 run(void) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 { |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
133 struct state state = { |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
134 .handle = handle, |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
135 .draw = draw |
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
136 }; |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 |
390
ae2dcf40c1eb
examples: fix with last game changes
David Demelier <markand@malikania.fr>
parents:
379
diff
changeset
|
138 game_init(states, UTIL_SIZE(states)); |
300
3638b39ef2bf
examples: fix with new game_push function
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
139 game_push(&state); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
140 game_loop(); |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
141 |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
142 music_finish(&music); |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
156
diff
changeset
|
143 sound_finish(&sound); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 int |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 main(int argc, char **argv) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 { |
135
eadfed7674ac
misc: fix all warnings
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
149 (void)argc; |
eadfed7674ac
misc: fix all warnings
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
150 (void)argv; |
eadfed7674ac
misc: fix all warnings
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
151 |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 init(); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 run(); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 quit(); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 } |