summaryrefslogtreecommitdiff
path: root/kernel/drv/oss_usb/ossusb.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/drv/oss_usb/ossusb.h')
-rw-r--r--kernel/drv/oss_usb/ossusb.h246
1 files changed, 246 insertions, 0 deletions
diff --git a/kernel/drv/oss_usb/ossusb.h b/kernel/drv/oss_usb/ossusb.h
new file mode 100644
index 0000000..df28418
--- /dev/null
+++ b/kernel/drv/oss_usb/ossusb.h
@@ -0,0 +1,246 @@
+/*
+ * Purpose: Definitions for the USB audio driver files
+ */
+/*
+ *
+ * This file is part of Open Sound System.
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This this source file is released under GPL v2 license (no other versions).
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ *
+ */
+
+#ifndef __OSUSB_H_
+#define __OSUSB_H_
+
+#include "udi.h"
+#include "midi_core.h"
+
+#define CS_DEVICE 0x21
+#define CS_CONFIG 0x22
+#define CS_STRING 0x23
+#define CS_INTERFACE 0x24
+#define CS_ENDPOINT 0x25
+
+#define AC_HEADER 0x01
+#define AC_INPUT_TERMINAL 0x02
+#define AC_OUTPUT_TERMINAL 0x03
+#define AC_MIXER_UNIT 0x04
+#define AC_SELECTOR_UNIT 0x05
+#define AC_FEATURE_UNIT 0x06
+#define AC_PROCESSING_UNIT 0x07
+#define AC_EXTENSION_UNIT 0x08
+
+#define AS_GENERAL 0x01
+#define AS_FORMAT_TYPE 0x02
+#define AS_FORMAT_SPECIFIC 0x03
+
+#define SET_CUR 0x01
+#define SET_MEM 0x05
+#define GET_CUR 0x81
+#define GET_MIN 0x82
+#define GET_MAX 0x83
+#define GET_RES 0x84
+#define GET_MEM 0x85
+#define GET_STAT 0xff
+
+#define USB_RECIP_MASK 0x1f
+#define USB_RECIP_DEVICE 0x00
+#define USB_RECIP_INTERFACE 0x01
+#define USB_RECIP_ENDPOINT 0x02
+#define USB_RECIP_OTHER 0x03
+#define USB_VENDOR_REQUEST 0x40
+
+#define USB_TYPE_CLASS 0x20
+
+/*
+ * Unit types
+ *
+ * Note that TY_OUTPUT is actually PCM input and TY_INPUT is actually
+ * PCM output. Unit types are defined as seen as the USB control interface.
+ * Input terminals listen to the output streaming interfases and output
+ * terminals feed the input streaming interfaces. Confusing it is.
+ */
+#define TY_INPUT 0
+#define TY_OUTPUT 1
+#define TY_MIXER 2
+#define TY_SELECT 3
+#define TY_FEAT 4
+#define TY_PROC 5
+#define TY_EXT 6
+// Remember to inclease size of devc->unit_counters[] if adding more unit types
+
+#define USBCLASS_AUDIO 1
+#define USBCLASS_HID 3
+
+#define MAX_IFACE 10
+
+typedef struct
+{
+ int num;
+ int typ; // TY_*
+ int subtyp;
+ char name[16];
+ unsigned char *desc;
+ int desclen;
+ int mixnum;
+ int target;
+ int source;
+ int ctl_avail;
+ int control_count;
+ int channels;
+ int chmask;
+} usb_audio_unit_t;
+
+#define MAX_UNIT 40
+#define MAX_CONTROLS 100
+#define MAX_PORTC 8 /* Max audio streaming interfaces per device */
+#define MAX_MIDIC 16 /* Max MIDI streaming interfaces per device */
+
+typedef struct
+{
+ usb_audio_unit_t *unit;
+ int index;
+ int flags;
+ int min_ch, max_ch;
+ int global;
+ int chmask;
+ int value;
+ int min, max, scale;
+ int exttype;
+} usb_control_t;
+
+typedef struct ossusb_devc ossusb_devc;
+
+typedef struct
+{
+ ossusb_devc *devc;
+ int disabled;
+ int if_number;
+ void *endpoint_desc, *orig_endpoint_desc;
+ udi_endpoint_handle_t *endpoint_handle;
+ int audio_dev;
+ int open_mode;
+ int permitted_modes;
+ int prepared_modes;
+ int stopping;
+
+ int speed;
+ int bytes_per_sample;
+ int terminal_link;
+ udi_usb_devc *usbdev;
+ int num_settings;
+ int act_setting;
+
+#define NR_DATAPIPES 2
+ udi_usb_request_t *datapipe[NR_DATAPIPES];
+ int curr_datapipe;
+ int fragment_size; /* Bytes per (1ms) USB tick */
+ int overflow_samples, overflow_size;
+ int convert_3byte;
+ int pipeline_delay;
+ unsigned char *tmp_buf[2];
+ int use_tmpbuf;
+ oss_dma_handle_t tmpbuf_dma_handle[2];
+} ossusb_portc;
+
+typedef struct
+{
+ struct ossusb_devc *devc;
+ oss_device_t *osdev;
+ udi_usb_devc *usbdev;
+
+ void *in_endpoint_desc, *out_endpoint_desc;
+ udi_endpoint_handle_t *in_endpoint_handle, *out_endpoint_handle;
+ int portnum;
+ int midi_dev;
+ int open_mode;
+ // int output_endpoint;
+ oss_midi_inputbyte_t midi_input_intr;
+ oss_midi_outputintr_t midi_output_intr;
+} ossusb_midic;
+
+typedef void *(*special_driver_t) (ossusb_devc * devc);
+typedef void (*special_unload_t) (void *devc);
+
+struct ossusb_devc
+{
+ special_unload_t unload_func;
+ oss_device_t *osdev;
+ oss_device_t *main_osdev;
+ oss_mutex_t mutex;
+ int num_interfaces;
+ udi_usb_devc *usbdev[MAX_IFACE], *last_usbdev;
+ int inum[MAX_IFACE];
+ int vendor, product;
+ char *dev_name, devpath[32];
+ int nports;
+ int disabled;
+ int usb_version; // 1 or 2
+
+ /*
+ * Units
+ */
+
+ usb_audio_unit_t units[MAX_UNIT];
+ int nunits;
+ char unit_counters[7]; // For TY_* identifiers
+
+ /*
+ * Mixer stuff
+ */
+ int mixer_dev;
+ void *mixer_usbdev;
+ int devmask, recmask, stereodevs, recsrc;
+
+ int rec_unit;
+ int num_recdevs;
+ int recdevs[32];
+
+ int *levels;
+
+ usb_control_t controls[MAX_CONTROLS];
+ int ncontrols;
+
+/* Audio stuff */
+ int num_audio_engines, num_inputs, num_outputs;
+ ossusb_portc portc[MAX_PORTC];
+
+/* MIDI stuff */
+ int num_mididevs;
+ ossusb_midic midic[MAX_MIDIC];
+
+ unsigned char *playbuf;
+ oss_dma_handle_t playbuf_dma_handle;
+ udi_usb_request_t *output_pipe;
+ int output_busy;
+#define Q_MAX 4096
+ unsigned char queue[Q_MAX];
+ int q_nbytes;
+
+ unsigned char *recbuf;
+ oss_dma_handle_t recbuf_dma_handle;
+ udi_usb_request_t *input_pipe;
+ udi_endpoint_handle_t *input_endpoint_handle;
+};
+
+extern int usb_trace, usb_quiet;
+
+#define UDB(x) {if (usb_trace) x;}
+
+extern ossusb_devc *ossusb_init_audiostream (ossusb_devc * devc,
+ udi_usb_devc * usbdev, int inum,
+ int reinit);
+extern ossusb_devc *ossusb_init_midistream (ossusb_devc * devc,
+ udi_usb_devc * usbdev, int inum,
+ int reinit);
+extern void ossusb_disconnect_midistream (ossusb_devc * devc);
+extern void ossusb_dump_desc (unsigned char *desc, int cfg_len);
+extern unsigned int ossusb_get_int (unsigned char *p, int nbytes);
+extern int ossusb_change_altsetting (int dev, int ctrl, unsigned int cmd,
+ int value);
+extern void ossusb_create_altset_control(int dev, int portc_num, int nalt, char *name);
+#endif