2010-03-04 19:46:12 +01:00
# ifndef __USBMIXER_H
# define __USBMIXER_H
2014-11-18 11:47:04 +01:00
# include <sound/info.h>
2010-03-11 21:13:22 +01:00
struct usb_mixer_interface {
struct snd_usb_audio * chip ;
2011-08-04 15:56:28 +02:00
struct usb_host_interface * hostif ;
2010-03-11 21:13:22 +01:00
struct list_head list ;
unsigned int ignore_ctl_error ;
struct urb * urb ;
/* array[MAX_ID_ELEMS], indexed by unit id */
2014-11-18 11:47:04 +01:00
struct usb_mixer_elem_list * * id_elems ;
2010-03-11 21:13:22 +01:00
2010-03-11 21:13:25 +01:00
/* the usb audio specification version this interface complies to */
int protocol ;
2010-03-11 21:13:22 +01:00
/* Sound Blaster remote control stuff */
const struct rc_config * rc_cfg ;
u32 rc_code ;
wait_queue_head_t rc_waitq ;
struct urb * rc_urb ;
struct usb_ctrlrequest * rc_setup_packet ;
u8 rc_buffer [ 6 ] ;
} ;
2011-05-25 09:09:01 +02:00
# define MAX_CHANNELS 16 /* max logical channels */
enum {
USB_MIXER_BOOLEAN ,
USB_MIXER_INV_BOOLEAN ,
USB_MIXER_S8 ,
USB_MIXER_U8 ,
USB_MIXER_S16 ,
USB_MIXER_U16 ,
2015-08-14 16:14:45 +02:00
USB_MIXER_S32 ,
USB_MIXER_U32 ,
2011-05-25 09:09:01 +02:00
} ;
2010-03-11 21:13:22 +01:00
2014-11-18 11:47:04 +01:00
typedef void ( * usb_mixer_elem_dump_func_t ) ( struct snd_info_buffer * buffer ,
struct usb_mixer_elem_list * list ) ;
typedef int ( * usb_mixer_elem_resume_func_t ) ( struct usb_mixer_elem_list * elem ) ;
struct usb_mixer_elem_list {
2010-03-11 21:13:22 +01:00
struct usb_mixer_interface * mixer ;
2014-11-18 11:47:04 +01:00
struct usb_mixer_elem_list * next_id_elem ; /* list of controls with same id */
struct snd_kcontrol * kctl ;
2010-03-11 21:13:22 +01:00
unsigned int id ;
2014-11-18 11:47:04 +01:00
usb_mixer_elem_dump_func_t dump ;
usb_mixer_elem_resume_func_t resume ;
} ;
struct usb_mixer_elem_info {
struct usb_mixer_elem_list head ;
2010-03-11 21:13:22 +01:00
unsigned int control ; /* CS or ICN (high byte) */
unsigned int cmask ; /* channel mask bitmap: 0 = master */
2012-11-28 23:55:35 +01:00
unsigned int idx_off ; /* Control index offset */
2010-05-31 13:35:37 +02:00
unsigned int ch_readonly ;
unsigned int master_readonly ;
2010-03-11 21:13:22 +01:00
int channels ;
int val_type ;
int min , max , res ;
int dBmin , dBmax ;
int cached ;
int cache_val [ MAX_CHANNELS ] ;
u8 initialized ;
2014-11-12 12:07:00 -06:00
void * private_data ;
2010-03-11 21:13:22 +01:00
} ;
2010-03-04 19:46:12 +01:00
int snd_usb_create_mixer ( struct snd_usb_audio * chip , int ctrlif ,
int ignore_error ) ;
2014-10-31 11:24:32 +01:00
void snd_usb_mixer_disconnect ( struct usb_mixer_interface * mixer ) ;
2010-03-04 19:46:12 +01:00
2010-03-11 21:13:22 +01:00
void snd_usb_mixer_notify_id ( struct usb_mixer_interface * mixer , int unitid ) ;
int snd_usb_mixer_set_ctl_value ( struct usb_mixer_elem_info * cval ,
int request , int validx , int value_set ) ;
2010-03-04 19:46:12 +01:00
2014-11-18 11:47:04 +01:00
int snd_usb_mixer_add_control ( struct usb_mixer_elem_list * list ,
2011-05-25 09:09:00 +02:00
struct snd_kcontrol * kctl ) ;
2014-11-18 11:47:04 +01:00
void snd_usb_mixer_elem_init_std ( struct usb_mixer_elem_list * list ,
struct usb_mixer_interface * mixer ,
int unitid ) ;
2012-04-23 20:24:24 +02:00
int snd_usb_mixer_vol_tlv ( struct snd_kcontrol * kcontrol , int op_flag ,
unsigned int size , unsigned int __user * _tlv ) ;
2014-01-20 16:51:16 +01:00
# ifdef CONFIG_PM
int snd_usb_mixer_suspend ( struct usb_mixer_interface * mixer ) ;
int snd_usb_mixer_resume ( struct usb_mixer_interface * mixer , bool reset_resume ) ;
# endif
2014-11-12 12:07:01 -06:00
int snd_usb_set_cur_mix_value ( struct usb_mixer_elem_info * cval , int channel ,
int index , int value ) ;
int snd_usb_get_cur_mix_value ( struct usb_mixer_elem_info * cval ,
int channel , int index , int * value ) ;
extern void snd_usb_mixer_elem_free ( struct snd_kcontrol * kctl ) ;
2010-03-04 19:46:12 +01:00
# endif /* __USBMIXER_H */