mirror of
				https://github.com/alsa-project/alsa-lib.git
				synced 2025-10-29 05:40:25 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			1230 lines
		
	
	
	
		
			55 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			1230 lines
		
	
	
	
		
			55 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|   Advanced Linux Sound Architecture - Library API
 | ||
|   Jaroslav Kysela <perex@jcu.cz> with assistance from Alan
 | ||
|   Robinson
 | ||
|   v0.0.3, 25 March 1998
 | ||
| 
 | ||
|   This document describes, in full detail, the Advanced Linux Sound
 | ||
|   Architecture library API.
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   Table of Contents:
 | ||
| 
 | ||
|   1.      Introduction
 | ||
| 
 | ||
|   2.      Error Codes
 | ||
| 
 | ||
|   2.1.    Error Codes in Detail
 | ||
| 
 | ||
|   2.2.    Functions
 | ||
| 
 | ||
|   2.2.1.  const char *snd_strerror( int errnum )
 | ||
| 
 | ||
|   3.      Control Interface
 | ||
| 
 | ||
|   3.1.    Low-Level Layer
 | ||
| 
 | ||
|   3.1.1.  int snd_cards( void )
 | ||
| 
 | ||
|   3.1.2.  unsigned int snd_cards_mask( void )
 | ||
| 
 | ||
|   3.1.3.  int snd_ctl_open( void **handle, int card )
 | ||
| 
 | ||
|   3.1.4.  int snd_ctl_close( void *handle )
 | ||
| 
 | ||
|   3.1.5.  int snd_ctl_file_descriptor( void *handle )
 | ||
| 
 | ||
|   3.1.6.  int snd_ctl_hw_info( void *handle, struct snd_ctl_hw_info
 | ||
|   *info )
 | ||
| 
 | ||
|   3.1.7.  int snd_ctl_pcm_info( void *handle, int dev, snd_pcm_info_t
 | ||
|   *info )
 | ||
| 
 | ||
|   3.1.8.  int snd_ctl_pcm_playback_info( void *handle, int dev,
 | ||
|   snd_pcm_playback_info_t *info )
 | ||
| 
 | ||
|   3.1.9.  int snd_ctl_pcm_record_info( void *handle, int dev,
 | ||
|   snd_pcm_record_info_t *info )
 | ||
| 
 | ||
|   3.1.10. int snd_ctl_mixer_info( void *handle, int dev,
 | ||
|   snd_mixer_info_t *info )
 | ||
| 
 | ||
|   3.2.    Examples
 | ||
| 
 | ||
|   4.      Mixer Interface
 | ||
| 
 | ||
|   4.1.    Low-Level Layer
 | ||
| 
 | ||
|   4.1.1.  int snd_mixer_open( void **handle, int card, int device )
 | ||
| 
 | ||
|   4.1.2.  int snd_mixer_close( void *handle )
 | ||
| 
 | ||
|   4.1.3.  int snd_mixer_file_descriptor( void *handle )
 | ||
| 
 | ||
|   4.1.4.  int snd_mixer_channels( void *handle )
 | ||
| 
 | ||
|   4.1.5.  int snd_mixer_info( void *handle, snd_mixer_info_t *info )
 | ||
| 
 | ||
|   4.1.6.  int snd_mixer_channel( void *handle, const char *channel_id )
 | ||
| 
 | ||
|   4.1.7.  int snd_mixer_exact_mode( void *handle, int enable )
 | ||
| 
 | ||
|   4.1.8.  int snd_mixer_channel_info( void *handle, int channel,
 | ||
|   snd_mixer_channel_info_t *info )
 | ||
| 
 | ||
|   4.1.9.  int snd_mixer_channel_read( void *handle, int channel,
 | ||
|   snd_mixer_channel_t *data )
 | ||
| 
 | ||
|   4.1.10. int snd_mixer_channel_write( void *handle, int channel,
 | ||
|   snd_mixer_channel_t *data )
 | ||
| 
 | ||
|   4.1.11. int snd_mixer_special_read( void *handle, snd_mixer_special_t
 | ||
|   *special )
 | ||
| 
 | ||
|   4.1.12. int snd_mixer_special_write( void *handle, snd_mixer_special_t
 | ||
|   *special )
 | ||
| 
 | ||
|   4.1.13. int snd_mixer_read( void *handle, snd_mixer_callbacks_t
 | ||
|   *callbacks )
 | ||
| 
 | ||
|   4.2.    Examples
 | ||
| 
 | ||
|   5.      Digital Audio (PCM) Interface
 | ||
| 
 | ||
|   5.1.    Low-Level Layer
 | ||
| 
 | ||
|   5.1.1.  int snd_pcm_open( void **handle, int card, int device, int
 | ||
|   mode )
 | ||
| 
 | ||
|   5.1.2.  int snd_pcm_close( void *handle )
 | ||
| 
 | ||
|   5.1.3.  int snd_pcm_file_descriptor( void *handle )
 | ||
| 
 | ||
|   5.1.4.  int snd_pcm_block_mode( void *handle, int enable )
 | ||
| 
 | ||
|   5.1.5.  int snd_pcm_info( void *handle, snd_pcm_info_t *info )
 | ||
| 
 | ||
|   5.1.6.  int snd_pcm_playback_info( void *handle,
 | ||
|   snd_pcm_playback_info_t *info )
 | ||
| 
 | ||
|   5.1.7.  int snd_pcm_record_info( void *handle, snd_pcm_record_info_t
 | ||
|   *info )
 | ||
| 
 | ||
|   5.1.8.  int snd_pcm_playback_format( void *handle, snd_pcm_format_t
 | ||
|   *format )
 | ||
| 
 | ||
|   5.1.9.  int snd_pcm_record_format( void *handle, snd_pcm_format_t
 | ||
|   *format )
 | ||
| 
 | ||
|   5.1.10. int snd_pcm_playback_params( void *handle,
 | ||
|   snd_pcm_playback_params_t *params )
 | ||
| 
 | ||
|   5.1.11. int snd_pcm_record_params( void *handle,
 | ||
|   snd_pcm_record_params_t *params )
 | ||
| 
 | ||
|   5.1.12. int snd_pcm_playback_status( void *handle,
 | ||
|   snd_pcm_playback_status_t *status )
 | ||
| 
 | ||
|   5.1.13. int snd_pcm_record_status( void *handle,
 | ||
|   snd_pcm_record_status_t *status )
 | ||
| 
 | ||
|   5.1.14. int snd_pcm_drain_playback( void *handle )
 | ||
| 
 | ||
|   5.1.15. int snd_pcm_flush_playback( void *handle )
 | ||
| 
 | ||
|   5.1.16. int snd_pcm_flush_record( void *handle )
 | ||
| 
 | ||
|   5.1.17. int snd_pcm_playback_time( void *handle, int enable )
 | ||
| 
 | ||
|   5.1.18. int snd_pcm_record_time( void *handle, int enable )
 | ||
| 
 | ||
|   5.1.19. ssize_t snd_pcm_write( void *handle, const void *buffer,
 | ||
|   size_t size )
 | ||
| 
 | ||
|   5.1.20. ssize_t snd_pcm_read( void *handle, void *buffer, size_t size
 | ||
|   )
 | ||
| 
 | ||
|   5.2.    Examples
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   11..  IInnttrroodduuccttiioonn
 | ||
| 
 | ||
|   The Advanced Linux Sound Architecture comes with a kernel API &
 | ||
|   library API.  This document describes the library API and how it
 | ||
|   interfaces with the kernel API.  The kernal API will probably never be
 | ||
|   documented in standalone form.
 | ||
| 
 | ||
|   Application programmers should use the library API rather than kernel
 | ||
|   API.  The Library offers 100% of the functionally of the kernel API,
 | ||
|   but add next major improvements in usability, making the application
 | ||
|   code simpler and better looking. In addition, some of the some
 | ||
|   fixes/compatibility code in, may be placed in the library code instead
 | ||
|   of the kernel driver.
 | ||
| 
 | ||
|   For a complete list of all variables and functions in the API you
 | ||
|   should look at the following header files:
 | ||
| 
 | ||
|   1. /usr/include/sys/asoundlib.h
 | ||
| 
 | ||
|   2. /usr/include/linux/asound.h
 | ||
| 
 | ||
|   3. /usr/include/linux/asoundid.h
 | ||
| 
 | ||
|   22..  EErrrroorr CCooddeess
 | ||
