Mercurial > molko
annotate src/libmlk-core/core/sound.c @ 320:8f9937403749
misc: improve loading of data
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 01 Oct 2021 20:30:00 +0200 |
parents | libmlk-core/core/sound.c@d01e83210ca2 |
children | 9eb25198d706 |
rev | line source |
---|---|
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * sound.c -- sound support |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
314 | 4 * Copyright (c) 2020-2021 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 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <stdio.h> |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <SDL_mixer.h> |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
169
eb0a7ab71023
misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents:
121
diff
changeset
|
24 #include "error.h" |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #include "sound.h" |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
27 int |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 sound_open(struct sound *snd, const char *path) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 { |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 assert(snd); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 assert(path); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
33 if (!(snd->handle = Mix_LoadWAV(path))) |
169
eb0a7ab71023
misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents:
121
diff
changeset
|
34 return errorf("%s", SDL_GetError()); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
36 return 0; |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
39 int |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 sound_openmem(struct sound *snd, const void *buffer, size_t buffersz) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 { |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 assert(snd); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 assert(buffer); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 SDL_RWops *ops; |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 if (!(ops = SDL_RWFromConstMem(buffer, buffersz)) || |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
48 !(snd->handle = Mix_LoadWAV_RW(ops, 1))) |
169
eb0a7ab71023
misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents:
121
diff
changeset
|
49 return errorf("%s", SDL_GetError()); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
51 return 0; |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
54 int |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
55 sound_ok(const struct sound *snd) |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 { |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
57 return snd && snd->handle; |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
58 } |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
59 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
60 int |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
61 sound_play(struct sound *snd, int channel, unsigned int fadein) |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
62 { |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
63 assert(sound_ok(snd)); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
65 int ret; |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
67 if (fadein > 0) |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
68 ret = Mix_FadeInChannel(channel, snd->handle, 0, fadein); |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
69 else |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
70 ret = Mix_PlayChannel(channel, snd->handle, 0); |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
71 |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
72 if (ret < 0) |
169
eb0a7ab71023
misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents:
121
diff
changeset
|
73 return errorf("%s", SDL_GetError()); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
75 snd->channel = channel; |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
76 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
77 return 0; |
103
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 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 void |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 sound_pause(struct sound *snd) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 { |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
83 Mix_Pause(snd ? snd->channel : -1); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 void |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 sound_resume(struct sound *snd) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 { |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
89 Mix_Resume(snd ? snd->channel : -1); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 void |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
93 sound_stop(struct sound *snd, unsigned int fadeout) |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 { |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
95 if (fadeout > 0) |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
96 Mix_FadeOutChannel(snd ? snd->channel : -1, fadeout); |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
97 else |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
98 Mix_HaltChannel(snd ? snd->channel : -1); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 void |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 sound_finish(struct sound *snd) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 { |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 assert(snd); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 if (snd->handle) { |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
107 Mix_HaltChannel(snd->channel); |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
108 Mix_FreeChunk(snd->handle); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 memset(snd, 0, sizeof (*snd)); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 } |