home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / sound / control.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  5.3 KB  |  153 lines

  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.