From 7167132eed064e65bc67eb83c55681978ec09d33 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 2 Dec 1999 12:31:35 +0000 Subject: [PATCH] Documentation placement changes.. --- doc/Makefile.am | 4 +- doc/README.1st | 1 + doc/alsa-lib.html | 3974 ------------------- doc/alsa-lib.lyx | 9667 --------------------------------------------- doc/pcmbuf.fig | 79 - doc/pcmbuf.gif | Bin 1985 -> 0 bytes doc/pcmbuf.ps | 222 -- doc/pcmbuf1.fig | 74 - doc/pcmbuf1.gif | Bin 1558 -> 0 bytes doc/pcmbuf1.ps | 199 - doc/plan.txt | 47 - 11 files changed, 2 insertions(+), 14265 deletions(-) create mode 100644 doc/README.1st delete mode 100644 doc/alsa-lib.html delete mode 100644 doc/alsa-lib.lyx delete mode 100644 doc/pcmbuf.fig delete mode 100644 doc/pcmbuf.gif delete mode 100644 doc/pcmbuf.ps delete mode 100644 doc/pcmbuf1.fig delete mode 100644 doc/pcmbuf1.gif delete mode 100644 doc/pcmbuf1.ps delete mode 100644 doc/plan.txt diff --git a/doc/Makefile.am b/doc/Makefile.am index be76bfe6..7b9c876a 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -1,5 +1,3 @@ -EXTRA_DIST=plan.txt alsa-lib.lyx alsa-lib.html \ - pcmbuf.fig pcmbuf.ps pcmbuf.gif \ - pcmbuf1.fig pcmbuf1.ps pcmbuf1.gif +EXTRA_DIST= INCLUDES=-I$(top_srcdir)/include diff --git a/doc/README.1st b/doc/README.1st new file mode 100644 index 00000000..26640a28 --- /dev/null +++ b/doc/README.1st @@ -0,0 +1 @@ +The documentation is distributed in a separate alsa-doc package. diff --git a/doc/alsa-lib.html b/doc/alsa-lib.html deleted file mode 100644 index f580148c..00000000 --- a/doc/alsa-lib.html +++ /dev/null @@ -1,3974 +0,0 @@ - - - - - - Advanced Linux Sound Architecture - Library API - -

Advanced Linux Sound Architecture - Library API

- -

- -

Jaroslav Kysela <perex@suse.cz> with assistance from Alan Robinson and Fred Floberg

- -

- -

1998-11-11

- -

-

This document describes, in full detail, the Advanced Linux -Sound Architecture library API. -

-

-

Contents

1  Introduction
-2  Error Codes
-    2.1  Error Codes in Detail
-    2.2  Functions
-3  Control Interface
-    3.1  Low-Level Layer
-        3.1.1  Examples
-4  Mixer Interface
-    4.1  Low-Level Layer
-        4.1.1  Examples
-5  Digital Audio (PCM) Interface
-    5.1  Low-Level Layer
-        5.1.1  Example
-    5.2  PCM Loopback Interface
-6  RawMidi Interface
-    6.1  Low Level Layer
-        6.1.1  Example
- -

-

-1  Introduction

- -

-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 major improvements -in usability, making the application code simpler and better looking. In addition, -some of the some fixes/compatibility code 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: - -

- -

-

-

-2  Error Codes

- -

-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) -represent standard system errors. Codes equal to or greather than this value -represent sound library API errors. All error codes begin with the prefix SND_ERROR_. - -

-

-2.1  Error Codes in Detail

- -

- - -
SND_ERROR_UNCOMPATIBLE_VERSION500000
- - -

-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. - -

-

-2.2  Functions

- -

- -

const char *snd_strerror(int errnum)

- -

-This function converts an error code to a string. Its functionality is the same -as the strerror function from the standard C library, but this function -returns error message strings for sound error codes, as well. - -

-

-3  Control Interface

- -

-The control interface gives applications 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 a selected soundcard or, for example, -to create a list of devices (MIXER, PCM etc) from which the user can select. - -

-

-3.1  Low-Level Layer

- -

- -

int snd_cards(void)

- -

-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. - -

- -

unsigned int snd_cards_mask(void)

- -

-Returns the bitmap of soundcards present in the system, if any. This function -will return 0 if no soundcards are detected. The first soundcard is represented -with bit 0 (0x00000001). See the documentation on installing ALSA and /etc/conf.modules -configuration for information on assigning numbers to soundcards. - -

- -

int snd_card_name(const char *name)

- -

-Returns soundcard number for appropriate soundcard name. String name -can contain word identification for card (ALSA driver allows the user choose -card identification using snd_id module parameter) or soundcard index (1-N) -encoded into ASCII. - -

- -

int snd_ctl_open(void **handle, int card)

- -

-Creates a new handle and opens communication with the kernel sound control interface -for soundcard number card (0-N). The function also checks if the 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. - -

- -

int snd_ctl_close(void *handle)

- -

-Frees all resources allocated with control handle and closes the kernel sound -control interface. This function returns zero if successful, otherwise it returns -an error code. - -

- -

int snd_ctl_file_descriptor(void *handle)

- -

-Returns a file descriptor for the kernel sound control interface. This function -is normally only used in very special cases. This function returns a negative -error code if an error was encountered. - -

- -

int snd_ctl_hw_info(void *handle, snd_ctl_hw_info_t *info)

- -

-Fills the info structure with data about the sound hardware referenced by handle. -This function returns zero if successful, otherwise it returns an error code. - -

- -

-
-/* driver has MIDI interface */  - -

-#define SND_CTL_GCAPS_MIDI      0x0000001  - -

-/* soundcard has synthesizer */ - -

-#define SND_CTL_LCAPS_SYNTH     0x0000001 - -

-/* soundcard has RAW FM/OPL3 */ - -

-#define SND_CTL_LCAPS_RAWFM     0x0000002 -

-

-  - -

- -

-
-struct snd_ctl_hw_info { - -

-        /* type of card - see SND_CARD_TYPE_XXXX */ - -

-        unsigned int type; - -

-        /* global capabilities - see SND_CTL_GCAPS_XXXX*/ - -

-        unsigned int gcaps; - -

-        /* local capabilities ¯  see SND_CTL_LCAPS_XXXX */ - -

-        unsigned int lcaps; - -

-        /* count of PCM devices (0 to N) */ - -

-        unsigned int pcmdevs; - -

-        /* count of MIXER devices (0 to N)*/ - -

-        unsigned int mixerdevs; - -

-        /* count of raw MIDI devices (0 to N) */ - -

-        unsigned int mididevs; - -

-        /* ID of card (user selectable) */ - -

-        char id[80]; - -

-        /* name/info text about soundcard */ - -

-        char name[80]; - -

-        /* count of control switches */ - -

-        unsigned int switches; - -

-        /* reserved for future use */ - -

-        unsigned char reserved[124]; - -

-}; -

-

- -

int snd_ctl_switches(void *handle)

- -

-Returns the number of control switches. In this context 'switch' means universal -control interface between kernel and application which allows various types -of control. Function returns count if successful, otherwise it returns an error -code. Return value should be zero if the soundcard doesn't have any control -switches. - -

- -

int snd_ctl_switch(void *handle, const char *switch_id)

- -

-Returns the index for the switch with the name switch_id. This function -returns switch index if successful, otherwise it returns an error code. - -

- -

int snd_ctl_switch_read(void *handle int switchn snd_ctl_switch_t -*data)

- -

-Fills the *data structure with data about the switch with index switchn. -This function returns zero if successful, otherwise it returns an error code. - -

- -

-
-/* 0 or 1 (enable member of union) */ - -

-#define SND_CTL_SW_TYPE_BOOLEAN       0 - -

-/* 0 to 255 - from low to high (data8[0] member of union) */ - -

-#define SND_CTL_SW_TYPE_BYTE          1 - -

-/* 0 to 65535 - from low to high (data16[0] member of union) */ - -

-#define SND_CTL_SW_TYPE_WORD          2 - -

-/* 0 to 4294967296 ¯  from low to high (data32[0] member of union) */ - -

-#define SND_CTL_SW_TYPE_DWORD         3 - -

-/* user type - no type control */ - -

-#define SND_CTL_SW_TYPE_USER          (~0) -

-

-  - -

- -

-
-/* well known (named) switches */ - -

-#define SND_CTL_SW_JOYSTICK           "Joystick" - -

-#define SND_CTL_SW_JOYSTICK_ADDRESS   "Joystick Address" - -

-#define SND_CTL_SW_JOYSTICK_SPEED     "Joystick Speed" -

-

-  - -

- -

-
-struct snd_ctl_switch { - -

-        /* switch index (filled by application) */ - -

-        unsigned int switchn; - -

-        /* indentification of switch (for driver) */ - -

-        unsigned char name[32]; - -

-        /* type of switch value - See SND_CTL_SW_TYPE_XXXX */ - -

-        unsigned int type; - -

-        /* low range value */ - -

-        unsigned int low; - -

-        /* high range value */ - -

-        unsigned int high; - -

-        union { - -

-                unsigned int enable;        /* 0 = off 1 = on */ - -

-                unsigned char data8[32];    /* 8-bit data */ - -

-                unsigned short data16[16];  /* 16-bit data */ - -

-                unsigned int data32[8];     /* 32-bit data */ - -

-        } value; - -

-        /* reserved for future use ¯  must be zero !!! */ - -

-        unsigned char reserved[32]; - -

-} -

-

- -

int snd_ctl_switch_write(void *handle int switchn snd_ctl_switch_t -*data)

- -

-Writes the *data structure with data about the switch with index -switchn to kernel. This function returns zero if successful, otherwise -it returns an error code. - -

- -

int snd_ctl_mixer_info(void *handle, int dev, snd_mixer_info_t *info)

- -

-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 Mixer Interface section. The argument dev -specifies the device number for the appropriate soundcard. Its range is 0 to -N where N is determined by struct snd_ctl_hw_info->mixerdevs - 1. -It should be used to collect information about mixer devices. - -

- -

int snd_ctl_mixer_switches(void *handle)

- -

-Returns count of mixer switches. In this context 'switch' means universal control -interface between kernel and application which allows various types control. -This function returns count if successful, otherwise it returns an error code. -Return value should be zero if soundcard doesn't have any mixer switches. - -

- -

int snd_ctl_mixer_switch(void *handle, const char *switch_id)

- -

-Returns the index for the switch with the name switch_id. This function -returns switch index if successful, otherwise it returns an error code. - -

- -

int snd_ctl_mixer_switch_read(void *handle int switchn snd_mixer_switch_t -*data)

- -

-Fills the *data structure with data about the switch with index switchn. -This function returns zero if successful, otherwise it returns an error code. -Details about the snd_mixer_switch_t structure are in the Mixer -Interface section. - -

- -

int snd_ctl_mixer_switch_write(void *handle int switchn snd_mixer_switch_t -*data)

- -

-Writes the *data structure with data about switch with index switchn -to kernel. Function returns zero if successful, otherwise it returns an error -code. Details about the snd_mixer_switch_t structure are in the -Mixer Interface Interface section. - -

- -

int snd_ctl_pcm_info(void *handle, int dev, snd_pcm_info_t *info)

- -

-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 Digital Audio (PCM) -Interface section. The argument dev selects the device number for the -sound card referenced by *handle. Its range is 0 to N where N is -struct snd_ctl_hw_info->pcmdevs - 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. - -

- -

int snd_ctl_pcm_playback_info(void *handle, int dev, snd_pcm_playback_info_t -*info)

- -

-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 Digital Audio (PCM) Interface section. The argument dev -selects the device number for the sound card referenced by *handle. -Its range is 0 to N where N is struct snd_ctl_hw_info->pcmdevs - -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. - -

- -

int snd_ctl_pcm_playback_switches(void *handle)

- -

-Returns count of PCM playback switches. In this context 'switch' means universal -control interface between kernel and application which allows various types -of control. Function returns count if successful, otherwise it returns an error -code. Return value should be zero if sound card doesn't have any PCM playback -switch. - -

- -

int snd_ctl_pcm_playback_switch(void *handle, const char *switch_id)

- -

-Returns index for switch with name switch_id. Function returns switch -index if successful, otherwise it returns an error code. - -

- -

int snd_ctl_pcm_playback_switch_read(void *handle int switchnsnd_pcm_switch_t *data)

- -

-Fills the *data structure with data about switch with index switchn. -Function returns zero if successful, otherwise it returns an error code. Details -about the snd_pcm_switch_t structure are in the Digital -Audio (PCM) Interface section. - -

- -

int snd_ctl_pcm_playback_switch_write(void *handle int switchnsnd_pcm_switch_t *data)

- -

-Writes the *data structure with data about switch with index switchn -to kernel. Function returns zero if successful, otherwise it returns an error -code. Details about the snd_pcm_switch_t structure are in the Digital -Audio (PCM) Interface section. - -

- -

int snd_ctl_pcm_record_info(void *handle, int dev, snd_pcm_record_info_t -*info)

- -

-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 Digital Audio (PCM) Interface section. The argument dev -selects the device number for the sound card referenced by *handle. -Its range is 0 to N where N is struct snd_ctl_hw_info->pcmdevs - -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. - -

- -

int snd_ctl_pcm_record_switches(void *handle)

- -

-Returns count of PCM record switches. In this context 'switch' means universal -control interface between kernel and application which allows various types -of control. Function returns count if successful, otherwise it returns an error -code. Return value should be zero if sound card doesn't have any PCM record -switch. - -

- -

int snd_ctl_pcm_record_switch(void *handle, const char *switch_id)

- -

-Returns index for switch with name switch_id. Function returns switch -index if successful, otherwise it returns an error code. - -

- -

int snd_ctl_pcm_record_switch_read(void *handle int switchnsnd_pcm_switch_t *data)

- -

-Fills the *data structure with data about switch with index switchn. -Function returns zero if successful, otherwise it returns an error code. Details -about the snd_pcm_switch_t structure are in the Digital -Audio (PCM) Interface section. - -

- -

int snd_ctl_pcm_record_switch_write(void *handle int switchnsnd_pcm_switch_t *data)

- -

-Writes the *data structure with data about switch with index switchn -to kernel. Function returns zero if successful, otherwise it returns an error -code. Details about the snd_pcm_switch_t structure are in the Digital -Audio (PCM) Interface section. - -

- -

int snd_ctl_rawmidi_info(void *handle, int dev, snd_rawmidi_info_t -*info)

- -

-Fills the *info structure with data about the rawmidi device. Function -returns zero if successful, otherwise it returns an error code. Details about -the snd_rawmidi_info_t structure are in the RawMidi Interface -section. The argument dev selects the device number for the sound card -referenced by *handle. Its range is 0 to N where N is struct -snd_ctl_hw_info->mididevs - 1. This function will work if the selected rawmidi -device is busy, too. It should be used to collect information about rawmidi -devices without exclusive lock. - -

- -

int snd_ctl_rawmidi_output_info(void *handle, int dev, snd_rawmidi_output_info_t -*info)

- -

-Fills the *info structure with data about the rawmidi device and -output direction. Function returns zero if successful, otherwise it returns -an error code. Details about the snd_pcm_playback_info_t structure -are in the RawMidi Interface section. The argument dev selects -the device number for the sound card referenced by *handle. Its range -is 0 to N where N is struct snd_ctl_hw_info->mididevs - 1. This -function will work if the selected rawmidi device is busy, too. It should be -used to collect information about rawmidi devices without exclusive lock. - -

- -

int snd_ctl_rawmidi_output_switches(void *handle)

- -

-Returns count of rawmidi output switches. In this context 'switch' means universal -control interface between kernel and application which allows various types -of control. Function returns count if successful, otherwise it returns an error -code. Return value should be zero if sound card doesn't have any control switch. - -

- -

int snd_ctl_rawmidi_output_switch(void *handle, const char *switch_id)

- -

-Returns index for switch with name switch_id. Function returns switch -index if successful, otherwise it returns an error code. Return value should -be zero if sound card doesn't have any rawmidi output switch. - -

- -

int snd_ctl_rawmidi_output_switch_read(void *handle int switchnsnd_rawmidi_switch_t *data)

- -

-Fills the *data structure with data about switch with index switchn. -Function returns zero if successful, otherwise it returns an error code. Details -about the snd_rawmidi_switch_t structure are in the RawMidi -Interface section. - -

- -

int snd_ctl_rawmidi_output_switch_write(void *handle int switchnsnd_rawmidi_switch_t *data)

- -

-Writes the *data structure with data about switch with index switchn -to kernel. Function returns zero if successful, otherwise it returns an error -code. Details about the snd_rawmidi_switch_t structure are in the -RawMidi Interface section. - -

- -

int snd_ctl_rawmidi_input_info(void *handle, int dev, snd_rawmidi_input_info_t -*info)

- -

-Fills the *info structure with data about the rawmidi device and -input direction. Function returns zero if successful, otherwise it returns an -error code. Details about the snd_rawmidi_record_info_t structure -are in the RawMidi Interface section. The argument dev selects -the device number for the sound card referenced by *handle. Its range -is 0 to N where N is struct snd_ctl_hw_info->pcmdevs - 1. This function -will work if the selected rawmidi device is busy, too. It should be used to -collect information about rawmidi devices without exclusive lock. - -

- -

int snd_ctl_rawmidi_input_switches(void *handle)

- -

-Returns count of rawmidi input switches. In this context 'switch' means universal -control interface between kernel and application which allows various types -of control. Function returns count if successful, otherwise it returns an error -code. Return value should be zero if sound card doesn't have any rawmidi input -switch. - -

- -

int snd_ctl_rawmidi_input_switch(void *handle, const char *switch_id)

- -

-Returns index for switch with name switch_id. Function returns switch -index if successful, otherwise it returns an error code. - -

- -

int snd_ctl_rawmidi_input_switch_read(void *handle int switchnsnd_pcm_switch_t *data)

- -

-Fills the *data structure with data about switch with index switchn. -Function returns zero if successful, otherwise it returns an error code. Details -about the snd_rawmidi_switch_t structure are in the RawMidi -Interface Interface section. - -

- -

int snd_ctl_rawmidi_input_switch_write(void *handle int switchnsnd_pcm_switch_t *data)

- -

-Writes the *data structure with data about switch with index switchn -to kernel. Function returns zero if successful, otherwise it returns an error -code. Details about the snd_rawmidi_switch_t structure are in the -RawMidi Interface section. - -

-

-3.1.1  Examples

- -

-The following example shows how all PCM devices can be detected for the first -sound card (#0) in the system. - -

- -

-
-int card = 0, err;  - -

-void *handle;  - -

-snd_ctl_hw_info_t 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);  -

-

-

-4  Mixer Interface

- -

-The Mixer Interface allows applications to change the volume level of a sound -card's input/output channels in both the linear range percentage range -(0-100) and in decibels. It also supports features like hardware mute, input -sound source, stereo signal routing etc. - -

-

-4.1  Low-Level Layer

- -

-Mixer devices aren't opened exclusively. This allows applications to open a -device multiple times with one or more processes. - -

- -

int snd_mixer_open(void **handle, int card, int device)

- -

-Creates new handle and opens a connection to the kernel sound mixer interface -for sound card number card (0-N) and mixer device number device. -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. - -

- -

int snd_mixer_close(void *handle)

- -

-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. - -

- -

int snd_mixer_file_descriptor(void *handle)

- -

-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 select(2) synchronous multiplexer -function for determining read direction. Applications should call snd_mixer_read() -function if some data is waiting to be read. It is recommended that you do this, -since it leaves place for this function to handle some new kernel API specifications. - -

- -

int snd_mixer_channels(void *handle)

- -

-Returns the count of mixer channels for appropriate mixer device, otherwise -the return value is negative, and signifies an error code. Never returns zero. - -

- -

int snd_mixer_info(void *handle, snd_mixer_info_t *info)

- -

-Fills the *info structure with information about the mixer associated -with *handle. Returns zero if successful, otherwise it returns an -error code. - -

- -

-
-/* mixer can do only exclusive record */ - -

-#define SND_MIXER_INFO_CAP_EXCL_RECORD   0x00000001 -

-

-  - -

- -

-
-struct snd_mixer_info { - -

-        /* type of sound card - SND_CARD_TYPE_XXXX */ - -

-        unsigned int type; - -

-        /* count of mixer devices */ - -

-        unsigned int channels; - -

-        /* some flags about this device (SND_MIXER_INFO_CAP_XXXX) */ - -

-        unsigned int caps; - -

-        /* ID of this mixer */ - -

-        unsigned char id[32]; - -

-        /* name of this device */ - -

-        unsigned char name[80]; - -

-        /* reserved for future use */ - -

-        char reserved[ 32 ]; - -

-}; -

-

- -

int snd_mixer_switches(void *handle)

- -

-Returns count of mixer switches. In this context 'switch' means universal control -interface between kernel and application which allows various types of control. -Function returns count if successful, otherwise it returns an error code. Return -value will be zero if sound card doesn't have any mixer switch. - -

- -

int snd_mixer_switch(void *handle, const char *switch_id)

- -

-Returns index for switch with name switch_id. Function returns switch -index if successful, otherwise it returns an error code. - -

- -

int snd_mixer_switch_read(void *handle int switchn snd_mixer_switch_t -*data)

- -

-Fills the *data structure with data about switch with index switchn. -Function returns zero if successful, otherwise it returns an error code. - -

- -

-
-/* 0 or 1 (enable member of union) */ - -

-#define SND_MIXER_SW_TYPE_BOOLEAN     0 - -

-/* 0 to 255 - from low to high (data8[0] member of union) */ - -

-#define SND_MIXER_SW_TYPE_BYTE        1 - -

-/* 0 to 65535 - from low to high (data16[0] member of union) */ - -

-#define SND_MIXER_SW_TYPE_WORD        2 - -

-/* 0 to 4294967296 ¯  from low to high (data32[0] member of union) */ - -