| 
 | ||
|   All functions return int (or some sort of signed value). If this value
 | ||
|   is negative it represents an error code. Codes up to SND_ERROR_BEGIN
 | ||
|   (500000) represents standard system errors. Codes equal or greather
 | ||
|   than this value represents sound library API errors. All error codes
 | ||
|   begin with the prefix _S_N_D___E_R_R_O_R__.
 | ||
| 
 | ||
|   22..11..  EErrrroorr CCooddeess iinn DDeettaaiill
 | ||
| 
 | ||
|      SSNNDD__EERRRROORR__UUNNCCOOMMPPAATTIIBBLLEE__VVEERRSSIIOONN ((550000000000))
 | ||
|         This error is caused if the driver uses an incompatible kernel
 | ||
|         API for this interface and hence the library doesn't know how
 | ||
|         this API can be used.
 | ||
| 
 | ||
|   22..22..  FFuunnccttiioonnss
 | ||
| 
 | ||
|   22..22..11..
 | ||
| 
 | ||
|   ccoonnsstt cchhaarr **ssnndd__ssttrreerrrroorr(( iinntt eerrrrnnuumm ))
 | ||
| 
 | ||
|   This functions converts error code to a string. Its functionality is
 | ||
|   the same as the _s_t_r_e_r_r_o_r function from the standard C library, but
 | ||
|   this function returns correct strings for sound error codes, too.
 | ||
| 
 | ||
|   33..  CCoonnttrrooll IInntteerrffaaccee
 | ||
| 
 | ||
|   The control interfaces gives application various information about the
 | ||
|   currently installed sound driver in the system. The interface should
 | ||
|   be used to detect if another sound interface is present for selected
 | ||
|   soundcard or, for example, to create a list of devices (MIXER, PCM
 | ||
|   etc) from which the user can select.
 | ||
| 
 | ||
|   33..11..  LLooww--LLeevveell LLaayyeerr
 | ||
| 
 | ||
|   33..11..11..
 | ||
| 
 | ||
|   iinntt ssnndd__ccaarrddss(( vvooiidd ))
 | ||
| 
 | ||
|   Returns the number of soundcards present in the system, if any.
 | ||
|   Otherwise it returns a negative value, which maps to an error code.
 | ||
|   This function will return 0 if no soundcards are detected.
 | ||
| 
 | ||
|   33..11..22..
 | ||
| 
 | ||
|   uunnssiiggnneedd iinntt ssnndd__ccaarrddss__mmaasskk(( vvooiidd ))
 | ||
| 
 | ||
|   Returns the bitmap of soundcards present in the system, if any.
 | ||
|   Otherwise it returns a negative value, which maps to an error code.
 | ||
|   This function will return 0 if no soundcards are detected. First
 | ||
|   soundcard is represented with bit 0.
 | ||
| 
 | ||
|   33..11..33..
 | ||
| 
 | ||
|   iinntt ssnndd__ccttll__ooppeenn(( vvooiidd ****hhaannddllee,, iinntt ccaarrdd ))
 | ||
| 
 | ||
|   Creates a new handle and opens communication with the kernel sound
 | ||
|   control interface for soundcard number _c_a_r_d (0-N). The function also
 | ||
|   checks if protocol is compatible, so as to prevent the use of old
 | ||
|   programs with a new kernel API. Function returns zero if successful,
 | ||
|   otherwise an error code is returned.
 | ||
| 
 | ||
|   33..11..44..
 | ||
| 
 | ||
|   iinntt ssnndd__ccttll__cclloossee(( vvooiidd **hhaannddllee ))
 | ||
| 
 | ||
|   Function frees all resources allocated with control handle and closes
 | ||
|   the kernel sound control interface. Function returns zero if
 | ||
|   successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   33..11..55..
 | ||
| 
 | ||
|   iinntt ssnndd__ccttll__ffiillee__ddeessccrriippttoorr(( vvooiidd **hhaannddllee ))
 | ||
| 
 | ||
|   Function returns file descriptor for the kernel sound control
 | ||
|   interface.  This function should be used in very special cases.
 | ||
|   Function returns a negative error code if some error was encountered.
 | ||
|   33..11..66..
 | ||
| 
 | ||
|   iinntt ssnndd__ccttll__hhww__iinnffoo(( vvooiidd **hhaannddllee,, ssttrruucctt ssnndd__ccttll__hhww__iinnffoo **iinnffoo ))
 | ||
| 
 | ||
|   Fills the info structure with data about the sound hardware referenced
 | ||
|   by handle. Function returns zero if successful, otherwise it returns
 | ||
|   an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     #define SND_CTL_GCAPS_MIDI              0x0000001       /* driver has MIDI interface */
 | ||
| 
 | ||
|     #define SND_CTL_LCAPS_SYNTH             0x0000001       /* soundcard has synthesizer */
 | ||
|     #define SND_CTL_LCAPS_RAWFM             0x0000002       /* soundcard has RAW FM/OPL3 */
 | ||
| 
 | ||
