Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/linuxbsd_headers/alsa/mixer.h
9898 views
1
/**
2
* \file include/mixer.h
3
* \brief Application interface library for the ALSA driver
4
* \author Jaroslav Kysela <[email protected]>
5
* \author Abramo Bagnara <[email protected]>
6
* \author Takashi Iwai <[email protected]>
7
* \date 1998-2001
8
*
9
* Application interface library for the ALSA driver
10
*/
11
/*
12
* This library is free software; you can redistribute it and/or modify
13
* it under the terms of the GNU Lesser General Public License as
14
* published by the Free Software Foundation; either version 2.1 of
15
* the License, or (at your option) any later version.
16
*
17
* This program is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
* GNU Lesser General Public License for more details.
21
*
22
* You should have received a copy of the GNU Lesser General Public
23
* License along with this library; if not, write to the Free Software
24
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25
*
26
*/
27
28
#ifndef __ALSA_MIXER_H
29
#define __ALSA_MIXER_H
30
31
#ifdef __cplusplus
32
extern "C" {
33
#endif
34
35
/**
36
* \defgroup Mixer Mixer Interface
37
* The mixer interface.
38
* \{
39
*/
40
41
/** Mixer handle */
42
typedef struct _snd_mixer snd_mixer_t;
43
/** Mixer elements class handle */
44
typedef struct _snd_mixer_class snd_mixer_class_t;
45
/** Mixer element handle */
46
typedef struct _snd_mixer_elem snd_mixer_elem_t;
47
48
/**
49
* \brief Mixer callback function
50
* \param mixer Mixer handle
51
* \param mask event mask
52
* \param elem related mixer element (if any)
53
* \return 0 on success otherwise a negative error code
54
*/
55
typedef int (*snd_mixer_callback_t)(snd_mixer_t *ctl,
56
unsigned int mask,
57
snd_mixer_elem_t *elem);
58
59
/**
60
* \brief Mixer element callback function
61
* \param elem Mixer element
62
* \param mask event mask
63
* \return 0 on success otherwise a negative error code
64
*/
65
typedef int (*snd_mixer_elem_callback_t)(snd_mixer_elem_t *elem,
66
unsigned int mask);
67
68
/**
69
* \brief Compare function for sorting mixer elements
70
* \param e1 First element
71
* \param e2 Second element
72
* \return -1 if e1 < e2, 0 if e1 == e2, 1 if e1 > e2
73
*/
74
typedef int (*snd_mixer_compare_t)(const snd_mixer_elem_t *e1,
75
const snd_mixer_elem_t *e2);
76
77
/**
78
* \brief Event callback for the mixer class
79
* \param class_ Mixer class
80
* \param mask Event mask (SND_CTL_EVENT_*)
81
* \param helem HCTL element which invoked the event
82
* \param melem Mixer element associated to HCTL element
83
* \return zero if success, otherwise a negative error value
84
*/
85
typedef int (*snd_mixer_event_t)(snd_mixer_class_t *class_, unsigned int mask,
86
snd_hctl_elem_t *helem, snd_mixer_elem_t *melem);
87
88
89
/** Mixer element type */
90
typedef enum _snd_mixer_elem_type {
91
/* Simple mixer elements */
92
SND_MIXER_ELEM_SIMPLE,
93
SND_MIXER_ELEM_LAST = SND_MIXER_ELEM_SIMPLE
94
} snd_mixer_elem_type_t;
95
96
int snd_mixer_open(snd_mixer_t **mixer, int mode);
97
int snd_mixer_close(snd_mixer_t *mixer);
98
snd_mixer_elem_t *snd_mixer_first_elem(snd_mixer_t *mixer);
99
snd_mixer_elem_t *snd_mixer_last_elem(snd_mixer_t *mixer);
100
int snd_mixer_handle_events(snd_mixer_t *mixer);
101
int snd_mixer_attach(snd_mixer_t *mixer, const char *name);
102
int snd_mixer_attach_hctl(snd_mixer_t *mixer, snd_hctl_t *hctl);
103
int snd_mixer_detach(snd_mixer_t *mixer, const char *name);
104
int snd_mixer_detach_hctl(snd_mixer_t *mixer, snd_hctl_t *hctl);
105
int snd_mixer_get_hctl(snd_mixer_t *mixer, const char *name, snd_hctl_t **hctl);
106
int snd_mixer_poll_descriptors_count(snd_mixer_t *mixer);
107
int snd_mixer_poll_descriptors(snd_mixer_t *mixer, struct pollfd *pfds, unsigned int space);
108
int snd_mixer_poll_descriptors_revents(snd_mixer_t *mixer, struct pollfd *pfds, unsigned int nfds, unsigned short *revents);
109
int snd_mixer_load(snd_mixer_t *mixer);
110
void snd_mixer_free(snd_mixer_t *mixer);
111
int snd_mixer_wait(snd_mixer_t *mixer, int timeout);
112
int snd_mixer_set_compare(snd_mixer_t *mixer, snd_mixer_compare_t msort);
113
void snd_mixer_set_callback(snd_mixer_t *obj, snd_mixer_callback_t val);
114
void * snd_mixer_get_callback_private(const snd_mixer_t *obj);
115
void snd_mixer_set_callback_private(snd_mixer_t *obj, void * val);
116
unsigned int snd_mixer_get_count(const snd_mixer_t *obj);
117
int snd_mixer_class_unregister(snd_mixer_class_t *clss);
118
119
snd_mixer_elem_t *snd_mixer_elem_next(snd_mixer_elem_t *elem);
120
snd_mixer_elem_t *snd_mixer_elem_prev(snd_mixer_elem_t *elem);
121
void snd_mixer_elem_set_callback(snd_mixer_elem_t *obj, snd_mixer_elem_callback_t val);
122
void * snd_mixer_elem_get_callback_private(const snd_mixer_elem_t *obj);
123
void snd_mixer_elem_set_callback_private(snd_mixer_elem_t *obj, void * val);
124
snd_mixer_elem_type_t snd_mixer_elem_get_type(const snd_mixer_elem_t *obj);
125
126
int snd_mixer_class_register(snd_mixer_class_t *class_, snd_mixer_t *mixer);
127
int snd_mixer_elem_new(snd_mixer_elem_t **elem,
128
snd_mixer_elem_type_t type,
129
int compare_weight,
130
void *private_data,
131
void (*private_free)(snd_mixer_elem_t *elem));
132
int snd_mixer_elem_add(snd_mixer_elem_t *elem, snd_mixer_class_t *class_);
133
int snd_mixer_elem_remove(snd_mixer_elem_t *elem);
134
void snd_mixer_elem_free(snd_mixer_elem_t *elem);
135
int snd_mixer_elem_info(snd_mixer_elem_t *elem);
136
int snd_mixer_elem_value(snd_mixer_elem_t *elem);
137
int snd_mixer_elem_attach(snd_mixer_elem_t *melem, snd_hctl_elem_t *helem);
138
int snd_mixer_elem_detach(snd_mixer_elem_t *melem, snd_hctl_elem_t *helem);
139
int snd_mixer_elem_empty(snd_mixer_elem_t *melem);
140
void *snd_mixer_elem_get_private(const snd_mixer_elem_t *melem);
141
142
size_t snd_mixer_class_sizeof(void);
143
/** \hideinitializer
144
* \brief allocate an invalid #snd_mixer_class_t using standard alloca
145
* \param ptr returned pointer
146
*/
147
#define snd_mixer_class_alloca(ptr) __snd_alloca(ptr, snd_mixer_class)
148
int snd_mixer_class_malloc(snd_mixer_class_t **ptr);
149
void snd_mixer_class_free(snd_mixer_class_t *obj);
150
void snd_mixer_class_copy(snd_mixer_class_t *dst, const snd_mixer_class_t *src);
151
snd_mixer_t *snd_mixer_class_get_mixer(const snd_mixer_class_t *class_);
152
snd_mixer_event_t snd_mixer_class_get_event(const snd_mixer_class_t *class_);
153
void *snd_mixer_class_get_private(const snd_mixer_class_t *class_);
154
snd_mixer_compare_t snd_mixer_class_get_compare(const snd_mixer_class_t *class_);
155
int snd_mixer_class_set_event(snd_mixer_class_t *class_, snd_mixer_event_t event);
156
int snd_mixer_class_set_private(snd_mixer_class_t *class_, void *private_data);
157
int snd_mixer_class_set_private_free(snd_mixer_class_t *class_, void (*private_free)(snd_mixer_class_t *));
158
int snd_mixer_class_set_compare(snd_mixer_class_t *class_, snd_mixer_compare_t compare);
159
160
/**
161
* \defgroup SimpleMixer Simple Mixer Interface
162
* \ingroup Mixer
163
* The simple mixer interface.
164
* \{
165
*/
166
167
/* Simple mixer elements API */
168
169
/** Mixer simple element channel identifier */
170
typedef enum _snd_mixer_selem_channel_id {
171
/** Unknown */
172
SND_MIXER_SCHN_UNKNOWN = -1,
173
/** Front left */
174
SND_MIXER_SCHN_FRONT_LEFT = 0,
175
/** Front right */
176
SND_MIXER_SCHN_FRONT_RIGHT,
177
/** Rear left */
178
SND_MIXER_SCHN_REAR_LEFT,
179
/** Rear right */
180
SND_MIXER_SCHN_REAR_RIGHT,
181
/** Front center */
182
SND_MIXER_SCHN_FRONT_CENTER,
183
/** Woofer */
184
SND_MIXER_SCHN_WOOFER,
185
/** Side Left */
186
SND_MIXER_SCHN_SIDE_LEFT,
187
/** Side Right */
188
SND_MIXER_SCHN_SIDE_RIGHT,
189
/** Rear Center */
190
SND_MIXER_SCHN_REAR_CENTER,
191
SND_MIXER_SCHN_LAST = 31,
192
/** Mono (Front left alias) */
193
SND_MIXER_SCHN_MONO = SND_MIXER_SCHN_FRONT_LEFT
194
} snd_mixer_selem_channel_id_t;
195
196
/** Mixer simple element - register options - abstraction level */
197
enum snd_mixer_selem_regopt_abstract {
198
/** no abstraction - try use all universal controls from driver */
199
SND_MIXER_SABSTRACT_NONE = 0,
200
/** basic abstraction - Master,PCM,CD,Aux,Record-Gain etc. */
201
SND_MIXER_SABSTRACT_BASIC,
202
};
203
204
/** Mixer simple element - register options */
205
struct snd_mixer_selem_regopt {
206
/** structure version */
207
int ver;
208
/** v1: abstract layer selection */
209
enum snd_mixer_selem_regopt_abstract abstract;
210
/** v1: device name (must be NULL when playback_pcm or capture_pcm != NULL) */
211
const char *device;
212
/** v1: playback PCM connected to mixer device (NULL == none) */
213
snd_pcm_t *playback_pcm;
214
/** v1: capture PCM connected to mixer device (NULL == none) */
215
snd_pcm_t *capture_pcm;
216
};
217
218
/** Mixer simple element identifier */
219
typedef struct _snd_mixer_selem_id snd_mixer_selem_id_t;
220
221
const char *snd_mixer_selem_channel_name(snd_mixer_selem_channel_id_t channel);
222
223
int snd_mixer_selem_register(snd_mixer_t *mixer,
224
struct snd_mixer_selem_regopt *options,
225
snd_mixer_class_t **classp);
226
void snd_mixer_selem_get_id(snd_mixer_elem_t *element,
227
snd_mixer_selem_id_t *id);
228
const char *snd_mixer_selem_get_name(snd_mixer_elem_t *elem);
229
unsigned int snd_mixer_selem_get_index(snd_mixer_elem_t *elem);
230
snd_mixer_elem_t *snd_mixer_find_selem(snd_mixer_t *mixer,
231
const snd_mixer_selem_id_t *id);
232
233
int snd_mixer_selem_is_active(snd_mixer_elem_t *elem);
234
int snd_mixer_selem_is_playback_mono(snd_mixer_elem_t *elem);
235
int snd_mixer_selem_has_playback_channel(snd_mixer_elem_t *obj, snd_mixer_selem_channel_id_t channel);
236
int snd_mixer_selem_is_capture_mono(snd_mixer_elem_t *elem);
237
int snd_mixer_selem_has_capture_channel(snd_mixer_elem_t *obj, snd_mixer_selem_channel_id_t channel);
238
int snd_mixer_selem_get_capture_group(snd_mixer_elem_t *elem);
239
int snd_mixer_selem_has_common_volume(snd_mixer_elem_t *elem);
240
int snd_mixer_selem_has_playback_volume(snd_mixer_elem_t *elem);
241
int snd_mixer_selem_has_playback_volume_joined(snd_mixer_elem_t *elem);
242
int snd_mixer_selem_has_capture_volume(snd_mixer_elem_t *elem);
243
int snd_mixer_selem_has_capture_volume_joined(snd_mixer_elem_t *elem);
244
int snd_mixer_selem_has_common_switch(snd_mixer_elem_t *elem);
245
int snd_mixer_selem_has_playback_switch(snd_mixer_elem_t *elem);
246
int snd_mixer_selem_has_playback_switch_joined(snd_mixer_elem_t *elem);
247
int snd_mixer_selem_has_capture_switch(snd_mixer_elem_t *elem);
248
int snd_mixer_selem_has_capture_switch_joined(snd_mixer_elem_t *elem);
249
int snd_mixer_selem_has_capture_switch_exclusive(snd_mixer_elem_t *elem);
250
251
int snd_mixer_selem_ask_playback_vol_dB(snd_mixer_elem_t *elem, long value, long *dBvalue);
252
int snd_mixer_selem_ask_capture_vol_dB(snd_mixer_elem_t *elem, long value, long *dBvalue);
253
int snd_mixer_selem_ask_playback_dB_vol(snd_mixer_elem_t *elem, long dBvalue, int dir, long *value);
254
int snd_mixer_selem_ask_capture_dB_vol(snd_mixer_elem_t *elem, long dBvalue, int dir, long *value);
255
int snd_mixer_selem_get_playback_volume(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long *value);
256
int snd_mixer_selem_get_capture_volume(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long *value);
257
int snd_mixer_selem_get_playback_dB(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long *value);
258
int snd_mixer_selem_get_capture_dB(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long *value);
259
int snd_mixer_selem_get_playback_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int *value);
260
int snd_mixer_selem_get_capture_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int *value);
261
int snd_mixer_selem_set_playback_volume(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long value);
262
int snd_mixer_selem_set_capture_volume(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long value);
263
int snd_mixer_selem_set_playback_dB(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long value, int dir);
264
int snd_mixer_selem_set_capture_dB(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long value, int dir);
265
int snd_mixer_selem_set_playback_volume_all(snd_mixer_elem_t *elem, long value);
266
int snd_mixer_selem_set_capture_volume_all(snd_mixer_elem_t *elem, long value);
267
int snd_mixer_selem_set_playback_dB_all(snd_mixer_elem_t *elem, long value, int dir);
268
int snd_mixer_selem_set_capture_dB_all(snd_mixer_elem_t *elem, long value, int dir);
269
int snd_mixer_selem_set_playback_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int value);
270
int snd_mixer_selem_set_capture_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int value);
271
int snd_mixer_selem_set_playback_switch_all(snd_mixer_elem_t *elem, int value);
272
int snd_mixer_selem_set_capture_switch_all(snd_mixer_elem_t *elem, int value);
273
int snd_mixer_selem_get_playback_volume_range(snd_mixer_elem_t *elem,
274
long *min, long *max);
275
int snd_mixer_selem_get_playback_dB_range(snd_mixer_elem_t *elem,
276
long *min, long *max);
277
int snd_mixer_selem_set_playback_volume_range(snd_mixer_elem_t *elem,
278
long min, long max);
279
int snd_mixer_selem_get_capture_volume_range(snd_mixer_elem_t *elem,
280
long *min, long *max);
281
int snd_mixer_selem_get_capture_dB_range(snd_mixer_elem_t *elem,
282
long *min, long *max);
283
int snd_mixer_selem_set_capture_volume_range(snd_mixer_elem_t *elem,
284
long min, long max);
285
286
int snd_mixer_selem_is_enumerated(snd_mixer_elem_t *elem);
287
int snd_mixer_selem_is_enum_playback(snd_mixer_elem_t *elem);
288
int snd_mixer_selem_is_enum_capture(snd_mixer_elem_t *elem);
289
int snd_mixer_selem_get_enum_items(snd_mixer_elem_t *elem);
290
int snd_mixer_selem_get_enum_item_name(snd_mixer_elem_t *elem, unsigned int idx, size_t maxlen, char *str);
291
int snd_mixer_selem_get_enum_item(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, unsigned int *idxp);
292
int snd_mixer_selem_set_enum_item(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, unsigned int idx);
293
294
size_t snd_mixer_selem_id_sizeof(void);
295
/** \hideinitializer
296
* \brief allocate an invalid #snd_mixer_selem_id_t using standard alloca
297
* \param ptr returned pointer
298
*/
299
#define snd_mixer_selem_id_alloca(ptr) __snd_alloca(ptr, snd_mixer_selem_id)
300
int snd_mixer_selem_id_malloc(snd_mixer_selem_id_t **ptr);
301
void snd_mixer_selem_id_free(snd_mixer_selem_id_t *obj);
302
void snd_mixer_selem_id_copy(snd_mixer_selem_id_t *dst, const snd_mixer_selem_id_t *src);
303
const char *snd_mixer_selem_id_get_name(const snd_mixer_selem_id_t *obj);
304
unsigned int snd_mixer_selem_id_get_index(const snd_mixer_selem_id_t *obj);
305
void snd_mixer_selem_id_set_name(snd_mixer_selem_id_t *obj, const char *val);
306
void snd_mixer_selem_id_set_index(snd_mixer_selem_id_t *obj, unsigned int val);
307
308
/** \} */
309
310
/** \} */
311
312
#ifdef __cplusplus
313
}
314
#endif
315
316
#endif /* __ALSA_MIXER_H */
317
318
319