annotate libcore/core/sound.c @ 220:617fda414bbb

js: remove Javascript API for now While convenient, I have been recommended that a scripting language would be a performance and debug disaster.
author David Demelier <markand@malikania.fr>
date Wed, 18 Nov 2020 15:07:43 +0100
parents d3ef968745f5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 *
68ce8e02061a sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
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
68ce8e02061a sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 bool
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
68ce8e02061a sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 return true;
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
68ce8e02061a sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 bool
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)) ||
203
d3ef968745f5 core: rework audio API
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
48 !(snd->handle = Mix_LoadWAV_RW(ops, true)))
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
68ce8e02061a sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 return true;
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
68ce8e02061a sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 bool
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
d3ef968745f5 core: rework audio API
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
60 bool
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
103
68ce8e02061a sound: add basic sound API
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 return true;
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 }