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");
22 import core
.stdc
.config
;
23 import core
.sys
.posix
.poll
;
26 nothrow @trusted: @nogc:
27 const(char)* snd_strerror (int errnum
);
31 #if !defined(_POSIX_C_SOURCE) && !defined(_POSIX_SOURCE)
33 time_t tv_sec; /* seconds */
34 long tv_usec; /* microseconds */
38 time_t tv_sec; /* seconds */
39 long tv_nsec; /* nanoseconds */
45 typedef struct timeval snd_timestamp_t;
46 /** Hi-res timestamp */
47 typedef struct timespec snd_htimestamp_t;
51 alias snd_pcm_stream_t
= 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
;
64 alias snd_pcm_type_t
= int;
66 /** Kernel level PCM */
70 /** One or more linked PCM with exclusive access to selected
73 /** File writing plugin */
75 /** Null endpoint PCM */
77 /** Shared memory client PCM */
79 /** INET client PCM (not yet implemented) */
83 /** Linear format conversion PCM */
85 /** A-Law format conversion PCM */
87 /** Mu-Law format conversion PCM */
89 /** IMA-ADPCM format conversion PCM */
91 /** Rate conversion PCM */
93 /** Attenuated static route PCM */
95 /** Format adjusted PCM */
103 /** Attenuated dynamic route PCM (not yet implemented) */
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 */
111 /** Direct Mixing plugin */
113 /** Jack Audio Connection Kit plugin */
115 /** Direct Snooping plugin */
117 /** Direct Sharing plugin */
119 /** IEC958 subframe plugin */
121 /** Soft volume plugin */
122 SND_PCM_TYPE_SOFTVOL
,
123 /** External I/O plugin */
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
,
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;
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;
168 SND_PCM_FORMAT_UNKNOWN
= -1,
170 SND_PCM_FORMAT_S8
= 0,
171 /** Unsigned 8 bit */
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
,
210 SND_PCM_FORMAT_MU_LAW
,
212 SND_PCM_FORMAT_A_LAW
,
214 SND_PCM_FORMAT_IMA_ADPCM
,
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!
263 alias snd_pcm_state_t
= int;
266 SND_PCM_STATE_OPEN
= 0,
267 /** Setup installed */
269 /** Ready to start */
270 SND_PCM_STATE_PREPARED
,
272 SND_PCM_STATE_RUNNING
,
273 /** Stopped: underrun (playback) or overrun (capture) detected */
275 /** Draining: running (playback) or stopped (capture) */
276 SND_PCM_STATE_DRAINING
,
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
,
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);
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);
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
);