-#define SND_MIXER_SW_TYPE_DWORD       3 - -

-/* user type - no type control */ - -

-#define SND_MIXER_SW_TYPE_USER        (~0) -

-

-  - -

- -

-
-/* well known (named) switches */ - -

-#define SND_MIXER_SW_LOUDNESS         "Loudness"  /* bass boost */ - -

-#define SND_MIXER_SW_SIM_STEREO       "Simulated Stereo Enhancement" - -

-#define SND_MIXER_SW_3D               "3D Stereo Enhancement" - -

-/* microphone gain */ - -

-#define SND_MIXER_SW_MIC_GAIN         "MIC Gain" - -

-/* microphone auto gain control */ - -

-#define SND_MIXER_SW_MIC_GAIN         "MIC Auto-Gain-Control" - -

-/* change microphone impedance */ - -

-#define SND_MIXER_SW_MIC_GAIN         "Change MIC Impedance" - -

-/* change line-in to output */ - -

-#define SND_MIXER_SW_MIC_GAIN         "Line In to Output" - -

-#define SND_MIXER_SW_IEC958OUT        "IEC-958 (S/PDIF) Output" - -

-#define SND_MIXER_SW_IEC958IN         "IEC-958 (S/PDIF) Input" -

-

-  - -

- -

-
-struct snd_mixer_switch { - -

-        /* switch index (filled by application) */ - -

-        unsigned int switchn; - -

-        /* identification of switch (for driver) */ - -

-        unsigned char name[32]; - -

-        /* type of switch value ¯  See SND_CTL_SW_TYPE_XXXX */ - -

-        unsigned int type; - -

-        /* low range value */ - -

-        unsigned int low; - -

-        /* high range value */ - -

-        unsigned int high; - -

-        union { - -

-                unsigned int enable;        /* 0 = off 1 = on */ - -

-                unsigned char data8[32];    /* 8-bit data */ - -

-                unsigned short data16[16];  /* 16-bit data */ - -

-                unsigned int data32[8];     /* 32-bit data */ - -

-        } value; - -

-        /* reserved for future use ¯  must be zero !!! */ - -

-        unsigned char reserved[32]; - -

-} -

-

- -

int snd_mixer_switch_write(void *handle int switchn snd_mixer_switch_t -*data)

- -

-Writes the *data structure with data about switch with index switchn -to kernel. Function returns zero if successful, otherwise it returns an error -code. - -

- -

int snd_mixer_exact_mode(void *handle, int enable)

- -

-Turns on = 1 or off = 0 (by default) exact mode. This mode allows application -to set/get volume values in exact range which uses hardware. In non-exact mode -range is always from percentage 0 to 100 and driver does conversion to hardware -range. Function returns zero if successful, otherwise it returns an error code. - -

- -

int snd_mixer_channel(void *handle, const char *channel_id)

- -

-Returns the channel number (index) associated with channel_id (channel -name), or returns an error code. Note: Below mixer channel IDs are subject to -change and will be extended if new hardware has support for other mixer input/output -channels. - -

- -

-
-#define SND_MIXER_ID_MASTER        "Master" - -

-#define SND_MIXER_ID_MASTER1       "Master 1" - -

-/* digital master */ - -

-#define SND_MIXER_ID_MASTERD       "Master D" - -

-/* second digital master */ - -

-#define SND_MIXER_ID_MASTERD1      "Master D1" - -

-#define SND_MIXER_ID_HEADPHONE     "Headphone" - -

-#define SND_MIXER_ID_MASTER_MONO   "Master M" - -

-#define SND_MIXER_ID_3D            "3D Wide" - -

-#define SND_MIXER_ID_3D_VOLUME     "3D Volume" - -

-#define SND_MIXER_ID_3D_CENTER     "3D Center" - -

-#define SND_MIXER_ID_3D_SPACE      "3D Space" - -

-#define SND_MIXER_ID_3D_DEPTH      "3D Depth" - -

-#define SND_MIXER_ID_BASS          "Bass" - -

-#define SND_MIXER_ID_TREBLE        "Treble" - -

-#define SND_MIXER_ID_FADER         "Fader" - -

-#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_DSP           "DSP" - -

-#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_VIDEO         "Video" - -

-#define SND_MIXER_ID_PHONE         "Phone" - -

-#define SND_MIXER_ID_GAIN          "Record-Gain" - -

-#define SND_MIXER_ID_MIC_GAIN      "Mic-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_MONO          "Mono" - -

-#define SND_MIXER_ID_MONO1         "Mono 1" - -

-#define SND_MIXER_ID_MONO2         "Mono 2" - -

-#define SND_MIXER_ID_AUXA          "Aux A" - -

-#define SND_MIXER_ID_AUXB          "Aux B" - -

-#define SND_MIXER_ID_AUXC          "Aux C" -

-

- -

int snd_mixer_channel_info(void *handle, int channel, snd_mixer_channel_info_t -*info)

- -

-Fills the *info structure. The argument channel specifies -channel (0 to N) for which is the info requested. Function returns zero if successful, -otherwise it returns an error code. - -

- -

-
-/* mixer channel is record source */ - -

-#define SND_MIXER_CINFO_CAP_RECORD         0x00000001 - -

-/* mixer channel is stereo */ - -

-#define SND_MIXER_CINFO_CAP_STEREO         0x00000002 - -

-/* always set at this moment driver emulates mute */ - -

-#define SND_MIXER_CINFO_CAP_MUTE           0x00000004 - -

-/* channel supports hardware mute */ - -

-#define SND_MIXER_CINFO_CAP_HWMUTE         0x00000008 - -

-/* channel does digital (not analog) mixing */ - -

-#define SND_MIXER_CINFO_CAP_DIGITAL        0x00000010 - -

-/* external input channel */ - -

-#define SND_MIXER_CINFO_CAP_INPUT          0x00000020 - -

-/* join mute is supported only */ - -

-/* left and right channel doesn't have separate mute control */ - -

-#define SND_MIXER_CINFO_CAP_JOINMUTE       0x00000040 - -

-/* join record is supported only * - -

-/* left and right channel doesn't have separate record control */ - -

-#define SND_MIXER_CINFO_CAP_JOINRECORD     0x00000080 - -

-/* route left input to right output is supported */ - -

-#define SND_MIXER_CINFO_CAP_LTOR_OUT       0x00000100 - -

-/* route right input to left output is supported */ - -

-#define SND_MIXER_CINFO_CAP_RTOL_OUT       0x00000200 - -

-/* route left input to right ADC is supported */ - -

-#define SND_MIXER_CINFO_CAP_LTOR_IN        0x00000400 - -

-/* route right input to left ADC is supported */ - -

-#define SND_MIXER_CINFO_CAP_RTOL_IN        0x00000800 - -

-/* output route is only switch (cannot be used separately) */ - -

-#define SND_MIXER_CINFO_CAP_SWITCH_OUT     0x00001000 - -

-/* input route is only switch (cannot be used separately) */ - -

-#define SND_MIXER_CINFO_CAP_SWITCH_IN      0x00002000 - -

-/* data can be recorded even if output path is muted */ - -

-/* (to avoid loopback) */ - -

-#define SND_MIXER_CINFO_CAP_RECORDBYMUTE   0x00004000 -

-

-  - -

- -

-
-struct snd_mixer_channel_info { - -

-        /* channel index (filled by application) */ - -

-        unsigned int channel; - -

-        /* parent channel # or SND_MIXER_PARENT */ - -

-        unsigned int parent; - -

-        /* name of this device */ - -

-        unsigned char name[12]; - -

-        /* some flags about this device (SND_MIXER_CINFO_XXXX) */ - -

-        unsigned int caps; - -

-        /* min. value when exact mode (or always 0) */ - -

-        int min;  - -

-        /* max. value when exact mode (or always 100) */  - -

-        int max; - -

-        /* minimum decibel value (*100) */ - -

-        int min_dB; - -

-        /* maximum decibel value (*100) */ - -

-        int max_dB; - -

-        /* step decibel value (*100) */ - -

-        int step_dB; - -

-        /* reserved for future use */ - -

-        unsigned char reserved[16]; - -

-}; -

-

- -

int snd_mixer_channel_read(void *handle, int channel, snd_mixer_channel_t -*data)

- -

-Fills the *data structure. The argument channel specifies -the channel (0 to N) for which is data requested. Function returns zero if successful, -otherwise it returns an error code. - -

- -

-
-/* channel record source flags */ - -

-#define SND_MIXER_FLG_RECORD_LEFT  0x00000001 - -

-#define SND_MIXER_FLG_RECORD_RIGHT 0x00000002 - -

-#define SND_MIXER_FLG_RECORD       0x00000003 - -

-/* mute channel flags */ - -

-#define SND_MIXER_FLG_MUTE_LEFT    0x00010000 - -

-#define SND_MIXER_FLG_MUTE_RIGHT   0x00020000 - -

-#define SND_MIXER_FLG_MUTE         0x00030000 - -

-/* input to output route setup */ - -

-#define SND_MIXER_FLG_LTOR_OUT     0x00100000 - -

-#define SND_MIXER_FLG_RTOL_OUT     0x00200000 - -

-#define SND_MIXER_FLG_SWITCH_OUT   0x00300000 - -

-/* input to ADC route setup */ - -

-#define SND_MIXER_FLG_LTOR_IN      0x00400000 - -

-#define SND_MIXER_FLG_RTOL_IN      0x00800000 - -

-#define SND_MIXER_FLG_SWITCH_IN    0x00c00000 - -

-/* set volume in decibels from dB variables */ - -

-#define SND_MIXER_FLG_DECIBEL      0x40000000 - -

-/* reserved for kernel use, don't use this flag from application */ - -

-#define SND_MIXER_FLG_FORCE        0x80000000 -

-

-  - -

- -

-
-struct snd_mixer_channel { - -

-        /* channel # (filled by application) */ - -

-        unsigned int channel; - -

-        /* some flags to read/write (SND_MIXER_FLG_XXXX) */ - -

-        unsigned int flags; - -

-        /* min - max when exact mode (or 0 - 100) */ - -

-        int left; - -

-        /* min - max when exact mode (or 0 - 100) */  - -

-        int right; - -

-        /* dB * 100 */ - -

-        int left_dB; - -

-        /* dB * 100 */ - -

-        int right_dB; - -

-        unsigned char reserved[16]; - -

-};  -

-

- -

int snd_mixer_channel_write(void *handle, int channel, snd_mixer_channel_t -*data)

- -

-Writes the *data structure to kernel. The channel 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 snd_mixer_channel_read. - -

- -

int snd_mixer_read(void *handle, snd_mixer_callbacks_t *callbacks)

- -

-This function reads and parses data from driver. Parsed actions are returned -back to the application using the callbacks 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 { - -

-        /* should be used by application */ - -

-        void *private_data; - -

-        void (*channel_was_changed)(void *private_data, int channel); - -

-        void (*switch_was_changed)(void *private_data, int switchn); - -

-        /* reserved for future use - must be NULL!!! */  - -

-        void *reserved[14]; - -

-} snd_mixer_callbacks_t; -

-

-

-4.1.1  Examples

- -

-The following example shows installed mixer channels for sound card #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); -

-

-

-5  Digital Audio (PCM) Interface

- -

-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 that 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, an 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 a 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 -beyond the scope of this document. - -

-

-5.1  Low-Level Layer

- -

-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: - -

- -

-
-/* muLaw compressed samples */ - -

-#define SND_PCM_SFMT_MU_LAW       0 - -

-/* aLaw compressed samples */ - -

-#define SND_PCM_SFMT_A_LAW        1 - -

-/* Ima-ADPM 4:1 compressed samples */ - -

-#define SND_PCM_SFMT_IMA_ADPCM    2 - -

-/* Unsigned 8-bit samples (most common 8-bit format) */ - -

-#define SND_PCM_SFMT_U8           3 - -

-/* Signed 16-bit Little Endian samples (most common 16-bit format) */ - -

-#define SND_PCM_SFMT_S16_LE       4 - -

-/* Signed 16-bit Big Endian samples */ - -

-#define SND_PCM_SFMT_S16_BE       5 - -

-/* Signed 8-bit samples */ - -

-#define SND_PCM_SFMT_S8           6 - -

-/* Unsigned 16-bit Little Endian samples */ - -

-#define SND_PCM_SFMT_U16_LE       7 - -

-/* Unsigned 16-bit Big Endian samples */ - -

-#define SND_PCM_SFMT_U16_BE       8 - -

-/* MPEG 1/2 stream */ - -

-#define SND_PCM_SFMT_MPEG         9 - -

-/* GSM stream */ - -

-#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 SND_PCM_FMT_ are used in info structures and -constants with prefix SND_PCM_SFMT_ are used in format structures. - -

-ALSA PCM API uses an enhanced double buffering scheme. This allows the user -to implement a more comfortable buffer setup. Audio buffer is separated to small -fragments. Each fragment has the same size. Application can set wakeup limits -like ``I want to get recorded data when at least two fragments with size 160 -bytes are filled.''. For more information you should see description of snd_pcm_*_params_t -and snd_pcm_*_status_t structures and the snd_pcm_playback_status(), -snd_pcm_record_status() functions, documented below. - -

- -

int snd_pcm_open(void **handle, int card, int device, int mode)

- -

-Creates a new handle and opens a connection to the kernel sound audio interface -for sound card number card (0-N) and audio device number device. -Function also checks if protocol is compatible to prevent use of old programs -with a new kernel API. Function returns zero if successful otherwise it returns -an error code. Error code -EBUSY is returned when some process owns the selected -direction. - -

-Default format after opening is mono mu-Law at 8000Hz. This device -can be used directly for playback of standard .au (Sparc) files. - -

-The following modes should be used for the mode argument: - -

- -

-
-#define SND_PCM_OPEN_PLAYBACK      (O_WRONLY) - -

-#define SND_PCM_OPEN_RECORD        (O_RDONLY) - -

-#define SND_PCM_OPEN_DUPLEX        (O_RDWR) -

-

- -

int snd_pcm_close(void *handle)

- -

-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. - -

- -

int snd_pcm_file_descriptor(void *handle)

- -

-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 select(2) synchronous multiplexer -function for setting the read direction. Application should call snd_pcm_read() -or snd_pcm_write() functions if data is waiting to be read or a write -can be performed. Calling these functions is highly recommended, as it leaves -a place for the API to do things like data conversions, if needed. - -

- -

int snd_pcm_block_mode(void *handle, int enable)

- -

-Sets up block (default) or non-block mode for a handle. Block mode suspends -execution of a program when snd_pcm_read() or snd_pcm_write() -is called for the time which is needed for the actual playback or record over -of the selected limit. In non-block mode, programs aren't suspended and the -above functions return 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. - -

- -

int snd_pcm_info(void *handle, snd_pcm_info_t *info)

- -

-Fills the *info structure with data about the PCM device selected -by *handle. Function returns zero if successful, otherwise it returns -an error code. - -

- -

-
-/* hardware have codec */ - -

-#define SND_PCM_INFO_CODEC          0x00000001 - -

-#define SND_PCM_INFO_DSP            SND_PCM_INFO_CODEC - -

-/* this flag is reserved and should be never used */ - -

-/* It remains for compatibility with Open Sound System driver. */ - -

-#define SND_PCM_INFO_MMAP           0x00000002 - -

-/* playback direction is supported */ - -

-#define SND_PCM_INFO_PLAYBACK       0x00000100 - -

-/* record direction is supported */ - -

-#define SND_PCM_INFO_RECORD         0x00000200 - -

-#define SND_PCM_INFO_DUPLEX         0x00000400 - -

-/* rate for playback & record must be same */ - -

-#define SND_PCM_INFO_DUPLEX_LIMIT   0x00000800 - -

-/* duplex is supported only by mono (one channel) format */ - -

-#define SND_PCM_INFO_DUPLEX_MONO    0x00001000 -

-

-  - -

- -

-
-struct snd_pcm_info { - -

-        /* sound card type */ - -

-        unsigned int type; - -

-        /* see SND_PCM_INFO_XXXX */ - -

-        unsigned int flags; - -

-        /* ID of this PCM device */ - -

-        unsigned char id[32]; - -

-        /* name of this device */ - -

-        unsigned char name[80]; - -

-        /* reserved for future use */ - -

-        unsigned char reserved[64]; - -

-}; -

-

- -

int snd_pcm_playback_info(void *handle, snd_pcm_playback_info_t *info)

- -

-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 { - -

-        /* see SND_PCM_PINFO_XXXX */ - -

-        unsigned int flags; - -

-        /* supported formats */  - -

-        unsigned int formats; - -

-        /* min rate (in Hz) */  - -

-        unsigned int min_rate; - -

-        /* max rate (in Hz) */  - -

-        unsigned int max_rate; - -

-        /* min channels - voices (probably always 1) */  - -

-        unsigned int min_channels; - -

-        /* max channels - voices */  - -

-        unsigned int max_channels; - -

-        /* playback buffer size in bytes */ - -

-        unsigned int buffer_size; - -

-        /* min fragment size in bytes */  - -

-        unsigned int min_fragment_size; - -

-        /* max fragment size in bytes */ - -

-        unsigned int max_fragment_size; - -

-        /* align fragment value */ - -

-        unsigned int fragment_align; - -

-        /* supported formats directly by hardware */ - -

-        unsigned int hw_formats; - -

-        /* count of playback switches */ - -

-        unsigned int switches; - -

-        /* reserved for future use */ - -

-        unsigned char reserved[56]; - -

-}; -

-

- -

-
[SND_PCM_PINFO_BATCH]Driver implements double buffering with this device. -This means that the chip used for data processing has its own memory, and output -will be more delayed than if a traditional codec chip is used. -
-
[SND_PCM_PINFO_8BITONLY]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 sound cards which can't do full 16-bit duplex. If this bit is set application -or higher 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. -
-
[SND_PCM_PINFO_16BITONLY]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 sound cards which can't do full 8-bit duplex. If this bit is set the -application or higher 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. -
-

- -

int snd_pcm_record_info(void *handle, snd_pcm_record_info_t *info)

- -

-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 - -

-#define SND_PCM_RINFO_OVERRANGE  0x00001000 -

-

-  - -

- -

-
-struct snd_pcm_record_info { - -

-        /* see SND_PCM_RINFO_XXXX */ - -

-        unsigned int flags; - -

-        /* supported formats */  - -

-        unsigned int formats; - -

-        /* min rate (in Hz) */  - -

-        unsigned int min_rate; - -

-        /* max rate (in Hz) */  - -

-        unsigned int max_rate; - -

-        /* min channels - voices (probably always 1) */  - -

-        unsigned int min_channels; - -

-        /* max channels - voices */  - -

-        unsigned int max_channels; - -

-        /* playback buffer size in bytes */ - -

-        unsigned int buffer_size; - -

-        /* min fragment size in bytes */  - -

-        unsigned int min_fragment_size; - -

-        /* max fragment size in bytes */ - -

-        unsigned int max_fragment_size; - -

-        /* align fragment value */ - -

-        unsigned int fragment_align; - -

-        /* supported formats directly by hardware */ - -

-        unsigned int hw_formats; - -

-        /* count of record switches */ - -

-        unsigned int switches; - -

-        /* reserved for future use */ - -

-        unsigned char reserved[56]; - -

-}; -

-

- -

-
[SND_PCM_RINFO_BATCH]Driver implements double buffering with this device. -This means that the chip used for data processing has its own memory, and input -will be more delayed than if a traditional codec chip is used. -
-
[SND_PCM_RINFO_8BITONLY]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 sound cards which can't do full 16-bit duplex. If this bit is set application -or higher 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. -
-
[SND_PCM_RINFO_16BITONLY]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 sound cards which can't do full 8-bit duplex. If this bit is set the -application or higher 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. -
-
[SND_PCM_RINFO_OVERRANGE]If this bit is set the hardware can do ADC -over-range detection. -
-

- -

int snd_pcm_playback_switches(void *handle)

- -

-Returns count of PCM playback switches. In this contents switch means universal -control interface between kernel and application which allows variable type -control. Function returns count if successful, otherwise it returns an error -code. Return value should be zero if sound card doesn't have any PCM playback -switch. - -

- -

int snd_pcm_playback_switch(void *handle, const char *switch_id)

- -

-Returns index for switch with name switch_id. Function returns switch -index if successful, otherwise it returns an error code. - -

- -

int snd_pcm_playback_switch_read(void *handle int switchnsnd_pcm_switch_t *data)

- -

-Fills the *data structure with data about switch with index switchn. -Function returns zero if successful, otherwise it returns an error code. - -

- -

-
-/* 0 or 1 (enable member of union) */ - -

-#define SND_PCM_SW_TYPE_BOOLEAN       0 - -

-/* 0 to 255 - from low to high (data8[0] member of union) */ - -

-#define SND_PCM_SW_TYPE_BYTE          1 - -

-/* 0 to 65535 - from low to high (data16[0] member of union) */ - -

-#define SND_PCM_SW_TYPE_WORD          2 - -

-/* 0 to 4294967296 ¯  from low to high (data32[0] member of union) */ - -

-#define SND_PCM_SW_TYPE_DWORD         3 - -

-/* user type - no type control */ - -

-#define SND_PCM_SW_TYPE_USER          (~0) -

-

-  - -

- -

-
-struct snd_pcm_switch { - -

-        /* switch index (filled by application) */ - -

-        unsigned int switchn; - -

-        /* identification of switch (for driver) */ - -

-        unsigned char name[32]; - -

-        /* type of switch value ¯  See SND_PCM_SW_TYPE_XXXX */ - -

-        unsigned int type; - -

-        /* low range value */ - -

-        unsigned int low; - -

-        /* high range value */ - -

-        unsigned int high; - -

-        union { - -

-                unsigned int enable;        /* 0 = off 1 = on */ - -

-                unsigned char data8[32];    /* 8-bit data */ - -

-                unsigned short data16[16];  /* 16-bit data */ - -

-                unsigned int data32[8];     /* 32-bit data */ - -

-        } value; - -

-        /* reserved for future use ¯  must be zero !!! */ - -

-        unsigned char reserved[32]; - -

-} -

