iv.vfs: don't turn "w+" mode to "r+" mode, lol
[iv.d.git] / alsa.d
blobe43b1c5d7418c57caf95341da028470debf40316
1 /* Invisible Vector Library
2 * coded by Ketmar // Invisible Vector <ketmar@ketmar.no-ip.org>
3 * Understanding is not required. Only obedience.
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 module iv.alsa /*is aliced*/;
19 pragma(lib, "asound");
21 import iv.alice;
22 import core.stdc.config;
23 import core.sys.posix.poll;
25 extern(C):
26 nothrow @trusted: @nogc:
27 const(char)* snd_strerror (int errnum);
30 #ifdef __GLIBC__
31 #if !defined(_POSIX_C_SOURCE) && !defined(_POSIX_SOURCE)
32 struct timeval {
33 time_t tv_sec; /* seconds */
34 long tv_usec; /* microseconds */
37 struct timespec {
38 time_t tv_sec; /* seconds */
39 long tv_nsec; /* nanoseconds */
41 #endif
42 #endif
44 /** Timestamp */
45 typedef struct timeval snd_timestamp_t;
46 /** Hi-res timestamp */
47 typedef struct timespec snd_htimestamp_t;
50 // pcm
51 alias snd_pcm_stream_t = int;
52 enum : int {
53 SND_PCM_STREAM_PLAYBACK,
54 SND_PCM_STREAM_CAPTURE,
57 /** Unsigned frames quantity */
58 alias snd_pcm_uframes_t = c_ulong;
59 /** Signed frames quantity */
60 alias snd_pcm_sframes_t = c_long;
63 /** PCM type */
64 alias snd_pcm_type_t = int;
65 enum : int {
66 /** Kernel level PCM */
67 SND_PCM_TYPE_HW = 0,
68 /** Hooked PCM */
69 SND_PCM_TYPE_HOOKS,
70 /** One or more linked PCM with exclusive access to selected
71 channels */
72 SND_PCM_TYPE_MULTI,
73 /** File writing plugin */
74 SND_PCM_TYPE_FILE,
75 /** Null endpoint PCM */
76 SND_PCM_TYPE_NULL,
77 /** Shared memory client PCM */
78 SND_PCM_TYPE_SHM,
79 /** INET client PCM (not yet implemented) */
80 SND_PCM_TYPE_INET,
81 /** Copying plugin */
82 SND_PCM_TYPE_COPY,
83 /** Linear format conversion PCM */
84 SND_PCM_TYPE_LINEAR,
85 /** A-Law format conversion PCM */
86 SND_PCM_TYPE_ALAW,
87 /** Mu-Law format conversion PCM */
88 SND_PCM_TYPE_MULAW,
89 /** IMA-ADPCM format conversion PCM */
90 SND_PCM_TYPE_ADPCM,
91 /** Rate conversion PCM */
92 SND_PCM_TYPE_RATE,
93 /** Attenuated static route PCM */
94 SND_PCM_TYPE_ROUTE,
95 /** Format adjusted PCM */
96 SND_PCM_TYPE_PLUG,
97 /** Sharing PCM */
98 SND_PCM_TYPE_SHARE,
99 /** Meter plugin */
100 SND_PCM_TYPE_METER,
101 /** Mixing PCM */
102 SND_PCM_TYPE_MIX,
103 /** Attenuated dynamic route PCM (not yet implemented) */
104 SND_PCM_TYPE_DROUTE,
105 /** Loopback server plugin (not yet implemented) */
106 SND_PCM_TYPE_LBSERVER,
107 /** Linear Integer <-> Linear Float format conversion PCM */
108 SND_PCM_TYPE_LINEAR_FLOAT,
109 /** LADSPA integration plugin */
110 SND_PCM_TYPE_LADSPA,
111 /** Direct Mixing plugin */
112 SND_PCM_TYPE_DMIX,
113 /** Jack Audio Connection Kit plugin */
114 SND_PCM_TYPE_JACK,
115 /** Direct Snooping plugin */
116 SND_PCM_TYPE_DSNOOP,
117 /** Direct Sharing plugin */
118 SND_PCM_TYPE_DSHARE,
119 /** IEC958 subframe plugin */
120 SND_PCM_TYPE_IEC958,
121 /** Soft volume plugin */
122 SND_PCM_TYPE_SOFTVOL,
123 /** External I/O plugin */
124 SND_PCM_TYPE_IOPLUG,
125 /** External filter plugin */
126 SND_PCM_TYPE_EXTPLUG,
127 /** Mmap-emulation plugin */
128 SND_PCM_TYPE_MMAP_EMUL,
129 SND_PCM_TYPE_LAST = SND_PCM_TYPE_MMAP_EMUL,
133 enum {
134 /** Non blocking mode (flag for open mode) \hideinitializer */
135 SND_PCM_NONBLOCK = 0x00000001,
136 /** Async notification (flag for open mode) \hideinitializer */
137 SND_PCM_ASYNC = 0x00000002,
138 /** In an abort state (internal, not allowed for open) */
139 SND_PCM_ABORT = 0x00008000,
140 /** Disable automatic (but not forced!) rate resamplinig */
141 SND_PCM_NO_AUTO_RESAMPLE = 0x00010000,
142 /** Disable automatic (but not forced!) channel conversion */
143 SND_PCM_NO_AUTO_CHANNELS = 0x00020000,
144 /** Disable automatic (but not forced!) format conversion */
145 SND_PCM_NO_AUTO_FORMAT = 0x00040000,
146 /** Disable soft volume control */
147 SND_PCM_NO_SOFTVOL = 0x00080000,
150 alias snd_pcm_access_t = int;
151 enum : int {
152 /** mmap access with simple interleaved channels */
153 SND_PCM_ACCESS_MMAP_INTERLEAVED = 0,
154 /** mmap access with simple non interleaved channels */
155 SND_PCM_ACCESS_MMAP_NONINTERLEAVED,
156 /** mmap access with complex placement */
157 SND_PCM_ACCESS_MMAP_COMPLEX,
158 /** snd_pcm_readi/snd_pcm_writei access */
159 SND_PCM_ACCESS_RW_INTERLEAVED,
160 /** snd_pcm_readn/snd_pcm_writen access */
161 SND_PCM_ACCESS_RW_NONINTERLEAVED,
162 SND_PCM_ACCESS_LAST = SND_PCM_ACCESS_RW_NONINTERLEAVED,
165 alias snd_pcm_format = int;
166 enum : int {
167 /** Unknown */
168 SND_PCM_FORMAT_UNKNOWN = -1,
169 /** Signed 8 bit */
170 SND_PCM_FORMAT_S8 = 0,
171 /** Unsigned 8 bit */
172 SND_PCM_FORMAT_U8,
173 /** Signed 16 bit Little Endian */
174 SND_PCM_FORMAT_S16_LE,
175 /** Signed 16 bit Big Endian */
176 SND_PCM_FORMAT_S16_BE,
177 /** Unsigned 16 bit Little Endian */
178 SND_PCM_FORMAT_U16_LE,
179 /** Unsigned 16 bit Big Endian */
180 SND_PCM_FORMAT_U16_BE,
181 /** Signed 24 bit Little Endian using low three bytes in 32-bit word */
182 SND_PCM_FORMAT_S24_LE,
183 /** Signed 24 bit Big Endian using low three bytes in 32-bit word */
184 SND_PCM_FORMAT_S24_BE,
185 /** Unsigned 24 bit Little Endian using low three bytes in 32-bit word */
186 SND_PCM_FORMAT_U24_LE,
187 /** Unsigned 24 bit Big Endian using low three bytes in 32-bit word */
188 SND_PCM_FORMAT_U24_BE,
189 /** Signed 32 bit Little Endian */
190 SND_PCM_FORMAT_S32_LE,
191 /** Signed 32 bit Big Endian */
192 SND_PCM_FORMAT_S32_BE,
193 /** Unsigned 32 bit Little Endian */
194 SND_PCM_FORMAT_U32_LE,
195 /** Unsigned 32 bit Big Endian */
196 SND_PCM_FORMAT_U32_BE,
197 /** Float 32 bit Little Endian, Range -1.0 to 1.0 */
198 SND_PCM_FORMAT_FLOAT_LE,
199 /** Float 32 bit Big Endian, Range -1.0 to 1.0 */
200 SND_PCM_FORMAT_FLOAT_BE,
201 /** Float 64 bit Little Endian, Range -1.0 to 1.0 */
202 SND_PCM_FORMAT_FLOAT64_LE,
203 /** Float 64 bit Big Endian, Range -1.0 to 1.0 */
204 SND_PCM_FORMAT_FLOAT64_BE,
205 /** IEC-958 Little Endian */
206 SND_PCM_FORMAT_IEC958_SUBFRAME_LE,
207 /** IEC-958 Big Endian */
208 SND_PCM_FORMAT_IEC958_SUBFRAME_BE,
209 /** Mu-Law */
210 SND_PCM_FORMAT_MU_LAW,
211 /** A-Law */
212 SND_PCM_FORMAT_A_LAW,
213 /** Ima-ADPCM */
214 SND_PCM_FORMAT_IMA_ADPCM,
215 /** MPEG */
216 SND_PCM_FORMAT_MPEG,
217 /** GSM */
218 SND_PCM_FORMAT_GSM,
219 /** Special */
220 SND_PCM_FORMAT_SPECIAL = 31,
221 /** Signed 24bit Little Endian in 3bytes format */
222 SND_PCM_FORMAT_S24_3LE = 32,
223 /** Signed 24bit Big Endian in 3bytes format */
224 SND_PCM_FORMAT_S24_3BE,
225 /** Unsigned 24bit Little Endian in 3bytes format */
226 SND_PCM_FORMAT_U24_3LE,
227 /** Unsigned 24bit Big Endian in 3bytes format */
228 SND_PCM_FORMAT_U24_3BE,
229 /** Signed 20bit Little Endian in 3bytes format */
230 SND_PCM_FORMAT_S20_3LE,
231 /** Signed 20bit Big Endian in 3bytes format */
232 SND_PCM_FORMAT_S20_3BE,
233 /** Unsigned 20bit Little Endian in 3bytes format */
234 SND_PCM_FORMAT_U20_3LE,
235 /** Unsigned 20bit Big Endian in 3bytes format */
236 SND_PCM_FORMAT_U20_3BE,
237 /** Signed 18bit Little Endian in 3bytes format */
238 SND_PCM_FORMAT_S18_3LE,
239 /** Signed 18bit Big Endian in 3bytes format */
240 SND_PCM_FORMAT_S18_3BE,
241 /** Unsigned 18bit Little Endian in 3bytes format */
242 SND_PCM_FORMAT_U18_3LE,
243 /** Unsigned 18bit Big Endian in 3bytes format */
244 SND_PCM_FORMAT_U18_3BE,
245 /* G.723 (ADPCM) 24 kbit/s, 8 samples in 3 bytes */
246 SND_PCM_FORMAT_G723_24,
247 /* G.723 (ADPCM) 24 kbit/s, 1 sample in 1 byte */
248 SND_PCM_FORMAT_G723_24_1B,
249 /* G.723 (ADPCM) 40 kbit/s, 8 samples in 3 bytes */
250 SND_PCM_FORMAT_G723_40,
251 /* G.723 (ADPCM) 40 kbit/s, 1 sample in 1 byte */
252 SND_PCM_FORMAT_G723_40_1B,
253 /* Direct Stream Digital (DSD) in 1-byte samples (x8) */
254 SND_PCM_FORMAT_DSD_U8,
255 /* Direct Stream Digital (DSD) in 2-byte samples (x16) */
256 SND_PCM_FORMAT_DSD_U16_LE,
257 SND_PCM_FORMAT_LAST = SND_PCM_FORMAT_DSD_U16_LE,
259 // I snipped a bunch of endian-specific ones!
262 /** PCM state */
263 alias snd_pcm_state_t = int;
264 enum : int {
265 /** Open */
266 SND_PCM_STATE_OPEN = 0,
267 /** Setup installed */
268 SND_PCM_STATE_SETUP,
269 /** Ready to start */
270 SND_PCM_STATE_PREPARED,
271 /** Running */
272 SND_PCM_STATE_RUNNING,
273 /** Stopped: underrun (playback) or overrun (capture) detected */
274 SND_PCM_STATE_XRUN,
275 /** Draining: running (playback) or stopped (capture) */
276 SND_PCM_STATE_DRAINING,
277 /** Paused */
278 SND_PCM_STATE_PAUSED,
279 /** Hardware is suspended */
280 SND_PCM_STATE_SUSPENDED,
281 /** Hardware is disconnected */
282 SND_PCM_STATE_DISCONNECTED,
283 SND_PCM_STATE_LAST = SND_PCM_STATE_DISCONNECTED,
286 struct snd_pcm_t {}
287 struct snd_pcm_hw_params_t {}
288 struct snd_pcm_sw_params_t {}
290 int snd_pcm_open (snd_pcm_t** pcm, const(char)* name, snd_pcm_stream_t stream, int mode);
291 int snd_pcm_close (snd_pcm_t* pcm);
292 const(char)* snd_pcm_name (snd_pcm_t* pcm);
293 snd_pcm_type_t snd_pcm_type (snd_pcm_t* pcm);
294 snd_pcm_stream_t snd_pcm_stream (snd_pcm_t* pcm);
296 int snd_pcm_poll_descriptors_count (snd_pcm_t* pcm);
297 int snd_pcm_poll_descriptors (snd_pcm_t* pcm, pollfd* pfds, uint space);
298 int snd_pcm_poll_descriptors_revents (snd_pcm_t* pcm, pollfd* pfds, uint nfds, ushort* revents);
299 int snd_pcm_nonblock (snd_pcm_t* pcm, int nonblock);
300 int snd_pcm_abort (snd_pcm_t* pcm) { return snd_pcm_nonblock(pcm, 2); }
302 int snd_pcm_prepare (snd_pcm_t* pcm);
303 int snd_pcm_reset (snd_pcm_t* pcm);
304 //int snd_pcm_status (snd_pcm_t* pcm, snd_pcm_status_t *status);
305 int snd_pcm_start (snd_pcm_t* pcm);
306 int snd_pcm_drop (snd_pcm_t* pcm);
307 int snd_pcm_drain (snd_pcm_t* pcm);
308 int snd_pcm_pause (snd_pcm_t* pcm, int enable);
309 snd_pcm_state_t snd_pcm_state (snd_pcm_t* pcm);
310 int snd_pcm_hwsync (snd_pcm_t* pcm);
311 int snd_pcm_delay (snd_pcm_t* pcm, snd_pcm_sframes_t *delayp);
312 int snd_pcm_resume (snd_pcm_t* pcm);
313 int snd_pcm_recover (snd_pcm_t* pcm, int err, int silent);
314 //int snd_pcm_htimestamp (snd_pcm_t* pcm, snd_pcm_uframes_t* avail, snd_htimestamp_t* tstamp);
315 snd_pcm_sframes_t snd_pcm_avail (snd_pcm_t* pcm);
316 snd_pcm_sframes_t snd_pcm_avail_update (snd_pcm_t* pcm);
317 int snd_pcm_avail_delay (snd_pcm_t* pcm, snd_pcm_sframes_t* availp, snd_pcm_sframes_t* delayp);
318 snd_pcm_sframes_t snd_pcm_rewindable (snd_pcm_t* pcm);
319 snd_pcm_sframes_t snd_pcm_rewind (snd_pcm_t* pcm, snd_pcm_uframes_t frames);
320 snd_pcm_sframes_t snd_pcm_forwardable (snd_pcm_t* pcm);
321 snd_pcm_sframes_t snd_pcm_forward (snd_pcm_t* pcm, snd_pcm_uframes_t frames);
322 snd_pcm_sframes_t snd_pcm_writei (snd_pcm_t* pcm, const(void)* buffer, snd_pcm_uframes_t size);
323 snd_pcm_sframes_t snd_pcm_readi (snd_pcm_t* pcm, void* buffer, snd_pcm_uframes_t size);
324 snd_pcm_sframes_t snd_pcm_writen (snd_pcm_t* pcm, void** bufs, snd_pcm_uframes_t size);
325 snd_pcm_sframes_t snd_pcm_readn (snd_pcm_t* pcm, void** bufs, snd_pcm_uframes_t size);
326 int snd_pcm_wait (snd_pcm_t* pcm, int timeout);
328 int snd_pcm_hw_params_current (snd_pcm_t* pcm, snd_pcm_hw_params_t* params);
329 int snd_pcm_hw_params (snd_pcm_t* pcm, snd_pcm_hw_params_t* params);
330 int snd_pcm_hw_params_set_channels(snd_pcm_t*, snd_pcm_hw_params_t*, uint);
331 int snd_pcm_hw_params_malloc(snd_pcm_hw_params_t**);
332 void snd_pcm_hw_params_free(snd_pcm_hw_params_t*);
333 int snd_pcm_hw_params_any(snd_pcm_t*, snd_pcm_hw_params_t*);
334 int snd_pcm_hw_params_set_access(snd_pcm_t*, snd_pcm_hw_params_t*, snd_pcm_access_t);
335 int snd_pcm_hw_params_set_format(snd_pcm_t*, snd_pcm_hw_params_t*, snd_pcm_format);
336 int snd_pcm_hw_params_set_rate_near(snd_pcm_t*, snd_pcm_hw_params_t*, uint*, int*);
337 int snd_pcm_hw_params_set_rate (snd_pcm_t* pcm, snd_pcm_hw_params_t* params, uint val, int dir);
338 int snd_pcm_hw_params_set_buffer_size_near (snd_pcm_t* pcm, snd_pcm_hw_params_t* params, snd_pcm_uframes_t* val);
339 int snd_pcm_hw_params_set_buffer_size (snd_pcm_t* pcm, snd_pcm_hw_params_t* params, snd_pcm_uframes_t val);
341 int snd_pcm_hw_params_set_rate_resample (snd_pcm_t* pcm, snd_pcm_hw_params_t* params, uint val);
343 int snd_pcm_sw_params_malloc(snd_pcm_sw_params_t**);
344 void snd_pcm_sw_params_free(snd_pcm_sw_params_t*);
346 int snd_pcm_sw_params_current(snd_pcm_t *pcm, snd_pcm_sw_params_t *params);
347 int snd_pcm_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t *params);
348 int snd_pcm_sw_params_set_avail_min(snd_pcm_t*, snd_pcm_sw_params_t*, snd_pcm_uframes_t);
349 int snd_pcm_sw_params_set_start_threshold(snd_pcm_t*, snd_pcm_sw_params_t*, snd_pcm_uframes_t);
350 int snd_pcm_sw_params_set_stop_threshold(snd_pcm_t*, snd_pcm_sw_params_t*, snd_pcm_uframes_t);
352 //alias snd_pcm_sframes_t = c_long;
353 //alias snd_pcm_uframes_t = c_ulong;
354 //snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t*, const void*, snd_pcm_uframes_t size);
355 //snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t*, void*, snd_pcm_uframes_t size);
357 //int snd_pcm_wait(snd_pcm_t *pcm, int timeout);
358 //snd_pcm_sframes_t snd_pcm_avail(snd_pcm_t *pcm);
359 //snd_pcm_sframes_t snd_pcm_avail_update(snd_pcm_t *pcm);
361 // raw midi
365 struct snd_rawmidi_t {}
366 int snd_rawmidi_open(snd_rawmidi_t**, snd_rawmidi_t**, const char*, int);
367 int snd_rawmidi_close(snd_rawmidi_t*);
368 int snd_rawmidi_drain(snd_rawmidi_t*);
369 ssize snd_rawmidi_write(snd_rawmidi_t*, const void*, usize);
370 ssize snd_rawmidi_read(snd_rawmidi_t*, void*, usize);
373 // mixer
375 struct snd_mixer_t {}
376 struct snd_mixer_elem_t {}
377 struct snd_mixer_selem_id_t {}
379 alias snd_mixer_elem_callback_t = int function(snd_mixer_elem_t*, uint);
381 int snd_mixer_open(snd_mixer_t**, int mode);
382 int snd_mixer_close(snd_mixer_t*);
383 int snd_mixer_attach(snd_mixer_t*, const char*);
384 int snd_mixer_load(snd_mixer_t*);
386 // FIXME: those aren't actually void*
387 int snd_mixer_selem_register(snd_mixer_t*, void*, void*);
388 int snd_mixer_selem_id_malloc(snd_mixer_selem_id_t**);
389 void snd_mixer_selem_id_free(snd_mixer_selem_id_t*);
390 void snd_mixer_selem_id_set_index(snd_mixer_selem_id_t*, uint);
391 void snd_mixer_selem_id_set_name(snd_mixer_selem_id_t*, const char*);
392 snd_mixer_elem_t* snd_mixer_find_selem(snd_mixer_t*, in snd_mixer_selem_id_t*);
394 // FIXME: the int should be an enum for channel identifier
395 int snd_mixer_selem_get_playback_volume(snd_mixer_elem_t*, int, c_long*);
397 int snd_mixer_selem_get_playback_volume_range(snd_mixer_elem_t*, c_long*, c_long*);
399 int snd_mixer_selem_set_playback_volume_all(snd_mixer_elem_t*, c_long);
401 void snd_mixer_elem_set_callback(snd_mixer_elem_t*, snd_mixer_elem_callback_t);
402 int snd_mixer_poll_descriptors(snd_mixer_t*, pollfd*, uint space);
404 int snd_mixer_handle_events(snd_mixer_t*);
406 // FIXME: the first int should be an enum for channel identifier
407 int snd_mixer_selem_get_playback_switch(snd_mixer_elem_t*, int, int* value);
408 int snd_mixer_selem_set_playback_switch_all(snd_mixer_elem_t*, int);
411 int snd_pcm_set_params (snd_pcm_t *pcm, snd_pcm_format format, snd_pcm_access_t access, uint channels, uint rate, int soft_resample, uint latency);
412 int snd_pcm_get_params (snd_pcm_t *pcm, snd_pcm_uframes_t *buffer_size, snd_pcm_uframes_t *period_size);
414 int snd_pcm_hw_params_test_rate (snd_pcm_t* pcm, snd_pcm_hw_params_t* params, uint val, int dir);
415 int snd_pcm_hw_params_get_rate_min (const(snd_pcm_hw_params_t)* params, uint* val, int* dir);
416 int snd_pcm_hw_params_get_rate_max (const(snd_pcm_hw_params_t)* params, uint* val, int* dir);
418 alias snd_lib_error_handler_t = void function (const(char)* file, int line, const(char)* function_, int err, const(char)* fmt, ...);
419 int snd_lib_error_set_handler (snd_lib_error_handler_t handler);
421 private void alsa_message_fucker (const(char)* file, int line, const(char)* function_, int err, const(char)* fmt, ...) {}
423 void fuck_alsa_messages () {
424 snd_lib_error_set_handler(&alsa_message_fucker);