Mercurial > molko
annotate src/libmlk-core/core/sound.c @ 343:9eb25198d706
js: add sound bindings
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 16 Oct 2021 22:17:09 +0200 |
parents | 8f9937403749 |
children | 12367bfc2df6 |
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" |
343
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
26 #include "vfs.h" |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
27 #include "vfs_p.h" |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
29 int |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 sound_open(struct sound *snd, const char *path) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 { |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 assert(snd); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 assert(path); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
35 if (!(snd->handle = Mix_LoadWAV(path))) |
169
eb0a7ab71023
misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents:
121
diff
changeset
|
36 return errorf("%s", SDL_GetError()); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
38 return 0; |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
41 int |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 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
|
43 { |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 assert(snd); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 assert(buffer); |
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 SDL_RWops *ops; |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 if (!(ops = SDL_RWFromConstMem(buffer, buffersz)) || |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
50 !(snd->handle = Mix_LoadWAV_RW(ops, 1))) |
169
eb0a7ab71023
misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents:
121
diff
changeset
|
51 return errorf("%s", SDL_GetError()); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
53 return 0; |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
56 int |
343
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
57 sound_openvfs(struct sound *snd, struct vfs_file *file) |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
58 { |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
59 assert(snd); |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
60 assert(vfs_file_ok(file)); |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
61 |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
62 SDL_RWops *ops; |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
63 |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
64 if (!(ops = vfs_to_rw(file))) |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
65 return -1; |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
66 if (!(snd->handle = Mix_LoadWAV_RW(ops, 1))) |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
67 return errorf("%s", SDL_GetError()); |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
68 |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
69 return 0; |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
70 } |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
71 |
9eb25198d706
js: add sound bindings
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
72 int |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
73 sound_ok(const struct sound *snd) |
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 return snd && snd->handle; |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
76 } |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
77 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
78 int |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
79 sound_play(struct sound *snd, int channel, unsigned int fadein) |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
80 { |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
81 assert(sound_ok(snd)); |
103
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 int ret; |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
85 if (fadein > 0) |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
86 ret = Mix_FadeInChannel(channel, snd->handle, 0, fadein); |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
87 else |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
88 ret = Mix_PlayChannel(channel, snd->handle, 0); |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
89 |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
90 if (ret < 0) |
169
eb0a7ab71023
misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents:
121
diff
changeset
|
91 return errorf("%s", SDL_GetError()); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
93 snd->channel = channel; |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
94 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
95 return 0; |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 void |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 sound_pause(struct sound *snd) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 { |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
101 Mix_Pause(snd ? snd->channel : -1); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 } |
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 void |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 sound_resume(struct sound *snd) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 { |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
107 Mix_Resume(snd ? snd->channel : -1); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 } |
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 void |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
111 sound_stop(struct sound *snd, unsigned int fadeout) |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 { |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
113 if (fadeout > 0) |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
114 Mix_FadeOutChannel(snd ? snd->channel : -1, fadeout); |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
115 else |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
116 Mix_HaltChannel(snd ? snd->channel : -1); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 void |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 sound_finish(struct sound *snd) |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 { |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 assert(snd); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 if (snd->handle) { |
203
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
125 Mix_HaltChannel(snd->channel); |
d3ef968745f5
core: rework audio API
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
126 Mix_FreeChunk(snd->handle); |
103
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 } |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 memset(snd, 0, sizeof (*snd)); |
68ce8e02061a
sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 } |