-

- -

int snd_pcm_playback_switch_write(void *handle int switchnsnd_pcm_switch_t *data)

- -

-Writes the *data structure with data about switch with index switchn -to kernel. Function returns zero if successful, otherwise it returns an error -code. - -

- -

int snd_pcm_record_switches(void *handle)

- -

-Returns count of PCM record switches. In this context 'switch' means universal -control interface between kernel and application which allows various types -of control. Function returns count if successful, otherwise it returns an error -code. Return value should be zero if sound card doesn't have any PCM record -switch. - -

- -

int snd_pcm_record_switch(void *handle, const char *switch_id)

- -

-Returns index for switch with name switch_id. Function returns switch -index if successful, otherwise it returns an error code. - -

- -

int snd_pcm_record_switch_read(void *handle int switchn snd_pcm_switch_t -*data)

- -

-Fills the *data structure with data about switch with index switchn. -Function returns zero if successful, otherwise it returns an error code. - -

- -

int snd_pcm_record_switch_write(void *handle int switchnsnd_pcm_switch_t *data)

- -

-Writes the *data structure with data about switch with index switchn -to kernel. Function returns zero if successful, otherwise it returns an error -code. - -

- -

int snd_pcm_playback_format(void *handle, snd_pcm_format_t *format)

- -

-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]; - -

-}; -

-

- -

int snd_pcm_record_format(void *handle, snd_pcm_format_t *format)

- -

-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]; - -

-}; -

-

- -

int snd_pcm_playback_params(void *handle, snd_pcm_playback_params_t -*params)

- -

-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; - -

-        /* reserved for future use - must be filled with zero */ - -

-        unsigned char reserved[16]; - -

-};  -

-

- -

-
[fragment_size]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 fragment_align variable from snd_pcm_playback_info_t -structure. Its range can be from min_fragment_size to max_fragment_size. -
-
[fragments_max]Maximum number of fragments in queue for wakeup. This number -doesn't include partly used fragments. If the current count of filled playback -fragments is greater than this value the driver will block the application or -return immediately back if non-block mode is active. -
-
[fragments_room]Minimum number of fragments writable for wakeup. This value -should in most cases be 1 which means return back to application if at least -one fragment is free for playback. This value includes partly used fragments, -too. -
-

- -

int snd_pcm_record_params(void *handle, snd_pcm_record_params_t *params)

- -

-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; - -

-        /* reserved for future use - must be filled with zero */ - -

-        unsigned char reserved[16]; - -

-};  -

-

- -

-
[fragment_size]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 fragment_align variable from snd_pcm_playback_info_t -structure. Its range can be from min_fragment_size to max_fragment_size. -
-
[fragments_min]Minimum filled fragments for wakeup. Driver blocks the application -(if block mode is selected) until input buffer is filled with less than the -number of fragments specified with this value. -
-

- -

int snd_pcm_playback_status(void *handle, snd_pcm_playback_status_t -*status)

- -

-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; - -

-        int scount; - -

-        /* reserved for future use - must be filled with zero */ - -

-        unsigned char reserved[16]; - -

-}; -

-

- -

-
[rate]Real playback rate. This value reflects hardware limitations. -
-
[fragments]Currently allocated fragments by the driver for playback direction. -
-
[fragment_size]Current fragment size used by driver for the playback direction. -
-
[count]Count of bytes writable without blocking. -
-
[queue]Count of bytes in queue. Note: (fragments*fragment_size) - -queue should not be equal to count. -
-
[underrun]This value tells the application the number of underruns since the -last call to snd_pcm_playback_status(). -
-
[time]Estimated time when the next written sample will actually be played (time -is always in the future). The estimate is calculated with: current time + sample -queue converted to time (number of samples waiting for write to device, -i.e., the same as the queue member above). This value should be used -for time synchronization. Returned value is in the same format as returned from -the standard C function gettimeofday(&time, NULL). This -variable contains valid information only if playback time mode is enabled (see -snd_pcm_playback_time() function). -
-
[stime]Time when playback was started. This variable contains valid information -only if playback time mode is enabled (see snd_pcm_playback_time() -function). -
-
[scount]Number of bytes processed (actually played) from playback start. This -number is not necessarily the same as byte count written by application. -
-

-

-

-

The figure above shows an example situation in the audio playback buffer in -the ALSA driver. The driver splits the audio buffer into 16 fragments, -each being fragment_size bytes long. Fragments 0 and 12-15 are filled -with samples. Fragment 1 is filled partly (about 75%). Driver is playing and -current playback position is in fragment 12 (about 35%). As you can seefree space (structure member count) is counted without including the -fragment which is being played. - -

- -

int snd_pcm_record_status(void *handle, snd_pcm_record_status_t *status)

- -

-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; - -

-        struct timeval stime; - -

-        int scount; - -

-        int overrange; - -

-        /* reserved for future use - must be filled with zero */ - -

-        unsigned char reserved[16]; - -

-}; -

-

- -

-
[rate]Real record rate. This value reflects hardware limitations. -
-
[fragments]Currently allocated fragments by driver for the record direction. -
-
[fragment_size]Current fragment size used by driver for the record direction. -
-
[count]Count of bytes readable without blocking. -
-
[free]Count of bytes in buffer still free. Note: (fragments*fragment_size) -- free should not be equal to count. -
-
[overrun]This value tells application the count of overruns since the last call -to snd_pcm_record_status. -
-
[time]Returns a timestamp for the next sample to be read from the record ring -buffer (time is always in the past). The timestamp is calculated with: current -time - sample queue converted to time (waiting for application read() + current -position in fragment is the same as record count + current position in fragment). -This value should be used for time synchronization. Returned value is in the -same format as returned by the standard C function gettimeofday(&time, NULL). -This variable contains right valid information only if record time mode is enabled -(see snd_pcm_record_time() function). -
-
[stime]Time when record was started. This variable contains valid information -only if record time mode is enabled (see snd_pcm_record_time function). -
-
[scount]Number of bytes processed (actually recorded) from record start (stime). -This number is not necessarily the same as the byte count read by application. -
-
[overrange]ADC overrange count. This value is used only when SND_PCM_RINFO_OVERRANGE -bit in struct snd_pcm_record_info_t->flags is set (if hardware -supports this feature). -
-

-

-

-

The figure above shows an example situation in the audio record buffer in the -ALSA driver. The driver splits the audio buffer into 16 fragments, each -being fragment_size bytes in length. Fragments 0 and 12-15 are filled -with samples. Fragment 1 is partly filled (about 75%) and at the end of the -filled area is the active record position. Data which is ready for the application -begins in fragment 12 (about 35%). As you can see free space (structure -member free) is counted without including the fragment which is partly -filled with samples and the application reads data from this fragment. - -

- -

int snd_pcm_drain_playback(void *handle)

- -

-This function stops and drains (destroys) the playback buffers immediately. -Function returns zero if successful, otherwise it returns an error code. - -

- -

int snd_pcm_flush_playback(void *handle)

- -

-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. - -

- -

int snd_pcm_flush_record(void *handle)

- -

-This function flushes (destroys) record buffers. Function returns zero if successful, -otherwise it returns an error code. - -

- -

int snd_pcm_playback_pause(void *handle int enable)

- -

-This function pauses playback if enable is non-zero. To restore playing -mode call this function with enable equal to zero. Function returns -zero if successful, otherwise it returns an error code. - -

- -

int snd_pcm_playback_time(void *handle, int enable)

- -

-This function enables or disables time mode for the playback direction. Time -mode is useful in synchronizing an application with other events. Function returns -zero if successful, otherwise it returns an error code. - -

- -

int snd_pcm_record_time(void *handle, int enable)

- -

-This function enables or disables time mode for record direction. Time mode -is useful in synchronizing an application with other events. Function returns -zero if successful, otherwise it returns an error code. - -

- -

ssize_t snd_pcm_write(void *handle, const void *buffer, size_t size)

- -

-Writes samples to the device which must be in the proper format specified by -the snd_pcm_playback_format function. Function returns zero or positive -value if playback was successful (value represents count of bytes which were -successfully written to device) or an error value if an error occurred. Function -will suspend process if block mode is active. - -

- -

ssize_t snd_pcm_read(void *handle, void *buffer, size_t size)

- -

-Function reads samples from driver. Samples are in format specified by snd_pcm_record_format -function. Function returns zero or positive value if record was success (value -represents count of bytes which was successfully read from device) or negative -error value if error occurred. Function will suspend process if block mode is -active. - -

-

-5.1.1  Example

- -

-The following example shows how to play the first 512kB from the /tmp/test.au -file with sound card #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; - -

-} - -

-bzero(&format sizeof(format)); - -

-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); -

-

-

-5.2  PCM Loopback Interface

- -

-This interface is designed to pass data currently being played or recorded from -one application to another application for other processing like a graphical -equalizer sample recorder etc... The programmer should be aware that each -loopback connection eats CPU time (for data copying from the process which is -doing the playback or record). - -

- -

int snd_pcm_loopback_open(void **handle, int card, int device, int mode)

- -

-Creates a new handle and opens a connection to the kernel sound audio loopback -interface for sound card number card (0-N) and audio device number -device. Function also checks if protocol is compatible to prevent use -of old programs with a new kernel API. Function returns zero if successful otherwise -it returns an error code. Error code -EBUSY is returned when another process -owns the selected direction. - -

-The following modes should be used for the mode argument: - -

- -

-
-#define SND_PCM_LB_OPEN_PLAYBACK     0 - -

-#define SND_PCM_LB_OPEN_RECORD       1 -

-

- -

int snd_pcm_loopback_close(void *handle)

- -

-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. - -

- -

int snd_pcm_loopback_file_descriptor(void *handle)

- -

-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 select(2) synchronous multiplexer -function for setting the read direction. Application should call snd_pcm_loopback_read() -function if data is waiting to be read. - -

- -

int snd_pcm_loopback_block_mode(void *handle, int enable)

- -

-Sets up block (default) or non-block mode for a handle. Block mode suspends -execution of a program when snd_pcm_loopback_read() is called for -the time until some data arrives for file descriptor. In non-block mode, programs -aren't suspended and the above function returns immediately with the count of -bytes which were read 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. - -

- -

int snd_pcm_loopback_stream_mode(void *handle, int mode)

- -

-Sets up stream mode which should be one of these values: - -

- -

-
-#define SND_PCM_LB_STREAM_MODE_RAW     0 - -

-#define SND_PCM_LB_STREAM_MODE_PACKET  1 -

-

-Mode raw (default mode) means that the stream contains only PCM samples. Packet -mode is more complicated. The stream contains a header at the begining of the -packet. Information like data type and data size is contain in this header. - -

- -

-
-#define SND_PCM_LB_TYPE_DATA           0   /* sample data */ - -

-#define SND_PCM_LB_TYPE_FORMAT         1   /* PCM format */ -

-

-  - -

- -

-
-struct snd_pcm_loopback_header { - -

-        unsigned int size;      /* block size */ - -

-        unsigned int type;      /* block type (SND_PCM_LB_TYPE_*) */ - -

-}; -

-

- -

int snd_pcm_loopback_format(void *handle, snd_pcm_format_t *format)

- -

-Get current format for PCM stream. - -

- -

-
-struct snd_pcm_format { - -

-        unsigned int format;    /* SND_PCM_SFMT_XXXX */ - -

-        unsigned int rate;      /* rate in Hz */ - -

-        unsigned int channels;  /* number of channels (voices) */ - -

-        unsigned char reserved[16]; - -

-}; -

-

- -

ssize_t snd_pcm_loopback_read(void *handle, void *buffer, size_t size)

- -

-This function reads samples or loopback packets from the stream. Data depends -on stream mode which should be set with snd_pcm_loopback_stream_mode() -function. Function returns zero or positive value if record was success (value -represents count of bytes which were successfully read from device) or negative -error value if error occurred. Function will suspend process if block mode is -active. - -

-

-6  RawMidi Interface

- -

-RawMidi Interface is designed to write or read raw (unchanged) MIDI data over -the MIDI line. MIDI stands Musical Instrument Digital Interface and more informations -about this standard can be found at http://www.midi.org. - -

-

-6.1  Low Level Layer

- -

-RawMidi devices are opened exclusively for a selected direction. While more -than one process may not open a given MIDI device in the same direction simultaniously, -seperate processes may open a single MIDI device in different directions (i.e. -process one opens a MIDI device in playback direction and process two opens -the same device in record direction). Audio devices (with MIDI ports) return -EBUSY error to applications when other applications have already opened the -requested direction. - -

- -

int snd_rawmidi_open(void **handle, int card, int device, int mode)

- -

-Creates a new handle and opens a connection to the kernel sound audio interface -for sound card number card (0-N) and rawmidi device number device. -Function also checks if protocol is compatible to prevent use of old programs -with a new kernel API. Function returns zero if successful, otherwise it returns -an error code. Error code -EBUSY is returned when another process owns the selected -direction. - -

-The following modes should be used for the mode argument: - -

- -

-
-#define SND_RAWMIDI_OPEN_OUTPUT        (O_WRONLY) - -

-#define SND_RAWMIDI_OPEN_INPUT         (O_RDONLY) - -

-#define SND_RAWMIDI_OPEN_DUPLEX        (O_RDWR) -

-

- -

int snd_rawmidi_close(void *handle)

- -

-Frees all resources allocated with audio handle and closes the connection to -the kernel sound rawmidi interface. Function returns zero if successful, otherwise -it returns an error code. - -

- -

int snd_rawmidi_file_descriptor(void *handle)

- -

-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 select(2) synchronous multiplexer -function for setting the read direction. Application should call snd_rawmidi_read() -or snd_rawmidi_write() functions if data is waiting to be read or -a write can be performed. Calling these functions is highly recommended. - -

- -

int snd_rawmidi_block_mode(void *handle, int enable)

- -

-Sets up block (default) or non-block mode for a handle. Block mode suspends -execution of a program when snd_rawmidi_read() or snd_rawmidi_write() -is called for the time which is needed for the actual output or input over of -the selected limit. In non-block mode, programs aren't suspended and the above -functions return 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. - -

- -

int snd_rawmidi_info(void *handle, snd_pcm_info_t *info)

- -

-Fills the *info structure with data about the PCM device selected -by *handle. Function returns zero if successful, otherwise it returns -an error code. - -

- -

-
-/* device is capable rawmidi output */ - -

-#define SND_RAWMIDI_INFO_OUTPUT        0x00000001  - -

-/* device is capable rawmidi input */ - -

-#define SND_RAWMIDI_INFO_INPUT         0x00000002 - -

-/* device is capable duplex mode */ - -

-#define SND_RAWMIDI_INFO_DUPLEX        0x00000004 -

-

-  - -

- -

-
-struct snd_rawmidi_info { - -

-        /* sound card type */ - -

-        unsigned int type; - -

-        /* see SND_RAWMIDI_INFO_XXXX */ - -

-        unsigned int flags; - -

-        /* ID of this PCM device */ - -

-        unsigned char id[32]; - -

-        /* name of this device */ - -

-        unsigned char name[80]; - -

-        /* reserved for future use */ - -

-        unsigned char reserved[64]; - -

-}; -

-

- -

int snd_rawmidi_output_info(void *handle, snd_rawmidi_output_info_t -*info)

- -

-Fills the *info structure with data about rawmidi output. Function returns -zero if successful, otherwise it returns an error code. - -

- -

-
-struct snd_rawmidi_output_info { - -

-        /* count of output switches */ - -

-        unsigned int switches; - -

-        /* reserved for future use */ - -

-        unsigned char reserved[64]; - -

-}; -

-

- -

int snd_rawmidi_input_info(void *handle, snd_pcm_record_info_t *info)

- -

-Fills the *info structure. Returns zero if successful, otherwise it returns -an error code. - -

- -

-
-struct snd_rawmidi_input_info { - -

-        /* count of output switches */ - -

-        unsigned int switches; - -

-        /* reserved for future use */ - -

-        unsigned char reserved[64]; - -

-}; -

-

- -

int snd_rawmidi_output_switches(void *handle)

- -

-Returns count of rawmidi output switches. In this context 'switch' means universal -control interface between kernel and application which allows various types -of control. Function returns count if successful, otherwise it returns an error -code. Return value should be zero if sound card doesn't have any rawmidi output -switch. - -

- -

int snd_rawmidi_output_switch(void *handle, const char *switch_id)

- -

-Returns index for switch with name switch_id. Function returns switch -index if successful, otherwise it returns an error code. - -

- -

int snd_rawmidi_output_switch_read(void *handle int switchnsnd_rawmidi_switch_t *data)

- -

-Fills the *data structure with data about switch with index switchn. -Function returns zero if successful, otherwise it returns an error code. - -

- -

-
-/* 0 or 1 (enable member of union) */ - -

-#define SND_PCM_SW_TYPE_BOOLEAN       0 - -

-/* 0 to 255 - from low to high (data8[0] member of union) */ - -

-#define SND_PCM_SW_TYPE_BYTE          1 - -

-/* 0 to 65535 - from low to high (data16[0] member of union) */ - -

-#define SND_PCM_SW_TYPE_WORD          2 - -

-/* 0 to 4294967296 ¯  from low to high (data32[0] member of union) */ - -

-#define SND_PCM_SW_TYPE_DWORD         3 - -

-/* user type - no type control */ - -

-#define SND_PCM_SW_TYPE_USER          (~0) -

-

-  - -

- -

-
-struct snd_rawmidi_switch { - -

-        /* switch index (filled by application) */ - -

-        unsigned int switchn; - -

-        /* identification of switch (for driver) */ - -

-        unsigned char name[32]; - -

-        /* type of switch value ¯  See SND_PCM_SW_TYPE_XXXX */ - -

-        unsigned int type; - -

-        /* low range value */ - -

-        unsigned int low; - -

-        /* high range value */ - -

-        unsigned int high; - -

-        union { - -

-                unsigned int enable;        /* 0 = off 1 = on */ - -

-                unsigned char data8[32];    /* 8-bit data */ - -

-                unsigned short data16[16];  /* 16-bit data */ - -

-                unsigned int data32[8];     /* 32-bit data */ - -

-        } value; - -

-        /* reserved for future use ¯  must be zero !!! */ - -

-        unsigned char reserved[32]; - -

-} -

-

- -

int snd_rawmidi_output_switch_write(void *handle int switchnsnd_rawmidi_switch_t *data)

- -

-Writes the *data structure with data about switch with index switchn -to kernel. Function returns zero if successful, otherwise it returns an error -code. - -

- -

int snd_rawmidi_input_switches(void *handle)

- -

-Returns count of rawmidi input switches. In this context 'switch' means universal -control interface between kernel and application which allows various types -of control. Function returns count if successful, otherwise it returns an error -code. Return value should be zero if sound card doesn't have any rawmidi input -switch. - -

- -

int snd_rawmidi_input_switch(void *handle, const char *switch_id)

- -

-Returns index for switch with name switch_id. Function returns switch -index if successful, otherwise it returns an error code. - -

- -

int snd_rawmidi_input_switch_read(void *handle int switchnsnd_rawmidi_switch_t *data)

- -

-Fills the *data structure with data about switch with index switchn. -Function returns zero if successful, otherwise it returns an error code. - -

- -

int snd_rawmidi_input_switch_write(void *handle int switchnsnd_rawmidi_switch_t *data)

- -

-Writes the *data structure with data about switch with index switchn -to kernel. Function returns zero if successful, otherwise it returns an error -code. - -

- -

int snd_rawmidi_output_params(void *handle, snd_rawmidi_output_params_t -*params)

- -

-Sets various parameters for output direction. Function returns zero if successful, -otherwise it returns an error code. - -

- -

-
-struct snd_rawmidi_output_params { - -

-        int size; - -

-        int max; - -

-        int room; - -

-        /* reserved for future use - must be filled with zero */ - -

-        unsigned char reserved[16]; - -

-};  -

-

- -

-
[size]Requested queue size of output buffer in bytes (default setup is 4096 -[i386] or 8192 [alpha] bytes - this is system architecture dependent). -
-
[max]Maximum number of bytes in queue for wakeup. If the current byte count -of filled portion of output buffer is greater than this value the driver will -block an application or return immediately if non block mode is active. -
-
[room]Minimum number of bytes writable for wakeup. This value should be in most -cases 1 which means return back to application if at least one byte is free -in output buffer. -
-

- -

int snd_rawmidi_input_params(void *handle, snd_rawmidi_input_params_t -*params)

- -

-Function sets various parameters for the recording direction. Function returns -zero if successful, otherwise it returns an error code. - -

- -

-
-struct snd_rawmidi_input_params { - -

-        int size; - -

-        int min; - -

-        /* reserved for future use - must be filled with zero */ - -

-        unsigned char reserved[16]; - -

-};  -

-

- -

-
[size]Requested queue size of input buffer in bytes (default setup is 4096 [i386] -or 8192 [alpha] bytes - this is system architecture dependent). -
-
[min]Minimum filled bytes in queue for wakeup. Driver blocks the application -(if block mode is selected) until input buffer is filled with fewer than the -number of bytes specified with this value. -
-

- -

int snd_rawmidi_output_status(void *handle, snd_rawmidi_output_status_t -*status)

- -

-Fills the *status structure. Function returns zero if successful, -otherwise it returns an error code. - -

- -

-
-struct snd_rawmidi_output_status { - -

-        int size; - -

-        int count; - -

-        int queue; - -

-        /* reserved for future use - must be filled with zero */ - -

-        unsigned char reserved[16]; - -

-}; -

-

- -

-
[size]Size of currently allocated queue in bytes. -
-
[count]Count of bytes writable without blocking. -
-
[queue]Count of bytes in queue (number of bytes waiting to be output). -
-

