11da177e4SLinus Torvalds #ifndef __SOUND_CONTROL_H 21da177e4SLinus Torvalds #define __SOUND_CONTROL_H 31da177e4SLinus Torvalds 41da177e4SLinus Torvalds /* 51da177e4SLinus Torvalds * Header file for control interface 61da177e4SLinus Torvalds * Copyright (c) by Jaroslav Kysela <perex@suse.cz> 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * 91da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify 101da177e4SLinus Torvalds * it under the terms of the GNU General Public License as published by 111da177e4SLinus Torvalds * the Free Software Foundation; either version 2 of the License, or 121da177e4SLinus Torvalds * (at your option) any later version. 131da177e4SLinus Torvalds * 141da177e4SLinus Torvalds * This program is distributed in the hope that it will be useful, 151da177e4SLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of 161da177e4SLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 171da177e4SLinus Torvalds * GNU General Public License for more details. 181da177e4SLinus Torvalds * 191da177e4SLinus Torvalds * You should have received a copy of the GNU General Public License 201da177e4SLinus Torvalds * along with this program; if not, write to the Free Software 211da177e4SLinus Torvalds * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 221da177e4SLinus Torvalds * 231da177e4SLinus Torvalds */ 241da177e4SLinus Torvalds 251da177e4SLinus Torvalds #include <sound/asound.h> 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds #define snd_kcontrol_chip(kcontrol) ((kcontrol)->private_data) 281da177e4SLinus Torvalds 2982e9bae6STakashi Iwai struct snd_kcontrol; 3082e9bae6STakashi Iwai typedef int (snd_kcontrol_info_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_info * uinfo); 3182e9bae6STakashi Iwai typedef int (snd_kcontrol_get_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol); 3282e9bae6STakashi Iwai typedef int (snd_kcontrol_put_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol); 338aa9b586SJaroslav Kysela typedef int (snd_kcontrol_tlv_rw_t)(struct snd_kcontrol *kcontrol, 348aa9b586SJaroslav Kysela int op_flag, /* 0=read,1=write,-1=command */ 358aa9b586SJaroslav Kysela unsigned int size, 368aa9b586SJaroslav Kysela unsigned int __user *tlv); 378aa9b586SJaroslav Kysela 381da177e4SLinus Torvalds 3982e9bae6STakashi Iwai struct snd_kcontrol_new { 401da177e4SLinus Torvalds snd_ctl_elem_iface_t iface; /* interface identifier */ 411da177e4SLinus Torvalds unsigned int device; /* device/client number */ 421da177e4SLinus Torvalds unsigned int subdevice; /* subdevice (substream) number */ 431da177e4SLinus Torvalds unsigned char *name; /* ASCII name of item */ 441da177e4SLinus Torvalds unsigned int index; /* index of item */ 451da177e4SLinus Torvalds unsigned int access; /* access rights */ 461da177e4SLinus Torvalds unsigned int count; /* count of same elements */ 471da177e4SLinus Torvalds snd_kcontrol_info_t *info; 481da177e4SLinus Torvalds snd_kcontrol_get_t *get; 491da177e4SLinus Torvalds snd_kcontrol_put_t *put; 508aa9b586SJaroslav Kysela union { 518aa9b586SJaroslav Kysela snd_kcontrol_tlv_rw_t *c; 528aa9b586SJaroslav Kysela unsigned int *p; 538aa9b586SJaroslav Kysela } tlv; 541da177e4SLinus Torvalds unsigned long private_value; 5582e9bae6STakashi Iwai }; 561da177e4SLinus Torvalds 5782e9bae6STakashi Iwai struct snd_kcontrol_volatile { 5882e9bae6STakashi Iwai struct snd_ctl_file *owner; /* locked */ 591da177e4SLinus Torvalds pid_t owner_pid; 601da177e4SLinus Torvalds unsigned int access; /* access rights */ 6182e9bae6STakashi Iwai }; 621da177e4SLinus Torvalds 6382e9bae6STakashi Iwai struct snd_kcontrol { 641da177e4SLinus Torvalds struct list_head list; /* list of controls */ 6582e9bae6STakashi Iwai struct snd_ctl_elem_id id; 661da177e4SLinus Torvalds unsigned int count; /* count of same elements */ 671da177e4SLinus Torvalds snd_kcontrol_info_t *info; 681da177e4SLinus Torvalds snd_kcontrol_get_t *get; 691da177e4SLinus Torvalds snd_kcontrol_put_t *put; 708aa9b586SJaroslav Kysela snd_kcontrol_tlv_rw_t *tlv_rw; 718aa9b586SJaroslav Kysela union { 728aa9b586SJaroslav Kysela snd_kcontrol_tlv_rw_t *c; 738aa9b586SJaroslav Kysela unsigned int *p; 748aa9b586SJaroslav Kysela } tlv; 751da177e4SLinus Torvalds unsigned long private_value; 761da177e4SLinus Torvalds void *private_data; 7782e9bae6STakashi Iwai void (*private_free)(struct snd_kcontrol *kcontrol); 7882e9bae6STakashi Iwai struct snd_kcontrol_volatile vd[0]; /* volatile data */ 791da177e4SLinus Torvalds }; 801da177e4SLinus Torvalds 8182e9bae6STakashi Iwai #define snd_kcontrol(n) list_entry(n, struct snd_kcontrol, list) 821da177e4SLinus Torvalds 8382e9bae6STakashi Iwai struct snd_kctl_event { 841da177e4SLinus Torvalds struct list_head list; /* list of events */ 8582e9bae6STakashi Iwai struct snd_ctl_elem_id id; 861da177e4SLinus Torvalds unsigned int mask; 8782e9bae6STakashi Iwai }; 881da177e4SLinus Torvalds 8982e9bae6STakashi Iwai #define snd_kctl_event(n) list_entry(n, struct snd_kctl_event, list) 901da177e4SLinus Torvalds 9182e9bae6STakashi Iwai struct snd_ctl_file { 921da177e4SLinus Torvalds struct list_head list; /* list of all control files */ 9382e9bae6STakashi Iwai struct snd_card *card; 941da177e4SLinus Torvalds pid_t pid; 951da177e4SLinus Torvalds int prefer_pcm_subdevice; 961da177e4SLinus Torvalds int prefer_rawmidi_subdevice; 971da177e4SLinus Torvalds wait_queue_head_t change_sleep; 981da177e4SLinus Torvalds spinlock_t read_lock; 991da177e4SLinus Torvalds struct fasync_struct *fasync; 1001da177e4SLinus Torvalds int subscribed; /* read interface is activated */ 1011da177e4SLinus Torvalds struct list_head events; /* waiting events for read */ 1021da177e4SLinus Torvalds }; 1031da177e4SLinus Torvalds 10482e9bae6STakashi Iwai #define snd_ctl_file(n) list_entry(n, struct snd_ctl_file, list) 1051da177e4SLinus Torvalds 10682e9bae6STakashi Iwai typedef int (*snd_kctl_ioctl_func_t) (struct snd_card * card, 10782e9bae6STakashi Iwai struct snd_ctl_file * control, 1081da177e4SLinus Torvalds unsigned int cmd, unsigned long arg); 1091da177e4SLinus Torvalds 11082e9bae6STakashi Iwai void snd_ctl_notify(struct snd_card * card, unsigned int mask, struct snd_ctl_elem_id * id); 1111da177e4SLinus Torvalds 11282e9bae6STakashi Iwai struct snd_kcontrol *snd_ctl_new(struct snd_kcontrol * kcontrol, unsigned int access); 11382e9bae6STakashi Iwai struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new * kcontrolnew, void * private_data); 11482e9bae6STakashi Iwai void snd_ctl_free_one(struct snd_kcontrol * kcontrol); 11582e9bae6STakashi Iwai int snd_ctl_add(struct snd_card * card, struct snd_kcontrol * kcontrol); 11682e9bae6STakashi Iwai int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol); 11782e9bae6STakashi Iwai int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id); 11882e9bae6STakashi Iwai int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id); 11982e9bae6STakashi Iwai struct snd_kcontrol *snd_ctl_find_numid(struct snd_card * card, unsigned int numid); 12082e9bae6STakashi Iwai struct snd_kcontrol *snd_ctl_find_id(struct snd_card * card, struct snd_ctl_elem_id *id); 1211da177e4SLinus Torvalds 12282e9bae6STakashi Iwai int snd_ctl_create(struct snd_card *card); 1231da177e4SLinus Torvalds 1241da177e4SLinus Torvalds int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn); 1251da177e4SLinus Torvalds int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn); 1261da177e4SLinus Torvalds #ifdef CONFIG_COMPAT 1271da177e4SLinus Torvalds int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn); 1281da177e4SLinus Torvalds int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn); 1291da177e4SLinus Torvalds #else 1301da177e4SLinus Torvalds #define snd_ctl_register_ioctl_compat(fcn) 1311da177e4SLinus Torvalds #define snd_ctl_unregister_ioctl_compat(fcn) 1321da177e4SLinus Torvalds #endif 1331da177e4SLinus Torvalds 13482e9bae6STakashi Iwai int snd_ctl_elem_read(struct snd_card *card, struct snd_ctl_elem_value *control); 13582e9bae6STakashi Iwai int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file, struct snd_ctl_elem_value *control); 1361da177e4SLinus Torvalds 13782e9bae6STakashi Iwai static inline unsigned int snd_ctl_get_ioffnum(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id) 1381da177e4SLinus Torvalds { 1391da177e4SLinus Torvalds return id->numid - kctl->id.numid; 1401da177e4SLinus Torvalds } 1411da177e4SLinus Torvalds 14282e9bae6STakashi Iwai static inline unsigned int snd_ctl_get_ioffidx(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id) 1431da177e4SLinus Torvalds { 1441da177e4SLinus Torvalds return id->index - kctl->id.index; 1451da177e4SLinus Torvalds } 1461da177e4SLinus Torvalds 14782e9bae6STakashi Iwai static inline unsigned int snd_ctl_get_ioff(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id) 1481da177e4SLinus Torvalds { 1491da177e4SLinus Torvalds if (id->numid) { 1501da177e4SLinus Torvalds return snd_ctl_get_ioffnum(kctl, id); 1511da177e4SLinus Torvalds } else { 1521da177e4SLinus Torvalds return snd_ctl_get_ioffidx(kctl, id); 1531da177e4SLinus Torvalds } 1541da177e4SLinus Torvalds } 1551da177e4SLinus Torvalds 15682e9bae6STakashi Iwai static inline struct snd_ctl_elem_id *snd_ctl_build_ioff(struct snd_ctl_elem_id *dst_id, 15782e9bae6STakashi Iwai struct snd_kcontrol *src_kctl, 1581da177e4SLinus Torvalds unsigned int offset) 1591da177e4SLinus Torvalds { 1601da177e4SLinus Torvalds *dst_id = src_kctl->id; 1611da177e4SLinus Torvalds dst_id->index += offset; 1621da177e4SLinus Torvalds dst_id->numid += offset; 1631da177e4SLinus Torvalds return dst_id; 1641da177e4SLinus Torvalds } 1651da177e4SLinus Torvalds 1661da177e4SLinus Torvalds #endif /* __SOUND_CONTROL_H */ 167