infra: Clean up project setup
[jog] / au.h
CommitLineData
e9060e7e 1/* -*-c-*-
2 *
af666e6f 3 * $Id: au.h,v 1.2 2002/02/02 22:43:50 mdw Exp $
e9060e7e 4 *
5 * Audio handling
6 *
7 * (c) 2002 Mark Wooding
8 */
9
10/*----- Licensing notice --------------------------------------------------*
11 *
12 * This file is part of Jog: Programming for a jogging machine.
13 *
14 * Jog is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * Jog is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with Jog; if not, write to the Free Software Foundation,
26 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 */
28
e9060e7e 29#ifndef AU_H
30#define AU_H
31
32#ifdef __cplusplus
33 extern "C" {
34#endif
35
36/*----- Header files ------------------------------------------------------*/
37
38#include <stddef.h>
39
40#include <mLib/bits.h>
41#include <mLib/sym.h>
42
43/*----- Data structures ---------------------------------------------------*/
44
45/* --- An audio sample --- *
46 *
47 * We maintain a cache of sample data, keyed by textual tags. An entry in
48 * the cache may indicate one of three states:
49 *
50 * * a tag for a sample which doesn't exist (negative answer);
51 *
52 * * a sample whose data is currently resident; or
53 *
54 * * sample with nonresident data.
55 *
56 * A negative answer is indicated by the @AUF_NOMATCH@ flag. If an entry has
57 * resident data, the @a@ pointer is non-null.
58 */
59
60typedef struct au_sample {
61 sym_base s; /* Base structure for name lookup */
62 unsigned f; /* Flags for this entry */
63 struct au_data *a; /* Sample data, if present */
64} au_sample;
65
66#define AUF_NOMATCH 1u /* Cached non-match for this tag */
67
68/* --- Audio data --- *
69 *
70 * The actual sample data, in an internal representation chosen by the
71 * system-specific layer.
72 *
73 * The sample data can be in one of two states: in-use or spare. Sample data
74 * is considered to be in-use if the @ref@ field is nonzero. Spare sample
75 * data is left in-memory for efficiency's sake, but will be discarded
76 * (least-recently-used first) when the total size of sample data (as
77 * measured by the @sz@ fields) exceeds @AU_CACHEMAX@.
78 */
79
80typedef struct au_data {
81 struct au_data *next, *prev; /* Other samples in this list */
82 unsigned ref; /* Reference count for sample data */
83 struct au_sample *s; /* Parent sample node */
84 octet *p; /* Pointer to sample file data */
85 size_t sz; /* Size of sample file data */
86} au_data;
87
af666e6f 88/* --- Audio cache information --- */
89
90typedef struct au_cacheinfo {
91 size_t sz_max; /* Maximum allowed cache size */
92 size_t sz_total; /* Total size used by samples */
93 size_t sz_spare; /* Size used by `spare' samples */
94 size_t sz_queue; /* Size used by queued samples */
95 unsigned n_total; /* Total number of cached samples */
96 unsigned n_spare; /* Number of `spare' samples */
97 unsigned n_queue; /* Number of queued samples */
98 unsigned long hits; /* Number of cache hits */
99 unsigned long misses; /* Number of cache misses */
100} au_cacheinfo;
101
102#define AU_CACHEMAX 0x01000000 /* Default cache maximum size */
e9060e7e 103
104/*----- Functions provided ------------------------------------------------*/
105
106/* --- @au_init@ --- *
107 *
108 * Arguments: @const char *dir@ = samples directory, or null
109 * @size_t max@ = maximum cache size
110 *
111 * Returns: ---
112 *
113 * Use: Initializes the audio subsystem.
114 */
115
116extern void au_init(const char */*dir*/, size_t /*max*/);
117
118/* --- @au_shutdown@ --- *
119 *
120 * Arguments: ---
121 *
122 * Returns: ---
123 *
124 * Use: Shuts down the audio subsystem.
125 */
126
127extern void au_shutdown(void);
128
af666e6f 129/* --- @au_getcacheinfo@ --- *
130 *
131 * Arguments: @au_cacheinfo *c@ = where to put the information
132 *
133 * Returns: ---
134 *
135 * Use: Extracts audio cache information.
136 */
137
138extern void au_getcacheinfo(au_cacheinfo */*c*/);
139
140/* --- @au_setcachelimit@ --- *
141 *
142 * Arguments: @size_t max@ = new cache limit
143 *
144 * Returns: ---
145 *
146 * Use: Reconfigures the maximum cache size. This probably isn't
147 * very useful, but it was easy...
148 */
149
150extern void au_setcachelimit(size_t /*max*/);
151
e9060e7e 152/* --- @au_find@ --- *
153 *
154 * Arguments: @const char *tag@ = sample tag string
155 *
156 * Returns: A pointer to the sample corresponding to the tag, or null if
157 * the sample wasn't found.
158 *
159 * Use: Looks up a sample by its name.
160 */
161
162extern au_sample *au_find(const char */*tag*/);
163
164/* --- @au_fetch@ --- *
165 *
166 * Arguments: @au_sample *s@ = sample pointer
167 *
168 * Returns: A pointer to the audio data for the sample.
169 *
170 * Use: Fetches a sample, and decodes it, if necessary. The decoded
171 * sample data is left with an outstanding reference to it, so
172 * it won't be freed. This is used internally by @au_queue@,
173 * before passing the fetched sample data to the system-specific
174 * layer for playback. It can also be used to lock sample data
175 * in memory (e.g., for the `abort' error message), or (by
176 * freeing it immediately afterwards) to prefetch a sample which
177 * will be used soon, to reduce the latency before the sample is
178 * heard.
179 */
180
181extern au_data *au_fetch(au_sample */*s*/);
182
183/* --- @au_queue@ --- *
184 *
185 * Arguments: @au_sample *s@ = sample pointer
186 *
187 * Returns: Zero on success, nonzero on failure.
188 *
189 * Use: Queues a sample to be played.
190 */
191
192extern int au_queue(au_sample */*s*/);
193
194/* --- @au_free@, @au_free_unlocked@ --- *
195 *
196 * Arguments: @au_data *a@ = pointer to audio data block
197 *
198 * Returns: ---
199 *
200 * Use: Frees a sample data block when it's no longer required.
201 */
202
203extern void au_free(au_data */*a*/);
204extern void au_free_unlocked(au_data */*a*/);
205
206/* --- @au_play@, @au_tryplay@ --- *
207 *
208 * Arguments: @const char *tag@ = sample tag string
209 *
210 * Returns: Zero on success, nonzero on failure.
211 *
212 * Use: Convenience functions for queueing samples by tag.
213 * If @au_tryplay@ cannot find the requested sample, it returns
214 * a zero value; if @au_play@ cannot find the sample, it aborts
215 * the program.
216 */
217
218extern int au_play(const char */*tag*/);
219extern int au_tryplay(const char */*tag*/);
220
221/*----- That's all, folks -------------------------------------------------*/
222
223#ifdef __cplusplus
224 }
225#endif
226
227#endif