linux/sound/usb/mixer.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __USBMIXER_H
   3#define __USBMIXER_H
   4
   5#include <sound/info.h>
   6
   7struct media_mixer_ctl;
   8
   9struct usb_mixer_interface {
  10        struct snd_usb_audio *chip;
  11        struct usb_host_interface *hostif;
  12        struct list_head list;
  13        unsigned int ignore_ctl_error;
  14        struct urb *urb;
  15        /* array[MAX_ID_ELEMS], indexed by unit id */
  16        struct usb_mixer_elem_list **id_elems;
  17
  18        /* the usb audio specification version this interface complies to */
  19        int protocol;
  20
  21        /* Sound Blaster remote control stuff */
  22        const struct rc_config *rc_cfg;
  23        u32 rc_code;
  24        wait_queue_head_t rc_waitq;
  25        struct urb *rc_urb;
  26        struct usb_ctrlrequest *rc_setup_packet;
  27        u8 rc_buffer[6];
  28        struct media_mixer_ctl *media_mixer_ctl;
  29
  30        bool disconnected;
  31
  32        void *private_data;
  33        void (*private_free)(struct usb_mixer_interface *mixer);
  34        void (*private_suspend)(struct usb_mixer_interface *mixer);
  35};
  36
  37#define MAX_CHANNELS    16      /* max logical channels */
  38
  39enum {
  40        USB_MIXER_BOOLEAN,
  41        USB_MIXER_INV_BOOLEAN,
  42        USB_MIXER_S8,
  43        USB_MIXER_U8,
  44        USB_MIXER_S16,
  45        USB_MIXER_U16,
  46        USB_MIXER_S32,
  47        USB_MIXER_U32,
  48};
  49
  50typedef void (*usb_mixer_elem_dump_func_t)(struct snd_info_buffer *buffer,
  51                                         struct usb_mixer_elem_list *list);
  52typedef int (*usb_mixer_elem_resume_func_t)(struct usb_mixer_elem_list *elem);
  53
  54struct usb_mixer_elem_list {
  55        struct usb_mixer_interface *mixer;
  56        struct usb_mixer_elem_list *next_id_elem; /* list of controls with same id */
  57        struct snd_kcontrol *kctl;
  58        unsigned int id;
  59        usb_mixer_elem_dump_func_t dump;
  60        usb_mixer_elem_resume_func_t resume;
  61};
  62
  63/* iterate over mixer element list of the given unit id */
  64#define for_each_mixer_elem(list, mixer, id)    \
  65        for ((list) = (mixer)->id_elems[id]; (list); (list) = (list)->next_id_elem)
  66#define mixer_elem_list_to_info(list) \
  67        container_of(list, struct usb_mixer_elem_info, head)
  68
  69struct usb_mixer_elem_info {
  70        struct usb_mixer_elem_list head;
  71        unsigned int control;   /* CS or ICN (high byte) */
  72        unsigned int cmask; /* channel mask bitmap: 0 = master */
  73        unsigned int idx_off; /* Control index offset */
  74        unsigned int ch_readonly;
  75        unsigned int master_readonly;
  76        int channels;
  77        int val_type;
  78        int min, max, res;
  79        int dBmin, dBmax;
  80        int cached;
  81        int cache_val[MAX_CHANNELS];
  82        u8 initialized;
  83        u8 min_mute;
  84        void *private_data;
  85};
  86
  87int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
  88                         int ignore_error);
  89void snd_usb_mixer_disconnect(struct usb_mixer_interface *mixer);
  90
  91void snd_usb_mixer_notify_id(struct usb_mixer_interface *mixer, int unitid);
  92
  93int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval,
  94                                int request, int validx, int value_set);
  95
  96int snd_usb_mixer_add_control(struct usb_mixer_elem_list *list,
  97                              struct snd_kcontrol *kctl);
  98
  99void snd_usb_mixer_elem_init_std(struct usb_mixer_elem_list *list,
 100                                 struct usb_mixer_interface *mixer,
 101                                 int unitid);
 102
 103int snd_usb_mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
 104                          unsigned int size, unsigned int __user *_tlv);
 105
 106#ifdef CONFIG_PM
 107int snd_usb_mixer_suspend(struct usb_mixer_interface *mixer);
 108int snd_usb_mixer_resume(struct usb_mixer_interface *mixer, bool reset_resume);
 109#endif
 110
 111int snd_usb_set_cur_mix_value(struct usb_mixer_elem_info *cval, int channel,
 112                             int index, int value);
 113
 114int snd_usb_get_cur_mix_value(struct usb_mixer_elem_info *cval,
 115                             int channel, int index, int *value);
 116
 117extern void snd_usb_mixer_elem_free(struct snd_kcontrol *kctl);
 118
 119extern struct snd_kcontrol_new *snd_usb_feature_unit_ctl;
 120
 121#endif /* __USBMIXER_H */
 122