www.pudn.com > av3dec_20050318.zip > AD.h


/*------------ Telecommunications & Signal Processing Lab -------------- 
                         McGill University 
 
Routine: 
  AD.h 
 
Description: 
  Declarations for audio device routines 
 
Author / revision: 
  P. Kabal  Copyright (C) 1999 
  $Revision: 1.18 $  $Date: 1999/06/14 16:10:34 $ 
 
----------------------------------------------------------------------*/ 
 
#ifndef AD_h_ 
#define AD_h_ 
 
#include 		/* AFILE */ 
#include 	/* uint1_t */ 
#include "AO.h"			/* AO_LIM_UNDEF */ 
 
/* Distinguish Solaris (SunOS 5.x) and SunOS 4.1 */ 
#ifdef __SVR4 
#  define SOLARIS	1 
#endif 
 
/* ADopenPlay flags */ 
#define AD_WAIT_FLAG		1 
#define AD_PRINT_FLAG		2 
 
/* Output ports (speaker, headphone, line-out) */ 
#define NOPORT		3 
#define PORT_DELETE	'-' 
#define PORT_ADD	'+' 
 
#ifndef	AD_t_ 
#  define	AD_t_ 
typedef struct AD_DevPar ADEV;	/* Audio device parameters */ 
#endif 
 
/* Audio device option structure */ 
struct AD_DevOpt { 
  float Sfreq; 
  float Vol; 
  float Balance; 
  char Ports[NOPORT]; 
  int Mute; 
}; 
 
/* Audio device parameter structure */ 
struct AD_DevPar { 
  int fd;		/* Audio device file descriptor */ 
  struct { 
    unsigned int gain; 
    unsigned int port; 
    unsigned char balance; 
  } play; 
  unsigned char output_muted; 
}; 
 
#define DevOpt_INIT(p) { \ 
	int i__; \ 
	(p)->Sfreq = SFREQ_DEFAULT; \ 
	(p)->Vol = VOL_UNDEF; \ 
	(p)->Balance = BALANCE_UNDEF; \ 
	for (i__ = 0; i__ < NOPORT; ++i__) \ 
	  (p)->Ports[i__] = ' '; \ 
	(p)->Mute = MUTE_DEFAULT; } 
 
#ifndef SOLARIS 
static const char *AD_type[] = { 
  "Not defined", 
  "amd device (ELC)", 
  "dbri device (speakerbox)", 
  "dbri device", 
  "Unknown device (code 4)", 
  "multimedia audio card", 
  "Unknown device" 
}; 
#define NELEM(array)	((sizeof array) / (sizeof array[0])) 
#define NAD_type	(NELEM (AD_type)) 
#endif 
 
/* 
  Choose the UNDEFINED value such that conversion between double & float 
  leaves the value unchanged 
*/ 
#define VOL_UNDEF	(-330)	/* Value not in [0,100] */ 
#define BALANCE_UNDEF	VOL_UNDEF 
#define SFREQ_DEFAULT	VOL_UNDEF 
 
#define AD_LIM_UNDEF	AO_LIM_UNDEF 
 
#define MUTE_ON		1 
#define MUTE_DEFAULT	0 
#define MUTE_OFF	-1 
 
#define AUDIO_DEV_DEFAULT	"/dev/audio" 
 
#define SFREQ_TOL	0.05	/* Fractional deviation */ 
 
/* 
  There are several versions of the audioio.h file. 
  On SunOS 4.1, the file is  
    Version 1.2 92/05/20 (file dated Sept. 3, 1992) 
      - definitions for AUDIO_GETINFO etc. work for both  ANSI C and non-ANSI C 
      - defines AUDIO_MAX_BALANCE 
      - AUDIO_GETINFO returns an integer code 
    Version 1.33 (file dated Oct. 14, 1994) 
      - definitions for AUDIO_GETINFO etc. work for only for non-ANSI C 
      - better comments 
      - defines AUDIO_RIGHT_BALANCE 
      - AUDIO_GETINFO returns an integer code 
  On SunOS 5.5, the file is  
    Version 1.21 94/01/21 (file dated Oct. 25, 1995) 
    Version 1.23 95/08/15 (file dated May 2, 1996) 
      - defines AUDIO_RIGHT_BALANCE 
      - defines new encodings 
      - defines new input port 
      - AUDIO_GETINFO returns a structure with strings 
*/ 
 
#ifdef SOLARIS 
#  include  
 
