Changeset 679 for GPL/trunk/alsa-kernel/include/sound/control.h
- Timestamp:
- Mar 18, 2021, 8:57:36 PM (4 years ago)
- Location:
- GPL/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/trunk
- Property svn:mergeinfo changed
/GPL/branches/uniaud32-linux-3.2.102 (added) merged: 611-614 /GPL/branches/uniaud32-next (added) merged: 615-678
- Property svn:mergeinfo changed
-
GPL/trunk/alsa-kernel/include/sound/control.h
r598 r679 1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 1 2 #ifndef __SOUND_CONTROL_H 2 3 #define __SOUND_CONTROL_H … … 5 6 * Header file for control interface 6 7 * Copyright (c) by Jaroslav Kysela <perex@perex.cz> 7 * 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 * 23 */ 24 8 */ 9 10 #include <linux/wait.h> 11 #include <linux/nospec.h> 25 12 #include <sound/asound.h> 26 13 … … 32 19 typedef int (snd_kcontrol_put_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol); 33 20 typedef int (snd_kcontrol_tlv_rw_t)(struct snd_kcontrol *kcontrol, 34 int op_flag, /* 0=read,1=write,-1=command*/21 int op_flag, /* SNDRV_CTL_TLV_OP_XXX */ 35 22 unsigned int size, 36 23 unsigned int __user *tlv); 37 24 25 /* internal flag for skipping validations */ 26 #ifdef CONFIG_SND_CTL_VALIDATION 27 #define SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK (1 << 27) 28 #define snd_ctl_skip_validation(info) \ 29 ((info)->access & SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK) 30 #else 31 #define SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK 0 32 #define snd_ctl_skip_validation(info) true 33 #endif 34 35 enum { 36 SNDRV_CTL_TLV_OP_READ = 0, 37 SNDRV_CTL_TLV_OP_WRITE = 1, 38 SNDRV_CTL_TLV_OP_CMD = -1, 39 }; 38 40 39 41 struct snd_kcontrol_new { … … 41 43 unsigned int device; /* device/client number */ 42 44 unsigned int subdevice; /* subdevice (substream) number */ 43 unsignedchar *name; /* ASCII name of item */45 const char *name; /* ASCII name of item */ 44 46 unsigned int index; /* index of item */ 45 47 unsigned int access; /* access rights */ … … 72 74 } tlv; 73 75 unsigned long private_value; 74 #ifdef TARGET_OS275 void *private_ptr;76 #endif77 76 void *private_data; 78 77 void (*private_free)(struct snd_kcontrol *kcontrol); 79 #ifndef TARGET_OS2 80 struct snd_kcontrol_volatile vd[0]; /* volatile data */ 81 #else 82 struct snd_kcontrol_volatile vd[1]; /* volatile data */ 83 #endif 78 struct snd_kcontrol_volatile vd[]; /* volatile data */ 84 79 }; 85 80 … … 96 91 struct pid; 97 92 93 enum { 94 SND_CTL_SUBDEV_PCM, 95 SND_CTL_SUBDEV_RAWMIDI, 96 SND_CTL_SUBDEV_ITEMS, 97 }; 98 98 99 struct snd_ctl_file { 99 100 struct list_head list; /* list of all control files */ 100 101 struct snd_card *card; 101 102 struct pid *pid; 102 int prefer_pcm_subdevice; 103 int prefer_rawmidi_subdevice; 103 int preferred_subdevice[SND_CTL_SUBDEV_ITEMS]; 104 104 wait_queue_head_t change_sleep; 105 105 spinlock_t read_lock; … … 121 121 int snd_ctl_add(struct snd_card * card, struct snd_kcontrol * kcontrol); 122 122 int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol); 123 int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol, bool add_on_replace); 123 124 int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id); 124 125 int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id); 126 int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id, 127 int active); 125 128 struct snd_kcontrol *snd_ctl_find_numid(struct snd_card * card, unsigned int numid); 126 129 struct snd_kcontrol *snd_ctl_find_id(struct snd_card * card, struct snd_ctl_elem_id *id); … … 138 141 #endif 139 142 143 int snd_ctl_get_preferred_subdevice(struct snd_card *card, int type); 144 140 145 static inline unsigned int snd_ctl_get_ioffnum(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id) 141 146 { 142 return id->numid - kctl->id.numid; 147 unsigned int ioff = id->numid - kctl->id.numid; 148 return array_index_nospec(ioff, kctl->count); 143 149 } 144 150 145 151 static inline unsigned int snd_ctl_get_ioffidx(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id) 146 152 { 147 return id->index - kctl->id.index; 153 unsigned int ioff = id->index - kctl->id.index; 154 return array_index_nospec(ioff, kctl->count); 148 155 } 149 156 … … 182 189 struct snd_kcontrol *snd_ctl_make_virtual_master(char *name, 183 190 const unsigned int *tlv); 184 int _snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave, 185 unsigned int flags); 186 /* optional flags for slave */ 187 #define SND_CTL_SLAVE_NEED_UPDATE (1 << 0) 191 int _snd_ctl_add_follower(struct snd_kcontrol *master, 192 struct snd_kcontrol *follower, 193 unsigned int flags); 194 /* optional flags for follower */ 195 #define SND_CTL_FOLLOWER_NEED_UPDATE (1 << 0) 188 196 189 197 /** 190 * snd_ctl_add_ slave - Add a virtual slavecontrol198 * snd_ctl_add_follower - Add a virtual follower control 191 199 * @master: vmaster element 192 * @ slave: slaveelement to add193 * 194 * Add a virtual slavecontrol to the given master element created via200 * @follower: follower element to add 201 * 202 * Add a virtual follower control to the given master element created via 195 203 * snd_ctl_create_virtual_master() beforehand. 196 * Returns zero if successful or a negative error code. 197 * 198 * All slaves must be the same type (returning the same information 199 * via info callback). The fucntion doesn't check it, so it's your 204 * 205 * All followers must be the same type (returning the same information 206 * via info callback). The function doesn't check it, so it's your 200 207 * responsibility. 201 208 * … … 204 211 * logarithmic volume control (dB level) thus no linear volume, 205 212 * master can only attenuate the volume without gain 213 * 214 * Return: Zero if successful or a negative error code. 206 215 */ 207 216 static inline int 208 snd_ctl_add_ slave(struct snd_kcontrol *master, struct snd_kcontrol *slave)209 { 210 return _snd_ctl_add_ slave(master, slave, 0);217 snd_ctl_add_follower(struct snd_kcontrol *master, struct snd_kcontrol *follower) 218 { 219 return _snd_ctl_add_follower(master, follower, 0); 211 220 } 212 221 213 222 /** 214 * snd_ctl_add_ slave_uncached - Add a virtual slavecontrol223 * snd_ctl_add_follower_uncached - Add a virtual follower control 215 224 * @master: vmaster element 216 * @ slave: slaveelement to add217 * 218 * Add a virtual slavecontrol to the given master.219 * Unlike snd_ctl_add_ slave(), the element added via this function225 * @follower: follower element to add 226 * 227 * Add a virtual follower control to the given master. 228 * Unlike snd_ctl_add_follower(), the element added via this function 220 229 * is supposed to have volatile values, and get callback is called 221 * at each time qu ried from the master.230 * at each time queried from the master. 222 231 * 223 232 * When the control peeks the hardware values directly and the value 224 233 * can be changed by other means than the put callback of the element, 225 234 * this function should be used to keep the value always up-to-date. 235 * 236 * Return: Zero if successful or a negative error code. 226 237 */ 227 238 static inline int 228 snd_ctl_add_slave_uncached(struct snd_kcontrol *master, 229 struct snd_kcontrol *slave) 230 { 231 return _snd_ctl_add_slave(master, slave, SND_CTL_SLAVE_NEED_UPDATE); 232 } 239 snd_ctl_add_follower_uncached(struct snd_kcontrol *master, 240 struct snd_kcontrol *follower) 241 { 242 return _snd_ctl_add_follower(master, follower, SND_CTL_FOLLOWER_NEED_UPDATE); 243 } 244 245 int snd_ctl_add_vmaster_hook(struct snd_kcontrol *kctl, 246 void (*hook)(void *private_data, int), 247 void *private_data); 248 void snd_ctl_sync_vmaster(struct snd_kcontrol *kctl, bool hook_only); 249 #define snd_ctl_sync_vmaster_hook(kctl) snd_ctl_sync_vmaster(kctl, true) 250 int snd_ctl_apply_vmaster_followers(struct snd_kcontrol *kctl, 251 int (*func)(struct snd_kcontrol *vfollower, 252 struct snd_kcontrol *follower, 253 void *arg), 254 void *arg); 255 256 /* 257 * Helper functions for jack-detection controls 258 */ 259 struct snd_kcontrol * 260 snd_kctl_jack_new(const char *name, struct snd_card *card); 261 void snd_kctl_jack_report(struct snd_card *card, 262 struct snd_kcontrol *kctl, bool status); 233 263 234 264 #endif /* __SOUND_CONTROL_H */
Note:
See TracChangeset
for help on using the changeset viewer.