Open Sound System |
Do you have problems with sound/audio application development? Don't panic! Click here for help! |
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 HDAUDIO_CODEC_H #define HDAUDIO_CODEC_H #define HDA_MAX_OUTSTREAMS 12 #define HDA_MAX_INSTREAMS 8 #define MAX_CODECS 16 #define MAX_WIDGETS 150 #define MAX_CONN 24 #define CT_INMONO 0x0001 #define CT_INSTEREO 0x0002 #define CT_INMUTE 0x0003 #define CT_INSRC 0x0004 /* Negation of a mute control */ #define CT_SELECT 0x0005 #define CT_OUTMONO 0x0006 #define CT_OUTSTEREO 0x0007 #define CT_OUTMUTE 0x0008 #define CT_OUTGAINSEL 0x0009 #define CT_INGAINSEL 0x000a #define CT_INSRCSELECT 0x000b #define corb_read(m, cad, wid, d, verb, parm, p1, p2) \ m->read(m->devc, cad, wid, d, verb, parm, p1, p2) #define corb_write(m, cad, wid, d, verb, parm) \ m->write(m->devc, cad, wid, d, verb, parm) #define MIXNUM(widget, ty, ix) \ ((ix) | (ty<<8) | (widget->wid<<16) | (widget->cad << 24)) extern int hdaudio_set_control (int dev, int ctrl, unsigned int cmd, int value); typedef struct _hdaudio_mixer_struct hdaudio_mixer_t;
Reserved (predefined) stream numbers
#define IDDLE_STREAM 0 /* Reserved for silence */ #define FRONT_STREAM 1 /* Reserved for front channel stereo pair */ typedef struct { char *name; int is_output; unsigned char ix, cad, base_wid; unsigned char recsrc_wid; unsigned char volume_wid; int borrow_count; /* Number of other endpoints grouped with this one (for multich) */ int binding; int afg; int min_rate, max_rate; int channels; int fmt_mask; volatile int busy; int nrates, rates[20]; unsigned int sizemask; int stream_number, default_stream_number, iddle_stream; int is_digital; int is_modem; int auto_muted; int skip; /* Not connected to anywhere */ int already_used; } hdaudio_endpointinfo_t;
Codec requests
#define GET_GAIN(inout, leftright) (0xb00|(inout<<7)|(leftright<<5)) #define SET_GAIN(out,inp,lft, rght, ix) (0x300|(out<<7)|(inp<<6)|(lft<<5)|(rght<<4)|ix) #define GET_CONVERTER_FORMAT 0xa00 #define SET_CONVERTER_FORMAT 0x200 #define GET_PARAMETER 0xf00 #define GET_SELECTOR 0xf01 #define SET_SELECTOR 0x701 #define GET_CONNECTION_LIST_ENTRY 0xf02 #define GET_PROCESSING_STATE 0xf03 #define SET_PROCESSING_STATE 0x703 #define GET_SDI_SELECT 0xf04 #define SET_SDI_SELECT 0x704 #define GET_CONVERTER 0xf06 #define SET_CONVERTER 0x706 #define GET_PINCTL 0xf07 #define SET_PINCTL 0x707 #define GET_UNSOLICITED 0xf08 #define SET_UNSOLICITED 0x708 #define GET_CONFIG_DEFAULT 0xf1c #define SET_POWER_STATE 0x705 #define GET_POWER_STATE 0xf05 #define GET_PIN_SENSE 0xf09 #define TRIGGER_PIN_SENSE 0x709 #define GET_BEEP 0xf0a #define SET_BEEP 0x70a #define GET_EAPD 0xf0c #define SET_EAPD 0x70c #define GET_SPDIF_CONTROL 0xf0d #define SET_SPDIF_CONTROL1 0x70d #define SET_SPDIF_CONTROL2 0x70e #define GET_VOLUME_KNOB_CONTROL 0xf0f #define SET_VOLUME_KNOB_CONTROL 0x70f #define GET_GPI_DATA 0xf10 #define SET_GPI_DATA 0x710 #define GET_GPI_WAKE 0xf11 #define SET_GPI_WAKE 0x711 #define GET_GPI_UNSOL 0xf12 #define SET_GPI_UNSOL 0x712 #define GET_GPI_STICKY 0xf13 #define SET_GPI_STICKY 0x713 #define GET_GPO_DATA 0xf14 #define SET_GPO_DATA 0x714 #define GET_GPIO_DATA 0xf15 #define SET_GPIO_DATA 0x715 #define GET_GPIO_ENABLE 0xf16 #define SET_GPIO_ENABLE 0x716 #define GET_GPIO_DIR 0xf17 #define SET_GPIO_DIR 0x717 #define GET_GPIO_WKEN 0xf18 #define SET_GPIO_WKEN 0x718 #define GET_GPIO_UNSOL 0xf19 #define SET_GPIO_UNSOL 0x719 #define GET_GPIO_STICKY 0xf1a #define SET_GPIO_STICKY 0x71a #define GET_SUBSYSTEM_ID 0xf20 #define GET_STRIPE_CONTROL 0xf24 #define SET_CODEC_RESET 0x7ff
Parameters
#define HDA_VENDOR 0x00 #define HDA_REVISION 0x02 #define HDA_NODE_COUNT 0x04 #define HDA_GROUP_TYPE 0x05 #define HDA_AUDIO_GROUP_CAPS 0x08 #define HDA_WIDGET_CAPS 0x09 #define HDA_PCM_SIZES 0x0a #define HDA_STREAM_FMTS 0x0b #define HDA_PIN_CAPS 0x0c #define HDA_INPUTAMP_CAPS 0x0d #define HDA_CONNLIST_LEN 0x0e #define HDA_SUPPORTED_POWER_STATES 0x0f #define HDA_PROCESSING_CAPS 0x10 #define HDA_GPIO_COUNT 0x11 #define HDA_OUTPUTAMP_CAPS 0x12 #define HDA_VOLUMEKNOB_CAPS 0x13 typedef int (*hdmixer_write_t) (void *devc, unsigned int cad, unsigned int nid, unsigned int d, unsigned int verb, unsigned int parm); typedef int (*hdmixer_read_t) (void *devc, unsigned int cad, unsigned int nid, unsigned int d, unsigned int verb, unsigned int parm, unsigned int *upper, unsigned int *lower); #ifdef _KERNEL extern hdaudio_mixer_t *hdaudio_mixer_create (char *name, void *devc, oss_device_t * osdev, hdmixer_write_t writefunc, hdmixer_read_t readfunc, unsigned int codecmask, unsigned int vendor_id, unsigned int subvendor_id); extern void hdaudio_mixer_set_initfunc (hdaudio_mixer_t * mixer, mixer_create_controls_t func); #endif extern int hdaudio_mixer_get_mixdev (hdaudio_mixer_t * mixer); extern int hdaudio_mixer_get_outendpoints (hdaudio_mixer_t * mixer, hdaudio_endpointinfo_t ** endpoints, int size); extern int hdaudio_mixer_get_inendpoints (hdaudio_mixer_t * mixer, hdaudio_endpointinfo_t ** endpoints, int size); extern int hdaudio_codec_setup_endpoint (hdaudio_mixer_t * mixer, hdaudio_endpointinfo_t * endpoint, int rate, int channels, int fmt, int stream_number, unsigned int *setupbits); extern int hdaudio_codec_reset_endpoint (hdaudio_mixer_t * mixer, hdaudio_endpointinfo_t * endpoint, int channels); extern int hdaudio_codec_audio_ioctl (hdaudio_mixer_t * mixer, hdaudio_endpointinfo_t * endpoint, unsigned int cmd, ioctl_arg arg); extern int hda_codec_getname (hdaudio_mixer_t * mixer, hda_name_t *name); extern int hda_codec_getwidget (hdaudio_mixer_t * mixer, hda_widget_info_t *info); extern void hda_codec_unsol (hdaudio_mixer_t * mixer, unsigned int upper, unsigned int lower); extern int hdaudio_amp_maxval (unsigned int ampcaps);
Audio widget types
#define NT_DAC 0 #define NT_ADC 1 #define NT_MIXER 2 #define NT_SELECT 3 #define NT_PIN 4 #define NT_POWER 5 #define NT_KNOB 6 #define NT_BEEP 7 #define NT_VENDOR 15 #endif
Struct for sample rate table
struct hdaudio_rate_def { unsigned int rate, mask; }; extern const struct hdaudio_rate_def *hdaudio_rates; typedef struct { unsigned char cad, wid; char name[32]; char color[32]; unsigned char wid_type, group_type; char used; /* Already bound to mixer */ char skip; /* Ignore this widget as input source */ char skip_output; /* Ignore this widget as output target */ unsigned int widget_caps; #define WCAP_STEREO (1 << 0) #define WCAP_INPUT_AMP_PRESENT (1 << 1) #define WCAP_OUTPUT_AMP_PRESENT (1 << 2) #define WCAP_AMP_CAP_OVERRIDE (1 << 3) #define WCAP_FORMAT_OVERRIDE (1 << 4) #define WCAP_STRIPE (1 << 5) #define WCAP_PROC_WIDGET (1 << 6) #define WCAP_UNSOL_CAPABLE (1 << 7) #define WCAP_CONN_LIST (1 << 8) #define WCAP_DIGITAL (1 << 9) #define WCAP_POWER_CTL (1 << 10) #define WCAP_LR_SWAP (1 << 11) unsigned int inamp_caps; unsigned int outamp_caps; #define AMPCAP_MUTE (1UL<<31) #define AMPCAP_STEPSIZE_SHIFT 16 #define AMPCAP_STEPSIZE_MASK 0x7f #define AMPCAP_NUMSTEPS_SHIFT 8 #define AMPCAP_NUMSTEPS_MASK 0x7f #define AMPCAP_OFFSET_SHIFT 0 #define AMPCAP_OFFSET_MASK 0x7f unsigned int pincaps; #define PINCAP_EAPD (1<<16) #define PINCAP_VREF_MASK 0x7f #define PINCAP_VREF_SHIFT 8 #define PINCAP_RESERVED (1<<7) #define PINCAP_BALANCED_PINS (1<<6) #define PINCAP_INPUT_CAPABLE (1<<5) #define PINCAP_OUTPUT_CAPABLE (1<<4) #define PINCAP_HP_DRIVE_CAPABLE (1<<3) #define PINCAP_JACKSENSE_CAPABLE (1<<2) #define PINCAP_TRIGGERR_RQRD (1<<1) #define PINCAP_IMPSENSE_CAPABLE (1<<0) unsigned int sizes; int nconn; short connections[MAX_CONN]; short references[MAX_CONN]; short refcount; char plugged_in; int impsense; /* Impedanse sensing result. -1=no info */ char pin_type, sensed_pin; #define PIN_UNKNOWN 0 #define PIN_IN 1 #define PIN_MIC 2 #define PIN_OUT 3 #define PIN_HEADPHONE 4 hdaudio_endpointinfo_t *endpoint; int current_selector; int rgbcolor; /* RGB value of the jack color */ int association, sequence; } widget_t; typedef int (*hda_mixer_init_func) (int dev, hdaudio_mixer_t * mixer, int cad, int group); typedef struct codec_desc codec_desc_t; typedef struct { const codec_desc_t *codec_desc; int active; /* Codec has audio or modem functionality */ unsigned long vendor_flags; int nwidgets; widget_t widgets[MAX_WIDGETS]; int afg; int jack_number; int first_node; int num_jacks_plugged; unsigned int sizes; hda_mixer_init_func mixer_init; unsigned int default_inamp_caps; unsigned int default_outamp_caps; unsigned int vendor_id, subvendor_id; int speaker_mode; #define SPKMODE_DEFAULT 0 #define SPKMODE_SPEAKER 1 #define SPKMODE_STEREO 2 #define SPKMODE_51 3 #define SPKMODE_71 4 int num_inendpoints; hdaudio_endpointinfo_t inendpoints[HDA_MAX_INSTREAMS]; int num_outendpoints; hdaudio_endpointinfo_t outendpoints[HDA_MAX_OUTSTREAMS]; unsigned int multich_map; /* See codec_desc_t.multich_map */ int mixer_mode; /* For use by dedicated drivers. Initially set to 0 */ char **remap; } codec_t; struct _hdaudio_mixer_struct { void *devc; oss_device_t *osdev; char name[64]; char *chip_name; int mixer_dev; hdmixer_write_t write; hdmixer_read_t read; unsigned int codecmask; int ncodecs; codec_t *codecs[MAX_CODECS]; int ncontrols; /* Total number of widgets (all codecs) */ int num_inendpoints, copied_inendpoints; hdaudio_endpointinfo_t inendpoints[HDA_MAX_INSTREAMS]; int num_outendpoints, copied_outendpoints; hdaudio_endpointinfo_t outendpoints[HDA_MAX_OUTSTREAMS]; int npins; /* Used for managing the width of the connectors group */ int split_connectors; /* Fearless flag used for splitting the connectors geroup */ mixer_create_controls_t client_mixer_init; int remap_avail; }; extern int create_outgain_selector (hdaudio_mixer_t * mixer, widget_t * widget, int group, const char *name); extern int create_ingain_selector (hdaudio_mixer_t * mixer, codec_t * codec, widget_t * widget, int group, int ix, const char *name); #include "hdaudio_mixers.h"