/* * Advanced Linux Sound Architecture * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef __u8 #define __u8 uint8_t #define __u16 uint16_t #define __u32 uint32_t #define __s8 int8_t #define __s16 int16_t #define __s32 int32_t #endif #define SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE 0x3000 #define HDSP_MATRIX_MIXER_SIZE 2048 #define SNDRV_MASK_MAX 256 typedef struct fm_operator { unsigned char am_vib; unsigned char ksl_level; unsigned char attack_decay; unsigned char sustain_release; unsigned char wave_select; } fm_operator_t; typedef struct { unsigned int share_id[4]; /* share id - zero = no sharing */ unsigned char type; /* instrument type */ fm_operator_t op[4]; unsigned char feedback_connection[2]; unsigned char echo_delay; unsigned char echo_atten; unsigned char chorus_spread; unsigned char trnsps; unsigned char fix_dur; unsigned char modes; unsigned char fix_key; } fm_instrument_t; typedef struct fm_xoperator { __u8 am_vib; __u8 ksl_level; __u8 attack_decay; __u8 sustain_release; __u8 wave_select; } fm_xoperator_t; typedef struct fm_xinstrument { __u32 stype; /* structure type */ __u32 share_id[4]; /* share id - zero = no sharing */ __u8 type; /* instrument type */ fm_xoperator_t op[4]; /* fm operators */ __u8 feedback_connection[2]; __u8 echo_delay; __u8 echo_atten; __u8 chorus_spread; __u8 trnsps; __u8 fix_dur; __u8 modes; __u8 fix_key; } fm_xinstrument_t; typedef struct gf1_wave { unsigned int share_id[4]; /* share id - zero = no sharing */ unsigned int format; /* wave format */ struct { unsigned int number; /* some other ID for this instrument */ unsigned int memory; /* begin of waveform in onboard memory */ unsigned char *ptr; /* pointer to waveform in system memory */ } address; unsigned int size; /* size of waveform in samples */ unsigned int start; /* start offset in samples * 16 (lowest 4 bits - fraction) */ unsigned int loop_start; /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */ unsigned int loop_end; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */ unsigned short loop_repeat; /* loop repeat - 0 = forever */ unsigned char flags; /* GF1 patch flags */ unsigned char pad; unsigned int sample_rate; /* sample rate in Hz */ unsigned int low_frequency; /* low frequency range */ unsigned int high_frequency; /* high frequency range */ unsigned int root_frequency; /* root frequency range */ signed short tune; unsigned char balance; unsigned char envelope_rate[6]; unsigned char envelope_offset[6]; unsigned char tremolo_sweep; unsigned char tremolo_rate; unsigned char tremolo_depth; unsigned char vibrato_sweep; unsigned char vibrato_rate; unsigned char vibrato_depth; unsigned short scale_frequency; unsigned short scale_factor; /* 0-2048 or 0-2 */ struct gf1_wave *next; } gf1_wave_t; typedef struct { unsigned short exclusion; unsigned short exclusion_group; /* 0 - none, 1-65535 */ unsigned char effect1; /* effect 1 */ unsigned char effect1_depth; /* 0-127 */ unsigned char effect2; /* effect 2 */ unsigned char effect2_depth; /* 0-127 */ gf1_wave_t *wave; /* first waveform */ } gf1_instrument_t; typedef struct gf1_xwave { __u32 stype; /* structure type */ __u32 share_id[4]; /* share id - zero = no sharing */ __u32 format; /* wave format */ __u32 size; /* size of waveform in samples */ __u32 start; /* start offset in samples * 16 (lowest 4 bits - fraction) */ __u32 loop_start; /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */ __u32 loop_end; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */ __u16 loop_repeat; /* loop repeat - 0 = forever */ __u8 flags; /* GF1 patch flags */ __u8 pad; __u32 sample_rate; /* sample rate in Hz */ __u32 low_frequency; /* low frequency range */ __u32 high_frequency; /* high frequency range */ __u32 root_frequency; /* root frequency range */ __s16 tune; __u8 balance; __u8 envelope_rate[6]; __u8 envelope_offset[6]; __u8 tremolo_sweep; __u8 tremolo_rate; __u8 tremolo_depth; __u8 vibrato_sweep; __u8 vibrato_rate; __u8 vibrato_depth; __u16 scale_frequency; __u16 scale_factor; /* 0-2048 or 0-2 */ } gf1_xwave_t; typedef struct gf1_xinstrument { __u32 stype; __u16 exclusion; __u16 exclusion_group; /* 0 - none, 1-65535 */ __u8 effect1; /* effect 1 */ __u8 effect1_depth; /* 0-127 */ __u8 effect2; /* effect 2 */ __u8 effect2_depth; /* 0-127 */ } gf1_xinstrument_t; typedef struct gf1_info { unsigned char flags; /* supported wave flags */ unsigned char pad[3]; unsigned int features; /* supported features */ unsigned int max8_len; /* maximum 8-bit wave length */ unsigned int max16_len; /* maximum 16-bit wave length */ } gf1_info_t; typedef struct iwffff_wave { unsigned int share_id[4]; /* share id - zero = no sharing */ unsigned int format; /* wave format */ struct { unsigned int number; /* some other ID for this wave */ unsigned int memory; /* begin of waveform in onboard memory */ unsigned char *ptr; /* pointer to waveform in system memory */ } address; unsigned int size; /* size of waveform in samples */ unsigned int start; /* start offset in samples * 16 (lowest 4 bits - fraction) */ unsigned int loop_start; /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */ unsigned int loop_end; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */ unsigned short loop_repeat; /* loop repeat - 0 = forever */ unsigned int sample_ratio; /* sample ratio (44100 * 1024 / rate) */ unsigned char attenuation; /* 0 - 127 (no corresponding midi controller) */ unsigned char low_note; /* lower frequency range for this waveform */ unsigned char high_note; /* higher frequency range for this waveform */ unsigned char pad; struct iwffff_wave *next; } iwffff_wave_t; typedef struct iwffff_lfo { unsigned short freq; /* (0-2047) 0.01Hz - 21.5Hz */ signed short depth; /* volume +- (0-255) 0.48675dB/step */ signed short sweep; /* 0 - 950 deciseconds */ unsigned char shape; /* see to IWFFFF_LFO_SHAPE_XXXX */ unsigned char delay; /* 0 - 255 deciseconds */ } iwffff_lfo_t; typedef struct iwffff_env_point { unsigned short offset; unsigned short rate; } iwffff_env_point_t; typedef struct iwffff_env_record { unsigned short nattack; unsigned short nrelease; unsigned short sustain_offset; unsigned short sustain_rate; unsigned short release_rate; unsigned char hirange; unsigned char pad; struct iwffff_env_record *next; /* points are stored here */ /* count of points = nattack + nrelease */ } iwffff_env_record_t; typedef struct iwffff_env { unsigned char flags; unsigned char mode; unsigned char index; unsigned char pad; struct iwffff_env_record *record; } iwffff_env_t; typedef struct iwffff_layer { unsigned char flags; unsigned char velocity_mode; unsigned char layer_event; unsigned char low_range; /* range for layer based */ unsigned char high_range; /* on either velocity or frequency */ unsigned char pan; /* pan offset from CC1 (0 left - 127 right) */ unsigned char pan_freq_scale; /* position based on frequency (0-127) */ unsigned char attenuation; /* 0-127 (no corresponding midi controller) */ iwffff_lfo_t tremolo; /* tremolo effect */ iwffff_lfo_t vibrato; /* vibrato effect */ unsigned short freq_scale; /* 0-2048, 1024 is equal to semitone scaling */ unsigned char freq_center; /* center for keyboard frequency scaling */ unsigned char pad; iwffff_env_t penv; /* pitch envelope */ iwffff_env_t venv; /* volume envelope */ iwffff_wave_t *wave; struct iwffff_layer *next; } iwffff_layer_t; typedef struct { unsigned short exclusion; unsigned short layer_type; unsigned short exclusion_group; /* 0 - none, 1-65535 */ unsigned char effect1; /* effect 1 */ unsigned char effect1_depth; /* 0-127 */ unsigned char effect2; /* effect 2 */ unsigned char effect2_depth; /* 0-127 */ iwffff_layer_t *layer; /* first layer */ } iwffff_instrument_t; typedef struct iwffff_xwave { __u32 stype; /* structure type */ __u32 share_id[4]; /* share id - zero = no sharing */ __u32 format; /* wave format */ __u32 offset; /* offset to ROM (address) */ __u32 size; /* size of waveform in samples */ __u32 start; /* start offset in samples * 16 (lowest 4 bits - fraction) */ __u32 loop_start; /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */ __u32 loop_end; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */ __u16 loop_repeat; /* loop repeat - 0 = forever */ __u32 sample_ratio; /* sample ratio (44100 * 1024 / rate) */ __u8 attenuation; /* 0 - 127 (no corresponding midi controller) */ __u8 low_note; /* lower frequency range for this waveform */ __u8 high_note; /* higher frequency range for this waveform */ __u8 pad; } iwffff_xwave_t; typedef struct iwffff_xlfo { __u16 freq; /* (0-2047) 0.01Hz - 21.5Hz */ __s16 depth; /* volume +- (0-255) 0.48675dB/step */ __s16 sweep; /* 0 - 950 deciseconds */ __u8 shape; /* see to ULTRA_IW_LFO_SHAPE_XXXX */ __u8 delay; /* 0 - 255 deciseconds */ } iwffff_xlfo_t; typedef struct iwffff_xenv_point { __u16 offset; __u16 rate; } iwffff_xenv_point_t; typedef struct iwffff_xenv_record { __u32 stype; __u16 nattack; __u16 nrelease; __u16 sustain_offset; __u16 sustain_rate; __u16 release_rate; __u8 hirange; __u8 pad; /* points are stored here.. */ /* count of points = nattack + nrelease */ } iwffff_xenv_record_t; typedef struct iwffff_xenv { __u8 flags; __u8 mode; __u8 index; __u8 pad; } iwffff_xenv_t; typedef struct iwffff_xlayer { __u32 stype; __u8 flags; __u8 velocity_mode; __u8 layer_event; __u8 low_range; /* range for layer based */ __u8 high_range; /* on either velocity or frequency */ __u8 pan; /* pan offset from CC1 (0 left - 127 right) */ __u8 pan_freq_scale; /* position based on frequency (0-127) */ __u8 attenuation; /* 0-127 (no corresponding midi controller) */ iwffff_xlfo_t tremolo; /* tremolo effect */ iwffff_xlfo_t vibrato; /* vibrato effect */ __u16 freq_scale; /* 0-2048, 1024 is equal to semitone scaling */ __u8 freq_center; /* center for keyboard frequency scaling */ __u8 pad; iwffff_xenv_t penv; /* pitch envelope */ iwffff_xenv_t venv; /* volume envelope */ } iwffff_xlayer_t; typedef struct iwffff_xinstrument { __u32 stype; __u16 exclusion; __u16 layer_type; __u16 exclusion_group; /* 0 - none, 1-65535 */ __u8 effect1; /* effect 1 */ __u8 effect1_depth; /* 0-127 */ __u8 effect2; /* effect 2 */ __u8 effect2_depth; /* 0-127 */ } iwffff_xinstrument_t; typedef struct { __u8 iwave[8]; __u8 revision; __u8 series_number; __u8 series_name[16]; __u8 date[10]; __u16 vendor_revision_major; __u16 vendor_revision_minor; __u32 rom_size; __u8 copyright[128]; __u8 vendor_name[64]; __u8 description[128]; } iwffff_rom_header_t; typedef struct iwffff_info { unsigned int format; /* supported format bits */ unsigned int effects; /* supported effects (1 << IWFFFF_EFFECT*) */ unsigned int lfos; /* LFO effects */ unsigned int max8_len; /* maximum 8-bit wave length */ unsigned int max16_len; /* maximum 16-bit wave length */ } iwffff_info_t; typedef struct simple_instrument_info { unsigned int format; /* supported format bits */ unsigned int effects; /* supported effects (1 << SIMPLE_EFFECT_*) */ unsigned int max8_len; /* maximum 8-bit wave length */ unsigned int max16_len; /* maximum 16-bit wave length */ } simple_instrument_info_t; typedef struct { unsigned int share_id[4]; /* share id - zero = no sharing */ unsigned int format; /* wave format */ struct { unsigned int number; /* some other ID for this instrument */ unsigned int memory; /* begin of waveform in onboard memory */ unsigned char *ptr; /* pointer to waveform in system memory */ } address; unsigned int size; /* size of waveform in samples */ unsigned int start; /* start offset in samples * 16 (lowest 4 bits - fraction) */ unsigned int loop_start; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */ unsigned int loop_end; /* loop end offset in samples * 16 (lowest 4 bits - fraction) */ unsigned short loop_repeat; /* loop repeat - 0 = forever */ unsigned char effect1; /* effect 1 */ unsigned char effect1_depth; /* 0-127 */ unsigned char effect2; /* effect 2 */ unsigned char effect2_depth; /* 0-127 */ } simple_instrument_t; typedef struct simple_xinstrument { __u32 stype; __u32 share_id[4]; /* share id - zero = no sharing */ __u32 format; /* wave format */ __u32 size; /* size of waveform in samples */ __u32 start; /* start offset in samples * 16 (lowest 4 bits - fraction) */ __u32 loop_start; /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */ __u32 loop_end; /* loop start offset in samples * 16 (lowest 4 bits - fraction) */ __u16 loop_repeat; /* loop repeat - 0 = forever */ __u8 effect1; /* effect 1 */ __u8 effect1_depth; /* 0-127 */ __u8 effect2; /* effect 2 */ __u8 effect2_depth; /* 0-127 */ } simple_xinstrument_t; typedef unsigned char sndrv_seq_event_type_t; /** event address */ struct sndrv_seq_addr { unsigned char client; /**< Client number: 0..255, 255 = broadcast to all clients */ unsigned char port; /**< Port within client: 0..255, 255 = broadcast to all ports */ }; /** port connection */ struct sndrv_seq_connect { struct sndrv_seq_addr sender; struct sndrv_seq_addr dest; }; struct sndrv_seq_ev_note { unsigned char channel; unsigned char note; unsigned char velocity; unsigned char off_velocity; /* only for SNDRV_SEQ_EVENT_NOTE */ unsigned int duration; /* only for SNDRV_SEQ_EVENT_NOTE */ }; /* controller event */ struct sndrv_seq_ev_ctrl { unsigned char channel; unsigned char unused1, unused2, unused3; /* pad */ unsigned int param; signed int value; }; /* generic set of bytes (12x8 bit) */ struct sndrv_seq_ev_raw8 { unsigned char d[12]; /* 8 bit value */ }; /* generic set of integers (3x32 bit) */ struct sndrv_seq_ev_raw32 { unsigned int d[3]; /* 32 bit value */ }; /* external stored data */ struct sndrv_seq_ev_ext { unsigned int len; /* length of data */ void *ptr; /* pointer to data (note: maybe 64-bit) */ } __attribute__((packed)); /* Instrument cluster type */ typedef unsigned int sndrv_seq_instr_cluster_t; /* Instrument type */ struct sndrv_seq_instr { sndrv_seq_instr_cluster_t cluster; unsigned int std; /* the upper byte means a private instrument (owner - client #) */ unsigned short bank; unsigned short prg; }; /* sample number */ struct sndrv_seq_ev_sample { unsigned int std; unsigned short bank; unsigned short prg; }; /* sample cluster */ struct sndrv_seq_ev_cluster { sndrv_seq_instr_cluster_t cluster; }; /* sample position */ typedef unsigned int sndrv_seq_position_t; /* playback position (in samples) * 16 */ /* sample stop mode */ enum sndrv_seq_stop_mode { SAMPLE_STOP_IMMEDIATELY = 0, /* terminate playing immediately */ SAMPLE_STOP_VENVELOPE = 1, /* finish volume envelope */ SAMPLE_STOP_LOOP = 2 /* terminate loop and finish wave */ }; /* sample frequency */ typedef int sndrv_seq_frequency_t; /* playback frequency in HZ * 16 */ /* sample volume control; if any value is set to -1 == do not change */ struct sndrv_seq_ev_volume { signed short volume; /* range: 0-16383 */ signed short lr; /* left-right balance; range: 0-16383 */ signed short fr; /* front-rear balance; range: 0-16383 */ signed short du; /* down-up balance; range: 0-16383 */ }; /* simple loop redefinition */ struct sndrv_seq_ev_loop { unsigned int start; /* loop start (in samples) * 16 */ unsigned int end; /* loop end (in samples) * 16 */ }; struct sndrv_seq_ev_sample_control { unsigned char channel; unsigned char unused1, unused2, unused3; /* pad */ union { struct sndrv_seq_ev_sample sample; struct sndrv_seq_ev_cluster cluster; sndrv_seq_position_t position; int stop_mode; sndrv_seq_frequency_t frequency; struct sndrv_seq_ev_volume volume; struct sndrv_seq_ev_loop loop; unsigned char raw8[8]; } param; }; /* INSTR_BEGIN event */ struct sndrv_seq_ev_instr_begin { int timeout; /* zero = forever, otherwise timeout in ms */ }; struct sndrv_seq_result { int event; /* processed event type */ int result; }; struct sndrv_seq_real_time { unsigned int tv_sec; /* seconds */ unsigned int tv_nsec; /* nanoseconds */ }; typedef unsigned int sndrv_seq_tick_time_t; /* midi ticks */ union sndrv_seq_timestamp { sndrv_seq_tick_time_t tick; struct sndrv_seq_real_time time; }; struct sndrv_seq_queue_skew { unsigned int value; unsigned int base; }; /* queue timer control */ struct sndrv_seq_ev_queue_control { unsigned char queue; /* affected queue */ unsigned char pad[3]; /* reserved */ union { signed int value; /* affected value (e.g. tempo) */ union sndrv_seq_timestamp time; /* time */ unsigned int position; /* sync position */ struct sndrv_seq_queue_skew skew; unsigned int d32[2]; unsigned char d8[8]; } param; }; /* quoted event - inside the kernel only */ struct sndrv_seq_ev_quote { struct sndrv_seq_addr origin; /* original sender */ unsigned short value; /* optional data */ struct sndrv_seq_event *event; /* quoted event */ } __attribute__((packed)); /* sequencer event */ struct sndrv_seq_event { sndrv_seq_event_type_t type; /* event type */ unsigned char flags; /* event flags */ char tag; unsigned char queue; /* schedule queue */ union sndrv_seq_timestamp time; /* schedule time */ struct sndrv_seq_addr source; /* source address */ struct sndrv_seq_addr dest; /* destination address */ union { /* event data... */ struct sndrv_seq_ev_note note; struct sndrv_seq_ev_ctrl control; struct sndrv_seq_ev_raw8 raw8; struct sndrv_seq_ev_raw32 raw32; struct sndrv_seq_ev_ext ext; struct sndrv_seq_ev_queue_control queue; union sndrv_seq_timestamp time; struct sndrv_seq_addr addr; struct sndrv_seq_connect connect; struct sndrv_seq_result result; struct sndrv_seq_ev_instr_begin instr_begin; struct sndrv_seq_ev_sample_control sample; struct sndrv_seq_ev_quote quote; } data; }; /* * bounce event - stored as variable size data */ struct sndrv_seq_event_bounce { int err; struct sndrv_seq_event event; /* external data follows here. */ }; struct sndrv_seq_system_info { int queues; /* maximum queues count */ int clients; /* maximum clients count */ int ports; /* maximum ports per client */ int channels; /* maximum channels per port */ int cur_clients; /* current clients */ int cur_queues; /* current queues */ char reserved[24]; }; struct sndrv_seq_running_info { unsigned char client; /* client id */ unsigned char big_endian; /* 1 = big-endian */ unsigned char cpu_mode; /* 4 = 32bit, 8 = 64bit */ unsigned char pad; /* reserved */ unsigned char reserved[12]; }; enum sndrv_seq_client_type { NO_CLIENT = 0, USER_CLIENT = 1, KERNEL_CLIENT = 2 }; struct sndrv_seq_client_info { int client; /* client number to inquire */ int type; /* client type */ char name[64]; /* client name */ unsigned int filter; /* filter flags */ unsigned char multicast_filter[8]; /* multicast filter bitmap */ unsigned char event_filter[32]; /* event filter bitmap */ int num_ports; /* RO: number of ports */ int event_lost; /* number of lost events */ char reserved[64]; /* for future use */ }; struct sndrv_seq_client_pool { int client; /* client number to inquire */ int output_pool; /* outgoing (write) pool size */ int input_pool; /* incoming (read) pool size */ int output_room; /* minimum free pool size for select/blocking mode */ int output_free; /* unused size */ int input_free; /* unused size */ char reserved[64]; }; struct sndrv_seq_remove_events { unsigned int remove_mode; /* Flags that determine what gets removed */ union sndrv_seq_timestamp time; unsigned char queue; /* Queue for REMOVE_DEST */ struct sndrv_seq_addr dest; /* Address for REMOVE_DEST */ unsigned char channel; /* Channel for REMOVE_DEST */ int type; /* For REMOVE_EVENT_TYPE */ char tag; /* Tag for REMOVE_TAG */ int reserved[10]; /* To allow for future binary compatibility */ }; struct sndrv_seq_port_info { struct sndrv_seq_addr addr; /* client/port numbers */ char name[64]; /* port name */ unsigned int capability; /* port capability bits */ unsigned int type; /* port type bits */ int midi_channels; /* channels per MIDI port */ int midi_voices; /* voices per MIDI port */ int synth_voices; /* voices per SYNTH port */ int read_use; /* R/O: subscribers for output (from this port) */ int write_use; /* R/O: subscribers for input (to this port) */ void *kernel; /* reserved for kernel use (must be NULL) */ unsigned int flags; /* misc. conditioning */ unsigned char time_queue; /* queue # for timestamping */ char reserved[59]; /* for future use */ }; struct sndrv_seq_queue_info { int queue; /* queue id */ /* * security settings, only owner of this queue can start/stop timer * etc. if the queue is locked for other clients */ int owner; /* client id for owner of the queue */ int locked:1; /* timing queue locked for other queues */ char name[64]; /* name of this queue */ unsigned int flags; /* flags */ char reserved[60]; /* for future use */ }; struct sndrv_seq_queue_status { int queue; /* queue id */ int events; /* read-only - queue size */ sndrv_seq_tick_time_t tick; /* current tick */ struct sndrv_seq_real_time time; /* current time */ int running; /* running state of queue */ int flags; /* various flags */ char reserved[64]; /* for the future */ }; struct sndrv_seq_queue_tempo { int queue; /* sequencer queue */ unsigned int tempo; /* current tempo, us/tick */ int ppq; /* time resolution, ticks/quarter */ unsigned int skew_value; /* queue skew */ unsigned int skew_base; /* queue skew base */ char reserved[24]; /* for the future */ }; struct sndrv_timer_id { int dev_class; int dev_sclass; int card; int device; int subdevice; }; struct sndrv_seq_queue_timer { int queue; /* sequencer queue */ int type; /* source timer type */ union { struct { struct sndrv_timer_id id; /* ALSA's timer ID */ unsigned int resolution; /* resolution in Hz */ } alsa; } u; char reserved[64]; /* for the future use */ }; struct sndrv_seq_queue_client { int queue; /* sequencer queue */ int client; /* sequencer client */ int used; /* queue is used with this client (must be set for accepting events) */ /* per client watermarks */ char reserved[64]; /* for future use */ }; struct sndrv_seq_port_subscribe { struct sndrv_seq_addr sender; /* sender address */ struct sndrv_seq_addr dest; /* destination address */ unsigned int voices; /* number of voices to be allocated (0 = don't care) */ unsigned int flags; /* modes */ unsigned char queue; /* input time-stamp queue (optional) */ unsigned char pad[3]; /* reserved */ char reserved[64]; }; struct sndrv_seq_query_subs { struct sndrv_seq_addr root; /* client/port id to be searched */ int type; /* READ or WRITE */ int index; /* 0..N-1 */ int num_subs; /* R/O: number of subscriptions on this port */ struct sndrv_seq_addr addr; /* R/O: result */ unsigned char queue; /* R/O: result */ unsigned int flags; /* R/O: result */ char reserved[64]; /* for future use */ }; /* size of ROM/RAM */ typedef unsigned int sndrv_seq_instr_size_t; struct sndrv_seq_instr_info { int result; /* operation result */ unsigned int formats[8]; /* bitmap of supported formats */ int ram_count; /* count of RAM banks */ sndrv_seq_instr_size_t ram_sizes[16]; /* size of RAM banks */ int rom_count; /* count of ROM banks */ sndrv_seq_instr_size_t rom_sizes[8]; /* size of ROM banks */ char reserved[128]; }; struct sndrv_seq_instr_status { int result; /* operation result */ sndrv_seq_instr_size_t free_ram[16]; /* free RAM in banks */ int instrument_count; /* count of downloaded instruments */ char reserved[128]; }; struct sndrv_seq_instr_format_info { char format[16]; /* format identifier - SNDRV_SEQ_INSTR_ID_* */ unsigned int len; /* max data length (without this structure) */ }; struct sndrv_seq_instr_format_info_result { int result; /* operation result */ char format[16]; /* format identifier */ unsigned int len; /* filled data length (without this structure) */ }; struct sndrv_seq_instr_data { char name[32]; /* instrument name */ char reserved[16]; /* for the future use */ int type; /* instrument type */ union { char format[16]; /* format identifier */ struct sndrv_seq_instr alias; } data; }; struct sndrv_seq_instr_header { union { struct sndrv_seq_instr instr; sndrv_seq_instr_cluster_t cluster; } id; /* instrument identifier */ unsigned int cmd; /* get/put/free command */ unsigned int flags; /* query flags (only for get) */ unsigned int len; /* real instrument data length (without header) */ int result; /* operation result */ char reserved[16]; /* for the future */ struct sndrv_seq_instr_data data; /* instrument data (for put/get result) */ }; struct sndrv_seq_instr_cluster_set { sndrv_seq_instr_cluster_t cluster; /* cluster identifier */ char name[32]; /* cluster name */ int priority; /* cluster priority */ char reserved[64]; /* for the future use */ }; struct sndrv_seq_instr_cluster_get { sndrv_seq_instr_cluster_t cluster; /* cluster identifier */ char name[32]; /* cluster name */ int priority; /* cluster priority */ char reserved[64]; /* for the future use */ }; typedef struct snd_dm_fm_info { unsigned char fm_mode; /* OPL mode, see SNDRV_DM_FM_MODE_XXX */ unsigned char rhythm; /* percussion mode flag */ } snd_dm_fm_info_t; typedef struct snd_dm_fm_voice { unsigned char op; /* operator cell (0 or 1) */ unsigned char voice; /* FM voice (0 to 17) */ unsigned char am; /* amplitude modulation */ unsigned char vibrato; /* vibrato effect */ unsigned char do_sustain; /* sustain phase */ unsigned char kbd_scale; /* keyboard scaling */ unsigned char harmonic; /* 4 bits: harmonic and multiplier */ unsigned char scale_level; /* 2 bits: decrease output freq rises */ unsigned char volume; /* 6 bits: volume */ unsigned char attack; /* 4 bits: attack rate */ unsigned char decay; /* 4 bits: decay rate */ unsigned char sustain; /* 4 bits: sustain level */ unsigned char release; /* 4 bits: release rate */ unsigned char feedback; /* 3 bits: feedback for op0 */ unsigned char connection; /* 0 for serial, 1 for parallel */ unsigned char left; /* stereo left */ unsigned char right; /* stereo right */ unsigned char waveform; /* 3 bits: waveform shape */ } snd_dm_fm_voice_t; typedef struct snd_dm_fm_note { unsigned char voice; /* 0-17 voice channel */ unsigned char octave; /* 3 bits: what octave to play */ unsigned int fnum; /* 10 bits: frequency number */ unsigned char key_on; /* set for active, clear for silent */ } snd_dm_fm_note_t; typedef struct snd_dm_fm_params { unsigned char am_depth; /* amplitude modulation depth (1=hi) */ unsigned char vib_depth; /* vibrato depth (1=hi) */ unsigned char kbd_split; /* keyboard split */ unsigned char rhythm; /* percussion mode select */ /* This block is the percussion instrument data */ unsigned char bass; unsigned char snare; unsigned char tomtom; unsigned char cymbal; unsigned char hihat; } snd_dm_fm_params_t; #include #if __BYTE_ORDER == __LITTLE_ENDIAN #define SNDRV_LITTLE_ENDIAN #elif __BYTE_ORDER == __BIG_ENDIAN #define SNDRV_BIG_ENDIAN #else #error "Unsupported endian..." #endif #include #include struct sndrv_aes_iec958 { unsigned char status[24]; /* AES/IEC958 channel status bits */ unsigned char subcode[147]; /* AES/IEC958 subcode bits */ unsigned char pad; /* nothing */ unsigned char dig_subframe[4]; /* AES/IEC958 subframe bits */ }; enum sndrv_hwdep_iface { SNDRV_HWDEP_IFACE_OPL2 = 0, SNDRV_HWDEP_IFACE_OPL3, SNDRV_HWDEP_IFACE_OPL4, SNDRV_HWDEP_IFACE_SB16CSP, /* Creative Signal Processor */ SNDRV_HWDEP_IFACE_EMU10K1, /* FX8010 processor in EMU10K1 chip */ SNDRV_HWDEP_IFACE_YSS225, /* Yamaha FX processor */ SNDRV_HWDEP_IFACE_ICS2115, /* Wavetable synth */ SNDRV_HWDEP_IFACE_SSCAPE, /* Ensoniq SoundScape ISA card (MC68EC000) */ SNDRV_HWDEP_IFACE_VX, /* Digigram VX cards */ SNDRV_HWDEP_IFACE_MIXART, /* Digigram miXart cards */ SNDRV_HWDEP_IFACE_USX2Y, /* Tascam US122, US224 & US428 usb */ SNDRV_HWDEP_IFACE_EMUX_WAVETABLE, /* EmuX wavetable */ SNDRV_HWDEP_IFACE_BLUETOOTH, /* Bluetooth audio */ SNDRV_HWDEP_IFACE_USX2Y_PCM, /* Tascam US122, US224 & US428 rawusb pcm */ SNDRV_HWDEP_IFACE_PCXHR, /* Digigram PCXHR */ SNDRV_HWDEP_IFACE_SB_RC, /* SB Extigy/Audigy2NX remote control */ /* Don't forget to change the following: */ SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_SB_RC }; struct sndrv_hwdep_info { unsigned int device; /* WR: device number */ int card; /* R: card number */ unsigned char id[64]; /* ID (user selectable) */ unsigned char name[80]; /* hwdep name */ int iface; /* hwdep interface */ unsigned char reserved[64]; /* reserved for future */ }; /* generic DSP loader */ struct sndrv_hwdep_dsp_status { unsigned int version; /* R: driver-specific version */ unsigned char id[32]; /* R: driver-specific ID string */ unsigned int num_dsps; /* R: number of DSP images to transfer */ unsigned int dsp_loaded; /* R: bit flags indicating the loaded DSPs */ unsigned int chip_ready; /* R: 1 = initialization finished */ unsigned char reserved[16]; /* reserved for future use */ }; struct sndrv_hwdep_dsp_image { unsigned int index; /* W: DSP index */ unsigned char name[64]; /* W: ID (e.g. file name) */ unsigned char *image; /* W: binary image */ size_t length; /* W: size of image in bytes */ unsigned long driver_data; /* W: driver-specific data */ }; typedef unsigned long sndrv_pcm_uframes_t; typedef long sndrv_pcm_sframes_t; enum sndrv_pcm_class { SNDRV_PCM_CLASS_GENERIC = 0, /* standard mono or stereo device */ SNDRV_PCM_CLASS_MULTI, /* multichannel device */ SNDRV_PCM_CLASS_MODEM, /* software modem class */ SNDRV_PCM_CLASS_DIGITIZER, /* digitizer class */ /* Don't forget to change the following: */ SNDRV_PCM_CLASS_LAST = SNDRV_PCM_CLASS_DIGITIZER, }; enum sndrv_pcm_subclass { SNDRV_PCM_SUBCLASS_GENERIC_MIX = 0, /* mono or stereo subdevices are mixed together */ SNDRV_PCM_SUBCLASS_MULTI_MIX, /* multichannel subdevices are mixed together */ /* Don't forget to change the following: */ SNDRV_PCM_SUBCLASS_LAST = SNDRV_PCM_SUBCLASS_MULTI_MIX, }; enum sndrv_pcm_stream { SNDRV_PCM_STREAM_PLAYBACK = 0, SNDRV_PCM_STREAM_CAPTURE, SNDRV_PCM_STREAM_LAST = SNDRV_PCM_STREAM_CAPTURE, }; enum sndrv_pcm_access { SNDRV_PCM_ACCESS_MMAP_INTERLEAVED = 0, /* interleaved mmap */ SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED, /* noninterleaved mmap */ SNDRV_PCM_ACCESS_MMAP_COMPLEX, /* complex mmap */ SNDRV_PCM_ACCESS_RW_INTERLEAVED, /* readi/writei */ SNDRV_PCM_ACCESS_RW_NONINTERLEAVED, /* readn/writen */ SNDRV_PCM_ACCESS_LAST = SNDRV_PCM_ACCESS_RW_NONINTERLEAVED, }; enum sndrv_pcm_format { SNDRV_PCM_FORMAT_S8 = 0, SNDRV_PCM_FORMAT_U8, SNDRV_PCM_FORMAT_S16_LE, SNDRV_PCM_FORMAT_S16_BE, SNDRV_PCM_FORMAT_U16_LE, SNDRV_PCM_FORMAT_U16_BE, SNDRV_PCM_FORMAT_S24_LE, /* low three bytes */ SNDRV_PCM_FORMAT_S24_BE, /* low three bytes */ SNDRV_PCM_FORMAT_U24_LE, /* low three bytes */ SNDRV_PCM_FORMAT_U24_BE, /* low three bytes */ SNDRV_PCM_FORMAT_S32_LE, SNDRV_PCM_FORMAT_S32_BE, SNDRV_PCM_FORMAT_U32_LE, SNDRV_PCM_FORMAT_U32_BE, SNDRV_PCM_FORMAT_FLOAT_LE, /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */ SNDRV_PCM_FORMAT_FLOAT_BE, /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */ SNDRV_PCM_FORMAT_FLOAT64_LE, /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */ SNDRV_PCM_FORMAT_FLOAT64_BE, /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */ SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE, /* IEC-958 subframe, Little Endian */ SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE, /* IEC-958 subframe, Big Endian */ SNDRV_PCM_FORMAT_MU_LAW, SNDRV_PCM_FORMAT_A_LAW, SNDRV_PCM_FORMAT_IMA_ADPCM, SNDRV_PCM_FORMAT_MPEG, SNDRV_PCM_FORMAT_GSM, SNDRV_PCM_FORMAT_SPECIAL = 31, SNDRV_PCM_FORMAT_S24_3LE = 32, /* in three bytes */ SNDRV_PCM_FORMAT_S24_3BE, /* in three bytes */ SNDRV_PCM_FORMAT_U24_3LE, /* in three bytes */ SNDRV_PCM_FORMAT_U24_3BE, /* in three bytes */ SNDRV_PCM_FORMAT_S20_3LE, /* in three bytes */ SNDRV_PCM_FORMAT_S20_3BE, /* in three bytes */ SNDRV_PCM_FORMAT_U20_3LE, /* in three bytes */ SNDRV_PCM_FORMAT_U20_3BE, /* in three bytes */ SNDRV_PCM_FORMAT_S18_3LE, /* in three bytes */ SNDRV_PCM_FORMAT_S18_3BE, /* in three bytes */ SNDRV_PCM_FORMAT_U18_3LE, /* in three bytes */ SNDRV_PCM_FORMAT_U18_3BE, /* in three bytes */ SNDRV_PCM_FORMAT_LAST = SNDRV_PCM_FORMAT_U18_3BE, #ifdef SNDRV_LITTLE_ENDIAN SNDRV_PCM_FORMAT_S16 = SNDRV_PCM_FORMAT_S16_LE, SNDRV_PCM_FORMAT_U16 = SNDRV_PCM_FORMAT_U16_LE, SNDRV_PCM_FORMAT_S24 = SNDRV_PCM_FORMAT_S24_LE, SNDRV_PCM_FORMAT_U24 = SNDRV_PCM_FORMAT_U24_LE, SNDRV_PCM_FORMAT_S32 = SNDRV_PCM_FORMAT_S32_LE, SNDRV_PCM_FORMAT_U32 = SNDRV_PCM_FORMAT_U32_LE, SNDRV_PCM_FORMAT_FLOAT = SNDRV_PCM_FORMAT_FLOAT_LE, SNDRV_PCM_FORMAT_FLOAT64 = SNDRV_PCM_FORMAT_FLOAT64_LE, SNDRV_PCM_FORMAT_IEC958_SUBFRAME = SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE, #endif #ifdef SNDRV_BIG_ENDIAN SNDRV_PCM_FORMAT_S16 = SNDRV_PCM_FORMAT_S16_BE, SNDRV_PCM_FORMAT_U16 = SNDRV_PCM_FORMAT_U16_BE, SNDRV_PCM_FORMAT_S24 = SNDRV_PCM_FORMAT_S24_BE, SNDRV_PCM_FORMAT_U24 = SNDRV_PCM_FORMAT_U24_BE, SNDRV_PCM_FORMAT_S32 = SNDRV_PCM_FORMAT_S32_BE, SNDRV_PCM_FORMAT_U32 = SNDRV_PCM_FORMAT_U32_BE, SNDRV_PCM_FORMAT_FLOAT = SNDRV_PCM_FORMAT_FLOAT_BE, SNDRV_PCM_FORMAT_FLOAT64 = SNDRV_PCM_FORMAT_FLOAT64_BE, SNDRV_PCM_FORMAT_IEC958_SUBFRAME = SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE, #endif }; enum sndrv_pcm_subformat { SNDRV_PCM_SUBFORMAT_STD = 0, SNDRV_PCM_SUBFORMAT_LAST = SNDRV_PCM_SUBFORMAT_STD, }; enum sndrv_pcm_state { SNDRV_PCM_STATE_OPEN = 0, /* stream is open */ SNDRV_PCM_STATE_SETUP, /* stream has a setup */ SNDRV_PCM_STATE_PREPARED, /* stream is ready to start */ SNDRV_PCM_STATE_RUNNING, /* stream is running */ SNDRV_PCM_STATE_XRUN, /* stream reached an xrun */ SNDRV_PCM_STATE_DRAINING, /* stream is draining */ SNDRV_PCM_STATE_PAUSED, /* stream is paused */ SNDRV_PCM_STATE_SUSPENDED, /* hardware is suspended */ SNDRV_PCM_STATE_DISCONNECTED, /* hardware is disconnected */ SNDRV_PCM_STATE_LAST = SNDRV_PCM_STATE_DISCONNECTED, }; enum { SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000, SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000, SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000, }; union sndrv_pcm_sync_id { unsigned char id[16]; unsigned short id16[8]; unsigned int id32[4]; }; struct sndrv_pcm_info { unsigned int device; /* RO/WR (control): device number */ unsigned int subdevice; /* RO/WR (control): subdevice number */ int stream; /* RO/WR (control): stream number */ int card; /* R: card number */ unsigned char id[64]; /* ID (user selectable) */ unsigned char name[80]; /* name of this device */ unsigned char subname[32]; /* subdevice name */ int dev_class; /* SNDRV_PCM_CLASS_* */ int dev_subclass; /* SNDRV_PCM_SUBCLASS_* */ unsigned int subdevices_count; unsigned int subdevices_avail; union sndrv_pcm_sync_id sync; /* hardware synchronization ID */ unsigned char reserved[64]; /* reserved for future... */ }; enum sndrv_pcm_hw_param { SNDRV_PCM_HW_PARAM_ACCESS = 0, /* Access type */ SNDRV_PCM_HW_PARAM_FIRST_MASK = SNDRV_PCM_HW_PARAM_ACCESS, SNDRV_PCM_HW_PARAM_FORMAT, /* Format */ SNDRV_PCM_HW_PARAM_SUBFORMAT, /* Subformat */ SNDRV_PCM_HW_PARAM_LAST_MASK = SNDRV_PCM_HW_PARAM_SUBFORMAT, SNDRV_PCM_HW_PARAM_SAMPLE_BITS = 8, /* Bits per sample */ SNDRV_PCM_HW_PARAM_FIRST_INTERVAL = SNDRV_PCM_HW_PARAM_SAMPLE_BITS, SNDRV_PCM_HW_PARAM_FRAME_BITS, /* Bits per frame */ SNDRV_PCM_HW_PARAM_CHANNELS, /* Channels */ SNDRV_PCM_HW_PARAM_RATE, /* Approx rate */ SNDRV_PCM_HW_PARAM_PERIOD_TIME, /* Approx distance between interrupts in us */ SNDRV_PCM_HW_PARAM_PERIOD_SIZE, /* Approx frames between interrupts */ SNDRV_PCM_HW_PARAM_PERIOD_BYTES, /* Approx bytes between interrupts */ SNDRV_PCM_HW_PARAM_PERIODS, /* Approx interrupts per buffer */ SNDRV_PCM_HW_PARAM_BUFFER_TIME, /* Approx duration of buffer in us */ SNDRV_PCM_HW_PARAM_BUFFER_SIZE, /* Size of buffer in frames */ SNDRV_PCM_HW_PARAM_BUFFER_BYTES, /* Size of buffer in bytes */ SNDRV_PCM_HW_PARAM_TICK_TIME, /* Approx tick duration in us */ SNDRV_PCM_HW_PARAM_LAST_INTERVAL = SNDRV_PCM_HW_PARAM_TICK_TIME }; struct sndrv_interval { unsigned int min, max; unsigned int openmin:1, openmax:1, integer:1, empty:1; }; struct sndrv_mask { u_int32_t bits[(SNDRV_MASK_MAX+31)/32]; }; struct sndrv_pcm_hw_params { unsigned int flags; struct sndrv_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK - SNDRV_PCM_HW_PARAM_FIRST_MASK + 1]; struct sndrv_mask mres[5]; /* reserved masks */ struct sndrv_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1]; struct sndrv_interval ires[9]; /* reserved intervals */ unsigned int rmask; /* W: requested masks */ unsigned int cmask; /* R: changed masks */ unsigned int info; /* R: Info flags for returned setup */ unsigned int msbits; /* R: used most significant bits */ unsigned int rate_num; /* R: rate numerator */ unsigned int rate_den; /* R: rate denominator */ sndrv_pcm_uframes_t fifo_size; /* R: chip FIFO size in frames */ unsigned char reserved[64]; /* reserved for future */ }; enum sndrv_pcm_tstamp { SNDRV_PCM_TSTAMP_NONE = 0, SNDRV_PCM_TSTAMP_MMAP, SNDRV_PCM_TSTAMP_LAST = SNDRV_PCM_TSTAMP_MMAP, }; struct sndrv_pcm_sw_params { int tstamp_mode; /* timestamp mode */ unsigned int period_step; unsigned int sleep_min; /* min ticks to sleep */ sndrv_pcm_uframes_t avail_min; /* min avail frames for wakeup */ sndrv_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */ sndrv_pcm_uframes_t start_threshold; /* min hw_avail frames for automatic start */ sndrv_pcm_uframes_t stop_threshold; /* min avail frames for automatic stop */ sndrv_pcm_uframes_t silence_threshold; /* min distance from noise for silence filling */ sndrv_pcm_uframes_t silence_size; /* silence block size */ sndrv_pcm_uframes_t boundary; /* pointers wrap point */ unsigned char reserved[64]; /* reserved for future */ }; struct sndrv_pcm_channel_info { unsigned int channel; long int offset; /* mmap offset */ unsigned int first; /* offset to first sample in bits */ unsigned int step; /* samples distance in bits */ }; struct sndrv_pcm_status { int state; /* stream state */ struct timespec trigger_tstamp; /* time when stream was started/stopped/paused */ struct timespec tstamp; /* reference timestamp */ sndrv_pcm_uframes_t appl_ptr; /* appl ptr */ sndrv_pcm_uframes_t hw_ptr; /* hw ptr */ sndrv_pcm_sframes_t delay; /* current delay in frames */ sndrv_pcm_uframes_t avail; /* number of frames available */ sndrv_pcm_uframes_t avail_max; /* max frames available on hw since last status */ sndrv_pcm_uframes_t overrange; /* count of ADC (capture) overrange detections from last status */ int suspended_state; /* suspended stream state */ unsigned char reserved[60]; /* must be filled with zero */ }; struct sndrv_pcm_mmap_status { int state; /* RO: state - SNDRV_PCM_STATE_XXXX */ int pad1; /* Needed for 64 bit alignment */ sndrv_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */ struct timespec tstamp; /* Timestamp */ int suspended_state; /* RO: suspended stream state */ }; struct sndrv_pcm_mmap_control { sndrv_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */ sndrv_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */ }; struct sndrv_pcm_sync_ptr { unsigned int flags; union { struct sndrv_pcm_mmap_status status; unsigned char reserved[64]; } s; union { struct sndrv_pcm_mmap_control control; unsigned char reserved[64]; } c; }; struct sndrv_xferi { sndrv_pcm_sframes_t result; void *buf; sndrv_pcm_uframes_t frames; }; struct sndrv_xfern { sndrv_pcm_sframes_t result; void **bufs; sndrv_pcm_uframes_t frames; }; enum sndrv_rawmidi_stream { SNDRV_RAWMIDI_STREAM_OUTPUT = 0, SNDRV_RAWMIDI_STREAM_INPUT, SNDRV_RAWMIDI_STREAM_LAST = SNDRV_RAWMIDI_STREAM_INPUT, }; struct sndrv_rawmidi_info { unsigned int device; /* RO/WR (control): device number */ unsigned int subdevice; /* RO/WR (control): subdevice number */ int stream; /* WR: stream */ int card; /* R: card number */ unsigned int flags; /* SNDRV_RAWMIDI_INFO_XXXX */ unsigned char id[64]; /* ID (user selectable) */ unsigned char name[80]; /* name of device */ unsigned char subname[32]; /* name of active or selected subdevice */ unsigned int subdevices_count; unsigned int subdevices_avail; unsigned char reserved[64]; /* reserved for future use */ }; struct sndrv_rawmidi_params { int stream; size_t buffer_size; /* queue size in bytes */ size_t avail_min; /* minimum avail bytes for wakeup */ unsigned int no_active_sensing: 1; /* do not send active sensing byte in close() */ unsigned char reserved[16]; /* reserved for future use */ }; struct sndrv_rawmidi_status { int stream; struct timespec tstamp; /* Timestamp */ size_t avail; /* available bytes */ size_t xruns; /* count of overruns since last status (in bytes) */ unsigned char reserved[16]; /* reserved for future use */ }; enum sndrv_timer_class { SNDRV_TIMER_CLASS_NONE = -1, SNDRV_TIMER_CLASS_SLAVE = 0, SNDRV_TIMER_CLASS_GLOBAL, SNDRV_TIMER_CLASS_CARD, SNDRV_TIMER_CLASS_PCM, SNDRV_TIMER_CLASS_LAST = SNDRV_TIMER_CLASS_PCM, }; /* slave timer classes */ enum sndrv_timer_slave_class { SNDRV_TIMER_SCLASS_NONE = 0, SNDRV_TIMER_SCLASS_APPLICATION, SNDRV_TIMER_SCLASS_SEQUENCER, /* alias */ SNDRV_TIMER_SCLASS_OSS_SEQUENCER, /* alias */ SNDRV_TIMER_SCLASS_LAST = SNDRV_TIMER_SCLASS_OSS_SEQUENCER, }; struct sndrv_timer_ginfo { struct sndrv_timer_id tid; /* requested timer ID */ unsigned int flags; /* timer flags - SNDRV_TIMER_FLG_* */ int card; /* card number */ unsigned char id[64]; /* timer identification */ unsigned char name[80]; /* timer name */ unsigned long reserved0; /* reserved for future use */ unsigned long resolution; /* average period resolution in ns */ unsigned long resolution_min; /* minimal period resolution in ns */ unsigned long resolution_max; /* maximal period resolution in ns */ unsigned int clients; /* active timer clients */ unsigned char reserved[32]; }; struct sndrv_timer_gparams { struct sndrv_timer_id tid; /* requested timer ID */ unsigned long period_num; /* requested precise period duration (in seconds) - numerator */ unsigned long period_den; /* requested precise period duration (in seconds) - denominator */ unsigned char reserved[32]; }; struct sndrv_timer_gstatus { struct sndrv_timer_id tid; /* requested timer ID */ unsigned long resolution; /* current period resolution in ns */ unsigned long resolution_num; /* precise current period resolution (in seconds) - numerator */ unsigned long resolution_den; /* precise current period resolution (in seconds) - denominator */ unsigned char reserved[32]; }; struct sndrv_timer_select { struct sndrv_timer_id id; /* bind to timer ID */ unsigned char reserved[32]; /* reserved */ }; struct sndrv_timer_info { unsigned int flags; /* timer flags - SNDRV_TIMER_FLG_* */ int card; /* card number */ unsigned char id[64]; /* timer identificator */ unsigned char name[80]; /* timer name */ unsigned long reserved0; /* reserved for future use */ unsigned long resolution; /* average period resolution in ns */ unsigned char reserved[64]; /* reserved */ }; struct sndrv_timer_params { unsigned int flags; /* flags - SNDRV_MIXER_PSFLG_* */ unsigned int ticks; /* requested resolution in ticks */ unsigned int queue_size; /* total size of queue (32-1024) */ unsigned int reserved0; /* reserved, was: failure locations */ unsigned int filter; /* event filter (bitmask of SNDRV_TIMER_EVENT_*) */ unsigned char reserved[60]; /* reserved */ }; struct sndrv_timer_status { struct timespec tstamp; /* Timestamp - last update */ unsigned int resolution; /* current period resolution in ns */ unsigned int lost; /* counter of master tick lost */ unsigned int overrun; /* count of read queue overruns */ unsigned int queue; /* used queue size */ unsigned char reserved[64]; /* reserved */ }; struct sndrv_timer_read { unsigned int resolution; unsigned int ticks; }; enum sndrv_timer_event { SNDRV_TIMER_EVENT_RESOLUTION = 0, /* val = resolution in ns */ SNDRV_TIMER_EVENT_TICK, /* val = ticks */ SNDRV_TIMER_EVENT_START, /* val = resolution in ns */ SNDRV_TIMER_EVENT_STOP, /* val = 0 */ SNDRV_TIMER_EVENT_CONTINUE, /* val = resolution in ns */ SNDRV_TIMER_EVENT_PAUSE, /* val = 0 */ SNDRV_TIMER_EVENT_EARLY, /* val = 0, early event */ SNDRV_TIMER_EVENT_SUSPEND, /* val = 0 */ SNDRV_TIMER_EVENT_RESUME, /* val = resolution in ns */ /* master timer events for slave timer instances */ SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10, SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10, SNDRV_TIMER_EVENT_MCONTINUE = SNDRV_TIMER_EVENT_CONTINUE + 10, SNDRV_TIMER_EVENT_MPAUSE = SNDRV_TIMER_EVENT_PAUSE + 10, SNDRV_TIMER_EVENT_MSUSPEND = SNDRV_TIMER_EVENT_SUSPEND + 10, SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10, }; struct sndrv_timer_tread { int event; struct timespec tstamp; unsigned int val; }; struct sndrv_ctl_card_info { int card; /* card number */ int pad; /* reserved for future (was type) */ unsigned char id[16]; /* ID of card (user selectable) */ unsigned char driver[16]; /* Driver name */ unsigned char name[32]; /* Short name of soundcard */ unsigned char longname[80]; /* name + info text about soundcard */ unsigned char reserved_[16]; /* reserved for future (was ID of mixer) */ unsigned char mixername[80]; /* visual mixer identification */ unsigned char components[80]; /* card components / fine identification, delimited with one space (AC97 etc..) */ unsigned char reserved[48]; /* reserved for future */ }; enum sndrv_ctl_elem_type { SNDRV_CTL_ELEM_TYPE_NONE = 0, /* invalid */ SNDRV_CTL_ELEM_TYPE_BOOLEAN, /* boolean type */ SNDRV_CTL_ELEM_TYPE_INTEGER, /* integer type */ SNDRV_CTL_ELEM_TYPE_ENUMERATED, /* enumerated type */ SNDRV_CTL_ELEM_TYPE_BYTES, /* byte array */ SNDRV_CTL_ELEM_TYPE_IEC958, /* IEC958 (S/PDIF) setup */ SNDRV_CTL_ELEM_TYPE_INTEGER64, /* 64-bit integer type */ SNDRV_CTL_ELEM_TYPE_LAST = SNDRV_CTL_ELEM_TYPE_INTEGER64, }; enum sndrv_ctl_elem_iface { SNDRV_CTL_ELEM_IFACE_CARD = 0, /* global control */ SNDRV_CTL_ELEM_IFACE_HWDEP, /* hardware dependent device */ SNDRV_CTL_ELEM_IFACE_MIXER, /* virtual mixer device */ SNDRV_CTL_ELEM_IFACE_PCM, /* PCM device */ SNDRV_CTL_ELEM_IFACE_RAWMIDI, /* RawMidi device */ SNDRV_CTL_ELEM_IFACE_TIMER, /* timer device */ SNDRV_CTL_ELEM_IFACE_SEQUENCER, /* sequencer client */ SNDRV_CTL_ELEM_IFACE_LAST = SNDRV_CTL_ELEM_IFACE_SEQUENCER, }; struct sndrv_ctl_elem_id { unsigned int numid; /* numeric identifier, zero = invalid */ int iface; /* interface identifier */ unsigned int device; /* device/client number */ unsigned int subdevice; /* subdevice (substream) number */ unsigned char name[44]; /* ASCII name of item */ unsigned int index; /* index of item */ }; struct sndrv_ctl_elem_list { unsigned int offset; /* W: first element ID to get */ unsigned int space; /* W: count of element IDs to get */ unsigned int used; /* R: count of element IDs set */ unsigned int count; /* R: count of all elements */ struct sndrv_ctl_elem_id *pids; /* R: IDs */ unsigned char reserved[50]; }; struct sndrv_ctl_elem_info { struct sndrv_ctl_elem_id id; /* W: element ID */ int type; /* R: value type - SNDRV_CTL_ELEM_TYPE_* */ unsigned int access; /* R: value access (bitmask) - SNDRV_CTL_ELEM_ACCESS_* */ unsigned int count; /* count of values */ pid_t owner; /* owner's PID of this control */ union { struct { long min; /* R: minimum value */ long max; /* R: maximum value */ long step; /* R: step (0 variable) */ } integer; struct { long long min; /* R: minimum value */ long long max; /* R: maximum value */ long long step; /* R: step (0 variable) */ } integer64; struct { unsigned int items; /* R: number of items */ unsigned int item; /* W: item number */ char name[64]; /* R: value name */ } enumerated; unsigned char reserved[128]; } value; union { unsigned short d[4]; /* dimensions */ unsigned short *d_ptr; /* indirect */ } dimen; unsigned char reserved[64-4*sizeof(unsigned short)]; }; struct sndrv_ctl_elem_value { struct sndrv_ctl_elem_id id; /* W: element ID */ unsigned int indirect: 1; /* W: use indirect pointer (xxx_ptr member) */ union { union { long value[128]; long *value_ptr; } integer; union { long long value[64]; long long *value_ptr; } integer64; union { unsigned int item[128]; unsigned int *item_ptr; } enumerated; union { unsigned char data[512]; unsigned char *data_ptr; } bytes; struct sndrv_aes_iec958 iec958; } value; /* RO */ struct timespec tstamp; unsigned char reserved[128-sizeof(struct timespec)]; }; struct sndrv_ctl_tlv { unsigned int numid; /* control element numeric identification */ unsigned int length; /* in bytes aligned to 4 */ unsigned int tlv[0]; /* first TLV */ }; enum sndrv_ctl_event_type { SNDRV_CTL_EVENT_ELEM = 0, SNDRV_CTL_EVENT_LAST = SNDRV_CTL_EVENT_ELEM, }; struct sndrv_ctl_event { int type; /* event type - SNDRV_CTL_EVENT_* */ union { struct { unsigned int mask; struct sndrv_ctl_elem_id id; } elem; unsigned char data8[60]; } data; }; struct sndrv_xferv { const struct iovec *vector; unsigned long count; }; typedef struct { unsigned int internal_tram_size; /* in samples */ unsigned int external_tram_size; /* in samples */ char fxbus_names[16][32]; /* names of FXBUSes */ char extin_names[16][32]; /* names of external inputs */ char extout_names[32][32]; /* names of external outputs */ unsigned int gpr_controls; /* count of GPR controls */ } emu10k1_fx8010_info_t; enum emu10k1_ctl_elem_iface { EMU10K1_CTL_ELEM_IFACE_MIXER = 2, /* virtual mixer device */ EMU10K1_CTL_ELEM_IFACE_PCM = 3, /* PCM device */ }; typedef struct { unsigned int pad; /* don't use */ int iface; /* interface identifier */ unsigned int device; /* device/client number */ unsigned int subdevice; /* subdevice (substream) number */ unsigned char name[44]; /* ASCII name of item */ unsigned int index; /* index of item */ } emu10k1_ctl_elem_id_t; typedef struct { emu10k1_ctl_elem_id_t id; /* full control ID definition */ unsigned int vcount; /* visible count */ unsigned int count; /* count of GPR (1..16) */ unsigned short gpr[32]; /* GPR number(s) */ unsigned int value[32]; /* initial values */ unsigned int min; /* minimum range */ unsigned int max; /* maximum range */ unsigned int translation; /* translation type (EMU10K1_GPR_TRANSLATION*) */ unsigned int *tlv; } emu10k1_fx8010_control_gpr_t; typedef struct { char name[128]; unsigned long gpr_valid[0x200/(sizeof(unsigned long)*8)]; /* bitmask of valid initializers */ uint32_t *gpr_map; /* initializers */ unsigned int gpr_add_control_count; /* count of GPR controls to add/replace */ emu10k1_fx8010_control_gpr_t *gpr_add_controls; /* GPR controls to add/replace */ unsigned int gpr_del_control_count; /* count of GPR controls to remove */ emu10k1_ctl_elem_id_t *gpr_del_controls; /* IDs of GPR controls to remove */ unsigned int gpr_list_control_count; /* count of GPR controls to list */ unsigned int gpr_list_control_total; /* total count of GPR controls */ emu10k1_fx8010_control_gpr_t *gpr_list_controls; /* listed GPR controls */ unsigned long tram_valid[0x100/(sizeof(unsigned long)*8)]; /* bitmask of valid initializers */ uint32_t *tram_data_map; /* data initializers */ uint32_t *tram_addr_map; /* map initializers */ unsigned long code_valid[1024/(sizeof(unsigned long)*8)]; /* bitmask of valid instructions */ uint32_t *code; /* one instruction - 64 bits */ } emu10k1_fx8010_code_t; typedef struct { unsigned int address; /* 31.bit == 1 -> external TRAM */ unsigned int size; /* size in samples (4 bytes) */ unsigned int *samples; /* pointer to samples (20-bit) */ /* NULL->clear memory */ } emu10k1_fx8010_tram_t; typedef struct { unsigned int substream; /* substream number */ unsigned int res1; /* reserved */ unsigned int channels; /* 16-bit channels count, zero = remove this substream */ unsigned int tram_start; /* ring buffer position in TRAM (in samples) */ unsigned int buffer_size; /* count of buffered samples */ unsigned short gpr_size; /* GPR containing size of ringbuffer in samples (host) */ unsigned short gpr_ptr; /* GPR containing current pointer in the ring buffer (host = reset, FX8010) */ unsigned short gpr_count; /* GPR containing count of samples between two interrupts (host) */ unsigned short gpr_tmpcount; /* GPR containing current count of samples to interrupt (host = set, FX8010) */ unsigned short gpr_trigger; /* GPR containing trigger (activate) information (host) */ unsigned short gpr_running; /* GPR containing info if PCM is running (FX8010) */ unsigned char pad; /* reserved */ unsigned char etram[32]; /* external TRAM address & data (one per channel) */ unsigned int res2; /* reserved */ } emu10k1_fx8010_pcm_t; typedef enum { Digiface, Multiface, H9652, H9632, Undefined, } HDSP_IO_Type; typedef struct _snd_hdsp_peak_rms hdsp_peak_rms_t; struct _snd_hdsp_peak_rms { uint32_t input_peaks[26]; uint32_t playback_peaks[26]; uint32_t output_peaks[28]; uint64_t input_rms[26]; uint64_t playback_rms[26]; /* These are only used for H96xx cards */ uint64_t output_rms[26]; }; typedef struct _snd_hdsp_config_info hdsp_config_info_t; struct _snd_hdsp_config_info { unsigned char pref_sync_ref; unsigned char wordclock_sync_check; unsigned char spdif_sync_check; unsigned char adatsync_sync_check; unsigned char adat_sync_check[3]; unsigned char spdif_in; unsigned char spdif_out; unsigned char spdif_professional; unsigned char spdif_emphasis; unsigned char spdif_nonaudio; unsigned int spdif_sample_rate; unsigned int system_sample_rate; unsigned int autosync_sample_rate; unsigned char system_clock_mode; unsigned char clock_source; unsigned char autosync_ref; unsigned char line_out; unsigned char passthru; unsigned char da_gain; unsigned char ad_gain; unsigned char phone_gain; unsigned char xlr_breakout_cable; unsigned char analog_extension_board; }; typedef struct _snd_hdsp_firmware hdsp_firmware_t; struct _snd_hdsp_firmware { void *firmware_data; /* 24413 x 4 bytes */ }; typedef struct _snd_hdsp_version hdsp_version_t; struct _snd_hdsp_version { HDSP_IO_Type io_type; unsigned short firmware_rev; }; typedef struct _snd_hdsp_mixer hdsp_mixer_t; struct _snd_hdsp_mixer { unsigned short matrix[HDSP_MATRIX_MIXER_SIZE]; }; typedef struct _snd_hdsp_9632_aeb hdsp_9632_aeb_t; struct _snd_hdsp_9632_aeb { int aebi; int aebo; }; typedef struct snd_sb_csp_mc_header { char codec_name[16]; /* id name of codec */ unsigned short func_req; /* requested function */ } snd_sb_csp_mc_header_t; typedef struct snd_sb_csp_microcode { snd_sb_csp_mc_header_t info; unsigned char data[SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE]; } snd_sb_csp_microcode_t; typedef struct snd_sb_csp_start { int sample_width; /* sample width, look above */ int channels; /* channels, look above */ } snd_sb_csp_start_t; typedef struct snd_sb_csp_info { char codec_name[16]; /* id name of codec */ unsigned short func_nr; /* function number */ unsigned int acc_format; /* accepted PCM formats */ unsigned short acc_channels; /* accepted channels */ unsigned short acc_width; /* accepted sample width */ unsigned short acc_rates; /* accepted sample rates */ unsigned short csp_mode; /* CSP mode, see above */ unsigned short run_channels; /* current channels */ unsigned short run_width; /* current sample width */ unsigned short version; /* version id: 0x10 - 0x1f */ unsigned short state; /* state bits */ } snd_sb_csp_info_t; struct sscape_bootblock { unsigned char code[256]; unsigned version; }; struct sscape_microcode { unsigned char *code; };