To create a new control, you need to define the
	following three
      callbacks: info,
      get and
      put. Then, define a
      struct snd_kcontrol_new record, such as: 
        
Example 6.1. Definition of a Control
  static struct snd_kcontrol_new my_control = {
          .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
          .name = "PCM Playback Switch",
          .index = 0,
          .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
          .private_value = 0xffff,
          .info = my_control_info,
          .get = my_control_get,
          .put = my_control_put
  };
          
      
        The iface field specifies the control
      type, SNDRV_CTL_ELEM_IFACE_XXX, which
      is usually MIXER.
      Use CARD for global controls that are not
      logically part of the mixer.
      If the control is closely associated with some specific device on
      the sound card, use HWDEP,
      PCM, RAWMIDI,
      TIMER, or SEQUENCER, and
      specify the device number with the
      device and
      subdevice fields.
      
        The name is the name identifier
      string. Since ALSA 0.9.x, the control name is very important,
      because its role is classified from its name. There are
      pre-defined standard control names. The details are described in
      the 
      Control Names subsection.
      
        The index field holds the index number
      of this control. If there are several different controls with
      the same name, they can be distinguished by the index
      number. This is the case when 
      several codecs exist on the card. If the index is zero, you can
      omit the definition above. 
      
        The access field contains the access
      type of this control. Give the combination of bit masks,
      SNDRV_CTL_ELEM_ACCESS_XXX, there.
      The details will be explained in
      the 
      Access Flags subsection.
      
        The private_value field contains
      an arbitrary long integer value for this record. When using
      the generic info,
      get and
      put callbacks, you can pass a value 
      through this field. If several small numbers are necessary, you can
      combine them in bitwise. Or, it's possible to give a pointer
      (casted to unsigned long) of some record to this field, too. 
      
      The tlv field can be used to provide
      metadata about the control; see the
      
      Metadata subsection.
      
The other three are callback functions.