|     struct snd_ctl_hw_info {
 | ||
|       unsigned int type;            /* type of card - see SND_CARD_TYPE_XXXX */
 | ||
|       unsigned int gcaps;           /* see SND_CTL_GCAPS_XXXX */
 | ||
|       unsigned int lcaps;           /* see SND_CTL_LCAPS_XXXX */
 | ||
|       unsigned int pcmdevs;         /* count of PCM devices (0 to N) */
 | ||
|       unsigned int mixerdevs;       /* count of MIXER devices (0 to N) */
 | ||
|       unsigned int mididevs;        /* count of raw MIDI devices (0 to N) */
 | ||
|       char id[8];                   /* ID of card (user selectable) */
 | ||
|       char name[80];                /* name/info text about soundcard */
 | ||
|       unsigned char reserved[128];  /* reserved for future use */
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   33..11..77..
 | ||
| 
 | ||
|   iinntt ssnndd__ccttll__ppccmm__iinnffoo(( vvooiidd **hhaannddllee,, iinntt ddeevv,, ssnndd__ppccmm__iinnffoo__tt **iinnffoo ))
 | ||
| 
 | ||
|   Fills the *info structure with data about the PCM device. Function
 | ||
|   returns zero if successful, otherwise it returns an error code.
 | ||
|   Details about the snd_pcm_info_t structure are in the DDiiggiittaall AAuuddiioo
 | ||
|   ((PPCCMM)) IInntteerrffaaccee section. The argument _d_e_v selects the device number
 | ||
|   for the soundcard referenced by *handle. Its range is 0 to N where N
 | ||
|   is _s_t_r_u_c_t _s_n_d___c_t_l___h_w___i_n_f_o _-_> _p_c_m_d_e_v_s _- _1. This function will work if
 | ||
|   the selected PCM device is busy, too. It should be used to collect
 | ||
|   information about PCM devices without exclusive lock.
 | ||
| 
 | ||
|   33..11..88..
 | ||
| 
 | ||
|   iinntt ssnndd__ccttll__ppccmm__ppllaayybbaacckk__iinnffoo(( vvooiidd **hhaannddllee,, iinntt ddeevv,, ssnndd__ppccmm__ppllaayy--
 | ||
|   bbaacckk__iinnffoo__tt **iinnffoo ))
 | ||
| 
 | ||
|   Fills the *info structure with data about the PCM device and playback
 | ||
|   direction.  Function returns zero if successful, otherwise it returns
 | ||
|   an error code.  Details about the snd_pcm_playback_info_t structure
 | ||
|   are in the DDiiggiittaall AAuuddiioo ((PPCCMM)) IInntteerrffaaccee section. The argument _d_e_v
 | ||
|   selects the device number for the soundcard referenced by *handle. Its
 | ||
|   range is 0 to N where N is _s_t_r_u_c_t _s_n_d___c_t_l___h_w___i_n_f_o _-_> _p_c_m_d_e_v_s _- _1.
 | ||
|   This function will work if the selected PCM device is busy, too. It
 | ||
|   should be used to collect information about PCM devices without
 | ||
|   exclusive lock.
 | ||
| 
 | ||
|   33..11..99..
 | ||
| 
 | ||
|   iinntt ssnndd__ccttll__ppccmm__rreeccoorrdd__iinnffoo(( vvooiidd **hhaannddllee,, iinntt ddeevv,,
 | ||
|   ssnndd__ppccmm__rreeccoorrdd__iinnffoo__tt **iinnffoo ))
 | ||
| 
 | ||
|   Fills the *info structure with data about the PCM device and record
 | ||
|   direction.  Function returns zero if successful, otherwise it returns
 | ||
|   an error code.  Details about the snd_pcm_record_info_t structure are
 | ||
|   in the DDiiggiittaall AAuuddiioo ((PPCCMM)) IInntteerrffaaccee section. The argument _d_e_v selects
 | ||
|   the device number for the soundcard referenced by *handle. Its range
 | ||
|   is 0 to N where N is _s_t_r_u_c_t _s_n_d___c_t_l___h_w___i_n_f_o _-_> _p_c_m_d_e_v_s _- _1.  This
 | ||
|   function will work if the selected PCM device is busy, too. It should
 | ||
|   be used to collect information about PCM devices without exclusive
 | ||
|   lock.
 | ||
| 
 | ||
|   33..11..1100..
 | ||
| 
 | ||
|   iinntt ssnndd__ccttll__mmiixxeerr__iinnffoo(( vvooiidd **hhaannddllee,, iinntt ddeevv,, ssnndd__mmiixxeerr__iinnffoo__tt **iinnffoo
 | ||
|   ))
 | ||
| 
 | ||
|   Fills the *info structure with data about the mixer device. Returns
 | ||
|   zero if successful, otherwise it returns an error code. Details about
 | ||
|   the snd_mixer_info_t structure are in the MMiixxeerr IInntteerrffaaccee section.
 | ||
|   The argument _d_e_v specifies the device number for the appropriate
 | ||
|   soundcard. Its range is 0 to N where N found from _s_t_r_u_c_t
 | ||
|   _s_n_d___c_t_l___h_w___i_n_f_o _-_> _m_i_x_e_r_d_e_v_s _- _1.  It should be used to collect
 | ||
|   information about mixer devices.
 | ||
| 
 | ||
|   33..22..  EExxaammpplleess
 | ||
| 
 | ||
|   The following example shows how all PCM devices can be detected for
 | ||
|   the first soundcard (#0) in the system.
 | ||
| 
 | ||
|        ______________________________________________________________________
 | ||
|        int card = 0, err;
 | ||
|        void *handle;
 | ||
|        stuct snd_ctl_hw_info info;
 | ||
| 
 | ||
|        if ( (err = snd_ctl_open( &handle, card )) < 0 ) {
 | ||
|          fprintf( stderr, "open failed: %s\n", snd_strerror( err ) );
 | ||
|          return;
 | ||
|        }
 | ||
|        if ( (err = snd_ctl_hw_info( handle, &info )) < 0 ) {
 | ||
|          fprintf( stderr, "hw info failed: %s\n", snd_strerror( err ) );
 | ||
|          snd_ctl_close( handle );
 | ||
|          return;
 | ||
|        }
 | ||
|        printf( "Installed PCM devices for card #i: %i\n", card + 1, info.pcmdevs );
 | ||
|        snd_ctl_close( handle );
 | ||
|        ______________________________________________________________________
 | ||
| 
 | ||
|   44..  MMiixxeerr IInntteerrffaaccee
 | ||
| 
 | ||
|   The Mixer Interface allows applications to change the volume level of
 | ||
|   a soundcard's input/output channels in both the linear range (0-100)
 | ||
|   and in decibels. It also supports features like hardware mute, input
 | ||
|   sound source, etc.
 | ||
| 
 | ||
|   44..11..  LLooww--LLeevveell LLaayyeerr
 | ||
| 
 | ||
|   Mixer devices aren't opened exclusively. This allows applications to
 | ||
|   open a device multiple times with one or more processes.
 | ||
|   44..11..11..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__ooppeenn(( vvooiidd ****hhaannddllee,, iinntt ccaarrdd,, iinntt ddeevviiccee ))
 | ||
| 
 | ||
|   Creates new handle and opens a connection to the kernel sound mixer
 | ||
|   interface for soundcard number _c_a_r_d (0-N) and mixer device number
 | ||
|   _d_e_v_i_c_e.  Also checks if protocol is compatible to prevent use of old
 | ||
|   programs with new kernel API. Function returns zero if successful,
 | ||
|   otherwise it returns an error code.
 | ||
| 
 | ||
|   44..11..22..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__cclloossee(( vvooiidd **hhaannddllee ))
 | ||
| 
 | ||
|   Frees all resources allocated to the mixer handle and closes its
 | ||
|   connection to the kernel sound mixer interface. Function returns zero
 | ||
|   if successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   44..11..33..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__ffiillee__ddeessccrriippttoorr(( vvooiidd **hhaannddllee ))
 | ||
| 
 | ||
|   Returns the file descriptor for the connection to the kernel sound
 | ||
|   mixer interface. This function should be used only in very special
 | ||
|   cases. Function returns a negative error code if an error was
 | ||
|   encountered.
 | ||
| 
 | ||
|   The file descriptor should be used for the _s_e_l_e_c_t synchronous
 | ||
|   multiplexer function for deterimeing read direction. Applications
 | ||
|   should call _s_n_d___m_i_x_e_r___r_e_a_d function if some data is waiting to be
 | ||
|   read.  It is recomended that you do this, since it leaves place for
 | ||
|   this function to handle some new kernel API specifications.
 | ||
| 
 | ||
|   44..11..44..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__cchhaannnneellss(( vvooiidd **hhaannddllee ))
 | ||
| 
 | ||
|   Returns the count of mixer channels for appropriate mixer device,
 | ||
|   otherwise the return value is negative, and signifies an error code.
 | ||
|   Never returns zero.
 | ||
| 
 | ||
|   44..11..55..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__iinnffoo(( vvooiidd **hhaannddllee,, ssnndd__mmiixxeerr__iinnffoo__tt **iinnffoo ))
 | ||
| 
 | ||
|   Fills the *info structure with information about the mixer associated
 | ||
|   with *handle. Returns zero if successful, otherwise it returns an
 | ||
|   error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     #define SND_MIXER_INFO_CAP_EXCL_RECORD  0x00000001
 | ||
| 
 | ||
|     struct snd_mixer_info {
 | ||
|       unsigned int type;            /* type of soundcard - SND_CARD_TYPE_XXXX */
 | ||
|       unsigned int channels;        /* count of mixer devices */
 | ||
|       unsigned int caps;            /* some flags about this device (SND_MIXER_INFO_CAP_XXXX) */
 | ||
|       unsigned char id[32];         /* ID of this mixer */
 | ||
|       unsigned char name[80];       /* name of this device */
 | ||
|       char reserved[ 32 ];          /* reserved for future use */
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   44..11..66..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__cchhaannnneell(( vvooiidd **hhaannddllee,, ccoonnsstt cchhaarr **cchhaannnneell__iidd ))
 | ||
| 
 | ||
|   Returns the channel number (index) associated with channel_id (channel
 | ||
|   name), or returns an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     #define SND_MIXER_ID_MASTER             "Master"
 | ||
|     #define SND_MIXER_ID_BASS               "Bass"
 | ||
|     #define SND_MIXER_ID_TREBLE             "Treble"
 | ||
|     #define SND_MIXER_ID_SYNTHESIZER        "Synth"
 | ||
|     #define SND_MIXER_ID_SYNTHESIZER1       "Synth 1"
 | ||
|     #define SND_MIXER_ID_FM                 "FM"
 | ||
|     #define SND_MIXER_ID_EFFECT             "Effect"
 | ||
|     #define SND_MIXER_ID_PCM                "PCM"
 | ||
|     #define SND_MIXER_ID_PCM1               "PCM 1"
 | ||
|     #define SND_MIXER_ID_LINE               "Line-In"
 | ||
|     #define SND_MIXER_ID_MIC                "MIC"
 | ||
|     #define SND_MIXER_ID_CD                 "CD"
 | ||
|     #define SND_MIXER_ID_GAIN               "Record-Gain"
 | ||
|     #define SND_MIXER_ID_IGAIN              "In-Gain"
 | ||
|     #define SND_MIXER_ID_OGAIN              "Out-Gain"
 | ||
|     #define SND_MIXER_ID_LOOPBACK           "Loopback"
 | ||
|     #define SND_MIXER_ID_SPEAKER            "PC Speaker"
 | ||
|     #define SND_MIXER_ID_AUXA               "Aux A"
 | ||
|     #define SND_MIXER_ID_AUXB               "Aux B"
 | ||
|     #define SND_MIXER_ID_AUXC               "Aux C"
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   44..11..77..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__eexxaacctt__mmooddee(( vvooiidd **hhaannddllee,, iinntt eennaabbllee ))
 | ||
| 
 | ||
|   Turns on or off (by default) exact mode. This mode allows to
 | ||
|   application set/get volume values in exact range which uses hardware.
 | ||
|   In non-exact mode is range always from 0 to 100 and conversion to
 | ||
|   hardware range does driver. Function returns zero if successful,
 | ||
|   otherwise it returns an error code.
 | ||
| 
 | ||
|   44..11..88..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__cchhaannnneell__iinnffoo(( vvooiidd **hhaannddllee,, iinntt cchhaannnneell,, ssnndd__mmiixxeerr__cchhaann--
 | ||
|   nneell__iinnffoo__tt **iinnffoo ))
 | ||
|   Fills the *info structure. The argument _c_h_a_n_n_e_l specifies channel (0
 | ||
|   to N) for which is the info requested. Function returns zero if
 | ||
|   successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     #define SND_MIXER_CINFO_CAP_RECORD      0x00000001
 | ||
|     #define SND_MIXER_CINFO_CAP_STEREO      0x00000002
 | ||
|     #define SND_MIXER_CINFO_CAP_MUTE        0x00000004
 | ||
|     #define SND_MIXER_CINFO_CAP_HWMUTE      0x00000008      /* channel supports hardware mute */
 | ||
|     #define SND_MIXER_CINFO_CAP_DIGITAL     0x00000010      /* channel does digital (not analog) mixing */
 | ||
|     #define SND_MIXER_CINOF_CAP_INPUT       0x00000020      /* input channel */
 | ||
| 
 | ||
|     struct snd_mixer_channel_info {
 | ||
|       unsigned int channel;         /* channel # (filled by application) */
 | ||
|       unsigned int parent;          /* parent channel # or SND_MIXER_PARENT */
 | ||
|       unsigned char name[12];       /* name of this device */
 | ||
|       unsigned int caps;            /* some flags about this device (SND_MIXER_CINFO_XXXX) */
 | ||
|       int min;                      /* min. value when exact mode (or always 0) */
 | ||
|       int max;                      /* max. value when exact mode (or always 100) */
 | ||
|       int min_dB;                   /* minimum decibel value (*100) */
 | ||
|       int max_dB;                   /* maximum decibel value (*100) */
 | ||
|       int step_dB;                  /* step decibel value (*100) */
 | ||
|       unsigned char reserved[16];
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   44..11..99..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__cchhaannnneell__rreeaadd(( vvooiidd **hhaannddllee,, iinntt cchhaannnneell,, ssnndd__mmiixxeerr__cchhaann--
 | ||
|   nneell__tt **ddaattaa ))
 | ||
| 
 | ||
|   Fills the *data structure. The argument _c_h_a_n_n_e_l specifies the channel
 | ||
|   (0 to N) for which is data requested. Function returns zero if
 | ||
|   successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     #define SND_MIXER_FLG_RECORD            0x00000001      /* channel record source flag */
 | ||
|     #define SND_MIXER_FLG_MUTE_LEFT         0x00010000
 | ||
|     #define SND_MIXER_FLG_MUTE_RIGHT        0x00020000
 | ||
|     #define SND_MIXER_FLG_MUTE              0x00030000
 | ||
|     #define SND_MIXER_FLG_DECIBEL           0x40000000
 | ||
|     #define SND_MIXER_FLG_FORCE             0x80000000
 | ||
| 
 | ||
|     struct snd_mixer_channel {
 | ||
|       unsigned int channel;         /* channel # (filled by application) */
 | ||
|       unsigned int flags;           /* some flags to read/write (SND_MIXER_FLG_XXXX) */
 | ||
|       int left;                     /* min - max when exact mode (or 0 - 100) */
 | ||
|       int right;                    /* min - max when exact mode (or 0 - 100) */
 | ||
|       int left_dB;                  /* dB * 100 */
 | ||
|       int right_dB;                 /* dB * 100 */
 | ||
|       unsigned char reserved[16];
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|      SSNNDD__MMIIXXEERR__FFLLGG__RREECCOORRDD
 | ||
|         Record source flag.
 | ||
| 
 | ||
|      SSNNDD__MMIIXXEERR__FFLLGG__DDEECCIIBBEELL
 | ||
|         If this bit is set, driver set volume from dB variables _l_e_f_t___d_B
 | ||
|         and _r_i_g_h_t___d_B.
 | ||
| 
 | ||
|      SSNNDD__MMIIXXEERR__FFLLGG__FFOORRCCEE
 | ||
|         Force set - this bit shouldn't be used from user space. Reserved
 | ||
|         for kernel.
 | ||
| 
 | ||
|   44..11..1100..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__cchhaannnneell__wwrriittee(( vvooiidd **hhaannddllee,, iinntt cchhaannnneell,,
 | ||
|   ssnndd__mmiixxeerr__cchhaannnneell__tt **ddaattaa ))
 | ||
| 
 | ||
|   Writes the *data structure to kernel. The _c_h_a_n_n_e_l argument specifies
 | ||
|   the channel (0 to N) for which is data is to be applied.  Function
 | ||
|   returns zero if successful, otherwise it returns an error code.  This
 | ||
|   functions is the opposite of _s_n_d___m_i_x_e_r___c_h_a_n_n_e_l___r_e_a_d.
 | ||
| 
 | ||
|   44..11..1111..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__ssppeecciiaall__rreeaadd(( vvooiidd **hhaannddllee,, ssnndd__mmiixxeerr__ssppeecciiaall__tt **ssppeecciiaall
 | ||
|   ))
 | ||
| 
 | ||
|   Not documented...
 | ||
| 
 | ||
|   44..11..1122..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__ssppeecciiaall__wwrriittee(( vvooiidd **hhaannddllee,, ssnndd__mmiixxeerr__ssppeecciiaall__tt **ssppee--
 | ||
|   cciiaall ))
 | ||
| 
 | ||
|   Not documented...
 | ||
| 
 | ||
|   44..11..1133..
 | ||
| 
 | ||
|   iinntt ssnndd__mmiixxeerr__rreeaadd(( vvooiidd **hhaannddllee,, ssnndd__mmiixxeerr__ccaallllbbaacckkss__tt **ccaallllbbaacckkss ))
 | ||
| 
 | ||
|   This function reads and parses data from driver. Parsed actions are
 | ||
|   returned back to the application using the _c_a_l_l_b_a_c_k_s structure.
 | ||
|   Applications should not parse data from the driver in standard cases.
 | ||
|   This function returns immediately after all data is read from driver.
 | ||
|   Does not block process.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     typedef struct snd_mixer_callbacks {
 | ||
|       void *private_data;           /* should be used by application */
 | ||
|       void (*channel_was_changed)( void *private_data, int channel );
 | ||
|       void *reserved[15];           /* reserved for future use - must be NULL!!! */
 | ||
|     } snd_mixer_callbacks_t;
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   44..22..  EExxaammpplleess
 | ||
| 
 | ||
|   The following example shows installed mixer channels for soundcard #0
 | ||
|   and mixer device #0 in the system, and also sets the master volume (if
 | ||
|   present) to 50.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|   int card = 0, device = 0, err;
 | ||
|   void *handle;
 | ||
|   snd_mixer_info_t info;
 | ||
|   snd_mixer_channel_t channel;
 | ||
| 
 | ||
|   if ( (err = snd_mixer_open( &handle, card, device )) < 0 ) {
 | ||
|     fprintf( stderr, "open failed: %s\n", snd_strerror( err ) );
 | ||
|     return;
 | ||
|   }
 | ||
|   if ( (err = snd_mixer_info( handle, &info )) < 0 ) {
 | ||
|     fprintf( stderr, "info failed: %s\n", snd_strerror( err ) );
 | ||
|     snd_mixer_close( handle );
 | ||
|     return;
 | ||
|   }
 | ||
|   printf( "Installed MIXER channels for card #i and device %i: %i\n",
 | ||
|                                           card + 1, device, info.channels );
 | ||
|   master = snd_mixer_channel( handle, SND_MIXER_ID_MASTER );
 | ||
|   if ( master >= 0 ) {
 | ||
|     if ( (err = snd_mixer_read( handle, master, &channel )) < 0 ) {
 | ||
|       fprintf( stderr, "master read failed: %s\n", snd_strerror( err ) );
 | ||
|       snd_mixer_close( handle );
 | ||
|       return;
 | ||
|     }
 | ||
|     channel -> left = channel -> right = 50;
 | ||
|     if ( (err = snd_mixer_write( handle, master, &channel )) < 0 ) {
 | ||
|       fprintf( stderr, "master write failed: %s\n", snd_strerror( err ) );
 | ||
|       snd_mixer_close( handle );
 | ||
|       return;
 | ||
|     }
 | ||
|   }
 | ||
|   snd_mixer_close( handle );
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   55..  DDiiggiittaall AAuuddiioo ((PPCCMM)) IInntteerrffaaccee
 | ||
| 
 | ||
|   Digital audio is the most commonly used method of representing sound
 | ||
|   inside a computer. In this method sound is stored as a sequence of
 | ||
|   samples taken from the audio signal using constant time intervals. A
 | ||
|   sample represents volume of the signal at the moment when it was
 | ||
|   measured. In uncompressed digital audio each sample require one or
 | ||
|   more bytes of storage. The number of bytes required depends on number
 | ||
|   of channels (mono, stereo) and sample format (8 or 16 bits, mu-Law,
 | ||
|   etc.). The length of this interval determines the sampling rate.
 | ||
|   Commonly used sampling rates are between 8 kHz (telephone quality) and
 | ||
|   48 kHz (DAT tapes).
 | ||
| 
 | ||
|   The physical devices used in digital audio are called the ADC (Analog
 | ||
|   to Digital Converter) and DAC (Digital to Analog Converter). A device
 | ||
|   containing both ADC and DAC is commonly known as a codec. The codec
 | ||
|   device used in a Sound Blaster cards is called a DSP which is somewhat
 | ||
|   misleading since DSP also stands for Digital Signal Processor (the SB
 | ||
|   DSP chip is very limited when compared to "true" DSP chips).
 | ||
| 
 | ||
|   Sampling parameters affect the quality of sound which can be
 | ||
|   reproduced from the recorded signal. The most fundamental parameter is
 | ||
|   sampling rate which limits the highest frequency than can be stored.
 | ||
|   It is well known (Nyquist's Sampling Theorem) that the highest
 | ||
|   frequency that can be stored in a sampled signal is at most 1/2 of the
 | ||
|   sampling frequency. For example, a 8 kHz sampling rate permits the
 | ||
|   recording of a signal in which the highest frequency is less than 4
 | ||
|   kHz. Higher frequency signals must be filtered out before feeding them
 | ||
|   to DAC.
 | ||
| 
 | ||
|   Sample encoding limits the dynamic range of recorded signal
 | ||
|   (difference between the faintest and the loudest signal that can be
 | ||
|   recorded). In theory the maximum dynamic range of signal is
 | ||
|   number_of_bits * 6 dB . This means that 8 bits sampling resolution
 | ||
|   gives dynamic range of 48 dB and 16 bit resolution gives 96 dB.
 | ||
| 
 | ||
|   Quality has price. The number of bytes required to store an audio
 | ||
|   sequence depends on sampling rate, number of channels and sampling
 | ||
|   resolution. For example just 8000 bytes of memory is required to store
 | ||
|   one second of sound using 8 kHz/8 bits/mono but 48 kHz/16bit/stereo
 | ||
|   takes 192 kilobytes. A 64 kbps ISDN channel is required to transfer a
 | ||
|   8kHz/8bit/mono audio stream in real time, and about 1.5 Mbps is
 | ||
|   required for DAT quality (48kHz/16bit/stereo).  On the other hand it
 | ||
|   is possible to store just 5.46 seconds of sound in a megabyte of
 | ||
|   memory when using 48kHz/16bit/stereo sampling. With 8kHz/8bits/mono it
 | ||
|   is possible to store 131 seconds of sound using the same amount of
 | ||
|   memory. It is possible to reduce memory and communication costs by
 | ||
|   compressing the recorded signal but this is out of the scope of this
 | ||
|   document.
 | ||
| 
 | ||
|   55..11..  LLooww--LLeevveell LLaayyeerr
 | ||
| 
 | ||
|   Audio devices are opened exclusively for a selected direction. This
 | ||
|   doesn't allow open from more than one processes for the same audio
 | ||
|   device in the same direction, but does allow one open call to each
 | ||
|   playback direction and second open call to record direction
 | ||
|   independently. Audio devices return EBUSY error to applications when
 | ||
|   other applications have already opened the requested direction.
 | ||
| 
 | ||
|   Low-Level layer supports these formats:
 | ||
| 
 | ||
|        ______________________________________________________________________
 | ||
|        #define SND_PCM_SFMT_MU_LAW             0
 | ||
|        #define SND_PCM_SFMT_A_LAW              1
 | ||
|        #define SND_PCM_SFMT_IMA_ADPCM          2
 | ||
|        #define SND_PCM_SFMT_U8                 3
 | ||
|        #define SND_PCM_SFMT_S16_LE             4
 | ||
|        #define SND_PCM_SFMT_S16_BE             5
 | ||
|        #define SND_PCM_SFMT_S8                 6
 | ||
|        #define SND_PCM_SFMT_U16_LE             7
 | ||
|        #define SND_PCM_SFMT_U16_BE             8
 | ||
|        #define SND_PCM_SFMT_MPEG               9
 | ||
|        #define SND_PCM_SFMT_GSM                10
 | ||
| 
 | ||
|        #define SND_PCM_FMT_MU_LAW              (1 << SND_PCM_SFMT_MU_LAW)
 | ||
|        #define SND_PCM_FMT_A_LAW               (1 << SND_PCM_SFMT_A_LAW)
 | ||
|        #define SND_PCM_FMT_IMA_ADPCM           (1 << SND_PCM_SFMT_IMA_ADPCM)
 | ||
|        #define SND_PCM_FMT_U8                  (1 << SND_PCM_SFMT_U8)
 | ||
|        #define SND_PCM_FMT_S16_LE              (1 << SND_PCM_SFMT_S16_LE)
 | ||
|        #define SND_PCM_FMT_S16_BE              (1 << SND_PCM_SFMT_S16_BE)
 | ||
|        #define SND_PCM_FMT_S8                  (1 << SND_PCM_SFMT_S8)
 | ||
|        #define SND_PCM_FMT_U16_LE              (1 << SND_PCM_SFMT_U16_LE)
 | ||
|        #define SND_PCM_FMT_U16_BE              (1 << SND_PCM_SFMT_U16_BE)
 | ||
|        #define SND_PCM_FMT_MPEG                (1 << SND_PCM_SFMT_MPEG)
 | ||
|        #define SND_PCM_FMT_GSM                 (1 << SND_PCM_SFMT_GSM)
 | ||
|        ______________________________________________________________________
 | ||
| 
 | ||
|   Constants with prefix SSNNDD__PPCCMM__FFMMTT__ are used in info structures and
 | ||
|   constants with prefix SSNNDD__PPCCMM__SSFFMMTT__ are used in format structures.
 | ||
|   55..11..11..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__ooppeenn(( vvooiidd ****hhaannddllee,, iinntt ccaarrdd,, iinntt ddeevviiccee,, iinntt mmooddee ))
 | ||
| 
 | ||
|   Creates a new handle and opens a connection to kernel sound audio
 | ||
|   interface for soundcard number _c_a_r_d (0-N) and audio device number
 | ||
|   _d_e_v_i_c_e. Function also checks if protocol is compatible to prevent use
 | ||
|   of old programs with a new kernel API. Function returns zero if
 | ||
|   successful,ful otherwise it returns an error code.  Error code -EBUSY
 | ||
|   is returned when some process ownes the selected direction.
 | ||
| 
 | ||
|   Default format after opening is mono _m_u_-_L_a_w at 8000Hz. This device can
 | ||
|   be used directly for playback of standard .au (Sparc) files.
 | ||
| 
 | ||
|   The following modes should be used for the _m_o_d_e argument:
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     #define SND_PCM_OPEN_PLAYBACK   (O_WRONLY)
 | ||
|     #define SND_PCM_OPEN_RECORD     (O_RDONLY)
 | ||
|     #define SND_PCM_OPEN_DUPLEX     (O_RDWR)
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   55..11..22..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__cclloossee(( vvooiidd **hhaannddllee ))
 | ||
| 
 | ||
|   Frees all resources allocated with audio handle and closes the
 | ||
|   connection to the kernel sound audio interface. Function returns zero
 | ||
|   if successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   55..11..33..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__ffiillee__ddeessccrriippttoorr(( vvooiidd **hhaannddllee ))
 | ||
| 
 | ||
|   Returns the file descriptor of the connection to the kernel sound
 | ||
|   audio interface. Function returns an error code if an error was
 | ||
|   encountered.
 | ||
| 
 | ||
|   The file descriptor should be used for the _s_e_l_e_c_t synchronous
 | ||
|   multiplexer function for setting the read direction. Application
 | ||
|   should call _s_n_d___p_c_m___r_e_a_d or _s_n_d___p_c_m___w_r_i_t_e functions if some data is
 | ||
|   waiting for reading or a write can be performed. Calling this function
 | ||
|   is highly recomended, as it leaves a place for the API to things like
 | ||
|   data conversions, if needed.
 | ||
| 
 | ||
|   55..11..44..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__bblloocckk__mmooddee(( vvooiidd **hhaannddllee,, iinntt eennaabbllee ))
 | ||
| 
 | ||
|   Sets up block (default) or nonblock mode for a handle. Block mode
 | ||
|   suspends execution of a program when _s_n_d___p_c_m___r_e_a_d or _s_n_d___p_c_m___w_r_i_t_e is
 | ||
|   called for the time which is needed for the actual playback or record
 | ||
|   over of the entire buffer. In nonblock mode, programs aren't suspended
 | ||
|   and the above functions returns immediately with the count of bytes
 | ||
|   which were read or written by the driver. When used in this way, don't
 | ||
|   try to use the entire buffer after the call, but instead process the
 | ||
|   number of bytes returned, and call the function again.
 | ||
| 
 | ||
|   55..11..55..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__iinnffoo(( vvooiidd **hhaannddllee,, ssnndd__ppccmm__iinnffoo__tt **iinnffoo ))
 | ||
| 
 | ||
|   Fills the *info structure with data about the PCM device selected by
 | ||
|   *handle. Function returns zero if successful, otherwise it returns an
 | ||
|   error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     #define SND_PCM_INFO_CODEC              0x00000001
 | ||
|     #define SND_PCM_INFO_DSP                SND_PCM_INFO_CODEC
 | ||
|     #define SND_PCM_INFO_MMAP               0x00000002      /* reserved */
 | ||
|     #define SND_PCM_INFO_PLAYBACK           0x00000100
 | ||
|     #define SND_PCM_INFO_RECORD             0x00000200
 | ||
|     #define SND_PCM_INFO_DUPLEX             0x00000400
 | ||
|     #define SND_PCM_INFO_DUPLEX_LIMIT       0x00000800      /* rate for playback & record are same */
 | ||
| 
 | ||
|     struct snd_pcm_info {
 | ||
|       unsigned int type;                    /* soundcard type */
 | ||
|       unsigned int flags;                   /* see SND_PCM_INFO_XXXX */
 | ||
|       unsigned char id[32];                 /* ID of this PCM device */
 | ||
|       unsigned char name[80];               /* name of this device */
 | ||
|       unsigned char reserved[64];           /* reserved for future use */
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|      SSNNDD__PPCCMM__IINNFFOO__MMMMAAPP
 | ||
|         This flag is reserved and should be never used. It remains for
 | ||
|         compatibility with Open Sound System driver.
 | ||
| 
 | ||
|      SSNNDD__PPCCMM__IINNFFOO__DDUUPPLLEEXX__LLIIMMIITT
 | ||
|         If this bit is set, rate must be same for playback and record
 | ||
|         direction.
 | ||
| 
 | ||
|   55..11..66..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__ppllaayybbaacckk__iinnffoo(( vvooiidd **hhaannddllee,, ssnndd__ppccmm__ppllaayybbaacckk__iinnffoo__tt **iinnffoo
 | ||
|   ))
 | ||
| 
 | ||
|   Fills the *info structure with data about PCM playback. Function
 | ||
|   returns zero if successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     #define SND_PCM_PINFO_BATCH             0x00000001
 | ||
|     #define SND_PCM_PINFO_8BITONLY          0x00000002
 | ||
|     #define SND_PCM_PINFO_16BITONLY         0x00000004
 | ||
| 
 | ||
|     struct snd_pcm_playback_info {
 | ||
|       unsigned int flags;                   /* see SND_PCM_PINFO_XXXX */
 | ||
|       unsigned int formats;                 /* supported formats */
 | ||
|       unsigned int min_rate;                /* min rate (in Hz) */
 | ||
|       unsigned int max_rate;                /* max rate (in Hz) */
 | ||
|       unsigned int min_channels;            /* min channels (probably always 1) */
 | ||
|       unsigned int max_channels;            /* max channels */
 | ||
|       unsigned int buffer_size;             /* playback buffer size */
 | ||
|       unsigned int min_fragment_size;       /* min fragment size in bytes */
 | ||
|       unsigned int max_fragment_size;       /* max fragment size in bytes */
 | ||
|       unsigned int fragment_align;          /* align fragment value */
 | ||
|       unsigned char reserved[64];           /* reserved for future use */
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|      SSNNDD__PPCCMM__PPIINNFFOO__BBAATTCCHH
 | ||
|         Driver implements double buffering with this device. This means
 | ||
|         that the chip used for data processing has its own memory, and
 | ||
|         output should be more delayed than if a traditional codec chip
 | ||
|         is used.
 | ||
| 
 | ||
|      SSNNDD__PPCCMM__PPIINNFFOO__88BBIITTOONNLLYY
 | ||
|         If this bit is set, the driver uses 8-bit format for 16-bit
 | ||
|         samples and does software conversion. This bit is set on broken
 | ||
|         SoundBlaster 16/AWE soundcards which can't do full 16-bit
 | ||
|         duplex. If this bit is set application or highter digital audio
 | ||
|         layer should do the conversion from 16-bit samples to 8-bit
 | ||
|         samples rather than making the driver to do it in the kernel.
 | ||
| 
 | ||
|      SSNNDD__PPCCMM__PPIINNFFOO__1166BBIITTOONNLLYY
 | ||
|         If this bit is set, driver uses 16-bit format for 8-bit samples
 | ||
|         and does software conversion. This bit is set on broken
 | ||
|         SoundBlaster 16/AWE soundcards which can't do full 8-bit duplex.
 | ||
|         If this bit is set the application or highter digital audio
 | ||
|         layer should do conversion from 8-bit samples to 16-bit samples
 | ||
|         rather than making the driver to do it in the kernel.
 | ||
| 
 | ||
|   55..11..77..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__rreeccoorrdd__iinnffoo(( vvooiidd **hhaannddllee,, ssnndd__ppccmm__rreeccoorrdd__iinnffoo__tt **iinnffoo ))
 | ||
| 
 | ||
|   Fills the *info structure. Returns zero if successful, otherwise it
 | ||
|   returns an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     #define SND_PCM_RINFO_BATCH             0x00000001
 | ||
|     #define SND_PCM_RINFO_8BITONLY          0x00000002
 | ||
|     #define SND_PCM_RINFO_16BITONLY         0x00000004
 | ||
| 
 | ||
|     struct snd_pcm_record_info {
 | ||
|       unsigned int flags;                   /* see to SND_PCM_RINFO_XXXX */
 | ||
|       unsigned int formats;                 /* supported formats */
 | ||
|       unsigned int min_rate;                /* min rate (in Hz) */
 | ||
|       unsigned int max_rate;                /* max rate (in Hz) */
 | ||
|       unsigned int min_channels;            /* min channels (probably always 1) */
 | ||
|       unsigned int max_channels;            /* max channels */
 | ||
|       unsigned int buffer_size;             /* record buffer size */
 | ||
|       unsigned int min_fragment_size;       /* min fragment size in bytes */
 | ||
|       unsigned int max_fragment_size;       /* max fragment size in bytes */
 | ||
|       unsigned int fragment_align;          /* align fragment value */
 | ||
|       unsigned char reserved[64];           /* reserved for future... */
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|      SSNNDD__PPCCMM__PPIINNFFOO__BBAATTCCHH
 | ||
|         Driver implements buffering for this device. This means that the
 | ||
|         chip used for data processing has its own memory and output
 | ||
|         should be more delayed than if a traditional codec chip is used.
 | ||
| 
 | ||
|      SSNNDD__PPCCMM__PPIINNFFOO__88BBIITTOONNLLYY
 | ||
|         If this bit is set, the device uses 8-bit format for 16-bit
 | ||
|         samples and does software conversion. This bit is set on broken
 | ||
|         SoundBlaster 16/AWE soundcards which can't do full 16-bit
 | ||
|         duplex. If this bit is set the application or highter digital
 | ||
|         audio layer should do conversion from 16-bit samples to 8-bit
 | ||
|         samples rather than making the driver to do it in the kernel.
 | ||
| 
 | ||
|      SSNNDD__PPCCMM__PPIINNFFOO__1166BBIITTOONNLLYY
 | ||
|         If this bit is set, the device uses a 16-bit format for 8-bit
 | ||
|         samples and does software conversion. This bit is set on broken
 | ||
|         SoundBlaster 16/AWE soundcards which can't do full 8-bit duplex.
 | ||
|         If this bit is set the application or highter digital audio
 | ||
|         layer should do the conversion from 8-bit samples to 16-bit
 | ||
|         samples rather than making the driver to do it in the kernel.
 | ||
| 
 | ||
|   55..11..88..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__ppllaayybbaacckk__ffoorrmmaatt(( vvooiidd **hhaannddllee,, ssnndd__ppccmm__ffoorrmmaatt__tt **ffoorrmmaatt ))
 | ||
| 
 | ||
|   Sets up format, rate (in Hz) and number of channels for playback, in
 | ||
|   the desired direction. Function returns zero if successful, otherwise
 | ||
|   it returns an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     struct snd_pcm_format {
 | ||
|       unsigned int format;                  /* SND_PCM_SFMT_XXXX */
 | ||
|       unsigned int rate;                    /* rate in Hz */
 | ||
|       unsigned int channels;                /* channels (voices) */
 | ||
|       unsigned char reserved[16];
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   55..11..99..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__rreeccoorrdd__ffoorrmmaatt(( vvooiidd **hhaannddllee,, ssnndd__ppccmm__ffoorrmmaatt__tt **ffoorrmmaatt ))
 | ||
| 
 | ||
|   Sets up format, rate (in Hz) and number of channels for used for
 | ||
|   recording in the specified direction. Function returns zero if
 | ||
|   successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     struct snd_pcm_format {
 | ||
|       unsigned int format;                  /* SND_PCM_SFMT_XXXX */
 | ||
|       unsigned int rate;                    /* rate in Hz */
 | ||
|       unsigned int channels;                /* channels (voices) */
 | ||
|       unsigned char reserved[16];
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   55..11..1100..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__ppllaayybbaacckk__ppaarraammss(( vvooiidd **hhaannddllee,, ssnndd__ppccmm__ppllaayybbaacckk__ppaarraammss__tt
 | ||
|   **ppaarraammss ))
 | ||
| 
 | ||
|   Sets various parameters for playback direction. Function returns zero
 | ||
|   if successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     struct snd_pcm_playback_params {
 | ||
|       int fragment_size;
 | ||
|       int fragments_max;
 | ||
|       int fragments_room;
 | ||
|       unsigned char reserved[16];           /* must be filled with zero */
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|      ffrraaggmmeenntt__ssiizzee
 | ||
|         Requested size of fragment. This value should be aligned for
 | ||
|         current format (for example to 4 if stereo 16-bit samples are
 | ||
|         used) or with the _f_r_a_g_m_e_n_t___a_l_i_g_n variable from
 | ||
|         _s_n_d___p_c_m___p_l_a_y_b_a_c_k___i_n_f_o___t structure. Its range can be from
 | ||
|         _m_i_n___f_r_a_g_m_e_n_t___s_i_z_e to _m_a_x___f_r_a_g_m_e_n_t___s_i_z_e.
 | ||
| 
 | ||
|      ffrraaggmmeennttss__mmaaxx
 | ||
|         Maximum number of fragments in queue for wakeup. This number
 | ||
|         doesn't counts partly used fragment. If current count of filled
 | ||
|         playback fragments is greater than this value driver block
 | ||
|         application or return immediately back if nonblock mode is
 | ||
|         active.
 | ||
| 
 | ||
|      ffrraaggmmeennttss__rroooomm
 | ||
|         Minumum number of fragments writeable for wakeup. This value
 | ||
|         should be in most cases 1 which means return back to application
 | ||
|         if at least one fragment is free for playback. This value
 | ||
|         includes partly used fragments, too.
 | ||
| 
 | ||
|   55..11..1111..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__rreeccoorrdd__ppaarraammss(( vvooiidd **hhaannddllee,, ssnndd__ppccmm__rreeccoorrdd__ppaarraammss__tt
 | ||
|   **ppaarraammss ))
 | ||
|   Function sets various parameters for the recording direction. Function
 | ||
|   returns zero if successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     struct snd_pcm_record_params {
 | ||
|       int fragment_size;
 | ||
|       int fragments_min;
 | ||
|       unsigned char reserved[16];
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|      ffrraaggmmeenntt__ssiizzee
 | ||
|         Requested size of fragment. This value should be aligned for
 | ||
|         current format (for example to 4 if stereo 16-bit samples are
 | ||
|         used) or set to the _f_r_a_g_m_e_n_t___a_l_i_g_n variable from
 | ||
|         _s_n_d___p_c_m___p_l_a_y_b_a_c_k___i_n_f_o___t structure. Its range can be from
 | ||
|         _m_i_n___f_r_a_g_m_e_n_t___s_i_z_e to _m_a_x___f_r_a_g_m_e_n_t___s_i_z_e.
 | ||
| 
 | ||
|      ffrraaggmmeennttss__mmiinn
 | ||
|         Minimum filled fragments for wakeup. Driver blocks the
 | ||
|         application (if block mode is selected) until it isn't filled
 | ||
|         with number of fragments specified with this value.
 | ||
| 
 | ||
|   55..11..1122..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__ppllaayybbaacckk__ssttaattuuss(( vvooiidd **hhaannddllee,, ssnndd__ppccmm__ppllaayybbaacckk__ssttaattuuss__tt
 | ||
|   **ssttaattuuss ))
 | ||
| 
 | ||
|   Fills the *status structure. Function returns zero if successful,
 | ||
|   otherwise it returns an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     struct snd_pcm_playback_status {
 | ||
|       unsigned int rate;
 | ||
|       int fragments;
 | ||
|       int fragment_size;
 | ||
|       int count;
 | ||
|       int queue;
 | ||
|       int underrun;
 | ||
|       struct timeval time;
 | ||
|       struct timeval stime;
 | ||
|       unsigned char reserved[16];
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|      rraattee
 | ||
|         Real playback rate. This value reflects hardware limitations.
 | ||
| 
 | ||
|      ffrraaggmmeennttss
 | ||
|         Currently allocated fragments by the driver for playback
 | ||
|         direction.
 | ||
| 
 | ||
|      ffrraaggmmeenntt__ssiizzee
 | ||
|         Current fragment size used by driver for the playback direction.
 | ||
| 
 | ||
|      ccoouunntt
 | ||
|         Count of bytes writeable without blocking.
 | ||
| 
 | ||
|      qquueeuuee
 | ||
|         Count of bytes in queue. Note: _(_f_r_a_g_m_e_n_t_s _* _f_r_a_g_m_e_n_t___s_i_z_e_) _-
 | ||
|         _q_u_e_u_e should not be equal to _c_o_u_n_t.
 | ||
| 
 | ||
|      uunnddeerrrruunn
 | ||
|         This value tells the application the number of underruns since
 | ||
|         the ast call of _s_n_d___p_c_m___p_l_a_y_b_a_c_k___s_t_a_t_u_s.
 | ||
| 
 | ||
|      ttiimmee
 | ||
|         Delay till played of the first sample from next write. This
 | ||
|         value should be used for time synchronization. Returned value is
 | ||
|         in the same format as returned from the standard C function
 | ||
|         _g_e_t_t_i_m_e_o_f_d_a_y_( _&_t_i_m_e_, _N_U_L_L _).  This variable contains right value
 | ||
|         only if playback time mode is enabled (look to
 | ||
|         _s_n_d___p_c_m___p_l_a_y_b_a_c_k___t_i_m_e function).
 | ||
| 
 | ||
|      ssttiimmee
 | ||
|         Time when playback was started.  This variable contains right
 | ||
|         value only if playback time mode is enabled (look to
 | ||
|         _s_n_d___p_c_m___p_l_a_y_b_a_c_k___t_i_m_e function).
 | ||
| 
 | ||
|   55..11..1133..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__rreeccoorrdd__ssttaattuuss(( vvooiidd **hhaannddllee,, ssnndd__ppccmm__rreeccoorrdd__ssttaattuuss__tt **ssttaa--
 | ||
|   ttuuss ))
 | ||
| 
 | ||
|   Fills the *status structure. Function returns zero if successful,
 | ||
|   otherwise it returns an error code.
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|     struct snd_pcm_record_status {
 | ||
|       unsigned int rate;
 | ||
|       int fragments;
 | ||
|       int fragment_size;
 | ||
|       int count;
 | ||
|       int free;
 | ||
|       int overrun;
 | ||
|       struct timeval time;
 | ||
|       unsigned char reserved[16];
 | ||
|     };
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|      rraattee
 | ||
|         Real record rate. This value reflects hardware limitations.
 | ||
| 
 | ||
|      ffrraaggmmeennttss
 | ||
|         Currently allocated fragments by driver for the record
 | ||
|         direction.
 | ||
| 
 | ||
|      ffrraaggmmeenntt__ssiizzee
 | ||
|         Current fragment size used by driver for the record direction.
 | ||
| 
 | ||
|      ccoouunntt
 | ||
|         Count of bytes readable without blocking.
 | ||
| 
 | ||
|      ffrreeee
 | ||
|         Count of bytes in buffer still free. Note: _(_f_r_a_g_m_e_n_t_s _*
 | ||
|         _f_r_a_g_m_e_n_t___s_i_z_e_) _- _f_r_e_e should not be equal to _c_o_u_n_t.
 | ||
| 
 | ||
|      oovveerrrruunn
 | ||
|         This value tells application the count of overruns since the
 | ||
|         last call to _s_n_d___p_c_m___r_e_c_o_r_d___s_t_a_t_u_s.
 | ||
|      ttiimmee
 | ||
|         Lag since the next sample read was recorded. This value should
 | ||
|         be used for time synchronization. Returned value is in the same
 | ||
|         format as returned by the from standard C function _g_e_t_t_i_m_e_o_f_d_a_y_(
 | ||
|         _&_t_i_m_e_, _N_U_L_L _). This variable contains right value only if record
 | ||
|         time mode is enabled (look to _s_n_d___p_c_m___r_e_c_o_r_d___t_i_m_e function).
 | ||
| 
 | ||
|      ssttiimmee
 | ||
|         Time when record was started. This variable contains right value
 | ||
|         only if record time mode is enabled (look to _s_n_d___p_c_m___r_e_c_o_r_d___t_i_m_e
 | ||
|         function).
 | ||
| 
 | ||
|   55..11..1144..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__ddrraaiinn__ppllaayybbaacckk(( vvooiidd **hhaannddllee ))
 | ||
| 
 | ||
|   This function drain playback buffers immediately. Function returns
 | ||
|   zero if successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   55..11..1155..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__fflluusshh__ppllaayybbaacckk(( vvooiidd **hhaannddllee ))
 | ||
| 
 | ||
|   This function flushes the playback buffers. It blocks the program
 | ||
|   while the all the waiting samples in kernel playback buffers are
 | ||
|   processed. Function returns zero if successful, otherwise it returns
 | ||
|   an error code.
 | ||
| 
 | ||
|   55..11..1166..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__fflluusshh__rreeccoorrdd(( vvooiidd **hhaannddllee ))
 | ||
| 
 | ||
|   This function flushes (destroyes) record buffers. Function returns
 | ||
|   zero if successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   55..11..1177..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__ppllaayybbaacckk__ttiimmee(( vvooiidd **hhaannddllee,, iinntt eennaabbllee ))
 | ||
| 
 | ||
|   This function enables or disables time mode for playback direction.
 | ||
|   Time mode allows to application better time synchronization. Function
 | ||
|   returns zero if successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   55..11..1188..
 | ||
| 
 | ||
|   iinntt ssnndd__ppccmm__rreeccoorrdd__ttiimmee(( vvooiidd **hhaannddllee,, iinntt eennaabbllee ))
 | ||
| 
 | ||
|   This function enables or disables time mode for record direction. Time
 | ||
|   mode allows to application better time synchronization. Function
 | ||
|   returns zero if successful, otherwise it returns an error code.
 | ||
| 
 | ||
|   55..11..1199..
 | ||
| 
 | ||
|   ssssiizzee__tt ssnndd__ppccmm__wwrriittee(( vvooiidd **hhaannddllee,, ccoonnsstt vvooiidd **bbuuffffeerr,, ssiizzee__tt ssiizzee ))
 | ||
| 
 | ||
|   Writes samples to the device which must be in the proper format
 | ||
|   specified by the _s_n_d___p_c_m___p_l_a_y_b_a_c_k___f_o_r_m_a_t function. Function returns
 | ||
|   zero or positive value if playback was successful (value represents
 | ||
|   count of bytes which was successfuly written to device) or an error
 | ||
|   value if error occured. Function should suspend process if block mode
 | ||
|   is active.
 | ||
| 
 | ||
|   55..11..2200..
 | ||
| 
 | ||
|   ssssiizzee__tt ssnndd__ppccmm__rreeaadd(( vvooiidd **hhaannddllee,, vvooiidd **bbuuffffeerr,, ssiizzee__tt ssiizzee ))
 | ||
| 
 | ||
|   Function reads samples from driver. Samples are in format specified by
 | ||
|   _s_n_d___p_c_m___r_e_c_o_r_d___f_o_r_m_a_t function. Function returns zero or positive
 | ||
|   value if record was success (value represents count of bytes which was
 | ||
|   successfuly read from device) or negative error value if error
 | ||
|   occured. Function should suspend process if block mode is active.
 | ||
| 
 | ||
|   55..22..  EExxaammpplleess
 | ||
| 
 | ||
|   The following example shows how to play the first 512kB from the
 | ||
|   /tmp/test.au file with soundcard #0 and PCM device #0:
 | ||
| 
 | ||
|        ______________________________________________________________________
 | ||
|        int card = 0, device = 0, err, fd, count, size, idx;
 | ||
|        void *handle;
 | ||
|        snd_pcm_format_t format;
 | ||
|        char *buffer;
 | ||
| 
 | ||
|        buffer = (char *)malloc( 512 * 1024 );
 | ||
|        if ( !buffer ) return;
 | ||
|        if ( (err = snd_pcm_open( &handle, card, device, SND_PCM_OPEN_PLAYBACK )) < 0 ) {
 | ||
|          fprintf( stderr, "open failed: %s\n", snd_strerror( err ) );
 | ||
|          return;
 | ||
|        }
 | ||
|        format.format = SND_PCM_SFMT_MU_LAW;
 | ||
|        format.rate = 8000;
 | ||
|        format.channels = 1;
 | ||
|        if ( (err = snd_pcm_playback_format( handle, &format )) < 0 ) {
 | ||
|          fprintf( stderr, "format setup failed: %s\n", snd_strerror( err ) );
 | ||
|          snd_pcm_close( handle );
 | ||
|          return;
 | ||
|        }
 | ||
|        fd = open( "/tmp/test.au", O_RDONLY );
 | ||
|        if ( fd < 0 ) {
 | ||
|          perror( "open file" );
 | ||
|          snd_pcm_close( handle );
 | ||
|          return;
 | ||
|        }
 | ||
|        idx = 0;
 | ||
|        count = read( fd, buffer, 512 * 1024 );
 | ||
|        if ( count <= 0 ) {
 | ||
|          perror( "read from file" );
 | ||
|          snd_pcm_close( handle );
 | ||
|          return;
 | ||
|        }
 | ||
|        close( fd );
 | ||
|        if ( !memcmp( buffer, ".snd", 4 ) ) {
 | ||
|          idx = (buffer[4]<<24)|(buffer[5]<<16)|(buffer[6]<<8)|(buffer[7]);
 | ||
|          if ( idx > 128 ) idx = 128;
 | ||
|          if ( idx > count ) idx = count;
 | ||
|        }
 | ||
|        size = snd_pcm_write( handle, &buffer[ idx ], count - idx );
 | ||
|        printf( "Bytes written %i from %i...\n", size, count - idx );
 | ||
|        snd_pcm_close( handle );
 | ||
|        free( buffer );
 | ||
|        ______________________________________________________________________
 | ||
| 
 | 