#else		/* SunOS 4.1.X */ 
#  include  
#  ifndef AUDIO_RIGHT_BALANCE 
#    define AUDIO_LEFT_BALANCE	AUDIO_MIN_BALANCE_ 
#    define AUDIO_RIGHT_BALANCE	AUDIO_MAX_BALANCE 
#  endif 
#  ifdef __STDC__ 
#    undef AUDIO_GETINFO 
#    undef AUDIO_SETINFO 
#    undef AUDIO_DRAIN 
#    undef AUDIO_GETDEV 
#    define AUDIO_GETINFO	_IOR('A', 1, audio_info_t) 
#    define AUDIO_SETINFO	_IOWR('A', 2, audio_info_t) 
#    define AUDIO_DRAIN		_IO('A', 3) 
#    define AUDIO_GETDEV	_IOR('A', 4, int) 
#  endif 
#endif 
 
/* Warning messages */ 
#define ADM_DevAtt	"Audio device attached" 
#define ADM_Muted	"Audio output is muted" 
#define ADM_WaitDev	"Waiting for audio device" 
 
/* Error messages */ 
#define ADM_AccessErr	"Error accessing audio device" 
#define ADM_BadBal	"Invalid stereo balance value" 
#define ADM_BadOPort	"Invalid output port specification" 
#define ADM_BadOption	"Option error, use -h for a list of options" 
#define ADM_BadSFreq	"Invalid sampling frequency" 
#define ADM_BadVol	"Invalid volume value" 
#define ADM_DataNChan	"Unable to set data type/ no. channels" 
#define ADM_DevBusy	"Audio device is busy" 
#define ADM_DrainErr	"Drain failed on audio device" 
#define ADM_FlushErr	"Error flushing audio device" 
#define ADM_GetErr	"Error reading audio device parameters" 
#define ADM_OpenErr	"Error opening audio device" 
#define ADM_PortErr	"Selected output port not available" 
#define ADM_SetErr	"Error setting audio device parameters" 
#define ADM_SigHandler	"Cannot set up signal handler" 
#define ADM_UnsAPrec	"Unsupported A-law precision" 
#define ADM_UnsData	"Unsupported data encoding" 
#define ADM_UnsIPrec	"Unsupported integer precision" 
#define ADM_UnsMPrec	"Unsupported mu-law precision" 
#define ADM_UnsSFreq	"Unsupported sampling rate" 
#define ADM_WriteErr	"Error writing to audio device" 
#define ADM_XNChan	"Too many input channels" 
 
/* Printout formats */ 
#define ADMF_ADev	"Audio device: %s, %*s:\n" 
#define ADMF_ADevS	"Audio device: %s, %s:\n" 
#define ADMF_Frames	"  frames: %ld to %ld (total %ld, %.3f sec)\n" 
#define ADMF_NOvld	"%s: %ld overloads detected" 
#define ADMF_Samples	"  samples: %ld to %ld (total %ld, %.3f sec)\n" 
#define ADMF_VolBal	"  volume: %.0f%%   balance: %.0f%%\n" 
#define ADMF_OFormat	"  playback: %s (%d-bit) %d channel, %d Hz\n" 
 
#define ADMF_SFreqChange "Sampling rate changed from %g to %g" 
 
#ifdef __cplusplus 
extern "C" { 
#endif 
 
/* Prototypes */ 
void 
ADclosePlay (void); 
int 
ADdecDevOpt (struct AD_DevOpt *DevOpt); 
void 
ADdecOPort (const char String[], char Ports[NOPORT]); 
void 
ADdrain (int audio_fd); 
int 
ADfI2 (const float Fbuf[], int2_t Ibuf[], int Nval); 
int 
ADfMulaw (const float Fbuf[], uint1_t Cbuf[], int Nval); 
void 
ADgetOFormat (int audio_fd, float *Sfreq, int *Format, long int *Nchan); 
int 
ADopenControl (const char AudDev[], int Flags); 
int 
ADopenPlay (const char AudioDev[], int Flags); 
void 
ADplay (int audio_fd, AFILE *AFp, const long int Lim[2]); 
void 
ADprintOFormat (int audio_fd); 
void 
ADprintOPort (int audio_fd); 
void 
ADsetOFormat (int audio_fd, double Sfreq, int Nchan); 
void 
ADsetOPort (int fd, const char Ports[NOPORT], double Vol, double Balance, 
	    int Mute); 
 
#ifdef __cplusplus 
} 
#endif 
 
#endif /* AD_h_ */