Blame view
include/sound/control.h
8.84 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 |
#ifndef __SOUND_CONTROL_H #define __SOUND_CONTROL_H /* * Header file for control interface |
c1017a4cd [ALSA] Changed Ja... |
6 |
* Copyright (c) by Jaroslav Kysela <perex@perex.cz> |
1da177e4c Linux-2.6.12-rc2 |
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
* * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ |
b69339ba1 sched/headers: Pr... |
24 |
#include <linux/wait.h> |
6ab1a94d1 ALSA: control: Ha... |
25 |
#include <linux/nospec.h> |
1da177e4c Linux-2.6.12-rc2 |
26 |
#include <sound/asound.h> |
1da177e4c Linux-2.6.12-rc2 |
27 |
#define snd_kcontrol_chip(kcontrol) ((kcontrol)->private_data) |
82e9bae6f [ALSA] Remove xxx... |
28 29 30 31 |
struct snd_kcontrol; typedef int (snd_kcontrol_info_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_info * uinfo); typedef int (snd_kcontrol_get_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol); typedef int (snd_kcontrol_put_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol); |
8aa9b586e [ALSA] Control AP... |
32 |
typedef int (snd_kcontrol_tlv_rw_t)(struct snd_kcontrol *kcontrol, |
0cea76f33 ALSA: control: De... |
33 |
int op_flag, /* SNDRV_CTL_TLV_OP_XXX */ |
8aa9b586e [ALSA] Control AP... |
34 35 |
unsigned int size, unsigned int __user *tlv); |
0cea76f33 ALSA: control: De... |
36 37 38 39 40 |
enum { SNDRV_CTL_TLV_OP_READ = 0, SNDRV_CTL_TLV_OP_WRITE = 1, SNDRV_CTL_TLV_OP_CMD = -1, }; |
1da177e4c Linux-2.6.12-rc2 |
41 |
|
82e9bae6f [ALSA] Remove xxx... |
42 |
struct snd_kcontrol_new { |
1da177e4c Linux-2.6.12-rc2 |
43 44 45 |
snd_ctl_elem_iface_t iface; /* interface identifier */ unsigned int device; /* device/client number */ unsigned int subdevice; /* subdevice (substream) number */ |
5ac2ba945 ALSA: core: Const... |
46 |
const unsigned char *name; /* ASCII name of item */ |
1da177e4c Linux-2.6.12-rc2 |
47 48 49 50 51 52 |
unsigned int index; /* index of item */ unsigned int access; /* access rights */ unsigned int count; /* count of same elements */ snd_kcontrol_info_t *info; snd_kcontrol_get_t *get; snd_kcontrol_put_t *put; |
8aa9b586e [ALSA] Control AP... |
53 54 |
union { snd_kcontrol_tlv_rw_t *c; |
0cb29ea0d [ALSA] Add even m... |
55 |
const unsigned int *p; |
8aa9b586e [ALSA] Control AP... |
56 |
} tlv; |
1da177e4c Linux-2.6.12-rc2 |
57 |
unsigned long private_value; |
82e9bae6f [ALSA] Remove xxx... |
58 |
}; |
1da177e4c Linux-2.6.12-rc2 |
59 |
|
82e9bae6f [ALSA] Remove xxx... |
60 61 |
struct snd_kcontrol_volatile { struct snd_ctl_file *owner; /* locked */ |
1da177e4c Linux-2.6.12-rc2 |
62 |
unsigned int access; /* access rights */ |
82e9bae6f [ALSA] Remove xxx... |
63 |
}; |
1da177e4c Linux-2.6.12-rc2 |
64 |
|
82e9bae6f [ALSA] Remove xxx... |
65 |
struct snd_kcontrol { |
1da177e4c Linux-2.6.12-rc2 |
66 |
struct list_head list; /* list of controls */ |
82e9bae6f [ALSA] Remove xxx... |
67 |
struct snd_ctl_elem_id id; |
1da177e4c Linux-2.6.12-rc2 |
68 69 70 71 |
unsigned int count; /* count of same elements */ snd_kcontrol_info_t *info; snd_kcontrol_get_t *get; snd_kcontrol_put_t *put; |
8aa9b586e [ALSA] Control AP... |
72 73 |
union { snd_kcontrol_tlv_rw_t *c; |
0cb29ea0d [ALSA] Add even m... |
74 |
const unsigned int *p; |
8aa9b586e [ALSA] Control AP... |
75 |
} tlv; |
1da177e4c Linux-2.6.12-rc2 |
76 77 |
unsigned long private_value; void *private_data; |
82e9bae6f [ALSA] Remove xxx... |
78 79 |
void (*private_free)(struct snd_kcontrol *kcontrol); struct snd_kcontrol_volatile vd[0]; /* volatile data */ |
1da177e4c Linux-2.6.12-rc2 |
80 |
}; |
82e9bae6f [ALSA] Remove xxx... |
81 |
#define snd_kcontrol(n) list_entry(n, struct snd_kcontrol, list) |
1da177e4c Linux-2.6.12-rc2 |
82 |
|
82e9bae6f [ALSA] Remove xxx... |
83 |
struct snd_kctl_event { |
1da177e4c Linux-2.6.12-rc2 |
84 |
struct list_head list; /* list of events */ |
82e9bae6f [ALSA] Remove xxx... |
85 |
struct snd_ctl_elem_id id; |
1da177e4c Linux-2.6.12-rc2 |
86 |
unsigned int mask; |
82e9bae6f [ALSA] Remove xxx... |
87 |
}; |
1da177e4c Linux-2.6.12-rc2 |
88 |
|
82e9bae6f [ALSA] Remove xxx... |
89 |
#define snd_kctl_event(n) list_entry(n, struct snd_kctl_event, list) |
1da177e4c Linux-2.6.12-rc2 |
90 |
|
25d27eded control: use refe... |
91 |
struct pid; |
23c18d4bf ALSA: control: Pr... |
92 93 94 95 96 |
enum { SND_CTL_SUBDEV_PCM, SND_CTL_SUBDEV_RAWMIDI, SND_CTL_SUBDEV_ITEMS, }; |
82e9bae6f [ALSA] Remove xxx... |
97 |
struct snd_ctl_file { |
1da177e4c Linux-2.6.12-rc2 |
98 |
struct list_head list; /* list of all control files */ |
82e9bae6f [ALSA] Remove xxx... |
99 |
struct snd_card *card; |
25d27eded control: use refe... |
100 |
struct pid *pid; |
23c18d4bf ALSA: control: Pr... |
101 |
int preferred_subdevice[SND_CTL_SUBDEV_ITEMS]; |
1da177e4c Linux-2.6.12-rc2 |
102 103 104 105 106 107 |
wait_queue_head_t change_sleep; spinlock_t read_lock; struct fasync_struct *fasync; int subscribed; /* read interface is activated */ struct list_head events; /* waiting events for read */ }; |
82e9bae6f [ALSA] Remove xxx... |
108 |
#define snd_ctl_file(n) list_entry(n, struct snd_ctl_file, list) |
1da177e4c Linux-2.6.12-rc2 |
109 |
|
82e9bae6f [ALSA] Remove xxx... |
110 111 112 |
typedef int (*snd_kctl_ioctl_func_t) (struct snd_card * card, struct snd_ctl_file * control, unsigned int cmd, unsigned long arg); |
1da177e4c Linux-2.6.12-rc2 |
113 |
|
82e9bae6f [ALSA] Remove xxx... |
114 |
void snd_ctl_notify(struct snd_card * card, unsigned int mask, struct snd_ctl_elem_id * id); |
1da177e4c Linux-2.6.12-rc2 |
115 |
|
82e9bae6f [ALSA] Remove xxx... |
116 117 118 119 |
struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new * kcontrolnew, void * private_data); void snd_ctl_free_one(struct snd_kcontrol * kcontrol); int snd_ctl_add(struct snd_card * card, struct snd_kcontrol * kcontrol); int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol); |
66b5b9722 ALSA: Add snd_ctl... |
120 |
int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol, bool add_on_replace); |
82e9bae6f [ALSA] Remove xxx... |
121 122 |
int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id); int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id); |
3cbdd7533 ALSA: Add snd_ctl... |
123 124 |
int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id, int active); |
82e9bae6f [ALSA] Remove xxx... |
125 126 |
struct snd_kcontrol *snd_ctl_find_numid(struct snd_card * card, unsigned int numid); struct snd_kcontrol *snd_ctl_find_id(struct snd_card * card, struct snd_ctl_elem_id *id); |
1da177e4c Linux-2.6.12-rc2 |
127 |
|
82e9bae6f [ALSA] Remove xxx... |
128 |
int snd_ctl_create(struct snd_card *card); |
1da177e4c Linux-2.6.12-rc2 |
129 130 131 132 133 134 135 136 137 138 |
int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn); int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn); #ifdef CONFIG_COMPAT int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn); int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn); #else #define snd_ctl_register_ioctl_compat(fcn) #define snd_ctl_unregister_ioctl_compat(fcn) #endif |
23c18d4bf ALSA: control: Pr... |
139 |
int snd_ctl_get_preferred_subdevice(struct snd_card *card, int type); |
82e9bae6f [ALSA] Remove xxx... |
140 |
static inline unsigned int snd_ctl_get_ioffnum(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id) |
1da177e4c Linux-2.6.12-rc2 |
141 |
{ |
6ab1a94d1 ALSA: control: Ha... |
142 143 |
unsigned int ioff = id->numid - kctl->id.numid; return array_index_nospec(ioff, kctl->count); |
1da177e4c Linux-2.6.12-rc2 |
144 |
} |
82e9bae6f [ALSA] Remove xxx... |
145 |
static inline unsigned int snd_ctl_get_ioffidx(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id) |
1da177e4c Linux-2.6.12-rc2 |
146 |
{ |
6ab1a94d1 ALSA: control: Ha... |
147 148 |
unsigned int ioff = id->index - kctl->id.index; return array_index_nospec(ioff, kctl->count); |
1da177e4c Linux-2.6.12-rc2 |
149 |
} |
82e9bae6f [ALSA] Remove xxx... |
150 |
static inline unsigned int snd_ctl_get_ioff(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id) |
1da177e4c Linux-2.6.12-rc2 |
151 152 153 154 155 156 157 |
{ if (id->numid) { return snd_ctl_get_ioffnum(kctl, id); } else { return snd_ctl_get_ioffidx(kctl, id); } } |
82e9bae6f [ALSA] Remove xxx... |
158 159 |
static inline struct snd_ctl_elem_id *snd_ctl_build_ioff(struct snd_ctl_elem_id *dst_id, struct snd_kcontrol *src_kctl, |
1da177e4c Linux-2.6.12-rc2 |
160 161 162 163 164 165 166 |
unsigned int offset) { *dst_id = src_kctl->id; dst_id->index += offset; dst_id->numid += offset; return dst_id; } |
b9ed4f2b6 [ALSA] Add helper... |
167 |
/* |
9600732b6 ALSA: core, oxyge... |
168 |
* Frequently used control callbacks/helpers |
b9ed4f2b6 [ALSA] Add helper... |
169 170 171 172 173 |
*/ int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo); int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo); |
9600732b6 ALSA: core, oxyge... |
174 175 |
int snd_ctl_enum_info(struct snd_ctl_elem_info *info, unsigned int channels, unsigned int items, const char *const names[]); |
b9ed4f2b6 [ALSA] Add helper... |
176 |
|
e922b0028 [ALSA] Move vmast... |
177 178 179 180 181 |
/* * virtual master control */ struct snd_kcontrol *snd_ctl_make_virtual_master(char *name, const unsigned int *tlv); |
f5b1db634 ALSA: add snd_ctl... |
182 183 184 185 |
int _snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave, unsigned int flags); /* optional flags for slave */ #define SND_CTL_SLAVE_NEED_UPDATE (1 << 0) |
79c7cdd54 ALSA: Add kernel-... |
186 187 188 189 190 191 192 |
/** * snd_ctl_add_slave - Add a virtual slave control * @master: vmaster element * @slave: slave element to add * * Add a virtual slave control to the given master element created via * snd_ctl_create_virtual_master() beforehand. |
79c7cdd54 ALSA: Add kernel-... |
193 194 |
* * All slaves must be the same type (returning the same information |
25985edce Fix common misspe... |
195 |
* via info callback). The function doesn't check it, so it's your |
79c7cdd54 ALSA: Add kernel-... |
196 197 198 199 200 201 |
* responsibility. * * Also, some additional limitations: * at most two channels, * logarithmic volume control (dB level) thus no linear volume, * master can only attenuate the volume without gain |
eb7c06e8e ALSA: add/change ... |
202 203 |
* * Return: Zero if successful or a negative error code. |
79c7cdd54 ALSA: Add kernel-... |
204 |
*/ |
f5b1db634 ALSA: add snd_ctl... |
205 206 207 208 209 |
static inline int snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave) { return _snd_ctl_add_slave(master, slave, 0); } |
79c7cdd54 ALSA: Add kernel-... |
210 211 212 213 214 215 216 217 |
/** * snd_ctl_add_slave_uncached - Add a virtual slave control * @master: vmaster element * @slave: slave element to add * * Add a virtual slave control to the given master. * Unlike snd_ctl_add_slave(), the element added via this function * is supposed to have volatile values, and get callback is called |
1a6ab46fa ALSA: Fix spellin... |
218 |
* at each time queried from the master. |
79c7cdd54 ALSA: Add kernel-... |
219 220 221 222 |
* * When the control peeks the hardware values directly and the value * can be changed by other means than the put callback of the element, * this function should be used to keep the value always up-to-date. |
eb7c06e8e ALSA: add/change ... |
223 224 |
* * Return: Zero if successful or a negative error code. |
79c7cdd54 ALSA: Add kernel-... |
225 |
*/ |
f5b1db634 ALSA: add snd_ctl... |
226 227 228 229 230 231 |
static inline int snd_ctl_add_slave_uncached(struct snd_kcontrol *master, struct snd_kcontrol *slave) { return _snd_ctl_add_slave(master, slave, SND_CTL_SLAVE_NEED_UPDATE); } |
2ad787e9a ALSA: Add a hook ... |
232 233 234 |
int snd_ctl_add_vmaster_hook(struct snd_kcontrol *kctl, void (*hook)(void *private_data, int), void *private_data); |
1ca2f2ec9 ALSA: vmaster: Ad... |
235 236 |
void snd_ctl_sync_vmaster(struct snd_kcontrol *kctl, bool hook_only); #define snd_ctl_sync_vmaster_hook(kctl) snd_ctl_sync_vmaster(kctl, true) |
a91d66129 ALSA: hda - Fix i... |
237 |
int snd_ctl_apply_vmaster_slaves(struct snd_kcontrol *kctl, |
665000d95 ALSA: hda - Fix y... |
238 239 240 |
int (*func)(struct snd_kcontrol *vslave, struct snd_kcontrol *slave, void *arg), |
a91d66129 ALSA: hda - Fix i... |
241 |
void *arg); |
2ad787e9a ALSA: Add a hook ... |
242 |
|
35be544af ALSA: Introduce c... |
243 244 245 246 |
/* * Helper functions for jack-detection controls */ struct snd_kcontrol * |
2ba2dfa1f ALSA: hda - Updat... |
247 |
snd_kctl_jack_new(const char *name, struct snd_card *card); |
35be544af ALSA: Introduce c... |
248 249 |
void snd_kctl_jack_report(struct snd_card *card, struct snd_kcontrol *kctl, bool status); |
1da177e4c Linux-2.6.12-rc2 |
250 |
#endif /* __SOUND_CONTROL_H */ |