2005-04-17 02:20:36 +04:00
/*
* dev_table . h
*
* Global definitions for device call tables
*
*
* Copyright ( C ) by Hannu Savolainen 1993 - 1997
*
* OSS / Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE ( GPL )
* Version 2 ( June 1991 ) . See the " COPYING " file distributed with this software
* for more info .
*/
# ifndef _DEV_TABLE_H_
# define _DEV_TABLE_H_
# include <linux/spinlock.h>
/*
* Sound card numbers 27 to 999. ( 1 to 26 are defined in soundcard . h )
* Numbers 1000 to N are reserved for driver ' s internal use .
*/
# define SNDCARD_DESKPROXL 27 /* Compaq Deskpro XL */
# define SNDCARD_VIDC 28 /* ARMs VIDC */
# define SNDCARD_SBPNP 29
# define SNDCARD_SOFTOSS 36
# define SNDCARD_VMIDI 37
# define SNDCARD_OPL3SA1 38 /* Note: clash in msnd.h */
# define SNDCARD_OPL3SA1_SB 39
# define SNDCARD_OPL3SA1_MPU 40
# define SNDCARD_WAVEFRONT 41
# define SNDCARD_OPL3SA2 42
# define SNDCARD_OPL3SA2_MPU 43
# define SNDCARD_WAVEARTIST 44 /* Waveartist */
# define SNDCARD_OPL3SA2_MSS 45 /* Originally missed */
# define SNDCARD_AD1816 88
/*
* NOTE ! NOTE ! NOTE ! NOTE !
*
* If you modify this file , please check the dev_table . c also .
*
* NOTE ! NOTE ! NOTE ! NOTE !
*/
struct driver_info
{
char * driver_id ;
int card_subtype ; /* Driver specific. Usually 0 */
int card_type ; /* From soundcard.h */
char * name ;
void ( * attach ) ( struct address_info * hw_config ) ;
int ( * probe ) ( struct address_info * hw_config ) ;
void ( * unload ) ( struct address_info * hw_config ) ;
} ;
struct card_info
{
int card_type ; /* Link (search key) to the driver list */
struct address_info config ;
int enabled ;
void * for_driver_use ;
} ;
/*
* Device specific parameters ( used only by dmabuf . c )
*/
# define MAX_SUB_BUFFERS (32*MAX_REALTIME_FACTOR)
# define DMODE_NONE 0
# define DMODE_OUTPUT PCM_ENABLE_OUTPUT
# define DMODE_INPUT PCM_ENABLE_INPUT
struct dma_buffparms
{
int dma_mode ; /* DMODE_INPUT, DMODE_OUTPUT or DMODE_NONE */
int closing ;
/*
* Pointers to raw buffers
*/
char * raw_buf ;
unsigned long raw_buf_phys ;
int buffsize ;
/*
* Device state tables
*/
unsigned long flags ;
# define DMA_BUSY 0x00000001
# define DMA_RESTART 0x00000002
# define DMA_ACTIVE 0x00000004
# define DMA_STARTED 0x00000008
# define DMA_EMPTY 0x00000010
# define DMA_ALLOC_DONE 0x00000020
# define DMA_SYNCING 0x00000040
# define DMA_DIRTY 0x00000080
# define DMA_POST 0x00000100
# define DMA_NODMA 0x00000200
# define DMA_NOTIMEOUT 0x00000400
int open_mode ;
/*
* Queue parameters .
*/
int qlen ;
int qhead ;
int qtail ;
spinlock_t lock ;
int cfrag ; /* Current incomplete fragment (write) */
int nbufs ;
int counts [ MAX_SUB_BUFFERS ] ;
int subdivision ;
int fragment_size ;
int needs_reorg ;
int max_fragments ;
int bytes_in_use ;
int underrun_count ;
unsigned long byte_counter ;
unsigned long user_counter ;
unsigned long max_byte_counter ;
int data_rate ; /* Bytes/second */
int mapping_flags ;
# define DMA_MAP_MAPPED 0x00000001
char neutral_byte ;
int dma ; /* DMA channel */
int applic_profile ; /* Application profile (APF_*) */
/* Interrupt callback stuff */
void ( * audio_callback ) ( int dev , int parm ) ;
int callback_parm ;
int buf_flags [ MAX_SUB_BUFFERS ] ;
# define BUFF_EOF 0x00000001 /* Increment eof count */
# define BUFF_DIRTY 0x00000002 /* Buffer written */
} ;
/*
* Structure for use with various microcontrollers and DSP processors
* in the recent sound cards .
*/
typedef struct coproc_operations
{
char name [ 64 ] ;
struct module * owner ;
int ( * open ) ( void * devc , int sub_device ) ;
void ( * close ) ( void * devc , int sub_device ) ;
int ( * ioctl ) ( void * devc , unsigned int cmd , void __user * arg , int local ) ;
void ( * reset ) ( void * devc ) ;
void * devc ; /* Driver specific info */
} coproc_operations ;
struct audio_driver
{
struct module * owner ;
int ( * open ) ( int dev , int mode ) ;
void ( * close ) ( int dev ) ;
void ( * output_block ) ( int dev , unsigned long buf ,
int count , int intrflag ) ;
void ( * start_input ) ( int dev , unsigned long buf ,
int count , int intrflag ) ;
int ( * ioctl ) ( int dev , unsigned int cmd , void __user * arg ) ;
int ( * prepare_for_input ) ( int dev , int bufsize , int nbufs ) ;
int ( * prepare_for_output ) ( int dev , int bufsize , int nbufs ) ;
void ( * halt_io ) ( int dev ) ;
int ( * local_qlen ) ( int dev ) ;
void ( * copy_user ) ( int dev ,
char * localbuf , int localoffs ,
const char __user * userbuf , int useroffs ,
int max_in , int max_out ,
int * used , int * returned ,
int len ) ;
void ( * halt_input ) ( int dev ) ;
void ( * halt_output ) ( int dev ) ;
void ( * trigger ) ( int dev , int bits ) ;
int ( * set_speed ) ( int dev , int speed ) ;
unsigned int ( * set_bits ) ( int dev , unsigned int bits ) ;
short ( * set_channels ) ( int dev , short channels ) ;
void ( * postprocess_write ) ( int dev ) ; /* Device spesific postprocessing for written data */
void ( * preprocess_read ) ( int dev ) ; /* Device spesific preprocessing for read data */
void ( * mmap ) ( int dev ) ;
} ;
struct audio_operations
{
char name [ 128 ] ;
int flags ;
# define NOTHING_SPECIAL 0x00
# define NEEDS_RESTART 0x01
# define DMA_AUTOMODE 0x02
# define DMA_DUPLEX 0x04
# define DMA_PSEUDO_AUTOMODE 0x08
# define DMA_HARDSTOP 0x10
# define DMA_EXACT 0x40
# define DMA_NORESET 0x80
int format_mask ; /* Bitmask for supported audio formats */
void * devc ; /* Driver specific info */
struct audio_driver * d ;
void * portc ; /* Driver specific info */
struct dma_buffparms * dmap_in , * dmap_out ;
struct coproc_operations * coproc ;
int mixer_dev ;
int enable_bits ;
int open_mode ;
int go ;
int min_fragment ; /* 0 == unlimited */
int max_fragment ; /* 0 == unlimited */
int parent_dev ; /* 0 -> no parent, 1 to n -> parent=parent_dev+1 */
/* fields formerly in dmabuf.c */
wait_queue_head_t in_sleeper ;
wait_queue_head_t out_sleeper ;
wait_queue_head_t poll_sleeper ;
/* fields formerly in audio.c */
int audio_mode ;
# define AM_NONE 0
# define AM_WRITE OPEN_WRITE
# define AM_READ OPEN_READ
int local_format ;
int audio_format ;
int local_conversion ;
# define CNV_MU_LAW 0x00000001
/* large structures at the end to keep offsets small */
struct dma_buffparms dmaps [ 2 ] ;
} ;
int * load_mixer_volumes ( char * name , int * levels , int present ) ;
struct mixer_operations
{
struct module * owner ;
char id [ 16 ] ;
char name [ 64 ] ;
int ( * ioctl ) ( int dev , unsigned int cmd , void __user * arg ) ;
void * devc ;
int modify_counter ;
} ;
struct synth_operations
{
struct module * owner ;
char * id ; /* Unique identifier (ASCII) max 29 char */
struct synth_info * info ;
int midi_dev ;
int synth_type ;
int synth_subtype ;
int ( * open ) ( int dev , int mode ) ;
void ( * close ) ( int dev ) ;
int ( * ioctl ) ( int dev , unsigned int cmd , void __user * arg ) ;
int ( * kill_note ) ( int dev , int voice , int note , int velocity ) ;
int ( * start_note ) ( int dev , int voice , int note , int velocity ) ;
int ( * set_instr ) ( int dev , int voice , int instr ) ;
void ( * reset ) ( int dev ) ;
void ( * hw_control ) ( int dev , unsigned char * event ) ;
int ( * load_patch ) ( int dev , int format , const char __user * addr ,
int offs , int count , int pmgr_flag ) ;
void ( * aftertouch ) ( int dev , int voice , int pressure ) ;
void ( * controller ) ( int dev , int voice , int ctrl_num , int value ) ;
void ( * panning ) ( int dev , int voice , int value ) ;
void ( * volume_method ) ( int dev , int mode ) ;
void ( * bender ) ( int dev , int chn , int value ) ;
int ( * alloc_voice ) ( int dev , int chn , int note , struct voice_alloc_info * alloc ) ;
void ( * setup_voice ) ( int dev , int voice , int chn ) ;
int ( * send_sysex ) ( int dev , unsigned char * bytes , int len ) ;
struct voice_alloc_info alloc ;
struct channel_info chn_info [ 16 ] ;
int emulation ;
# define EMU_GM 1 /* General MIDI */
# define EMU_XG 2 /* Yamaha XG */
# define MAX_SYSEX_BUF 64
unsigned char sysex_buf [ MAX_SYSEX_BUF ] ;
int sysex_ptr ;
} ;
struct midi_input_info
{
/* MIDI input scanner variables */
# define MI_MAX 10
volatile int m_busy ;
unsigned char m_buf [ MI_MAX ] ;
unsigned char m_prev_status ; /* For running status */
int m_ptr ;
# define MST_INIT 0
# define MST_DATA 1
# define MST_SYSEX 2
int m_state ;
int m_left ;
} ;
struct midi_operations
{
struct module * owner ;
struct midi_info info ;
struct synth_operations * converter ;
struct midi_input_info in_info ;
int ( * open ) ( int dev , int mode ,
void ( * inputintr ) ( int dev , unsigned char data ) ,
void ( * outputintr ) ( int dev )
) ;
void ( * close ) ( int dev ) ;
int ( * ioctl ) ( int dev , unsigned int cmd , void __user * arg ) ;
int ( * outputc ) ( int dev , unsigned char data ) ;
int ( * start_read ) ( int dev ) ;
int ( * end_read ) ( int dev ) ;
void ( * kick ) ( int dev ) ;
int ( * command ) ( int dev , unsigned char * data ) ;
int ( * buffer_status ) ( int dev ) ;
int ( * prefix_cmd ) ( int dev , unsigned char status ) ;
struct coproc_operations * coproc ;
void * devc ;
} ;
struct sound_lowlev_timer
{
int dev ;
int priority ;
unsigned int ( * tmr_start ) ( int dev , unsigned int usecs ) ;
void ( * tmr_disable ) ( int dev ) ;
void ( * tmr_restart ) ( int dev ) ;
} ;
struct sound_timer_operations
{
struct module * owner ;
struct sound_timer_info info ;
int priority ;
int devlink ;
int ( * open ) ( int dev , int mode ) ;
void ( * close ) ( int dev ) ;
int ( * event ) ( int dev , unsigned char * ev ) ;
unsigned long ( * get_time ) ( int dev ) ;
int ( * ioctl ) ( int dev , unsigned int cmd , void __user * arg ) ;
void ( * arm_timer ) ( int dev , long time ) ;
} ;
extern struct sound_timer_operations default_sound_timer ;
2006-10-04 13:17:31 +04:00
2005-04-17 02:20:36 +04:00
extern struct audio_operations * audio_devs [ MAX_AUDIO_DEV ] ;
extern int num_audiodevs ;
extern struct mixer_operations * mixer_devs [ MAX_MIXER_DEV ] ;
extern int num_mixers ;
extern struct synth_operations * synth_devs [ MAX_SYNTH_DEV + MAX_MIDI_DEV ] ;
extern int num_synths ;
extern struct midi_operations * midi_devs [ MAX_MIDI_DEV ] ;
extern int num_midis ;
extern struct sound_timer_operations * sound_timer_devs [ MAX_TIMER_DEV ] ;
extern int num_sound_timers ;
extern int sound_map_buffer ( int dev , struct dma_buffparms * dmap , buffmem_desc * info ) ;
void sound_timer_init ( struct sound_lowlev_timer * t , char * name ) ;
void sound_dma_intr ( int dev , struct dma_buffparms * dmap , int chan ) ;
# define AUDIO_DRIVER_VERSION 2
# define MIXER_DRIVER_VERSION 2
int sound_install_audiodrv ( int vers , char * name , struct audio_driver * driver ,
int driver_size , int flags , unsigned int format_mask ,
void * devc , int dma1 , int dma2 ) ;
int sound_install_mixer ( int vers , char * name , struct mixer_operations * driver ,
int driver_size , void * devc ) ;
void sound_unload_audiodev ( int dev ) ;
void sound_unload_mixerdev ( int dev ) ;
void sound_unload_mididev ( int dev ) ;
void sound_unload_synthdev ( int dev ) ;
void sound_unload_timerdev ( int dev ) ;
int sound_alloc_mixerdev ( void ) ;
int sound_alloc_timerdev ( void ) ;
int sound_alloc_synthdev ( void ) ;
int sound_alloc_mididev ( void ) ;
# endif /* _DEV_TABLE_H_ */