- -

int snd_rawmidi_input_status(void *handle, snd_rawmidi_input_status_t -*status)

- -

-Fills the *status structure. Function returns zero if successful, -otherwise it returns an error code. - -

- -

-
-struct snd_rawmidi_input_status { - -

-        int size; - -

-        int count; - -

-        int free; - -

-        int overrun; - -

-        /* reserved for future use - must be filled with zero */ - -

-        unsigned char reserved[16]; - -

-}; -

-

- -

-
[size]Size of currently allocated queue in bytes. -
-
[count]Count of bytes readable without blocking. -
-
[free]Count of bytes in queue still free. -
-
[overrun]This value tells the application the count of overruns since the last -call to snd_rawmidi_input_status. -
-

- -

int snd_rawmidi_drain_output(void *handle)

- -

-This function stops and drains (destroys) the output queue immediately. Function -returns zero if successful, otherwise it returns an error code. - -

- -

int snd_rawmidi_flush_output(void *handle)

- -

-This function flushes the output queue. It blocks the program while the all -the waiting bytes in kernel output queue are processed. Function returns zero -if successful, otherwise it returns an error code. - -

- -

int snd_rawmidi_flush_input(void *handle)

- -

-This function flushes (destroys) input queue. Function returns zero if successful, -otherwise it returns an error code. - -

- -

ssize_t snd_rawmidi_write(void *handle, const void *buffer, size_t -size)

- -

-Writes bytes to the output queue. Function returns zero or positive value if -the write was successful (value represents count of bytes which were successfully -written to the device) or an error value if error occurred. Function will suspend -the process if block mode is active. - -

- -

ssize_t snd_rawmidi_read(void *handle, void *buffer, size_t size)

- -

-Function reads bytes from input queue. Function returns zero or positive value -if the read was successful (value represents count of bytes which were successfully -read from device) or negative error value if error occurred. Function will suspend -the process if block mode is active. - -

-

-6.1.1  Example

- -

-The following example shows how to send a control sequence (such as SysEx) to -a MIDI device. Sound card #0 and rawmidi device #0 are used here: - -

- -

-
-int card = 0, device = 0, err, fd, count, size; - -

-void *handle; - -

-snd_pcm_format_t format; - -

-char *buffer; -

-

-  - -

- -

-
-buffer = (char *)malloc(64 * 1024); - -

-if (!buffer) return; - -

-if ((err = snd_rawmidi_open(&handle, card, device, - -

-                            SND_RAWMIDI_OPEN_OUTPUT)) < 0) {  - -

-        fprintf(stderr, "open failed: %s\n", snd_strerror( err ));  - -

-        return; - -

-} - -

-if ((err = snd_rawmidi_block_mode(handle 1)) < 0) { - -

-        fprintf(stderr, "block failed: %s\n", snd_strerror( err ));  - -

-        snd_rawmidi_close(handle); - -

-        return; - -

-} - -

-fd = open("/tmp/test.sysex", O_RDONLY); - -

-if (fd < 0) { - -

-        perror("open file"); - -

-        snd_rawmidi_close(handle); - -

-        return; - -

-} - -

-idx = 0; - -

-count = read(fd, buffer, 64 * 1024); - -

-if (count <= 0) { - -

-        perror("read from file"); - -

-        snd_rawmidi_close(handle); - -

-        return; - -

-} - -

-close(fd); - -

-size = snd_rawmidi_write(handle, &buffer, count); - -

-printf("Bytes written %i from %i...\n", size, count); - -

-snd_rawmidi_close(handle); - -

-free(buffer); - -

-

-


