1 #ifndef __SOUND_CONTROL_H 2 #define __SOUND_CONTROL_H 3 4 /* 5 * Header file for control interface 6 * Copyright (c) by Jaroslav Kysela <perex@suse.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 25 #include <sound/asound.h> 26 27 #define snd_kcontrol_chip(kcontrol) ((kcontrol)->private_data) 28 29 struct snd_kcontrol; 30 typedef int (snd_kcontrol_info_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_info * uinfo); 31 typedef int (snd_kcontrol_get_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol); 32 typedef int (snd_kcontrol_put_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol); 33 34 struct snd_kcontrol_new { 35 snd_ctl_elem_iface_t iface; /* interface identifier */ 36 unsigned int device; /* device/client number */ 37 unsigned int subdevice; /* subdevice (substream) number */ 38 unsigned char *name; /* ASCII name of item */ 39 unsigned int index; /* index of item */ 40 unsigned int access; /* access rights */ 41 unsigned int count; /* count of same elements */ 42 snd_kcontrol_info_t *info; 43 snd_kcontrol_get_t *get; 44 snd_kcontrol_put_t *put; 45 unsigned long private_value; 46 }; 47 48 struct snd_kcontrol_volatile { 49 struct snd_ctl_file *owner; /* locked */ 50 pid_t owner_pid; 51 unsigned int access; /* access rights */ 52 }; 53 54 struct snd_kcontrol { 55 struct list_head list; /* list of controls */ 56 struct snd_ctl_elem_id id; 57 unsigned int count; /* count of same elements */ 58 snd_kcontrol_info_t *info; 59 snd_kcontrol_get_t *get; 60 snd_kcontrol_put_t *put; 61 unsigned long private_value; 62 void *private_data; 63 void (*private_free)(struct snd_kcontrol *kcontrol); 64 struct snd_kcontrol_volatile vd[0]; /* volatile data */ 65 }; 66 67 #define snd_kcontrol(n) list_entry(n, struct snd_kcontrol, list) 68 69 struct snd_kctl_event { 70 struct list_head list; /* list of events */ 71 struct snd_ctl_elem_id id; 72 unsigned int mask; 73 }; 74 75 #define snd_kctl_event(n) list_entry(n, struct snd_kctl_event, list) 76 77 struct snd_ctl_file { 78 struct list_head list; /* list of all control files */ 79 struct snd_card *card; 80 pid_t pid; 81 int prefer_pcm_subdevice; 82 int prefer_rawmidi_subdevice; 83 wait_queue_head_t change_sleep; 84 spinlock_t read_lock; 85 struct fasync_struct *fasync; 86 int subscribed; /* read interface is activated */ 87 struct list_head events; /* waiting events for read */ 88 }; 89 90 #define snd_ctl_file(n) list_entry(n, struct snd_ctl_file, list) 91 92 typedef int (*snd_kctl_ioctl_func_t) (struct snd_card * card, 93 struct snd_ctl_file * control, 94 unsigned int cmd, unsigned long arg); 95 96 void snd_ctl_notify(struct snd_card * card, unsigned int mask, struct snd_ctl_elem_id * id); 97 98 struct snd_kcontrol *snd_ctl_new(struct snd_kcontrol * kcontrol, unsigned int access); 99 struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new * kcontrolnew, void * private_data); 100 void snd_ctl_free_one(struct snd_kcontrol * kcontrol); 101 int snd_ctl_add(struct snd_card * card, struct snd_kcontrol * kcontrol); 102 int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol); 103 int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id); 104 int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id); 105 struct snd_kcontrol *snd_ctl_find_numid(struct snd_card * card, unsigned int numid); 106 struct snd_kcontrol *snd_ctl_find_id(struct snd_card * card, struct snd_ctl_elem_id *id); 107 108 int snd_ctl_create(struct snd_card *card); 109 110 int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn); 111 int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn); 112 #ifdef CONFIG_COMPAT 113 int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn); 114 int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn); 115 #else 116 #define snd_ctl_register_ioctl_compat(fcn) 117 #define snd_ctl_unregister_ioctl_compat(fcn) 118 #endif 119 120 int snd_ctl_elem_read(struct snd_card *card, struct snd_ctl_elem_value *control); 121 int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file, struct snd_ctl_elem_value *control); 122 123 static inline unsigned int snd_ctl_get_ioffnum(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id) 124 { 125 return id->numid - kctl->id.numid; 126 } 127 128 static inline unsigned int snd_ctl_get_ioffidx(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id) 129 { 130 return id->index - kctl->id.index; 131 } 132 133 static inline unsigned int snd_ctl_get_ioff(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id) 134 { 135 if (id->numid) { 136 return snd_ctl_get_ioffnum(kctl, id); 137 } else { 138 return snd_ctl_get_ioffidx(kctl, id); 139 } 140 } 141 142 static inline struct snd_ctl_elem_id *snd_ctl_build_ioff(struct snd_ctl_elem_id *dst_id, 143 struct snd_kcontrol *src_kctl, 144 unsigned int offset) 145 { 146 *dst_id = src_kctl->id; 147 dst_id->index += offset; 148 dst_id->numid += offset; 149 return dst_id; 150 } 151 152 #endif /* __SOUND_CONTROL_H */ 153