caiaq-device.h 3.5 KB
Newer Older
1 2 3 4 5 6 7 8
#ifndef CAIAQ_DEVICE_H
#define CAIAQ_DEVICE_H

#include "../usbaudio.h"

#define USB_VID_NATIVEINSTRUMENTS 0x17cc

#define USB_PID_RIGKONTROL2	0x1969
9
#define USB_PID_RIGKONTROL3	0x1940
10
#define USB_PID_KORECONTROLLER	0x4711
11
#define USB_PID_KORECONTROLLER2	0x4712
12
#define USB_PID_AK1		0x0815
13
#define USB_PID_AUDIO4DJ	0x0839
14
#define USB_PID_AUDIO8DJ	0x1978
15
#define USB_PID_SESSIONIO	0x1915
16
#define USB_PID_GUITARRIGMOBILE	0x0d8d
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

#define EP1_BUFSIZE 64
#define CAIAQ_USB_STR_LEN 0xff
#define MAX_STREAMS 32

//#define	SND_USB_CAIAQ_DEBUG

#define MODNAME "snd-usb-caiaq"
#define log(x...) snd_printk(KERN_WARNING MODNAME" log: " x)

#ifdef SND_USB_CAIAQ_DEBUG
#define debug(x...) snd_printk(KERN_WARNING MODNAME " debug: " x)
#else
#define debug(x...) do { } while(0)
#endif

#define EP1_CMD_GET_DEVICE_INFO	0x1
#define EP1_CMD_READ_ERP	0x2
#define EP1_CMD_READ_ANALOG	0x3
#define EP1_CMD_READ_IO		0x4
#define EP1_CMD_WRITE_IO	0x5
#define EP1_CMD_MIDI_READ	0x6
#define EP1_CMD_MIDI_WRITE	0x7
#define EP1_CMD_AUDIO_PARAMS	0x9
#define EP1_CMD_AUTO_MSG	0xb
42
#define EP1_CMD_DIMM_LEDS       0xc
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

struct caiaq_device_spec {
	unsigned short fw_version;
	unsigned char hw_subtype;
	unsigned char num_erp;
	unsigned char num_analog_in;
	unsigned char num_digital_in;
	unsigned char num_digital_out;
	unsigned char num_analog_audio_out;
	unsigned char num_analog_audio_in;
	unsigned char num_digital_audio_out;
	unsigned char num_digital_audio_in;
	unsigned char num_midi_out;
	unsigned char num_midi_in;
	unsigned char data_alignment;
} __attribute__ ((packed));

struct snd_usb_caiaq_cb_info;

struct snd_usb_caiaqdev {
	struct snd_usb_audio chip;

	struct urb ep1_in_urb;
	struct urb midi_out_urb;
	struct urb **data_urbs_in;
	struct urb **data_urbs_out;
	struct snd_usb_caiaq_cb_info *data_cb_info;
70

71 72 73 74 75 76 77 78 79
	unsigned char ep1_in_buf[EP1_BUFSIZE];
	unsigned char ep1_out_buf[EP1_BUFSIZE];
	unsigned char midi_out_buf[EP1_BUFSIZE];

	struct caiaq_device_spec spec;
	spinlock_t spinlock;
	wait_queue_head_t ep1_wait_queue;
	wait_queue_head_t prepare_wait_queue;
	int spec_received, audio_parm_answer;
T
Takashi Iwai 已提交
80
	int midi_out_active;
81

82 83 84 85 86 87 88 89 90 91
	char vendor_name[CAIAQ_USB_STR_LEN];
	char product_name[CAIAQ_USB_STR_LEN];
	char serial[CAIAQ_USB_STR_LEN];

	int n_streams, n_audio_in, n_audio_out;
	int streaming, first_packet, output_running;
	int audio_in_buf_pos[MAX_STREAMS];
	int audio_out_buf_pos[MAX_STREAMS];
	int period_in_count[MAX_STREAMS];
	int period_out_count[MAX_STREAMS];
92
	int input_panic, output_panic, warned;
93
	char *audio_in_buf, *audio_out_buf;
94
	unsigned int samplerates, bpp;
95 96 97 98

	struct snd_pcm_substream *sub_playback[MAX_STREAMS];
	struct snd_pcm_substream *sub_capture[MAX_STREAMS];

99 100 101
	/* Controls */
	unsigned char control_state[64];

102 103 104
	/* Linux input */
#ifdef CONFIG_SND_USB_CAIAQ_INPUT
	struct input_dev *input_dev;
105
	char phys[64];			/* physical device path */
106
	unsigned short keycode[64];
107
#endif
108

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
	/* ALSA */
	struct snd_pcm *pcm;
	struct snd_pcm_hardware pcm_info;
	struct snd_rawmidi *rmidi;
	struct snd_rawmidi_substream *midi_receive_substream;
	struct snd_rawmidi_substream *midi_out_substream;
};

struct snd_usb_caiaq_cb_info {
	struct snd_usb_caiaqdev *dev;
	int index;
};

#define caiaqdev(c) ((struct snd_usb_caiaqdev*)(c)->private_data)

int snd_usb_caiaq_set_audio_params (struct snd_usb_caiaqdev *dev, int rate, int depth, int bbp);
int snd_usb_caiaq_set_auto_msg (struct snd_usb_caiaqdev *dev, int digital, int analog, int erp);
126 127 128 129
int snd_usb_caiaq_send_command(struct snd_usb_caiaqdev *dev,
			       unsigned char command,
			       const unsigned char *buffer,
			       int len);
130 131

#endif /* CAIAQ_DEVICE_H */