File translated from TEX by TTH, version 1.98.
On 19 Jan 1999, 16:22.
- diff --git a/doc/alsa-lib.lyx b/doc/alsa-lib.lyx deleted file mode 100644 index 202da108..00000000 --- a/doc/alsa-lib.lyx +++ /dev/null @@ -1,9667 +0,0 @@ -#This file was created by Mon Jan 11 02:36:51 1999 -#LyX 1.0 (C) 1995-1998 Matthias Ettrich and the LyX Team -\lyxformat 2.15 -\textclass article -\language default -\inputencoding default -\fontscheme default -\graphics default -\paperfontsize default -\spacing single -\papersize Default -\paperpackage widemarginsa4 -\use_geometry 0 -\use_amsmath 0 -\paperorientation portrait -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\defskip medskip -\quotes_language english -\quotes_times 2 -\papercolumns 1 -\papersides 1 -\paperpagestyle default - -\layout Title -\added_space_top vfill \added_space_bottom vfill -Advanced Linux Sound Architecture - Library API -\layout Author - - -\series bold -Jaroslav Kysela -\series default - with assistance from Alan Robinson and Fred Floberg -\layout Date - -1998-11-11 -\layout Standard -\align center - -\shape italic -This document describes, in full detail, the Advanced Linux Sound Architecture - library API. - -\layout Standard - - -\begin_inset LatexCommand \tableofcontents - -\end_inset - - -\layout Section - -Introduction -\layout Standard - -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. - -\layout Standard - -Application programmers should use the library API rather than kernel API. - The Library offers 100% of the functionally of the kernel API, but add - major improvements in usability, making the application code simpler and - better looking. - In addition, some of the some fixes/compatibility code may be placed in - the library code instead of the kernel driver. - -\layout Standard - -For a complete list of all variables and functions in the API you should - look at the following header files: -\layout Itemize - -/usr/include/sys/asoundlib.h -\layout Itemize - -/usr/include/linux/asound.h -\layout Itemize - -/usr/include/linux/asoundid.h -\layout Section - -Error Codes -\layout Standard - -All functions return int (or some sort of signed value). - If this value is negative it represents an error code. - Codes up to -\shape italic -SND_ERROR_BEGIN (500000) -\shape default - represent standard system errors. - Codes equal to or greather than this value represent sound library API - errors. - All error codes begin with the prefix -\shape italic -SND_ERROR_ -\shape default -. - -\layout Subsection - -Error Codes in Detail -\layout Standard -\added_space_top 0.3cm \added_space_bottom 0.3cm \LyXTable -multicol5 -1 2 0 0 -1 -1 -1 -1 -1 1 0 0 -8 1 1 "" "" -8 1 1 "" "" -0 8 1 0 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" - -SND_ERROR_UNCOMPATIBLE_VERSION -\newline -500000 -\layout Standard - -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. - -\layout Subsection - -Functions -\layout Subsubsection* - -const char *snd_strerror(int errnum) -\layout Standard - -This function converts an error code to a string. - Its functionality is the same as the -\shape italic -strerror -\shape default - function from the standard C library, but this function returns error message - strings for sound error codes, as well. -\layout Section - -Control Interface -\layout Standard - -The control interface gives applications 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 a selected soundcard or, for example, to create a list of devices (MIXER, - PCM etc) from which the user can select. -\layout Subsection - -Low-Level Layer -\layout Subsubsection* - -int snd_cards(void) -\layout Standard - -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. -\layout Subsubsection* - -unsigned int snd_cards_mask(void) -\layout Standard - -Returns the bitmap of soundcards present in the system, if any. - This function will return 0 if no soundcards are detected. - The first soundcard is represented with bit 0 (0x00000001). - See the documentation on installing ALSA and /etc/conf.modules configuration - for information on assigning numbers to soundcards. -\layout Subsubsection* - -int snd_card_name(const char *name) -\layout Standard - -Returns soundcard number for appropriate soundcard name. - String -\shape italic -name -\shape default - can contain word identification for card (ALSA driver allows the user choose - card identification using snd_id module parameter) or soundcard index (1-N) - encoded into ASCII. -\layout Subsubsection* - -int snd_ctl_open(void **handle, int card) -\layout Standard - -Creates a new handle and opens communication with the kernel sound control - interface for soundcard number -\shape italic -card -\shape default - (0-N). - The function also checks if the 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. - -\layout Subsubsection* - -int snd_ctl_close(void *handle) -\layout Standard - -Frees all resources allocated with control handle and closes the kernel - sound control interface. - This function returns zero if successful, otherwise it returns an error - code. -\layout Subsubsection* - -int snd_ctl_file_descriptor(void *handle) -\layout Standard - -Returns a file descriptor for the kernel sound control interface. - This function is normally only used in very special cases. - This function returns a negative error code if an error was encountered. -\layout Subsubsection* - -int snd_ctl_hw_info(void *handle, snd_ctl_hw_info_t *info) -\layout Standard - -Fills the info structure with data about the sound hardware referenced by - handle. - This function returns zero if successful, otherwise it returns an error - code. -\layout LyX-Code - - -\shape italic -/* driver has MIDI interface */ -\layout LyX-Code - -#define SND_CTL_GCAPS_MIDI -\protected_separator - -\protected_separator - -\protected_separator -0x0000001 -\layout LyX-Code - - -\shape italic -/* soundcard has synthesizer */ -\layout LyX-Code - -#define SND_CTL_LCAPS_SYNTH -\protected_separator - -\protected_separator - 0x0000001 -\layout LyX-Code - - -\shape italic -/* soundcard has RAW FM/OPL3 */ -\layout LyX-Code - -#define SND_CTL_LCAPS_RAWFM -\protected_separator - -\protected_separator - 0x0000002 -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_ctl_hw_info { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* type of card - see SND_CARD_TYPE_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int type; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* global capabilities - see SND_CTL_GCAPS_XXXX*/ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int gcaps; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* local capabilities \i \={ } - see SND_CTL_LCAPS_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int lcaps; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* count of PCM devices (0 to N) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -unsigned int pcmdevs; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* count of MIXER devices (0 to N)*/ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int mixerdevs; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* count of raw MIDI devices (0 to N) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -unsigned int mididevs; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* ID of card (user selectable) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -char id[80]; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* name/info text about soundcard */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - char name[80]; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* count of control switches */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int switches; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* reserved for future use */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[124]; -\layout LyX-Code - -}; -\layout Subsubsection* - -int snd_ctl_switches(void *handle) -\layout Standard - -Returns the number of control switches. - In this context 'switch' means universal control interface between kernel - and application which allows various types of control. - Function returns count if successful, otherwise it returns an error code. - Return value should be zero if the soundcard doesn't have any control switches. -\layout Subsubsection* - -int snd_ctl_switch(void *handle, const char *switch_id) -\layout Standard - -Returns the index for the switch with the name -\shape italic -switch_id -\shape default -. - This function returns switch index if successful, otherwise it returns - an error code. -\layout Subsubsection* - -int snd_ctl_switch_read(void *handle\i \c{ } - int switchn\i \c{ } - snd_ctl_switch_t *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure with data about the switch with index -\shape italic -switchn -\shape default -. - This function returns zero if successful, otherwise it returns an error - code. -\layout LyX-Code - - -\shape italic -/* 0 or 1 (enable member of union) */ -\layout LyX-Code - -#define SND_CTL_SW_TYPE_BOOLEAN -\protected_separator - -\protected_separator - -\protected_separator - 0 -\layout LyX-Code - - -\shape italic -/* 0 to 255 - from low to high (data8[0] member of union) */ -\layout LyX-Code - -#define SND_CTL_SW_TYPE_BYTE -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -1 -\layout LyX-Code - - -\shape italic -/* 0 to 65535 - from low to high (data16[0] member of union) */ -\layout LyX-Code - -#define SND_CTL_SW_TYPE_WORD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -2 -\layout LyX-Code - - -\shape italic -/* 0 to 4294967296 \i \={ } - from low to high (data32[0] member of union) */ -\layout LyX-Code - -#define SND_CTL_SW_TYPE_DWORD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 3 -\layout LyX-Code - - -\shape italic -/* user type - no type control */ -\layout LyX-Code - -#define SND_CTL_SW_TYPE_USER -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -(~0) -\layout Standard - - -\protected_separator - -\layout LyX-Code - - -\shape italic -/* well known (named) switches */ -\layout LyX-Code - -#define SND_CTL_SW_JOYSTICK -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "Joystick" -\layout LyX-Code - -#define SND_CTL_SW_JOYSTICK_ADDRESS -\protected_separator - "Joystick Address" -\layout LyX-Code - -#define SND_CTL_SW_JOYSTICK_SPEED -\protected_separator - -\protected_separator - "Joystick Speed" -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_ctl_switch { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* switch index (filled by application) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int switchn; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* indentification of switch (for driver) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char name[32]; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* type of switch value - See SND_CTL_SW_TYPE_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int type; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* low range value */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int low; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* high range value */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int high; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - union { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int enable; -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* 0 = off\i \c{ } - 1 = on */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char data8[32]; -\protected_separator - -\protected_separator - -\shape italic -/* 8-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned short data16[16]; -\protected_separator - -\shape italic -/* 16-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int data32[8]; -\protected_separator - -\protected_separator - -\shape italic -/* 32-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - } value; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* reserved for future use \i \={ } - must be zero !!! */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[32]; -\layout LyX-Code - -} -\layout Subsubsection* - -int snd_ctl_switch_write(void *handle\i \c{ } - int switchn\i \c{ } - snd_ctl_switch_t *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure with data about the switch with index -\shape italic -switchn -\shape default - to kernel. - This function returns zero if successful, otherwise it returns an error - code. -\layout Subsubsection* - -int snd_ctl_mixer_info(void *handle, int dev, snd_mixer_info_t *info) -\layout Standard - -Fills the *info structure with data about the mixer device. - Returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_mixer_info_t -\shape default - structure are in the -\series bold -Mixer Interface -\series default - section. - The argument -\shape italic -dev -\shape default - specifies the device number for the appropriate soundcard. - Its range is 0 to N where N is determined by -\shape italic -struct snd_ctl_hw_info->mixerdevs - 1 -\shape default -. - It should be used to collect information about mixer devices. -\layout Subsubsection* - -int snd_ctl_mixer_switches(void *handle) -\layout Standard - -Returns count of mixer switches. - In this context 'switch' means universal control interface between kernel - and application which allows various types control. - This function returns count if successful, otherwise it returns an error - code. - Return value should be zero if soundcard doesn't have any mixer switches. -\layout Subsubsection* - -int snd_ctl_mixer_switch(void *handle, const char *switch_id) -\layout Standard - -Returns the index for the switch with the name -\shape italic -switch_id -\shape default -. - This function returns switch index if successful, otherwise it returns - an error code. -\layout Subsubsection* - -int snd_ctl_mixer_switch_read(void *handle\i \c{ } - int switchn\i \c{ } - snd_mixer_switch_t - *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure with data about the switch with index -\shape italic -switchn -\shape default -. - This function returns zero if successful, otherwise it returns an error - code. - Details about the -\shape italic -snd_mixer_switch_t -\shape default - structure are in the -\series bold -Mixer Interface -\series default - section. -\layout Subsubsection* - -int snd_ctl_mixer_switch_write(void *handle\i \c{ } - int switchn\i \c{ } - snd_mixer_switch_t - *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default - to kernel. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_mixer_switch_t -\shape default - structure are in the -\series bold -Mixer Interface -\series default - Interface section. -\layout Subsubsection* - -int snd_ctl_pcm_info(void *handle, int dev, snd_pcm_info_t *info) -\layout Standard - -Fills the -\shape italic -*info -\shape default - structure with data about the PCM device. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_pcm_info_t -\shape default - structure are in the -\series bold -Digital Audio (PCM) -\series default - Interface section. - The argument -\shape italic -dev -\shape default - selects the device number for the sound card referenced by -\shape italic -*handle -\shape default -. - Its range is 0 to N where N is -\shape italic -struct snd_ctl_hw_info->pcmdevs - 1 -\shape default -. - 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. - -\layout Subsubsection* - -int snd_ctl_pcm_playback_info(void *handle, int dev, snd_pcm_playback_info_t - *info) -\layout Standard - -Fills the -\shape italic -*info -\shape default - structure with data about the PCM device and playback direction. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_pcm_playback_info_t -\shape default - structure are in the -\series bold -Digital Audio (PCM) Interface -\series default - section. - The argument -\shape italic -dev -\shape default - selects the device number for the sound card referenced by -\shape italic -*handle -\shape default -. - Its range is 0 to N where N is -\shape italic -struct snd_ctl_hw_info->pcmdevs - 1 -\shape default -. - 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. - -\layout Subsubsection* - -int snd_ctl_pcm_playback_switches(void *handle) -\layout Standard - -Returns count of PCM playback switches. - In this context 'switch' means universal control interface between kernel - and application which allows various types of control. - Function returns count if successful, otherwise it returns an error code. - Return value should be zero if sound card doesn't have any PCM playback - switch. -\layout Subsubsection* - -int snd_ctl_pcm_playback_switch(void *handle, const char *switch_id) -\layout Standard - -Returns index for switch with name -\shape italic -switch_id -\shape default -. - Function returns switch index if successful, otherwise it returns an error - code. -\layout Subsubsection* - -int snd_ctl_pcm_playback_switch_read(void *handle\i \c{ } - int switchn\i \c{ } - snd_pcm_switch_t - *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default -. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_pcm_switch_t -\shape default - structure are in the -\series bold -Digital Audio (PCM) -\series default - Interface section. -\layout Subsubsection* - -int snd_ctl_pcm_playback_switch_write(void *handle\i \c{ } - int switchn\i \c{ } - snd_pcm_switch_t - *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default - to kernel. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_pcm_switch_t -\shape default - structure are in the -\series bold -Digital Audio (PCM) -\series default - Interface section. -\layout Subsubsection* - -int snd_ctl_pcm_record_info(void *handle, int dev, snd_pcm_record_info_t - *info) -\layout Standard - -Fills the -\shape italic -*info -\shape default - structure with data about the PCM device and record direction. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_pcm_record_info_t -\shape default - structure are in the -\series bold -Digital Audio (PCM) Interface -\series default - section. - The argument -\shape italic -dev -\shape default - selects the device number for the sound card referenced by -\shape italic -*handle -\shape default -. - Its range is 0 to N where N is -\shape italic -struct snd_ctl_hw_info->pcmdevs - 1 -\shape default -. - 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. - -\layout Subsubsection* - -int snd_ctl_pcm_record_switches(void *handle) -\layout Standard - -Returns count of PCM record switches. - In this context 'switch' means universal control interface between kernel - and application which allows various types of control. - Function returns count if successful, otherwise it returns an error code. - Return value should be zero if sound card doesn't have any PCM record switch. -\layout Subsubsection* - -int snd_ctl_pcm_record_switch(void *handle, const char *switch_id) -\layout Standard - -Returns index for switch with name -\shape italic -switch_id -\shape default -. - Function returns switch index if successful, otherwise it returns an error - code. -\layout Subsubsection* - -int snd_ctl_pcm_record_switch_read(void *handle\i \c{ } - int switchn\i \c{ } - snd_pcm_switch_t - *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default -. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_pcm_switch_t -\shape default - structure are in the -\series bold -Digital Audio (PCM) -\series default - Interface section. -\layout Subsubsection* - -int snd_ctl_pcm_record_switch_write(void *handle\i \c{ } - int switchn\i \c{ } - snd_pcm_switch_t - *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default - to kernel. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_pcm_switch_t -\shape default - structure are in the -\series bold -Digital Audio (PCM) -\series default - Interface section. -\layout Subsubsection* - -int snd_ctl_rawmidi_info(void *handle, int dev, snd_rawmidi_info_t *info) -\layout Standard - -Fills the -\shape italic -*info -\shape default - structure with data about the rawmidi device. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_rawmidi_info_t -\shape default - structure are in the -\series bold -RawMidi Interface -\series default - section. - The argument -\shape italic -dev -\shape default - selects the device number for the sound card referenced by -\shape italic -*handle -\shape default -. - Its range is 0 to N where N is -\shape italic -struct snd_ctl_hw_info->mididevs - 1 -\shape default -. - This function will work if the selected rawmidi device is busy, too. - It should be used to collect information about rawmidi devices without - exclusive lock. - -\layout Subsubsection* - -int snd_ctl_rawmidi_output_info(void *handle, int dev, snd_rawmidi_output_info_t - *info) -\layout Standard - -Fills the -\shape italic -*info -\shape default - structure with data about the rawmidi device and output direction. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_pcm_playback_info_t -\shape default - structure are in the -\series bold -RawMidi Interface -\series default - section. - The argument -\shape italic -dev -\shape default - selects the device number for the sound card referenced by -\shape italic -*handle -\shape default -. - Its range is 0 to N where N is -\shape italic -struct snd_ctl_hw_info->mididevs - 1 -\shape default -. - This function will work if the selected rawmidi device is busy, too. - It should be used to collect information about rawmidi devices without - exclusive lock. - -\layout Subsubsection* - -int snd_ctl_rawmidi_output_switches(void *handle) -\layout Standard - -Returns count of rawmidi output switches. - In this context 'switch' means universal control interface between kernel - and application which allows various types of control. - Function returns count if successful, otherwise it returns an error code. - Return value should be zero if sound card doesn't have any control switch. -\layout Subsubsection* - -int snd_ctl_rawmidi_output_switch(void *handle, const char *switch_id) -\layout Standard - -Returns index for switch with name -\shape italic -switch_id -\shape default -. - Function returns switch index if successful, otherwise it returns an error - code. - Return value should be zero if sound card doesn't have any rawmidi output - switch. -\layout Subsubsection* - -int snd_ctl_rawmidi_output_switch_read(void *handle\i \c{ } - int switchn\i \c{ } - snd_rawmidi_swit -ch_t *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default -. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_rawmidi_switch_t -\shape default - structure are in the -\series bold -RawMidi Interface -\series default - section. -\layout Subsubsection* - -int snd_ctl_rawmidi_output_switch_write(void *handle\i \c{ } - int switchn\i \c{ } - snd_rawmidi_swi -tch_t *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default - to kernel. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_rawmidi_switch_t -\shape default - structure are in the -\series bold -RawMidi Interface -\series default - section. -\layout Subsubsection* - -int snd_ctl_rawmidi_input_info(void *handle, int dev, snd_rawmidi_input_info_t - *info) -\layout Standard - -Fills the -\shape italic -*info -\shape default - structure with data about the rawmidi device and input direction. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_rawmidi_record_info_t -\shape default - structure are in the -\series bold -RawMidi Interface -\series default - section. - The argument -\shape italic -dev -\shape default - selects the device number for the sound card referenced by -\shape italic -*handle -\shape default -. - Its range is 0 to N where N is -\shape italic -struct snd_ctl_hw_info->pcmdevs - 1 -\shape default -. - This function will work if the selected rawmidi device is busy, too. - It should be used to collect information about rawmidi devices without - exclusive lock. - -\layout Subsubsection* - -int snd_ctl_rawmidi_input_switches(void *handle) -\layout Standard - -Returns count of rawmidi input switches. - In this context 'switch' means universal control interface between kernel - and application which allows various types of control. - Function returns count if successful, otherwise it returns an error code. - Return value should be zero if sound card doesn't have any rawmidi input - switch. -\layout Subsubsection* - -int snd_ctl_rawmidi_input_switch(void *handle, const char *switch_id) -\layout Standard - -Returns index for switch with name -\shape italic -switch_id -\shape default -. - Function returns switch index if successful, otherwise it returns an error - code. -\layout Subsubsection* - -int snd_ctl_rawmidi_input_switch_read(void *handle\i \c{ } - int switchn\i \c{ } - snd_pcm_switch_t - *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default -. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_rawmidi_switch_t -\shape default - structure are in the -\series bold -RawMidi Interface -\series default - Interface section. -\layout Subsubsection* - -int snd_ctl_rawmidi_input_switch_write(void *handle\i \c{ } - int switchn\i \c{ } - snd_pcm_switch_t - *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default - to kernel. - Function returns zero if successful, otherwise it returns an error code. - Details about the -\shape italic -snd_rawmidi_switch_t -\shape default - structure are in the -\series bold -RawMidi Interface -\series default - section. -\layout Subsubsection - -Examples -\layout Standard - -The following example shows how all PCM devices can be detected for the - first sound card (#0) in the system. -\layout LyX-Code - -int card = 0, err; -\layout LyX-Code - -void *handle; -\layout LyX-Code - -snd_ctl_hw_info_t info; -\newline - -\layout LyX-Code - -if ((err = snd_ctl_open(&handle, card)) < 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - fprintf(stderr, "open failed: %s -\backslash -n", snd_strerror(err)); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - -} -\layout LyX-Code - -if ((err = snd_ctl_hw_info(handle, &info)) < 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - fprintf(stderr, "hw info failed: %s -\backslash -n", -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_strerror(err)); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_ctl_close(handle); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -return; -\layout LyX-Code - -} -\layout LyX-Code - -printf("Installed PCM devices for card #i: %i -\backslash -n", -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - card + 1, info.pcmdevs); -\layout LyX-Code - -snd_ctl_close(handle); -\layout Section - -Mixer Interface -\layout Standard - -The Mixer Interface allows applications to change the volume level of a - sound card's input/output channels in both the linear range\i \c{ } - percentage - range (0-100) and in decibels. - It also supports features like hardware mute, input sound source, stereo - signal routing etc. -\layout Subsection - -Low-Level Layer -\layout Standard - -Mixer devices aren't opened exclusively. - This allows applications to open a device multiple times with one or more - processes. -\layout Subsubsection* - -int snd_mixer_open(void **handle, int card, int device) -\layout Standard - -Creates new handle and opens a connection to the kernel sound mixer interface - for sound card number -\shape italic -card -\shape default - (0-N) and mixer device number -\shape italic -device -\shape default -. - 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. -\layout Subsubsection* - -int snd_mixer_close(void *handle) -\layout Standard - -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. -\layout Subsubsection* - -int snd_mixer_file_descriptor(void *handle) -\layout Standard - -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. -\layout Standard - -The file descriptor should be used for the -\shape italic -select(2) -\shape default - synchronous multiplexer function for determining read direction. - Applications should call -\shape italic -snd_mixer_read() -\shape default - function if some data is waiting to be read. - It is recommended that you do this, since it leaves place for this function - to handle some new kernel API specifications. -\layout Subsubsection* - -int snd_mixer_channels(void *handle) -\layout Standard - -Returns the count of mixer channels for appropriate mixer device, otherwise - the return value is negative, and signifies an error code. - Never returns zero. -\layout Subsubsection* - -int snd_mixer_info(void *handle, snd_mixer_info_t *info) -\layout Standard - -Fills the -\shape italic -*info -\shape default - structure with information about the mixer associated with -\shape italic -*handle -\shape default -. - Returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - - -\shape italic -/* mixer can do only exclusive record */ -\layout LyX-Code - -#define SND_MIXER_INFO_CAP_EXCL_RECORD -\protected_separator - 0x00000001 -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_mixer_info { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* type of sound card - SND_CARD_TYPE_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int type; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* count of mixer devices */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -unsigned int channels; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* some flags about this device (SND_MIXER_INFO_CAP_XXXX) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int caps; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* ID of this mixer */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char id[32]; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* name of this device */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char name[80]; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* reserved for future use */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - char reserved[ 32 ]; -\layout LyX-Code - -}; -\layout Subsubsection* - -int snd_mixer_switches(void *handle) -\layout Standard - -Returns count of mixer switches. - In this context 'switch' means universal control interface between kernel - and application which allows various types of control. - Function returns count if successful, otherwise it returns an error code. - Return value will be zero if sound card doesn't have any mixer switch. -\layout Subsubsection* - -int snd_mixer_switch(void *handle, const char *switch_id) -\layout Standard - -Returns index for switch with name -\shape italic -switch_id -\shape default -. - Function returns switch index if successful, otherwise it returns an error - code. -\layout Subsubsection* - -int snd_mixer_switch_read(void *handle\i \c{ } - int switchn\i \c{ } - snd_mixer_switch_t *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default -. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - - -\shape italic -/* 0 or 1 (enable member of union) */ -\layout LyX-Code - -#define SND_MIXER_SW_TYPE_BOOLEAN -\protected_separator - -\protected_separator - 0 -\layout LyX-Code - - -\shape italic -/* 0 to 255 - from low to high (data8[0] member of union) */ -\layout LyX-Code - -#define SND_MIXER_SW_TYPE_BYTE -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -1 -\layout LyX-Code - - -\shape italic -/* 0 to 65535 - from low to high (data16[0] member of union) */ -\layout LyX-Code - -#define SND_MIXER_SW_TYPE_WORD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -2 -\layout LyX-Code - - -\shape italic -/* 0 to 4294967296 \i \={ } - from low to high (data32[0] member of union) */ -\layout LyX-Code - -#define SND_MIXER_SW_TYPE_DWORD -\protected_separator - -\protected_separator - -\protected_separator - 3 -\layout LyX-Code - - -\shape italic -/* user type - no type control */ -\layout LyX-Code - -#define SND_MIXER_SW_TYPE_USER -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -(~0) -\layout Standard - - -\protected_separator - -\layout LyX-Code - - -\shape italic -/* well known (named) switches */ -\layout LyX-Code - -#define SND_MIXER_SW_LOUDNESS -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "Loudness" -\protected_separator - -\shape italic -/* bass boost */ -\layout LyX-Code - -#define SND_MIXER_SW_SIM_STEREO -\protected_separator - -\protected_separator - -\protected_separator - "Simulated Stereo Enhancement" -\layout LyX-Code - -#define SND_MIXER_SW_3D -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "3D Stereo Enhancement" -\layout LyX-Code - - -\shape italic -/* microphone gain */ -\layout LyX-Code - -#define SND_MIXER_SW_MIC_GAIN -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "MIC Gain" -\layout LyX-Code - - -\shape italic -/* microphone auto gain control */ -\layout LyX-Code - -#define SND_MIXER_SW_MIC_GAIN -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "MIC Auto-Gain-Control" -\layout LyX-Code - - -\shape italic -/* change microphone impedance */ -\layout LyX-Code - -#define SND_MIXER_SW_MIC_GAIN -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "Change MIC Impedance" -\layout LyX-Code - - -\shape italic -/* change line-in to output */ -\layout LyX-Code - -#define SND_MIXER_SW_MIC_GAIN -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "Line In to Output" -\layout LyX-Code - -#define SND_MIXER_SW_IEC958OUT -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "IEC-958 (S/PDIF) Output" -\layout LyX-Code - -#define SND_MIXER_SW_IEC958IN -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "IEC-958 (S/PDIF) Input" -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_mixer_switch { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* switch index (filled by application) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int switchn; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* identification of switch (for driver) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char name[32]; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* type of switch value \i \={ } - See SND_CTL_SW_TYPE_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int type; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* low range value */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int low; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* high range value */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int high; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - union { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int enable; -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* 0 = off\i \c{ } - 1 = on */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char data8[32]; -\protected_separator - -\protected_separator - -\shape italic -/* 8-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned short data16[16]; -\protected_separator - -\shape italic -/* 16-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int data32[8]; -\protected_separator - -\protected_separator - -\shape italic -/* 32-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - } value; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* reserved for future use \i \={ } - must be zero !!! */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[32]; -\layout LyX-Code - -} -\layout Subsubsection* - -int snd_mixer_switch_write(void *handle\i \c{ } - int switchn\i \c{ } - snd_mixer_switch_t *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default - to kernel. - Function returns zero if successful, otherwise it returns an error code. - -\layout Subsubsection* - -int snd_mixer_exact_mode(void *handle, int enable) -\layout Standard - -Turns on = 1 or off = 0 (by default) exact mode. - This mode allows application to set/get volume values in exact range which - uses hardware. - In non-exact mode range is always from percentage 0 to 100 and driver does - conversion to hardware range. - Function returns zero if successful, otherwise it returns an error code. -\layout Subsubsection* - -int snd_mixer_channel(void *handle, const char *channel_id) -\layout Standard - -Returns the channel number (index) associated with -\shape italic -channel_id -\shape default - (channel name), or returns an error code. - Note: Below mixer channel IDs are subject to change and will be extended - if new hardware has support for other mixer input/output channels. -\layout LyX-Code - -#define SND_MIXER_ID_MASTER -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Master" -\layout LyX-Code - -#define SND_MIXER_ID_MASTER1 -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Master 1" -\layout LyX-Code - - -\shape italic -/* digital master */ -\layout LyX-Code - -#define SND_MIXER_ID_MASTERD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Master D" -\layout LyX-Code - - -\shape italic -/* second digital master */ -\layout LyX-Code - -#define SND_MIXER_ID_MASTERD1 -\protected_separator - -\protected_separator - -\protected_separator -"Master D1" -\layout LyX-Code - -#define SND_MIXER_ID_HEADPHONE -\protected_separator - -\protected_separator - -\protected_separator -"Headphone" -\layout LyX-Code - -#define SND_MIXER_ID_MASTER_MONO -\protected_separator - -\protected_separator -"Master M" -\layout LyX-Code - -#define SND_MIXER_ID_3D -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"3D Wide" -\layout LyX-Code - -#define SND_MIXER_ID_3D_VOLUME -\protected_separator - -\protected_separator - -\protected_separator -"3D Volume" -\layout LyX-Code - -#define SND_MIXER_ID_3D_CENTER -\protected_separator - -\protected_separator - -\protected_separator -"3D Center" -\layout LyX-Code - -#define SND_MIXER_ID_3D_SPACE -\protected_separator - -\protected_separator - -\protected_separator -"3D Space" -\layout LyX-Code - -#define SND_MIXER_ID_3D_DEPTH -\protected_separator - -\protected_separator - -\protected_separator -"3D Depth" -\layout LyX-Code - -#define SND_MIXER_ID_BASS -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Bass" -\layout LyX-Code - -#define SND_MIXER_ID_TREBLE -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Treble" -\layout LyX-Code - -#define SND_MIXER_ID_FADER -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "Fader" -\layout LyX-Code - -#define SND_MIXER_ID_SYNTHESIZER -\protected_separator - "Synth" -\layout LyX-Code - -#define SND_MIXER_ID_SYNTHESIZER1 -\protected_separator -"Synth 1" -\layout LyX-Code - -#define SND_MIXER_ID_FM -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"FM" -\layout LyX-Code - -#define SND_MIXER_ID_EFFECT -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Effect" -\layout LyX-Code - -#define SND_MIXER_ID_DSP -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"DSP" -\layout LyX-Code - -#define SND_MIXER_ID_PCM -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "PCM" -\layout LyX-Code - -#define SND_MIXER_ID_PCM1 -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"PCM 1" -\layout LyX-Code - -#define SND_MIXER_ID_LINE -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Line-In" -\layout LyX-Code - -#define SND_MIXER_ID_MIC -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "MIC" -\layout LyX-Code - -#define SND_MIXER_ID_CD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"CD" -\layout LyX-Code - -#define SND_MIXER_ID_VIDEO -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Video" -\layout LyX-Code - -#define SND_MIXER_ID_PHONE -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Phone" -\layout LyX-Code - -#define SND_MIXER_ID_GAIN -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Record-Gain" -\layout LyX-Code - -#define SND_MIXER_ID_MIC_GAIN -\protected_separator - -\protected_separator - -\protected_separator -"Mic-Gain" -\layout LyX-Code - -#define SND_MIXER_ID_IGAIN -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "In-Gain" -\layout LyX-Code - -#define SND_MIXER_ID_OGAIN -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "Out-Gain" -\layout LyX-Code - -#define SND_MIXER_ID_LOOPBACK -\protected_separator - -\protected_separator - -\protected_separator -"Loopback" -\layout LyX-Code - -#define SND_MIXER_ID_SPEAKER -\protected_separator - -\protected_separator - -\protected_separator - "PC Speaker" -\layout LyX-Code - -#define SND_MIXER_ID_MONO -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - "Mono" -\layout LyX-Code - -#define SND_MIXER_ID_MONO1 -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Mono 1" -\layout LyX-Code - -#define SND_MIXER_ID_MONO2 -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Mono 2" -\layout LyX-Code - -#define SND_MIXER_ID_AUXA -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Aux A" -\layout LyX-Code - -#define SND_MIXER_ID_AUXB -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Aux B" -\layout LyX-Code - -#define SND_MIXER_ID_AUXC -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -"Aux C" -\layout Subsubsection* - -int snd_mixer_channel_info(void *handle, int channel, snd_mixer_channel_info_t - *info) -\layout Standard - -Fills the -\shape italic -*info -\shape default - structure. - The argument -\shape italic -channel -\shape default - specifies channel (0 to N) for which is the info requested. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - - -\shape italic -/* mixer channel is record source */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_RECORD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 0x00000001 -\layout LyX-Code - - -\shape italic -/* mixer channel is stereo */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_STEREO -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 0x00000002 -\layout LyX-Code - - -\shape italic -/* always set at this moment\i \c{ } - driver emulates mute */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_MUTE -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 0x00000004 -\layout LyX-Code - - -\shape italic -/* channel supports hardware mute */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_HWMUTE -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 0x00000008 -\layout LyX-Code - - -\shape italic -/* channel does digital (not analog) mixing */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_DIGITAL -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -0x00000010 -\layout LyX-Code - - -\shape italic -/* external input channel */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_INPUT -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -0x00000020 -\layout LyX-Code - - -\shape italic -/* join mute is supported only */ -\layout LyX-Code - - -\shape italic -/* left and right channel doesn't have separate mute control */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_JOINMUTE -\protected_separator - -\protected_separator - -\protected_separator - 0x00000040 -\layout LyX-Code - - -\shape italic -/* join record is supported only * -\layout LyX-Code - - -\shape italic -/* left and right channel doesn't have separate record control */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_JOINRECORD -\protected_separator - -\protected_separator - 0x00000080 -\layout LyX-Code - - -\shape italic -/* route left input to right output is supported */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_LTOR_OUT -\protected_separator - -\protected_separator - -\protected_separator - 0x00000100 -\layout LyX-Code - - -\shape italic -/* route right input to left output is supported */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_RTOL_OUT -\protected_separator - -\protected_separator - -\protected_separator - 0x00000200 -\layout LyX-Code - - -\shape italic -/* route left input to right ADC is supported */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_LTOR_IN -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -0x00000400 -\layout LyX-Code - - -\shape italic -/* route right input to left ADC is supported */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_RTOL_IN -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -0x00000800 -\layout LyX-Code - - -\shape italic -/* output route is only switch (cannot be used separately) */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_SWITCH_OUT -\protected_separator - -\protected_separator - 0x00001000 -\layout LyX-Code - - -\shape italic -/* input route is only switch (cannot be used separately) */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_SWITCH_IN -\protected_separator - -\protected_separator - -\protected_separator -0x00002000 -\layout LyX-Code - - -\shape italic -/* data can be recorded even if output path is muted */ -\layout LyX-Code - - -\shape italic -/* (to avoid loopback) */ -\layout LyX-Code - -#define SND_MIXER_CINFO_CAP_RECORDBYMUTE -\protected_separator - 0x00004000 -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_mixer_channel_info { -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* channel index (filled by application) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int channel; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* parent channel # or SND_MIXER_PARENT */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int parent; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* name of this device */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char name[12]; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* some flags about this device (SND_MIXER_CINFO_XXXX) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int caps; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* min. - value when exact mode (or always 0) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int min; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* max. - value when exact mode (or always 100) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int max; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* minimum decibel value (*100) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int min_dB; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* maximum decibel value (*100) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int max_dB; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* step decibel value (*100) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int step_dB; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Subsubsection* - -int snd_mixer_channel_read(void *handle, int channel, snd_mixer_channel_t - *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure. - The argument -\shape italic -channel -\shape default - specifies the channel (0 to N) for which is data requested. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - -/* channel record source flags */ -\layout LyX-Code - -#define SND_MIXER_FLG_RECORD_LEFT -\protected_separator - 0x00000001 -\layout LyX-Code - -#define SND_MIXER_FLG_RECORD_RIGHT 0x00000002 -\layout LyX-Code - -#define SND_MIXER_FLG_RECORD -\protected_separator - -\protected_separator - -\protected_separator - 0x00000003 -\layout LyX-Code - -/* mute channel flags */ -\layout LyX-Code - -#define SND_MIXER_FLG_MUTE_LEFT -\protected_separator - -\protected_separator -0x00010000 -\layout LyX-Code - -#define SND_MIXER_FLG_MUTE_RIGHT -\protected_separator - 0x00020000 -\layout LyX-Code - -#define SND_MIXER_FLG_MUTE -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 0x00030000 -\layout LyX-Code - -/* input to output route setup */ -\layout LyX-Code - -#define SND_MIXER_FLG_LTOR_OUT -\protected_separator - -\protected_separator - 0x00100000 -\layout LyX-Code - -#define SND_MIXER_FLG_RTOL_OUT -\protected_separator - -\protected_separator - 0x00200000 -\layout LyX-Code - -#define SND_MIXER_FLG_SWITCH_OUT -\protected_separator - 0x00300000 -\layout LyX-Code - -/* input to ADC route setup */ -\layout LyX-Code - -#define SND_MIXER_FLG_LTOR_IN -\protected_separator - -\protected_separator - -\protected_separator - 0x00400000 -\layout LyX-Code - -#define SND_MIXER_FLG_RTOL_IN -\protected_separator - -\protected_separator - -\protected_separator - 0x00800000 -\layout LyX-Code - -#define SND_MIXER_FLG_SWITCH_IN -\protected_separator - -\protected_separator - 0x00c00000 -\layout LyX-Code - -/* set volume in decibels from dB variables */ -\layout LyX-Code - -#define SND_MIXER_FLG_DECIBEL -\protected_separator - -\protected_separator - -\protected_separator -0x40000000 -\layout LyX-Code - -/* reserved for kernel use, don't use this flag from application */ -\layout LyX-Code - -#define SND_MIXER_FLG_FORCE -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -0x80000000 -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_mixer_channel { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* channel # (filled by application) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int channel; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* some flags to read/write (SND_MIXER_FLG_XXXX) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int flags; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* min - max when exact mode (or 0 - 100) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int left; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* min - max when exact mode (or 0 - 100) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int right; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* dB * 100 */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int left_dB; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* dB * 100 */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int right_dB; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Subsubsection* - -int snd_mixer_channel_write(void *handle, int channel, snd_mixer_channel_t - *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure to kernel. - The -\shape italic -channel -\shape default - 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 -\shape italic -snd_mixer_channel_read -\shape default -. -\layout Subsubsection* - -int snd_mixer_read(void *handle, snd_mixer_callbacks_t *callbacks) -\layout Standard - -This function reads and parses data from driver. - Parsed actions are returned back to the application using the -\shape italic -callbacks -\shape default - 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. -\layout LyX-Code - -typedef struct snd_mixer_callbacks { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* should be used by application */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - void *private_data; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - void (*channel_was_changed)(void *private_data, int channel); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - void (*switch_was_changed)(void *private_data, -\protected_separator -int switchn); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use - must be NULL!!! */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - void *reserved[14]; -\layout LyX-Code - -} snd_mixer_callbacks_t; -\layout Subsubsection - -Examples -\layout Standard - -The following example shows installed mixer channels for sound card #0 and - mixer device #0 in the system, and also sets the master volume (if present) - to 50. -\layout LyX-Code - -int card = 0, device = 0, err; -\layout LyX-Code - -void *handle; -\layout LyX-Code - -snd_mixer_info_t info; -\layout LyX-Code - -snd_mixer_channel_t channel; -\layout Standard - - -\protected_separator - -\layout LyX-Code - -if ((err = snd_mixer_open(&handle, card, device)) < 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - fprintf(stderr, "open failed: %s -\backslash -n", snd_strerror(err)); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - -} -\layout LyX-Code - -if ((err = snd_mixer_info(handle, &info)) < 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - fprintf(stderr, "info failed: %s -\backslash -n", snd_strerror(err)); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_mixer_close(handle); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - -} -\layout LyX-Code - -printf("Installed MIXER channels for card #i and device %i: %i -\backslash -n", -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - card + 1, device, -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - info.channels); -\layout LyX-Code - -master = snd_mixer_channel(handle, SND_MIXER_ID_MASTER); -\layout LyX-Code - -if (master >= 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - if ((err = snd_mixer_read(handle, master, &channel)) < 0) { -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - fprintf(stderr, "master read failed: %s -\backslash -n", -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_strerror( err )); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_mixer_close( handle ); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - } -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - channel.left = channel.right = 50; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - if ((err = snd_mixer_write(handle, master, &channel)) < 0 ) { -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - fprintf(stderr, "master write failed: %s -\backslash -n", -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_strerror( err )); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_mixer_close(handle); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - } -\layout LyX-Code - -} -\layout LyX-Code - -snd_mixer_close(handle); -\layout Section - -Digital Audio (PCM) Interface -\layout Standard - -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). -\layout Standard - -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). -\layout Standard - -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 that 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, an 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. -\layout Standard - -Sample encoding limits the dynamic range of a 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. -\layout Standard - -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 beyond the scope of this document. - -\layout Subsection - -Low-Level Layer -\layout Standard - -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. -\layout Standard - -Low-Level layer supports these formats: -\layout LyX-Code - - -\shape italic -/* muLaw compressed samples */ -\layout LyX-Code - -#define SND_PCM_SFMT_MU_LAW -\protected_separator - -\protected_separator - -\protected_separator - 0 -\layout LyX-Code - - -\shape italic -/* aLaw compressed samples */ -\layout LyX-Code - -#define SND_PCM_SFMT_A_LAW -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -1 -\layout LyX-Code - - -\shape italic -/* Ima-ADPM 4:1 compressed samples */ -\layout LyX-Code - -#define SND_PCM_SFMT_IMA_ADPCM -\protected_separator - -\protected_separator -2 -\layout LyX-Code - - -\shape italic -/* Unsigned 8-bit samples (most common 8-bit format) */ -\layout LyX-Code - -#define SND_PCM_SFMT_U8 -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 3 -\layout LyX-Code - - -\shape italic -/* Signed 16-bit Little Endian samples (most common 16-bit format) */ -\layout LyX-Code - -#define SND_PCM_SFMT_S16_LE -\protected_separator - -\protected_separator - -\protected_separator - 4 -\layout LyX-Code - - -\shape italic -/* Signed 16-bit Big Endian samples */ -\layout LyX-Code - -#define SND_PCM_SFMT_S16_BE -\protected_separator - -\protected_separator - -\protected_separator - 5 -\layout LyX-Code - - -\shape italic -/* Signed 8-bit samples */ -\layout LyX-Code - -#define SND_PCM_SFMT_S8 -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 6 -\layout LyX-Code - - -\shape italic -/* Unsigned 16-bit Little Endian samples */ -\layout LyX-Code - -#define SND_PCM_SFMT_U16_LE -\protected_separator - -\protected_separator - -\protected_separator - 7 -\layout LyX-Code - - -\shape italic -/* Unsigned 16-bit Big Endian samples */ -\layout LyX-Code - -#define SND_PCM_SFMT_U16_BE -\protected_separator - -\protected_separator - -\protected_separator - 8 -\layout LyX-Code - - -\shape italic -/* MPEG 1/2 stream */ -\layout LyX-Code - -#define SND_PCM_SFMT_MPEG -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 9 -\layout LyX-Code - - -\shape italic -/* GSM stream */ -\layout LyX-Code - -#define SND_PCM_SFMT_GSM -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -10 -\layout Standard - - -\protected_separator - -\layout LyX-Code - -#define SND_PCM_FMT_MU_LAW -\protected_separator - -\protected_separator - -\protected_separator - (1 << SND_PCM_SFMT_MU_LAW) -\layout LyX-Code - -#define SND_PCM_FMT_A_LAW -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -(1 << SND_PCM_SFMT_A_LAW) -\layout LyX-Code - -#define SND_PCM_FMT_IMA_ADPCM -\protected_separator - -\protected_separator -(1 << SND_PCM_SFMT_IMA_ADPCM) -\layout LyX-Code - -#define SND_PCM_FMT_U8 -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - (1 << SND_PCM_SFMT_U8) -\layout LyX-Code - -#define SND_PCM_FMT_S16_LE -\protected_separator - -\protected_separator - -\protected_separator - (1 << SND_PCM_SFMT_S16_LE) -\layout LyX-Code - -#define SND_PCM_FMT_S16_BE -\protected_separator - -\protected_separator - -\protected_separator - (1 << SND_PCM_SFMT_S16_BE) -\layout LyX-Code - -#define SND_PCM_FMT_S8 -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - (1 << SND_PCM_SFMT_S8) -\layout LyX-Code - -#define SND_PCM_FMT_U16_LE -\protected_separator - -\protected_separator - -\protected_separator - (1 << SND_PCM_SFMT_U16_LE) -\layout LyX-Code - -#define SND_PCM_FMT_U16_BE -\protected_separator - -\protected_separator - -\protected_separator - (1 << SND_PCM_SFMT_U16_BE) -\layout LyX-Code - -#define SND_PCM_FMT_MPEG -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - (1 << SND_PCM_SFMT_MPEG) -\layout LyX-Code - -#define SND_PCM_FMT_GSM -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -(1 << SND_PCM_SFMT_GSM) -\layout Standard - -Constants with prefix -\shape italic -SND_PCM_FMT_ -\shape default - are used in info structures and constants with prefix -\shape italic -SND_PCM_SFMT_ -\shape default - are used in format structures. -\layout Standard - -ALSA PCM API uses an enhanced double buffering scheme. - This allows the user to implement a more comfortable buffer setup. - Audio buffer is separated to small fragments. - Each fragment has the same size. - Application can set wakeup limits like -\begin_inset Quotes eld -\end_inset - -I want to get recorded data when at least two fragments with size 160 bytes - are filled. -\begin_inset Quotes erd -\end_inset - -. - For more information you should see description of -\shape italic -snd_pcm_*_params_t -\shape default - and -\shape italic -snd_pcm_*_status_t -\shape default - structures and the -\emph on -snd_pcm_playback_status(), snd_pcm_record_status() -\emph default -functions, documented below. -\layout Subsubsection* - -int snd_pcm_open(void **handle, int card, int device, int mode) -\layout Standard - -Creates a new handle and opens a connection to the kernel sound audio interface - for sound card number -\shape italic -card -\shape default - (0-N) and audio device number -\shape italic -device -\shape default -. - Function also checks if protocol is compatible to prevent use of old programs - with a new kernel API. - Function returns zero if successful otherwise it returns an error code. - Error code -EBUSY is returned when some process owns the selected direction. -\layout Standard - -Default format after opening is mono -\shape italic -mu-Law -\shape default - at 8000Hz. - This device can be used directly for playback of standard .au (Sparc) files. - -\layout Standard - -The following modes should be used for the -\shape italic -mode -\shape default - argument: -\layout LyX-Code - -#define SND_PCM_OPEN_PLAYBACK -\protected_separator - -\protected_separator - -\protected_separator -(O_WRONLY) -\layout LyX-Code - -#define SND_PCM_OPEN_RECORD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -(O_RDONLY) -\layout LyX-Code - -#define SND_PCM_OPEN_DUPLEX -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -(O_RDWR) -\layout Subsubsection* - -int snd_pcm_close(void *handle) -\layout Standard - -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. -\layout Subsubsection* - -int snd_pcm_file_descriptor(void *handle) -\layout Standard - -Returns the file descriptor of the connection to the kernel sound audio - interface. - Function returns an error code if an error was encountered. -\layout Standard - -The file descriptor should be used for the -\shape italic -select(2) -\shape default - synchronous multiplexer function for setting the read direction. - Application should call -\shape italic -snd_pcm_read() -\shape default - or -\shape italic -snd_pcm_write() -\shape default - functions if data is waiting to be read or a write can be performed. - Calling these functions is highly recommended, as it leaves a place for - the API to do things like data conversions, if needed. -\layout Subsubsection* - -int snd_pcm_block_mode(void *handle, int enable) -\layout Standard - -Sets up block (default) or non-block mode for a handle. - Block mode suspends execution of a program when -\shape italic -snd_pcm_read() -\shape default - or -\shape italic -snd_pcm_write() -\shape default - is called for the time which is needed for the actual playback or record - over of the selected limit. - In non-block mode, programs aren't suspended and the above functions return - 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. -\layout Subsubsection* - -int snd_pcm_info(void *handle, snd_pcm_info_t *info) -\layout Standard - -Fills the -\shape italic -*info -\shape default - structure with data about the PCM device selected by -\shape italic -*handle -\shape default -. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - - -\shape italic -/* hardware have codec */ -\layout LyX-Code - -#define SND_PCM_INFO_CODEC -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -0x00000001 -\layout LyX-Code - -#define SND_PCM_INFO_DSP -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -SND_PCM_INFO_CODEC -\layout LyX-Code - - -\shape italic -/* this flag is reserved and should be never used */ -\layout LyX-Code - - -\shape italic -/* It remains for compatibility with Open Sound System driver. - */ -\layout LyX-Code - -#define SND_PCM_INFO_MMAP -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 0x00000002 -\layout LyX-Code - - -\shape italic -/* playback direction is supported */ -\layout LyX-Code - -#define SND_PCM_INFO_PLAYBACK -\protected_separator - -\protected_separator - -\protected_separator - 0x00000100 -\layout LyX-Code - - -\shape italic -/* record direction is supported */ -\layout LyX-Code - -#define SND_PCM_INFO_RECORD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 0x00000200 -\layout LyX-Code - -#define SND_PCM_INFO_DUPLEX -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 0x00000400 -\layout LyX-Code - - -\shape italic -/* rate for playback & record must be same */ -\layout LyX-Code - -#define SND_PCM_INFO_DUPLEX_LIMIT -\protected_separator - 0x00000800 -\layout LyX-Code - - -\shape italic -/* duplex is supported only by mono (one channel) format */ -\layout LyX-Code - -#define SND_PCM_INFO_DUPLEX_MONO -\protected_separator - -\protected_separator -0x00001000 -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_pcm_info { -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* sound card type */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int type; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* see SND_PCM_INFO_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int flags; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* ID of this PCM device */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char id[32]; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* name of this device */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char name[80]; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[64]; -\layout LyX-Code - -}; -\layout Subsubsection* - -int snd_pcm_playback_info(void *handle, snd_pcm_playback_info_t *info) -\layout Standard - -Fills the *info structure with data about PCM playback. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - -#define SND_PCM_PINFO_BATCH -\protected_separator - -\protected_separator - -\protected_separator -0x00000001 -\layout LyX-Code - -#define SND_PCM_PINFO_8BITONLY -\protected_separator - 0x00000002 -\layout LyX-Code - -#define SND_PCM_PINFO_16BITONLY -\protected_separator -0x00000004 -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_pcm_playback_info { -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* see SND_PCM_PINFO_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int flags; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* supported formats */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int formats; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* min rate (in Hz) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int min_rate; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* max rate (in Hz) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int max_rate; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* min channels - voices (probably always 1) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int min_channels; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* max channels - voices */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int max_channels; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* playback buffer size in bytes */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int buffer_size; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* min fragment size in bytes */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int min_fragment_size; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* max fragment size in bytes */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int max_fragment_size; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* align fragment value */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int fragment_align; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* supported formats directly by hardware */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int hw_formats; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* count of playback switches */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int switches; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[56]; -\layout LyX-Code - -}; -\layout Description - -SND_PCM_PINFO_BATCH Driver implements double buffering with this device. - This means that the chip used for data processing has its own memory, and - output will be more delayed than if a traditional codec chip is used. -\layout Description - -SND_PCM_PINFO_8BITONLY 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 sound cards which can't do - full 16-bit duplex. - If this bit is set application or higher 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. -\layout Description - -SND_PCM_PINFO_16BITONLY 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 sound cards which can't do - full 8-bit duplex. - If this bit is set the application or higher 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. - -\layout Subsubsection* - -int snd_pcm_record_info(void *handle, snd_pcm_record_info_t *info) -\layout Standard - -Fills the *info structure. - Returns zero if successful, otherwise it returns an error code. - -\layout LyX-Code - -#define SND_PCM_RINFO_BATCH -\protected_separator - -\protected_separator - -\protected_separator -0x00000001 -\layout LyX-Code - -#define SND_PCM_RINFO_8BITONLY -\protected_separator - 0x00000002 -\layout LyX-Code - -#define SND_PCM_RINFO_16BITONLY -\protected_separator -0x00000004 -\layout LyX-Code - -#define SND_PCM_RINFO_OVERRANGE -\protected_separator -0x00001000 -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_pcm_record_info { -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* see SND_PCM_RINFO_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int flags; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* supported formats */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int formats; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* min rate (in Hz) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int min_rate; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* max rate (in Hz) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int max_rate; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* min channels - voices (probably always 1) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int min_channels; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* max channels - voices */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int max_channels; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* playback buffer size in bytes */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int buffer_size; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* min fragment size in bytes */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int min_fragment_size; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* max fragment size in bytes */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int max_fragment_size; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* align fragment value */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int fragment_align; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* supported formats directly by hardware */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int hw_formats; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* count of record switches */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int switches; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[56]; -\layout LyX-Code - -}; -\layout Description - -SND_PCM_RINFO_BATCH Driver implements double buffering with this device. - This means that the chip used for data processing has its own memory, and - input will be more delayed than if a traditional codec chip is used. -\layout Description - -SND_PCM_RINFO_8BITONLY 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 sound cards which can't do - full 16-bit duplex. - If this bit is set application or higher 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. -\layout Description - -SND_PCM_RINFO_16BITONLY 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 sound cards which can't do - full 8-bit duplex. - If this bit is set the application or higher 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. - -\layout Description - -SND_PCM_RINFO_OVERRANGE If this bit is set\i \c{ } - the hardware can do ADC over-range - detection. -\layout Subsubsection* - -int snd_pcm_playback_switches(void *handle) -\layout Standard - -Returns count of PCM playback switches. - In this contents switch means universal control interface between kernel - and application which allows variable type control. - Function returns count if successful, otherwise it returns an error code. - Return value should be zero if sound card doesn't have any PCM playback - switch. -\layout Subsubsection* - -int snd_pcm_playback_switch(void *handle, const char *switch_id) -\layout Standard - -Returns index for switch with name -\shape italic -switch_id -\shape default -. - Function returns switch index if successful, otherwise it returns an error - code. -\layout Subsubsection* - -int snd_pcm_playback_switch_read(void *handle\i \c{ } - int switchn\i \c{ } - snd_pcm_switch_t - *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default -. - Function returns zero if successful, otherwise it returns an error code. - -\layout LyX-Code - - -\shape italic -/* 0 or 1 (enable member of union) */ -\layout LyX-Code - -#define SND_PCM_SW_TYPE_BOOLEAN -\protected_separator - -\protected_separator - -\protected_separator - 0 -\layout LyX-Code - - -\shape italic -/* 0 to 255 - from low to high (data8[0] member of union) */ -\layout LyX-Code - -#define SND_PCM_SW_TYPE_BYTE -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -1 -\layout LyX-Code - - -\shape italic -/* 0 to 65535 - from low to high (data16[0] member of union) */ -\layout LyX-Code - -#define SND_PCM_SW_TYPE_WORD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -2 -\layout LyX-Code - - -\shape italic -/* 0 to 4294967296 \i \={ } - from low to high (data32[0] member of union) */ -\layout LyX-Code - -#define SND_PCM_SW_TYPE_DWORD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 3 -\layout LyX-Code - - -\shape italic -/* user type - no type control */ -\layout LyX-Code - -#define SND_PCM_SW_TYPE_USER -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -(~0) -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_pcm_switch { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* switch index (filled by application) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int switchn; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* identification of switch (for driver) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char name[32]; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* type of switch value \i \={ } - See SND_PCM_SW_TYPE_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int type; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* low range value */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int low; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* high range value */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int high; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - union { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int enable; -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* 0 = off\i \c{ } - 1 = on */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char data8[32]; -\protected_separator - -\protected_separator - -\shape italic -/* 8-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned short data16[16]; -\protected_separator - -\shape italic -/* 16-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int data32[8]; -\protected_separator - -\protected_separator - -\shape italic -/* 32-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - } value; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* reserved for future use \i \={ } - must be zero !!! */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[32]; -\layout LyX-Code - -} -\layout Subsubsection* - -int snd_pcm_playback_switch_write(void *handle\i \c{ } - int switchn\i \c{ } - snd_pcm_switch_t - *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default - to kernel. - Function returns zero if successful, otherwise it returns an error code. - -\layout Subsubsection* - -int snd_pcm_record_switches(void *handle) -\layout Standard - -Returns count of PCM record switches. - In this context 'switch' means universal control interface between kernel - and application which allows various types of control. - Function returns count if successful, otherwise it returns an error code. - Return value should be zero if sound card doesn't have any PCM record switch. -\layout Subsubsection* - -int snd_pcm_record_switch(void *handle, const char *switch_id) -\layout Standard - -Returns index for switch with name -\shape italic -switch_id -\shape default -. - Function returns switch index if successful, otherwise it returns an error - code. -\layout Subsubsection* - -int snd_pcm_record_switch_read(void *handle\i \c{ } - int switchn\i \c{ } - snd_pcm_switch_t - *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default -. - Function returns zero if successful, otherwise it returns an error code. -\layout Subsubsection* - -int snd_pcm_record_switch_write(void *handle\i \c{ } - int switchn\i \c{ } - snd_pcm_switch_t - *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default - to kernel. - Function returns zero if successful, otherwise it returns an error code. - -\layout Subsubsection* - -int snd_pcm_playback_format(void *handle, snd_pcm_format_t *format) -\layout Standard - -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. -\layout LyX-Code - -struct snd_pcm_format { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int format; -\protected_separator - -\protected_separator - -\shape italic -/* SND_PCM_SFMT_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int rate; -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* rate in Hz */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int channels; -\protected_separator - -\shape italic -/* channels (voices) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Subsubsection* - -int snd_pcm_record_format(void *handle, snd_pcm_format_t *format) -\layout Standard - -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. - -\layout LyX-Code - -struct snd_pcm_format { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int format; -\protected_separator - -\protected_separator - -\shape italic -/* SND_PCM_SFMT_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int rate; -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* rate in Hz */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int channels; -\protected_separator - -\shape italic -/* channels (voices) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Subsubsection* - -int snd_pcm_playback_params(void *handle, snd_pcm_playback_params_t *params) -\layout Standard - -Sets various parameters for playback direction. - Function returns zero if successful, otherwise it returns an error code. - -\layout LyX-Code - -struct snd_pcm_playback_params { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int fragment_size; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int fragments_max; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int fragments_room; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use - must be filled with zero */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Description - -fragment_size 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 -\shape italic -fragment_align -\shape default - variable from -\shape italic -snd_pcm_playback_info_t -\shape default - structure. - Its range can be from -\shape italic -min_fragment_size -\shape default - to -\shape italic -max_fragment_size -\shape default -. -\layout Description - -fragments_max Maximum number of fragments in queue for wakeup. - This number doesn't include partly used fragments. - If the current count of filled playback fragments is greater than this - value the driver will block the application or return immediately back - if non-block mode is active. -\layout Description - -fragments_room Minimum number of fragments writable for wakeup. - This value should in most cases be 1 which means return back to application - if at least one fragment is free for playback. - This value includes partly used fragments, too. -\layout Subsubsection* - -int snd_pcm_record_params(void *handle, snd_pcm_record_params_t *params) -\layout Standard - -Function sets various parameters for the recording direction. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - -struct snd_pcm_record_params { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int fragment_size; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int fragments_min; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use - must be filled with zero */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Description - -fragment_size 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 -\shape italic -fragment_align -\shape default - variable from -\shape italic -snd_pcm_playback_info_t -\shape default - structure. - Its range can be from -\shape italic -min_fragment_size -\shape default - to -\shape italic -max_fragment_size -\shape default -. -\layout Description - -fragments_min Minimum filled fragments for wakeup. - Driver blocks the application (if block mode is selected) until input buffer - is filled with less than the number of fragments specified with this value. -\layout Subsubsection* - -int snd_pcm_playback_status(void *handle, snd_pcm_playback_status_t *status) -\layout Standard - -Fills the -\shape italic -*status -\shape default - structure. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - -struct snd_pcm_playback_status { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int rate; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int fragments; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int fragment_size; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int count; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int queue; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int underrun; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - struct timeval time; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - struct timeval stime; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int scount; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use - must be filled with zero */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Description - -rate Real playback rate. - This value reflects hardware limitations. - -\layout Description - -fragments Currently allocated fragments by the driver for playback direction. -\layout Description - -fragment_size Current fragment size used by driver for the playback direction. -\layout Description - -count Count of bytes writable without blocking. -\layout Description - -queue Count of bytes in queue. - Note: -\shape italic -(fragments*fragment_size) - queue -\shape default - should not be equal to -\shape italic -count -\shape default -. -\layout Description - -underrun This value tells the application the number of underruns since - the last call to -\shape italic -snd_pcm_playback_status -\shape default -\emph on -() -\emph default -. - -\layout Description - -time Estimated time when the next written sample will actually be played - (time is always in the future). - The estimate is calculated with: current time + sample queue -\emph on - -\emph default -converted to time (number of samples waiting for write to device, i.e., the - same as the -\emph on -queue -\emph default -member above). - This value should be used for time synchronization. - Returned value is in the same format as returned from the standard C function - -\emph on -gettimeofday -\emph default -(& -\emph on -time -\emph default -, -\emph on -NULL -\emph default -). - This variable contains valid information only if playback time mode is - enabled (see -\shape italic -snd_pcm_playback_time() -\shape default - function). - -\layout Description - -stime Time when playback was started. - This variable contains valid information only if playback time mode is - enabled (see -\shape italic -snd_pcm_playback_time() -\shape default - function). -\layout Description - -scount Number of bytes processed (actually played) from playback start. - This number is not necessarily the same as byte count written by application. -\layout Standard -\added_space_top 0.3cm \added_space_bottom 0.3cm \align center - -\begin_inset Figure size 654 212 -file pcmbuf.ps -width 3 100 -flags 9 - -\end_inset - - -\layout Standard - -The figure above shows an example situation in the audio playback buffer - in the ALSA driver. - The driver splits the audio buffer into 16 -\emph on -fragments -\emph default -, each being -\emph on - fragment_size -\emph default -bytes long. - Fragments 0 and 12-15 are filled with samples. - Fragment 1 is filled partly (about 75%). - Driver is playing and current playback position is in fragment 12 (about - 35%). - As you can see\i \c{ } - free space (structure member -\shape italic -count -\shape default -) is counted without including the fragment which is being played. -\layout Subsubsection* - -int snd_pcm_record_status(void *handle, snd_pcm_record_status_t *status) -\layout Standard - -Fills the -\shape italic -*status -\shape default - structure. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - -struct snd_pcm_record_status { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int rate; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int fragments; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int fragment_size; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int count; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int free; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int overrun; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - struct timeval time; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - struct timeval stime; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int scount; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int overrange; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use - must be filled with zero */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Description - -rate Real record rate. - This value reflects hardware limitations. -\layout Description - -fragments Currently allocated fragments by driver for the record direction. -\layout Description - -fragment_size Current fragment size used by driver for the record direction. -\layout Description - -count Count of bytes readable without blocking. -\layout Description - -free Count of bytes in buffer still free. - Note: -\shape italic -(fragments*fragment_size) - free -\shape default - should not be equal to -\shape italic -count -\shape default -. -\layout Description - -overrun This value tells application the count of overruns since the last - call to -\shape italic -snd_pcm_record_status -\shape default -. -\layout Description - -time Returns a timestamp for the next sample to be read from the record - ring buffer (time is always in the past). - The timestamp is calculated with: current time - sample queue converted - to time (waiting for application read() + current position in fragment - is the same as record count + current position in fragment). - This value should be used for time synchronization. - Returned value is in the same format as returned by the standard C function - gettimeofday(&time, NULL). - This variable contains right valid information only if record time mode - is enabled (see -\shape italic -snd_pcm_record_time() -\shape default - function). - -\layout Description - -stime Time when record was started. - This variable contains valid information only if record time mode is enabled - (see -\shape italic -snd_pcm_record_time -\shape default - function). -\layout Description - -scount Number of bytes processed (actually recorded) from record start (stime). - This number is not necessarily the same as the byte count read by application. -\layout Description - -overrange ADC overrange count. - This value is used only when -\shape italic -SND_PCM_RINFO_OVERRANGE -\shape default - bit in -\shape italic -struct snd_pcm_record_info_t->flags -\shape default - is set (if hardware supports this feature). -\layout Standard -\added_space_top 0.3cm \added_space_bottom 0.3cm \align center - -\begin_inset Figure size 595 121 -file pcmbuf1.ps -width 3 100 -flags 9 - -\end_inset - - -\layout Standard - -The figure above shows an example situation in the audio record buffer in - the ALSA driver. - The driver splits the audio buffer into 16 -\emph on -fragments -\emph default -, each being -\emph on -fragment_size -\emph default -bytes in length. - Fragments 0 and 12-15 are filled with samples. - Fragment 1 is partly filled (about 75%) and at the end of the filled area - is the active record position. - Data which is ready for the application begins in fragment 12 (about 35%). - As you can see\i \c{ } - free space (structure member -\shape italic -free -\shape default -) is counted without including the fragment which is partly filled with - samples and the application reads data from this fragment. -\layout Subsubsection* - -int snd_pcm_drain_playback(void *handle) -\layout Standard - -This function stops and drains (destroys) the playback buffers immediately. - Function returns zero if successful, otherwise it returns an error code. - -\layout Subsubsection* - -int snd_pcm_flush_playback(void *handle) -\layout Standard - -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. -\layout Subsubsection* - -int snd_pcm_flush_record(void *handle) -\layout Standard - -This function flushes (destroys) record buffers. - Function returns zero if successful, otherwise it returns an error code. - -\layout Subsubsection* - -int snd_pcm_playback_pause(void *handle\i \c{ } - int enable) -\layout Standard - -This function pauses playback if -\shape italic -enable -\shape default - is non-zero. - To restore playing mode call this function with -\shape italic -enable -\shape default - equal to zero. - Function returns zero if successful, otherwise it returns an error code. - -\layout Subsubsection* - -int snd_pcm_playback_time(void *handle, int enable) -\layout Standard - -This function enables or disables time mode for the playback direction. - Time mode is useful in synchronizing an application with other events. - Function returns zero if successful, otherwise it returns an error code. -\layout Subsubsection* - -int snd_pcm_record_time(void *handle, int enable) -\layout Standard - -This function enables or disables time mode for record direction. - Time mode is useful in synchronizing an application with other events. - Function returns zero if successful, otherwise it returns an error code. -\layout Subsubsection* - -ssize_t snd_pcm_write(void *handle, const void *buffer, size_t size) -\layout Standard - -Writes samples to the device which must be in the proper format specified - by the -\shape italic -snd_pcm_playback_format -\shape default - function. - Function returns zero or positive value if playback was successful (value - represents count of bytes which were successfully written to device) or - an error value if an error occurred. - Function will suspend process if block mode is active. -\layout Subsubsection* - -ssize_t snd_pcm_read(void *handle, void *buffer, size_t size) -\layout Standard - -Function reads samples from driver. - Samples are in format specified by -\shape italic -snd_pcm_record_format -\shape default - function. - Function returns zero or positive value if record was success (value represents - count of bytes which was successfully read from device) or negative error - value if error occurred. - Function will suspend process if block mode is active. -\layout Subsubsection - -Example -\layout Standard - -The following example shows how to play the first 512kB from the /tmp/test.au - file with sound card #0 and PCM device #0: -\layout LyX-Code - -int card = 0, device = 0, err, fd, count, size, idx; -\layout LyX-Code - -void *handle; -\layout LyX-Code - -snd_pcm_format_t format; -\layout LyX-Code - -char *buffer; -\layout Standard - - -\protected_separator - -\layout LyX-Code - -buffer = (char *)malloc(512 * 1024); -\layout LyX-Code - -if (!buffer) return; -\layout LyX-Code - -if ((err = snd_pcm_open(&handle, card, device, -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - SND_PCM_OPEN_PLAYBACK)) < 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - fprintf(stderr, "open failed: %s -\backslash -n", snd_strerror( err )); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - -} -\layout LyX-Code - -bzero(&format\i \c{ } - sizeof(format)); -\layout LyX-Code - -format.format = SND_PCM_SFMT_MU_LAW; -\layout LyX-Code - -format.rate = 8000; -\layout LyX-Code - -format.channels = 1; -\layout LyX-Code - -if ((err = snd_pcm_playback_format(handle, &format)) < 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - fprintf(stderr, "format setup failed: %s -\backslash -n", -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -snd_strerror( err )); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_pcm_close( handle ); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - -} -\layout LyX-Code - -fd = open("/tmp/test.au", O_RDONLY); -\layout LyX-Code - -if (fd < 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - perror("open file"); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_pcm_close(handle); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - -} -\layout LyX-Code - -idx = 0; -\layout LyX-Code - -count = read(fd, buffer, 512 * 1024); -\layout LyX-Code - -if (count <= 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - perror("read from file"); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_pcm_close( handle ); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - -} -\layout LyX-Code - -close( fd ); -\layout LyX-Code - -if (!memcmp(buffer, ".snd", 4)) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - idx = (buffer[4]<<24)|(buffer[5]<<16)| -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - (buffer[6]<<8)|(buffer[7]); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - if (idx > 128) idx = 128; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - if (idx > count) idx = count; -\layout LyX-Code - -} -\layout LyX-Code - -size = snd_pcm_write(handle, &buffer[ idx ], count - idx); -\layout LyX-Code - -printf("Bytes written %i from %i... -\backslash -n", size, count - idx); -\layout LyX-Code - -snd_pcm_close(handle); -\layout LyX-Code - -free(buffer); -\layout Subsection - -PCM Loopback Interface -\layout Standard - -This interface is designed to pass data currently being played or recorded - from one application to another application for other processing like a - graphical equalizer\i \c{ } - sample recorder etc... - The programmer should be aware that each loopback connection eats CPU time - (for data copying from the process which is doing the playback or record). -\layout Subsubsection* - -int snd_pcm_loopback_open(void **handle, int card, int device, int mode) -\layout Standard - -Creates a new handle and opens a connection to the kernel sound audio loopback - interface for sound card number -\shape italic -card -\shape default - (0-N) and audio device number -\shape italic -device -\shape default -. - Function also checks if protocol is compatible to prevent use of old programs - with a new kernel API. - Function returns zero if successful otherwise it returns an error code. - Error code -EBUSY is returned when another process owns the selected direction. -\layout Standard - -The following modes should be used for the -\shape italic -mode -\shape default - argument: -\layout LyX-Code - -#define SND_PCM_LB_OPEN_PLAYBACK -\protected_separator - -\protected_separator - -\protected_separator -0 -\layout LyX-Code - -#define SND_PCM_LB_OPEN_RECORD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -1 -\layout Subsubsection* - -int snd_pcm_loopback_close(void *handle) -\layout Standard - -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. -\layout Subsubsection* - -int snd_pcm_loopback_file_descriptor(void *handle) -\layout Standard - -Returns the file descriptor of the connection to the kernel sound audio - interface. - Function returns an error code if an error was encountered. -\layout Standard - -The file descriptor should be used for the -\shape italic -select(2) -\shape default - synchronous multiplexer function for setting the read direction. - Application should call -\shape italic -snd_pcm_loopback_read() -\shape default - function if data is waiting to be read. -\layout Subsubsection* - -int snd_pcm_loopback_block_mode(void *handle, int enable) -\layout Standard - -Sets up block (default) or non-block mode for a handle. - Block mode suspends execution of a program when -\shape italic -snd_pcm_loopback_read() -\shape default - is called for the time until some data arrives for file descriptor. - In non-block mode, programs aren't suspended and the above function returns - immediately with the count of bytes which were read 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. -\layout Subsubsection* - -int snd_pcm_loopback_stream_mode(void *handle, int mode) -\layout Standard - -Sets up stream mode which should be one of these values: -\layout LyX-Code - -#define SND_PCM_LB_STREAM_MODE_RAW -\protected_separator - -\protected_separator - -\protected_separator -0 -\layout LyX-Code - -#define SND_PCM_LB_STREAM_MODE_PACKET -\protected_separator -1 -\layout Standard - -Mode raw (default mode) means that the stream contains only PCM samples. - Packet mode is more complicated. - The stream contains a header at the begining of the packet. - Information like data type and data size is contain in this header. -\layout LyX-Code - -#define SND_PCM_LB_TYPE_DATA -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -0 -\protected_separator - -\shape italic -/* sample data */ -\layout LyX-Code - -#define SND_PCM_LB_TYPE_FORMAT -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 1 -\protected_separator - -\shape italic -/* PCM format */ -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_pcm_loopback_header { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int size; -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* block size */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int type; -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* block type (SND_PCM_LB_TYPE_*) */ -\layout LyX-Code - -}; -\layout Subsubsection* - -int snd_pcm_loopback_format(void *handle, snd_pcm_format_t *format) -\layout Standard - -Get current format for PCM stream. - -\layout LyX-Code - -struct snd_pcm_format { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int format; -\protected_separator - -\protected_separator - -\shape italic -/* SND_PCM_SFMT_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int rate; -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* rate in Hz */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int channels; -\protected_separator - -\shape italic -/* number of channels (voices) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Subsubsection* - -ssize_t snd_pcm_loopback_read(void *handle, void *buffer, size_t size) -\layout Standard - -This function reads samples or loopback packets from the stream. - Data depends on stream mode which should be set with -\shape italic -snd_pcm_loopback_stream_mode() -\shape default - function. - Function returns zero or positive value if record was success (value represents - count of bytes which were successfully read from device) or negative error - value if error occurred. - Function will suspend process if block mode is active. -\layout Section - -RawMidi Interface -\layout Standard - -RawMidi Interface is designed to write or read raw (unchanged) MIDI data - over the MIDI line. - MIDI stands Musical Instrument Digital Interface and more informations - about this standard can be found at -\series bold -http://www.midi.org -\series default -. -\layout Subsection - -Low Level Layer -\layout Standard - -RawMidi devices are opened exclusively for a selected direction. - While more than one process may not open a given MIDI device in the same - direction simultaniously, seperate processes may open a single MIDI device - in different directions (i.e. - process one opens a MIDI device in playback direction and process two opens - the same device in record direction). - Audio devices (with MIDI ports) return EBUSY error to applications when - other applications have already opened the requested direction. -\layout Subsubsection* - -int snd_rawmidi_open(void **handle, int card, int device, int mode) -\layout Standard - -Creates a new handle and opens a connection to the kernel sound audio interface - for sound card number -\shape italic -card -\shape default - (0-N) and rawmidi device number -\shape italic -device -\shape default -. - Function also checks if protocol is compatible to prevent use of old programs - with a new kernel API. - Function returns zero if successful, otherwise it returns an error code. - Error code -EBUSY is returned when another process owns the selected direction. -\layout Standard - -The following modes should be used for the -\shape italic -mode -\shape default - argument: -\layout LyX-Code - -#define SND_RAWMIDI_OPEN_OUTPUT -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -(O_WRONLY) -\layout LyX-Code - -#define SND_RAWMIDI_OPEN_INPUT -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -(O_RDONLY) -\layout LyX-Code - -#define SND_RAWMIDI_OPEN_DUPLEX -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -(O_RDWR) -\layout Subsubsection* - -int snd_rawmidi_close(void *handle) -\layout Standard - -Frees all resources allocated with audio handle and closes the connection - to the kernel sound rawmidi interface. - Function returns zero if successful, otherwise it returns an error code. -\layout Subsubsection* - -int snd_rawmidi_file_descriptor(void *handle) -\layout Standard - -Returns the file descriptor of the connection to the kernel sound audio - interface. - Function returns an error code if an error was encountered. -\layout Standard - -The file descriptor should be used for the -\shape italic -select(2) -\shape default - synchronous multiplexer function for setting the read direction. - Application should call -\shape italic -snd_rawmidi_read() -\shape default - or -\shape italic -snd_rawmidi_write() -\shape default - functions if data is waiting to be read or a write can be performed. - Calling these functions is highly recommended. -\layout Subsubsection* - -int snd_rawmidi_block_mode(void *handle, int enable) -\layout Standard - -Sets up block (default) or non-block mode for a handle. - Block mode suspends execution of a program when -\shape italic -snd_rawmidi_read() -\shape default - or -\shape italic -snd_rawmidi_write() -\shape default - is called for the time which is needed for the actual output or input over - of the selected limit. - In non-block mode, programs aren't suspended and the above functions return - 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. -\layout Subsubsection* - -int snd_rawmidi_info(void *handle, snd_pcm_info_t *info) -\layout Standard - -Fills the -\shape italic -*info -\shape default - structure with data about the PCM device selected by -\shape italic -*handle -\shape default -. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - - -\shape italic -/* -\shape default - device is capable rawmidi output * -\shape italic -/ -\layout LyX-Code - -#define SND_RAWMIDI_INFO_OUTPUT -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -0x00000001 -\layout LyX-Code - - -\shape italic -/* device is capable rawmidi input */ -\layout LyX-Code - -#define SND_RAWMIDI_INFO_INPUT -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 0x00000002 -\layout LyX-Code - - -\shape italic -/* device is capable duplex mode */ -\layout LyX-Code - -#define SND_RAWMIDI_INFO_DUPLEX -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -0x00000004 -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_rawmidi_info { -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* sound card type */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int type; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* see SND_RAWMIDI_INFO_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int flags; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* ID of this PCM device */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char id[32]; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* name of this device */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char name[80]; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[64]; -\layout LyX-Code - -}; -\layout Subsubsection* - -int snd_rawmidi_output_info(void *handle, snd_rawmidi_output_info_t *info) -\layout Standard - -Fills the *info structure with data about rawmidi output. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - -struct snd_rawmidi_output_info { -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* count of output switches */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int switches; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[64]; -\layout LyX-Code - -}; -\layout Subsubsection* - -int snd_rawmidi_input_info(void *handle, snd_pcm_record_info_t *info) -\layout Standard - -Fills the *info structure. - Returns zero if successful, otherwise it returns an error code. - -\layout LyX-Code - -struct snd_rawmidi_input_info { -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* count of output switches */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int switches; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[64]; -\layout LyX-Code - -}; -\layout Subsubsection* - -int snd_rawmidi_output_switches(void *handle) -\layout Standard - -Returns count of rawmidi output switches. - In this context 'switch' means universal control interface between kernel - and application which allows various types of control. - Function returns count if successful, otherwise it returns an error code. - Return value should be zero if sound card doesn't have any rawmidi output - switch. -\layout Subsubsection* - -int snd_rawmidi_output_switch(void *handle, const char *switch_id) -\layout Standard - -Returns index for switch with name -\shape italic -switch_id -\shape default -. - Function returns switch index if successful, otherwise it returns an error - code. -\layout Subsubsection* - -int snd_rawmidi_output_switch_read(void *handle\i \c{ } - int switchn\i \c{ } - snd_rawmidi_switch_t - *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default -. - Function returns zero if successful, otherwise it returns an error code. - -\layout LyX-Code - - -\shape italic -/* 0 or 1 (enable member of union) */ -\layout LyX-Code - -#define SND_PCM_SW_TYPE_BOOLEAN -\protected_separator - -\protected_separator - -\protected_separator - 0 -\layout LyX-Code - - -\shape italic -/* 0 to 255 - from low to high (data8[0] member of union) */ -\layout LyX-Code - -#define SND_PCM_SW_TYPE_BYTE -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -1 -\layout LyX-Code - - -\shape italic -/* 0 to 65535 - from low to high (data16[0] member of union) */ -\layout LyX-Code - -#define SND_PCM_SW_TYPE_WORD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -2 -\layout LyX-Code - - -\shape italic -/* 0 to 4294967296 \i \={ } - from low to high (data32[0] member of union) */ -\layout LyX-Code - -#define SND_PCM_SW_TYPE_DWORD -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 3 -\layout LyX-Code - - -\shape italic -/* user type - no type control */ -\layout LyX-Code - -#define SND_PCM_SW_TYPE_USER -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -(~0) -\layout Standard - - -\protected_separator - -\layout LyX-Code - -struct snd_rawmidi_switch { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* switch index (filled by application) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int switchn; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* identification of switch (for driver) */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char name[32]; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* type of switch value \i \={ } - See SND_PCM_SW_TYPE_XXXX */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int type; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* low range value */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int low; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* high range value */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int high; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - union { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int enable; -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* 0 = off\i \c{ } - 1 = on */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char data8[32]; -\protected_separator - -\protected_separator - -\shape italic -/* 8-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned short data16[16]; -\protected_separator - -\shape italic -/* 16-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned int data32[8]; -\protected_separator - -\protected_separator - -\shape italic -/* 32-bit data */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - } value; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\shape italic -/* reserved for future use \i \={ } - must be zero !!! */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[32]; -\layout LyX-Code - -} -\layout Subsubsection* - -int snd_rawmidi_output_switch_write(void *handle\i \c{ } - int switchn\i \c{ } - snd_rawmidi_switch_ -t *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default - to kernel. - Function returns zero if successful, otherwise it returns an error code. - -\layout Subsubsection* - -int snd_rawmidi_input_switches(void *handle) -\layout Standard - -Returns count of rawmidi input switches. - In this context 'switch' means universal control interface between kernel - and application which allows various types of control. - Function returns count if successful, otherwise it returns an error code. - Return value should be zero if sound card doesn't have any rawmidi input - switch. -\layout Subsubsection* - -int snd_rawmidi_input_switch(void *handle, const char *switch_id) -\layout Standard - -Returns index for switch with name -\shape italic -switch_id -\shape default -. - Function returns switch index if successful, otherwise it returns an error - code. -\layout Subsubsection* - -int snd_rawmidi_input_switch_read(void *handle\i \c{ } - int switchn\i \c{ } - snd_rawmidi_switch_t - *data) -\layout Standard - -Fills the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default -. - Function returns zero if successful, otherwise it returns an error code. -\layout Subsubsection* - -int snd_rawmidi_input_switch_write(void *handle\i \c{ } - int switchn\i \c{ } - snd_rawmidi_switch_t - *data) -\layout Standard - -Writes the -\shape italic -*data -\shape default - structure with data about switch with index -\shape italic -switchn -\shape default - to kernel. - Function returns zero if successful, otherwise it returns an error code. - -\layout Subsubsection* - -int snd_rawmidi_output_params(void *handle, snd_rawmidi_output_params_t - *params) -\layout Standard - -Sets various parameters for output direction. - Function returns zero if successful, otherwise it returns an error code. - -\layout LyX-Code - -struct snd_rawmidi_output_params { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int size; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int max; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int room; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use - must be filled with zero */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Description - -size Requested queue size of output buffer in bytes (default setup is 4096 - [i386] or 8192 [alpha] bytes - this is system architecture dependent). -\layout Description - -max Maximum number of bytes in queue for wakeup. - If the current byte count of filled portion of output buffer is greater - than this value the driver will block an application or return immediately - if non block mode is active. -\layout Description - -room Minimum number of bytes writable for wakeup. - This value should be in most cases 1 which means return back to application - if at least one byte is free in output buffer. -\layout Subsubsection* - -int snd_rawmidi_input_params(void *handle, snd_rawmidi_input_params_t *params) -\layout Standard - -Function sets various parameters for the recording direction. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - -struct snd_rawmidi_input_params { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int size; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int min; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use - must be filled with zero */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Description - -size Requested queue size of input buffer in bytes (default setup is 4096 - [i386] or 8192 [alpha] bytes - this is system architecture dependent). -\layout Description - -min Minimum filled bytes in queue for wakeup. - Driver blocks the application (if block mode is selected) until input buffer - is filled with fewer than the number of bytes specified with this value. -\layout Subsubsection* - -int snd_rawmidi_output_status(void *handle, snd_rawmidi_output_status_t - *status) -\layout Standard - -Fills the -\shape italic -*status -\shape default - structure. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - -struct snd_rawmidi_output_status { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int size; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int count; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int queue; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use - must be filled with zero */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Description - -size Size of currently allocated queue in bytes. -\layout Description - -count Count of bytes writable without blocking. -\layout Description - -queue Count of bytes in queue (number of bytes waiting to be output). -\layout Subsubsection* - -int snd_rawmidi_input_status(void *handle, snd_rawmidi_input_status_t *status) -\layout Standard - -Fills the -\shape italic -*status -\shape default - structure. - Function returns zero if successful, otherwise it returns an error code. -\layout LyX-Code - -struct snd_rawmidi_input_status { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int size; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int count; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int free; -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - int overrun; -\layout LyX-Code - - -\shape italic - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - /* reserved for future use - must be filled with zero */ -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - unsigned char reserved[16]; -\layout LyX-Code - -}; -\layout Description - -size Size of currently allocated queue in bytes. -\layout Description - -count Count of bytes readable without blocking. -\layout Description - -free Count of bytes in queue still free. -\layout Description - -overrun This value tells the application the count of overruns since the - last call to -\shape italic -snd_rawmidi_input_status -\shape default -. -\layout Subsubsection* - -int snd_rawmidi_drain_output(void *handle) -\layout Standard - -This function stops and drains (destroys) the output queue immediately. - Function returns zero if successful, otherwise it returns an error code. - -\layout Subsubsection* - -int snd_rawmidi_flush_output(void *handle) -\layout Standard - -This function flushes the output queue. - It blocks the program while the all the waiting bytes in kernel output - queue are processed. - Function returns zero if successful, otherwise it returns an error code. -\layout Subsubsection* - -int snd_rawmidi_flush_input(void *handle) -\layout Standard - -This function flushes (destroys) input queue. - Function returns zero if successful, otherwise it returns an error code. - -\layout Subsubsection* - -ssize_t snd_rawmidi_write(void *handle, const void *buffer, size_t size) -\layout Standard - -Writes bytes to the output queue. - Function returns zero or positive value if the write was successful (value - represents count of bytes which were successfully written to the device) - or an error value if error occurred. - Function will suspend the process if block mode is active. -\layout Subsubsection* - -ssize_t snd_rawmidi_read(void *handle, void *buffer, size_t size) -\layout Standard - -Function reads bytes from input queue. - Function returns zero or positive value if the read was successful (value - represents count of bytes which were successfully read from device) or - negative error value if error occurred. - Function will suspend the process if block mode is active. -\layout Subsubsection - -Example -\layout Standard - -The following example shows how to send a control sequence (such as SysEx) - to a MIDI device. - Sound card #0 and rawmidi device #0 are used here: -\layout LyX-Code - -int card = 0, device = 0, err, fd, count, size; -\layout LyX-Code - -void *handle; -\layout LyX-Code - -snd_pcm_format_t format; -\layout LyX-Code - -char *buffer; -\layout Standard - - -\protected_separator - -\layout LyX-Code - -buffer = (char *)malloc(64 * 1024); -\layout LyX-Code - -if (!buffer) return; -\layout LyX-Code - -if ((err = snd_rawmidi_open(&handle, card, device, -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - SND_RAWMIDI_OPEN_OUTPUT)) < 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - fprintf(stderr, "open failed: %s -\backslash -n", snd_strerror( err )); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - -} -\layout LyX-Code - -if ((err = snd_rawmidi_block_mode(handle\i \c{ } - 1)) < 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - fprintf(stderr, "block failed: %s -\backslash -n", snd_strerror( err )); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_rawmidi_close(handle); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - -} -\layout LyX-Code - -fd = open("/tmp/test.sysex", O_RDONLY); -\layout LyX-Code - -if (fd < 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - perror("open file"); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_rawmidi_close(handle); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - -} -\layout LyX-Code - -idx = 0; -\layout LyX-Code - -count = read(fd, buffer, 64 * 1024); -\layout LyX-Code - -if (count <= 0) { -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - perror("read from file"); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - snd_rawmidi_close(handle); -\layout LyX-Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - return; -\layout LyX-Code - -} -\layout LyX-Code - -close(fd); -\layout LyX-Code - -size = snd_rawmidi_write(handle, &buffer, count); -\layout LyX-Code - -printf("Bytes written %i from %i... -\backslash -n", size, count); -\layout LyX-Code - -snd_rawmidi_close(handle); -\layout LyX-Code - -free(buffer); -\the_end diff --git a/doc/pcmbuf.fig b/doc/pcmbuf.fig deleted file mode 100644 index c5347ace..00000000 --- a/doc/pcmbuf.fig +++ /dev/null @@ -1,79 +0,0 @@ -#FIG 3.2 -Portrait -Center -Metric -Letter -100.00 -Single --2 -1200 2 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 450 855 900 855 900 1350 450 1350 450 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 900 855 1350 855 1350 1350 900 1350 900 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 1350 855 1800 855 1800 1350 1350 1350 1350 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 1800 855 2250 855 2250 1350 1800 1350 1800 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 2250 855 2700 855 2700 1350 2250 1350 2250 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 2700 855 3150 855 3150 1350 2700 1350 2700 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 3150 855 3600 855 3600 1350 3150 1350 3150 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 3600 855 4050 855 4050 1350 3600 1350 3600 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 4050 855 4500 855 4500 1350 4050 1350 4050 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 4500 855 4950 855 4950 1350 4500 1350 4500 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 4950 855 5400 855 5400 1350 4950 1350 4950 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 5400 855 5850 855 5850 1350 5400 1350 5400 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 5850 855 6300 855 6300 1350 5850 1350 5850 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 6300 855 6750 855 6750 1350 6300 1350 6300 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 6750 855 7200 855 7200 1350 6750 1350 6750 855 -2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 7200 855 7650 855 7650 1350 7200 1350 7200 855 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 5850 855 6300 1350 6750 855 7200 1350 7650 855 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 - 5850 1350 6300 855 6750 1350 7200 855 7650 1350 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 3 - 450 855 900 1350 1215 855 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 3 - 450 1350 900 855 1215 1350 -2 1 2 1 0 7 0 0 -1 3.000 0 0 -1 0 0 2 - 1215 855 1215 1350 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 - 0 0 1.00 60.00 120.00 - 450 720 1215 720 -2 1 3 3 0 7 0 0 -1 3.000 0 0 -1 0 0 2 - 6030 855 6030 1350 -2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 1 2 - 0 0 1.00 60.00 120.00 - 0 0 1.00 60.00 120.00 - 1215 720 5850 720 -2 1 0 1 0 7 0 0 -1 3.000 0 0 -1 0 1 2 - 0 0 1.00 60.00 120.00 - 6030 720 7650 720 -2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 1 3 - 0 0 1.00 60.00 120.00 - 6300 1395 5670 2835 5985 2835 -2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 1 3 - 0 0 1.00 60.00 120.00 - 6750 1395 7425 2835 7155 2835 -4 0 0 0 0 0 12 0.0000 4 135 90 405 1570 0\001 -4 0 0 0 0 0 12 0.0000 4 135 90 2205 1570 4\001 -4 0 0 0 0 0 12 0.0000 4 135 90 4005 1570 8\001 -4 0 0 0 0 0 12 0.0000 4 135 180 5760 1570 12\001 -4 0 0 0 0 0 12 0.0000 4 135 180 7560 1570 16\001 -4 0 0 0 0 0 12 0.0000 4 135 450 585 585 queue\001 -4 0 0 0 0 0 12 0.0000 4 105 420 2925 585 count\001 -4 0 0 0 0 0 12 0.0000 4 135 450 6750 585 queue\001 -4 0 0 100 0 0 12 0.0000 4 180 765 180 1800 fragments\001 -4 0 0 100 0 0 12 0.0000 4 180 1080 6030 2880 fragment_size\001 diff --git a/doc/pcmbuf.gif b/doc/pcmbuf.gif deleted file mode 100644 index 68a4c3338a8faa3430fff9226224b3a4cc3e27c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1985 zcmV;y2R`^mNk%v~VebL10Du4h00030|Nkri0002*0j>Z50{)DTsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJ?hD8AOxN~}=lag~{tpZahs2`sh)gP%%%<}RjY_A~s`ZM^YPa03 z_X`e-$Kb83Vh_mAXdYz7++uszqUVmrccgMzOc;J^OsAwlgRahq|nHWjv zcnASm8ClpVxrzA(IX5}zNhvk@Ns7>^8Tz29>RCw(>oz;Nrfb!>8i=^~db_aaON&g5 zds^Ds+6F+rsL-KAiyA$OG^x_1Oq)7=3N@w#_CxNgUpEq1q0UO2!u>`e!%Y~Kj1cF~2~ zL9PSEixG2Re9f`nz=#r(f*h=H20)WBU$FI=7vacq~v8ax~JoJ?@7)}ljG z&Kb-$r?rh))AlVJxbD-aHzOYQSCzp&xo?mDrQ3A{Sr(`}cecDaapBdA8|Oa#EqLbI z2cy-lSb6s62Ge6#@rrHy@(R?y-=5g}aQv(O`S<_-8-2Z@7hZYt8MfYl36_8yZwRV$ zk8}clm*05gRfu7R08-f8T@BtB3xX5YMYqKYS?$l#7E8rWijFJ8AFjyBflWRy}udE+xe26^Od@Yt1PmoSb{4wpun zXqkRZR!JqAXQs(!cfy4^=9NT>>E(oQ)>&knKaxo#o@=&QpoUMnDd?1c5{j3cBl0-p zo=o29=$9fus3?8bIlAPMOa@9Lpci&}D5rx4Mros^>bdEuUurtnkXxQdXP=0IDypHO zemZKcYRO|E3m4*xNCLOac-)+Xy`ZpQYuEqsI( zWS3l-idSf}&XybPxy!0sA7?(kn`OJ~*)%T-;DWm&q`pc!Ex+bEh%T@FvTLg%%F+uj z!U-pO@Cn;?yGyLV`ulIgy9!+K!UF>gsx}%&Z1HO$YdbQS@DeLB!534@GR5iEyD`VP zs$7|`D5I<=&O++!@R6!6r`EX7y4*6+M$?>eyodIf?R<^y`7@tSr--M%*)csa(l3`> zwANk295dH0^JF!OWn+n|*;D6P>4Hv69qHC$dwn$BcFR07-fI3N@uF$Nc=mODQyn+5 zbAp|;(iqGAG2?3|{&$-0V*Z+~mX#0Av$f>z%cz}{TX;9(jz7M5>895WHoj29jP>8G zd&%m;Wj?52=K-G{`rNrUj{EM4*E&ksZy)?R?1jUf!tlfk%lp@&_x?Qex<~JP^SB;( zpSU1m&!Wt+*N!M?k!P*<%D$5>z4hm#kGit);cVZzm#Q28yx*S)SuW4nzV7;!w?DlA zs?UFIBNTGFRX+zMkUip)-&l^tEzQ-2eAENr?<{yh0v@k=8B`#{eAGZ^g;0bN9Mk=b zB%R5POlY91VEG{TKMihBhMCD1Z?F{}9Of{EB}~kV{!%Fx-VTG~8(j=vXv6|e=Z8Sd zL=&ADmlNV8EL5zb{uQr?#Vl%Zi&~_L7rzL`Fp6=EWITcp%ZSEvJQ0d%Y@;>S_^mO( zQI5Bmqa5uhjCA19UQ*;lAEEHaCyek6!7~qEST)E8QjkJ{bV4JWkjOIdkA&iRp8-$~enN-6jIeAJW6mK-K(;-3HL$y>E0TqXct3JISHJ#su!JqFVGoPgq6RjxgiHlvqq0~cJ{BR5n5<Yf=_ahtpOs{?oJks}GX1y8?ia$&2Mg^CJmMC7ziCYZg7|VFZG_J9Y TZ;ay{>v+dJ?y-+IPyhfsx&GwEaUsqYtP04OLC7Z-3iD2I5+h*%innCRH2 z7&$e0*@#yOiTMC%IY`<`3JNk>NqLFdBzj<)c*^J+iZD7mD@$mbp_NMi6g3q64f<|OWG^x_1Oq)7=3N@7NB8SdlDt6RIK{2I1o(WSL@ zJ$516ZQ5FL36;is0cl*7L&vs!9Qo|!%s2QZ9(lM$;K3pIPW^mKvBIaSLq}bFcXIKv zn=3Dm{(P^5+aYiFuDUz?`17d{S`2-DcIxT=jhpxH9BcoP*B^oSbQXVWRz zTQ_#`=NEqv0(f45xrIkyh8}*{;a?J7DBOr7nkZk24Xn3TiIG_do`o`ENMnr~j@O}$ zwc)s9ela?D;*2a>hvJMt23dtL?71l9kw|hkV2)DW$m4HSS~;L})hUS+eMUCPWSCE8 z;w6bgD)^&@J*tT%n{5VoC6pSb>7w9-j$L=%$=-MoDF%geuAx zo)tQ(C!~7@_vm3=2FazMldcKkl$`4Lsi$uqswO&1M*1au4WcUMsg_=ZrUvh^VvAHX5z8y1JO`E!lRtZKU05 zM=h+tZpmS&qV{?&y4Ow{?ylWvW*xjl&ifXGW0vR#3_CCyNr4G(IGQjN$oN>Up zb}Tcy!lGC*f;sCfZkRh?p|YkdpV@N393Ne?(MZ2+^UXREJucKmFW7UPK}RU5m{hmS z@6rMFMrLVc_=eNUne2T@NUHdg-@*J}6jIQqc-n>tK z`t`sUc_4*twl41SCpS;Tuk?z%vh~@o&p!3-yDzrs?}y)``SgQa?DNpSI_QY#cSbk) z!7qN1`moaQsrtbOM;b;2ltX1kB*;w6{T%Y4AJ!Gg;RV zQ$hTZiF4qv2nJOrx$PydgD_NJ^*Bf*7EU8Tp!r1)Z$rKz5GEp_YMv1VG`-<@aE1eH zV!|F%JGZoDh%Q`9`dY4t#Vl%Zi(KrY7rn@pFp6=EWGtf@&xpn}s&S2MY$I2wxDY$Q zF%42=!yG>r1i;iGh;S<*7|yXnHHdGCERY}__o%`#Ft7~ZyCDb{D91hCQ4EVD!#O4y z3{S9P5$jmRCRyh($ diff --git a/doc/pcmbuf1.ps b/doc/pcmbuf1.ps deleted file mode 100644 index 9193b220..00000000 --- a/doc/pcmbuf1.ps +++ /dev/null @@ -1,199 +0,0 @@ -%!PS-Adobe-2.0 -%%Title: done/pcmbuf1.ps -%%Creator: fig2dev Version 3.2 Patchlevel 1 -%%CreationDate: Mon Jan 11 04:04:40 1999 -%%For: emng@cyphyn.219.org (Fred Floberg,,,,) -%%Orientation: Portrait -%%BoundingBox: 42 358 570 433 -%%Pages: 1 -%%BeginSetup -%%IncludeFeature: *PageSize Letter -%%EndSetup -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def - -end -save -34.0 464.5 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def -%%EndProlog - -$F2psBegin -10 setmiterlimit -n -1000 2674 m -1000 -1000 l 9509 -1000 l 9509 2674 l cp clip - 0.06299 0.06299 sc -%%Page: 1 1 -/Times-Roman ff 180.00 scf sf -135 1620 m -gs 1 -1 sc (fragments) col0 sh gr -% Polyline -7.500 slw -n 1215 900 m 1665 900 l 1665 1395 l 1215 1395 l cp gs col0 s gr -% Polyline -n 1665 900 m 2115 900 l 2115 1395 l 1665 1395 l cp gs col0 s gr -% Polyline -n 2115 900 m 2565 900 l 2565 1395 l 2115 1395 l cp gs col0 s gr -% Polyline -n 2565 900 m 3015 900 l 3015 1395 l 2565 1395 l cp gs col0 s gr -% Polyline -n 3015 900 m 3465 900 l 3465 1395 l 3015 1395 l cp gs col0 s gr -% Polyline -n 3465 900 m 3915 900 l 3915 1395 l 3465 1395 l cp gs col0 s gr -% Polyline -n 3915 900 m 4365 900 l 4365 1395 l 3915 1395 l cp gs col0 s gr -% Polyline -n 4365 900 m 4815 900 l 4815 1395 l 4365 1395 l cp gs col0 s gr -% Polyline -n 4815 900 m 5265 900 l 5265 1395 l 4815 1395 l cp gs col0 s gr -% Polyline -n 5265 900 m 5715 900 l 5715 1395 l 5265 1395 l cp gs col0 s gr -% Polyline -n 5715 900 m 6165 900 l 6165 1395 l 5715 1395 l cp gs col0 s gr -% Polyline -n 6165 900 m 6615 900 l 6615 1395 l 6165 1395 l cp gs col0 s gr -% Polyline -n 6615 900 m 7065 900 l 7065 1395 l 6615 1395 l cp gs col0 s gr -% Polyline -n 7065 900 m 7515 900 l 7515 1395 l 7065 1395 l cp gs col0 s gr -% Polyline -n 7515 900 m 7965 900 l 7965 1395 l 7515 1395 l cp gs col0 s gr -% Polyline -n 7965 900 m 8415 900 l 8415 1395 l 7965 1395 l cp gs col0 s gr -% Polyline -n 6615 900 m 7065 1395 l 7515 900 l 7965 1395 l 8415 900 l gs col0 s gr -% Polyline -n 6615 1395 m 7065 900 l 7515 1395 l 7965 900 l 8415 1395 l gs col0 s gr -% Polyline -gs clippath -1860 735 m 1980 765 l 1860 795 l 1995 795 l 1995 735 l cp -clip -n 1215 765 m 1980 765 l gs col0 s gr gr - -% arrowhead -n 1860 735 m 1980 765 l 1860 795 l col0 s -% Polyline -gs clippath -6495 735 m 6615 765 l 6495 795 l 6630 795 l 6630 735 l cp -2280 795 m 2160 765 l 2280 735 l 2145 735 l 2145 795 l cp -clip -n 2160 765 m 6615 765 l gs col0 s gr gr - -% arrowhead -n 2280 795 m 2160 765 l 2280 735 l col0 s -% arrowhead -n 6495 735 m 6615 765 l 6495 795 l col0 s -% Polyline -gs clippath -6915 795 m 6795 765 l 6915 735 l 6780 735 l 6780 795 l cp -clip -n 6795 765 m 8415 765 l gs col0 s gr gr - -% arrowhead -n 6915 795 m 6795 765 l 6915 735 l col0 s -% Polyline - [45 22 15 22] 0 sd -n 1980 900 m 1980 1395 l gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 6795 900 m 6795 1395 l gs col0 s gr [] 0 sd -% Polyline -n 1215 900 m 1665 1395 l 1980 900 l gs col0 s gr -% Polyline -n 1215 1395 m 1665 900 l 1980 1395 l gs col0 s gr -/Times-Roman ff 180.00 scf sf -1170 1615 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman ff 180.00 scf sf -2970 1615 m -gs 1 -1 sc (4) col0 sh gr -/Times-Roman ff 180.00 scf sf -4770 1615 m -gs 1 -1 sc (8) col0 sh gr -/Times-Roman ff 180.00 scf sf -6525 1615 m -gs 1 -1 sc (12) col0 sh gr -/Times-Roman ff 180.00 scf sf -8325 1615 m -gs 1 -1 sc (16) col0 sh gr -/Times-Roman ff 180.00 scf sf -7515 630 m -gs 1 -1 sc (count) col0 sh gr -/Times-Roman ff 180.00 scf sf -1350 630 m -gs 1 -1 sc (count) col0 sh gr -/Times-Roman ff 180.00 scf sf -4095 630 m -gs 1 -1 sc (free) col0 sh gr -$F2psEnd -rs -showpage diff --git a/doc/plan.txt b/doc/plan.txt deleted file mode 100644 index ef6cd322..00000000 --- a/doc/plan.txt +++ /dev/null @@ -1,47 +0,0 @@ - - ALSA library plan - ================= - -===== -ST: Status of coding -NT: Note -RP: Responsible person - -This file is maintained by Jaroslav Kysela . -===== - - Library code - ============ - -1: Control interface routines - ST: Low-Level code done - RP: Jaroslav Kysela -1.1: Network layer -2: MIXER routines - ST: Low-Level code done - RP: Jaroslav Kysela -2.1: Network layer -3: PCM routines - ST: Low-Level code done - RP: Jaroslav Kysela -3.1: Network layer + mixing routines to allow playback more than one input - to one exclusive device -3.2: Player routines for digital data (.wav,.snd,.mp3 etc...) (???) -4: Instrument loading routines -4.1: Network layer -4.2: Instrument format interface -4.2.1: GF1 patches (.pat) -4.2.2: AMD FFFF -4.2.3: SoundFont (for SoundBlaster) -4.2.4: FM/OPL3 instrument formats -5: Raw FM/OPL3 interface -6: SYNTH interface -6.1: Network layer -6.2: player for .MOD,.S3M etc. (???) -7: Instrument server interface -8: Instrument configuration routines for MIDI -9: raw MIDI interface -9.1: Network layer -10: sequenced MIDI interface -10.1: Network layer -10.2: player for MIDI files -- 2.47.1