Google
 

Open Sound System
The Hitchhiker's Guide to OSS 4.1 Internals

Do you have problems with sound/audio application development? Don't panic! Click here for help!

oss_hdaudio/hdaudio_codec.h

Definitions of HD audio codec functions, structures and macros

Description




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"

Copyright (C) 4Front Technologies, 2007. All rights reserved.

Back to index OSS web site


Copyright (C) 4Front Technologies, 2007. All rights reserved.
Back to index OSS web site