From 104b86e839a453c8376550b4255eaed9673b0661 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 19 Jan 1999 15:31:59 +0000 Subject: [PATCH] New manual for 0.2.0 API.. --- doc/Makefile.am | 5 +- doc/alsa-lib.html | 3974 +++++++++++++++++++++ doc/alsa-lib.lyx | 9667 +++++++++++++++++++++++++++++++++++++++++++++++++++ doc/pcmbuf.gif | Bin 0 -> 1985 bytes doc/pcmbuf.ps | 222 ++ doc/pcmbuf1.gif | Bin 0 -> 1558 bytes doc/pcmbuf1.ps | 199 ++ doc/soundapi-1.html | 34 - doc/soundapi-2.html | 44 - doc/soundapi-3.html | 159 - doc/soundapi-4.html | 268 -- doc/soundapi-5.html | 552 --- doc/soundapi.html | 52 - doc/soundapi.sgml | 956 ----- doc/soundapi.txt | 1230 ------- 15 files changed, 14064 insertions(+), 3298 deletions(-) create mode 100644 doc/alsa-lib.html create mode 100644 doc/alsa-lib.lyx create mode 100644 doc/pcmbuf.gif create mode 100644 doc/pcmbuf.ps create mode 100644 doc/pcmbuf1.gif create mode 100644 doc/pcmbuf1.ps delete mode 100644 doc/soundapi-1.html delete mode 100644 doc/soundapi-2.html delete mode 100644 doc/soundapi-3.html delete mode 100644 doc/soundapi-4.html delete mode 100644 doc/soundapi-5.html delete mode 100644 doc/soundapi.html delete mode 100644 doc/soundapi.sgml delete mode 100644 doc/soundapi.txt diff --git a/doc/Makefile.am b/doc/Makefile.am index ca4259e5..61d89c11 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -1,5 +1,4 @@ -EXTRA_DIST=plan.txt soundapi.txt soundapi.sgml \ - soundapi.html soundapi-1.html soundapi-2.html \ - soundapi-3.html soundapi-4.html soundapi-5.html +EXTRA_DIST=plan.txt alsa-lib.lyx alsa-lib.html \ + pcmbuf.ps pcmbuf.gif pcmbuf1.ps pcmbuf1.gif INCLUDES=-I$(top_srcdir)/include diff --git a/doc/alsa-lib.html b/doc/alsa-lib.html new file mode 100644 index 00000000..74ecd16d --- /dev/null +++ b/doc/alsa-lib.html @@ -0,0 +1,3974 @@ + + + + + + Advanced Linux Sound Architecture - Library API + +

Advanced Linux Sound Architecture - Library API

+ +

+ +

Jaroslav Kysela <perex@jcu.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 new file mode 100644 index 00000000..705943fe --- /dev/null +++ b/doc/alsa-lib.lyx @@ -0,0 +1,9667 @@ +#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.gif b/doc/pcmbuf.gif new file mode 100644 index 0000000000000000000000000000000000000000..68a4c3338a8faa3430fff9226224b3a4cc3e27c7 GIT binary patch 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($ literal 0 HcmV?d00001 diff --git a/doc/pcmbuf1.ps b/doc/pcmbuf1.ps new file mode 100644 index 00000000..9193b220 --- /dev/null +++ b/doc/pcmbuf1.ps @@ -0,0 +1,199 @@ +%!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/soundapi-1.html b/doc/soundapi-1.html deleted file mode 100644 index 71da2b89..00000000 --- a/doc/soundapi-1.html +++ /dev/null @@ -1,34 +0,0 @@ - - -Advanced Linux Sound Architecture - Library API: Introduction - - -Previous -Next -Table of Contents -
-

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 next -major improvements in usability, making the application code simpler and -better looking. In addition, some of the some fixes/compatibility code in, -may be placed in the library code instead of the kernel driver.

-

For a complete list of all variables and functions in the API you should look -at the following header files: -

    -
  1. /usr/include/sys/asoundlib.h
  2. -
  3. /usr/include/linux/asound.h
  4. -
  5. /usr/include/linux/asoundid.h
  6. -
-

- -
-Previous -Next -Table of Contents - - diff --git a/doc/soundapi-2.html b/doc/soundapi-2.html deleted file mode 100644 index 5c743b1e..00000000 --- a/doc/soundapi-2.html +++ /dev/null @@ -1,44 +0,0 @@ - - -Advanced Linux Sound Architecture - Library API: Error Codes - - -Previous -Next -Table of Contents -
-

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

- -

2.1 Error Codes in Detail

- -

-

-
SND_ERROR_UNCOMPATIBLE_VERSION (500000)

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 functions converts error code to a string. Its functionality is the same -as the strerror function from the standard C library, but this -function returns correct strings for sound error codes, too.

- - -
-Previous -Next -Table of Contents - - diff --git a/doc/soundapi-3.html b/doc/soundapi-3.html deleted file mode 100644 index 47daa30d..00000000 --- a/doc/soundapi-3.html +++ /dev/null @@ -1,159 +0,0 @@ - - -Advanced Linux Sound Architecture - Library API: Control Interface - - -Previous -Next -Table of Contents -
-

3. Control Interface

- -

The control interfaces gives application various information about the -currently installed sound driver in the system. The interface should be used -to detect if another sound interface is present for selected soundcard or, -for example, to create a list of devices (MIXER, PCM etc) from which -the user can select.

- -

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. Otherwise -it returns a negative value, which maps to an error code. This function -will return 0 if no soundcards are detected. First soundcard is represented -with bit 0.

- -

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

- -

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

- -

int snd_ctl_file_descriptor( void *handle )

- -

Function returns file descriptor for the kernel sound control interface. -This function should be used in very special cases. Function returns -a negative error code if some error was encountered.

- -

int snd_ctl_hw_info( void *handle, struct snd_ctl_hw_info *info )

- -

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


-
-  #define SND_CTL_GCAPS_MIDI              0x0000001       /* driver has MIDI interface */
-
-  #define SND_CTL_LCAPS_SYNTH             0x0000001       /* soundcard has synthesizer */
-  #define SND_CTL_LCAPS_RAWFM             0x0000002       /* soundcard has RAW FM/OPL3 */
-
-  struct snd_ctl_hw_info {
-    unsigned int type;            /* type of card - see SND_CARD_TYPE_XXXX */
-    unsigned int gcaps;           /* see SND_CTL_GCAPS_XXXX */
-    unsigned int lcaps;           /* see SND_CTL_LCAPS_XXXX */
-    unsigned int pcmdevs;         /* count of PCM devices (0 to N) */
-    unsigned int mixerdevs;       /* count of MIXER devices (0 to N) */
-    unsigned int mididevs;        /* count of raw MIDI devices (0 to N) */
-    char id[8];                   /* ID of card (user selectable) */
-    char name[80];                /* name/info text about soundcard */
-    unsigned char reserved[128];  /* reserved for future use */
-  };
-  
-
-
-

- -

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 -soundcard 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 soundcard 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_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 soundcard 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_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 found from -struct snd_ctl_hw_info -> mixerdevs - 1. -It should be used to collect information about mixer devices.

- - -

3.2 Examples

- -

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

-

-

-
-
-int card = 0, err;
-void *handle;
-stuct snd_ctl_hw_info info;
-
-if ( (err = snd_ctl_open( &handle, card )) < 0 ) {
-  fprintf( stderr, "open failed: %s\n", snd_strerror( err ) );
-  return;
-}
-if ( (err = snd_ctl_hw_info( handle, &info )) < 0 ) {
-  fprintf( stderr, "hw info failed: %s\n", snd_strerror( err ) );
-  snd_ctl_close( handle );
-  return;
-}
-printf( "Installed PCM devices for card #i: %i\n", card + 1, info.pcmdevs );
-snd_ctl_close( handle );
-
-
-
-

- - -
-Previous -Next -Table of Contents - - diff --git a/doc/soundapi-4.html b/doc/soundapi-4.html deleted file mode 100644 index 719315e7..00000000 --- a/doc/soundapi-4.html +++ /dev/null @@ -1,268 +0,0 @@ - - -Advanced Linux Sound Architecture - Library API: Mixer Interface - - -Previous -Next -Table of Contents -
-

4. Mixer Interface

- -

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

- -

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

- -

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


-
-  #define SND_MIXER_INFO_CAP_EXCL_RECORD  0x00000001
-
-  struct snd_mixer_info {
-    unsigned int type;            /* type of soundcard - SND_CARD_TYPE_XXXX */
-    unsigned int channels;        /* count of mixer devices */
-    unsigned int caps;            /* some flags about this device (SND_MIXER_INFO_CAP_XXXX) */
-    unsigned char id[32];         /* ID of this mixer */
-    unsigned char name[80];       /* name of this device */
-    char reserved[ 32 ];          /* reserved for future use */
-  };
-  
-
-
-

- -

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


-
-  #define SND_MIXER_ID_MASTER             "Master"
-  #define SND_MIXER_ID_BASS               "Bass"
-  #define SND_MIXER_ID_TREBLE             "Treble"
-  #define SND_MIXER_ID_SYNTHESIZER        "Synth"
-  #define SND_MIXER_ID_SYNTHESIZER1       "Synth 1"
-  #define SND_MIXER_ID_FM                 "FM"
-  #define SND_MIXER_ID_EFFECT             "Effect"
-  #define SND_MIXER_ID_PCM                "PCM"
-  #define SND_MIXER_ID_PCM1               "PCM 1"
-  #define SND_MIXER_ID_LINE               "Line-In"
-  #define SND_MIXER_ID_MIC                "MIC"
-  #define SND_MIXER_ID_CD                 "CD"
-  #define SND_MIXER_ID_GAIN               "Record-Gain"
-  #define SND_MIXER_ID_IGAIN              "In-Gain"
-  #define SND_MIXER_ID_OGAIN              "Out-Gain"
-  #define SND_MIXER_ID_LOOPBACK           "Loopback"
-  #define SND_MIXER_ID_SPEAKER            "PC Speaker"
-  #define SND_MIXER_ID_AUXA               "Aux A"
-  #define SND_MIXER_ID_AUXB               "Aux B"
-  #define SND_MIXER_ID_AUXC               "Aux C"
-  
-
-
-

- -

int snd_mixer_exact_mode( void *handle, int enable )

- -

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

- -

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


-
-  #define SND_MIXER_CINFO_CAP_RECORD      0x00000001
-  #define SND_MIXER_CINFO_CAP_STEREO      0x00000002
-  #define SND_MIXER_CINFO_CAP_MUTE        0x00000004
-  #define SND_MIXER_CINFO_CAP_HWMUTE      0x00000008      /* channel supports hardware mute */
-  #define SND_MIXER_CINFO_CAP_DIGITAL     0x00000010      /* channel does digital (not analog) mixing */
-  #define SND_MIXER_CINOF_CAP_INPUT       0x00000020      /* input channel */
-
-  struct snd_mixer_channel_info {
-    unsigned int channel;         /* channel # (filled by application) */
-    unsigned int parent;          /* parent channel # or SND_MIXER_PARENT */
-    unsigned char name[12];       /* name of this device */
-    unsigned int caps;            /* some flags about this device (SND_MIXER_CINFO_XXXX) */
-    int min;                      /* min. value when exact mode (or always 0) */
-    int max;                      /* max. value when exact mode (or always 100) */
-    int min_dB;                   /* minimum decibel value (*100) */
-    int max_dB;                   /* maximum decibel value (*100) */
-    int step_dB;                  /* step decibel value (*100) */
-    unsigned char reserved[16];
-  };
-  
-
-
-

- -

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


-
-  #define SND_MIXER_FLG_RECORD            0x00000001      /* channel record source flag */
-  #define SND_MIXER_FLG_MUTE_LEFT         0x00010000
-  #define SND_MIXER_FLG_MUTE_RIGHT        0x00020000
-  #define SND_MIXER_FLG_MUTE              0x00030000
-  #define SND_MIXER_FLG_DECIBEL           0x40000000
-  #define SND_MIXER_FLG_FORCE             0x80000000
-
-  struct snd_mixer_channel {
-    unsigned int channel;         /* channel # (filled by application) */
-    unsigned int flags;           /* some flags to read/write (SND_MIXER_FLG_XXXX) */
-    int left;                     /* min - max when exact mode (or 0 - 100) */
-    int right;                    /* min - max when exact mode (or 0 - 100) */
-    int left_dB;                  /* dB * 100 */
-    int right_dB;                 /* dB * 100 */
-    unsigned char reserved[16];
-  };
-  
-
-
-

-

-

-
SND_MIXER_FLG_RECORD

Record source flag.

-
SND_MIXER_FLG_DECIBEL

If this bit is set, driver set volume from dB variables left_dB -and right_dB.

-
SND_MIXER_FLG_FORCE

Force set - this bit shouldn't be used from user space. Reserved for -kernel.

-
-

- -

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_special_read( void *handle, snd_mixer_special_t *special )

- -

Not documented...

- -

int snd_mixer_special_write( void *handle, snd_mixer_special_t *special )

- -

Not documented...

- -

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 {
-    void *private_data;           /* should be used by application */
-    void (*channel_was_changed)( void *private_data, int channel );
-    void *reserved[15];           /* reserved for future use - must be NULL!!! */
-  } snd_mixer_callbacks_t;
-  
-
-
-

- - -

4.2 Examples

- -

The following example shows installed mixer channels for soundcard #0 and -mixer device #0 in the system, and also sets the master volume (if present) -to 50.

-

-

-
-
-int card = 0, device = 0, err;
-void *handle;
-snd_mixer_info_t info;
-snd_mixer_channel_t channel;
-
-if ( (err = snd_mixer_open( &handle, card, device )) < 0 ) {
-  fprintf( stderr, "open failed: %s\n", snd_strerror( err ) );
-  return;
-}
-if ( (err = snd_mixer_info( handle, &info )) < 0 ) {
-  fprintf( stderr, "info failed: %s\n", snd_strerror( err ) );
-  snd_mixer_close( handle );
-  return;
-}
-printf( "Installed MIXER channels for card #i and device %i: %i\n",
-                                        card + 1, device, info.channels );
-master = snd_mixer_channel( handle, SND_MIXER_ID_MASTER );
-if ( master >= 0 ) {
-  if ( (err = snd_mixer_read( handle, master, &channel )) < 0 ) {
-    fprintf( stderr, "master read failed: %s\n", snd_strerror( err ) );
-    snd_mixer_close( handle );
-    return;
-  }
-  channel -> left = channel -> right = 50;
-  if ( (err = snd_mixer_write( handle, master, &channel )) < 0 ) {
-    fprintf( stderr, "master write failed: %s\n", snd_strerror( err ) );
-    snd_mixer_close( handle );
-    return;
-  }
-}
-snd_mixer_close( handle );
-
-
-
-

- - -
-Previous -Next -Table of Contents - - diff --git a/doc/soundapi-5.html b/doc/soundapi-5.html deleted file mode 100644 index 0701b7df..00000000 --- a/doc/soundapi-5.html +++ /dev/null @@ -1,552 +0,0 @@ - - -Advanced Linux Sound Architecture - Library API: Digital Audio (PCM) Interface - - -Previous -Next -Table of Contents -
-

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 than can be stored. It is well known (Nyquist's -Sampling Theorem) that the highest frequency that can be stored in a sampled -signal is at most 1/2 of the sampling frequency. For example, a 8 kHz sampling -rate permits the recording of a signal in which the highest frequency is less -than 4 kHz. Higher frequency signals must be filtered out before feeding them -to DAC.

-

Sample encoding limits the dynamic range of recorded signal (difference between -the faintest and the loudest signal that can be recorded). In theory the -maximum dynamic range of signal is number_of_bits * 6 dB . This means that -8 bits sampling resolution gives dynamic range of 48 dB and 16 bit resolution -gives 96 dB.

-

Quality has price. The number of bytes required to store an audio sequence -depends on sampling rate, number of channels and sampling resolution. For -example just 8000 bytes of memory is required to store one second of sound -using 8 kHz/8 bits/mono but 48 kHz/16bit/stereo takes 192 kilobytes. A 64 kbps -ISDN channel is required to transfer a 8kHz/8bit/mono audio stream in real -time, and about 1.5 Mbps is required for DAT quality (48kHz/16bit/stereo). -On the other hand it is possible to store just 5.46 seconds of sound in -a megabyte of memory when using 48kHz/16bit/stereo sampling. With -8kHz/8bits/mono it is possible to store 131 seconds of sound using the same -amount of memory. It is possible to reduce memory and communication costs by -compressing the recorded signal but this is out of the scope of this document.

- -

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

-
-
-#define SND_PCM_SFMT_MU_LAW             0
-#define SND_PCM_SFMT_A_LAW              1
-#define SND_PCM_SFMT_IMA_ADPCM          2
-#define SND_PCM_SFMT_U8                 3
-#define SND_PCM_SFMT_S16_LE             4
-#define SND_PCM_SFMT_S16_BE             5
-#define SND_PCM_SFMT_S8                 6
-#define SND_PCM_SFMT_U16_LE             7
-#define SND_PCM_SFMT_U16_BE             8
-#define SND_PCM_SFMT_MPEG               9
-#define SND_PCM_SFMT_GSM                10
-
-#define SND_PCM_FMT_MU_LAW              (1 << SND_PCM_SFMT_MU_LAW)
-#define SND_PCM_FMT_A_LAW               (1 << SND_PCM_SFMT_A_LAW)
-#define SND_PCM_FMT_IMA_ADPCM           (1 << SND_PCM_SFMT_IMA_ADPCM)
-#define SND_PCM_FMT_U8                  (1 << SND_PCM_SFMT_U8)
-#define SND_PCM_FMT_S16_LE              (1 << SND_PCM_SFMT_S16_LE)
-#define SND_PCM_FMT_S16_BE              (1 << SND_PCM_SFMT_S16_BE)
-#define SND_PCM_FMT_S8                  (1 << SND_PCM_SFMT_S8)
-#define SND_PCM_FMT_U16_LE              (1 << SND_PCM_SFMT_U16_LE)
-#define SND_PCM_FMT_U16_BE              (1 << SND_PCM_SFMT_U16_BE)
-#define SND_PCM_FMT_MPEG                (1 << SND_PCM_SFMT_MPEG)
-#define SND_PCM_FMT_GSM                 (1 << SND_PCM_SFMT_GSM)
-
-
-
- -Constants with prefix SND_PCM_FMT_ are used in info structures -and constants with prefix SND_PCM_SFMT_ are used in format structures.

- -

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

- -

Creates a new handle and opens a connection to kernel sound -audio interface for soundcard 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,ful otherwise it returns an error code. -Error code -EBUSY is returned when some process ownes the selected direction.

-

Default format after opening is mono 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 synchronous -multiplexer function for setting the read direction. Application should -call snd_pcm_read or snd_pcm_write functions if some -data is waiting for reading or a write can be performed. Calling this -function is highly recomended, as it leaves a place for the API to things -like data conversions, if needed.

- -

int snd_pcm_block_mode( void *handle, int enable )

- -

Sets up block (default) or nonblock 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 entire buffer. In nonblock mode, programs aren't suspended and -the above functions returns immediately with the count of bytes which were -read or written by the driver. When used in this way, don't try to use the -entire buffer after the call, but instead process the number of bytes -returned, and call the function again.

- -

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


-
-  #define SND_PCM_INFO_CODEC              0x00000001
-  #define SND_PCM_INFO_DSP                SND_PCM_INFO_CODEC
-  #define SND_PCM_INFO_MMAP               0x00000002      /* reserved */
-  #define SND_PCM_INFO_PLAYBACK           0x00000100
-  #define SND_PCM_INFO_RECORD             0x00000200
-  #define SND_PCM_INFO_DUPLEX             0x00000400
-  #define SND_PCM_INFO_DUPLEX_LIMIT       0x00000800      /* rate for playback & record are same */
-
-  struct snd_pcm_info {
-    unsigned int type;                    /* soundcard type */
-    unsigned int flags;                   /* see SND_PCM_INFO_XXXX */
-    unsigned char id[32];                 /* ID of this PCM device */
-    unsigned char name[80];               /* name of this device */
-    unsigned char reserved[64];           /* reserved for future use */
-  };
-  
-
-
- -
-
SND_PCM_INFO_MMAP

This flag is reserved and should be never used. It remains for -compatibility with Open Sound System driver.

-
SND_PCM_INFO_DUPLEX_LIMIT

If this bit is set, rate must be same for playback and record direction.

-
-

- -

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 {
-    unsigned int flags;                   /* see SND_PCM_PINFO_XXXX */
-    unsigned int formats;                 /* supported formats */
-    unsigned int min_rate;                /* min rate (in Hz) */
-    unsigned int max_rate;                /* max rate (in Hz) */
-    unsigned int min_channels;            /* min channels (probably always 1) */
-    unsigned int max_channels;            /* max channels */
-    unsigned int buffer_size;             /* playback buffer size */
-    unsigned int min_fragment_size;       /* min fragment size in bytes */
-    unsigned int max_fragment_size;       /* max fragment size in bytes */
-    unsigned int fragment_align;          /* align fragment value */
-    unsigned char reserved[64];           /* reserved for future use */
-  };
-  
-
-
- -
-
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 should 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 -soundcards which can't do full 16-bit duplex. If this bit is set -application or highter digital audio layer should do the conversion from -16-bit samples to 8-bit samples rather than making the driver to do it in -the kernel.

-
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 -soundcards which can't do full 8-bit duplex. If this bit is set the -application or highter digital audio layer should do conversion from -8-bit samples to 16-bit samples rather than making the driver to do it in -the kernel.

-
-

- -

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
-
-  struct snd_pcm_record_info {
-    unsigned int flags;                   /* see to SND_PCM_RINFO_XXXX */
-    unsigned int formats;                 /* supported formats */
-    unsigned int min_rate;                /* min rate (in Hz) */
-    unsigned int max_rate;                /* max rate (in Hz) */
-    unsigned int min_channels;            /* min channels (probably always 1) */
-    unsigned int max_channels;            /* max channels */
-    unsigned int buffer_size;             /* record buffer size */
-    unsigned int min_fragment_size;       /* min fragment size in bytes */
-    unsigned int max_fragment_size;       /* max fragment size in bytes */
-    unsigned int fragment_align;          /* align fragment value */
-    unsigned char reserved[64];           /* reserved for future... */
-  };
-  
-
-
- -
-
SND_PCM_PINFO_BATCH

Driver implements buffering for this device. This means that -the chip used for data processing has its own memory and output should be -more delayed than if a traditional codec chip is used.

-
SND_PCM_PINFO_8BITONLY

If this bit is set, the device uses 8-bit format for 16-bit samples and -does software conversion. This bit is set on broken SoundBlaster 16/AWE -soundcards which can't do full 16-bit duplex. If this bit is set the -application or highter digital audio layer should do conversion from -16-bit samples to 8-bit samples rather than making the driver to do it in -the kernel.

-
SND_PCM_PINFO_16BITONLY

If this bit is set, the device uses a 16-bit format for 8-bit samples and -does software conversion. This bit is set on broken SoundBlaster 16/AWE -soundcards which can't do full 8-bit duplex. If this bit is set the -application or highter digital audio layer should do the conversion from -8-bit samples to 16-bit samples rather than making the driver to do it in -the kernel.

-
-

- -

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;
-    unsigned char reserved[16];           /* must be filled with zero */
-  };
-  
-
-
- -
-
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 -counts partly used fragment. If current count of filled playback fragments -is greater than this value driver block application or return immediately -back if nonblock mode is active.

-
fragments_room

Minumum number of fragments writeable for wakeup. This value should be -in most cases 1 which means return back to application if at least -one fragment is free for playback. This value includes partly used fragments, -too.

-
-

- -

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;
-    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 it isn't filled with 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;
-    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 writeable 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 ast call -of snd_pcm_playback_status.

-
time

Delay till played of the first sample from next write. This value should -be used for time synchronization. Returned value is in the same format as -returned from the standard C function gettimeofday( &time, NULL ). -This variable contains right value only if playback time mode is enabled -(look to snd_pcm_playback_time function).

-
stime

Time when playback was started. -This variable contains right value only if playback time mode is enabled -(look to snd_pcm_playback_time function).

-
-

- -

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

Lag since the next sample read was recorded. This value should be used for time -synchronization. Returned value is in the same format as returned by the -from standard C function gettimeofday( &time, NULL ). This -variable contains right value only if record time mode is enabled (look to -snd_pcm_record_time function).

-
stime

Time when record was started. This variable contains right value only if -record time mode is enabled (look to snd_pcm_record_time function).

-
-

- -

int snd_pcm_drain_playback( void *handle )

- -

This function drain 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 (destroyes) record buffers. 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 playback direction. Time mode -allows to application better time synchronization. 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 -allows to application better time synchronization. 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 was successfuly written to device) or an -error value if error occured. Function should 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 successfuly read from device) or negative error value if -error occured. Function should suspend process if block mode is active.

- - -

5.2 Examples

- -

The following example shows how to play the first 512kB from the -/tmp/test.au file with soundcard #0 and PCM device #0:

-

-

-
-
-int card = 0, device = 0, err, fd, count, size, idx;
-void *handle;
-snd_pcm_format_t format;
-char *buffer;
-
-buffer = (char *)malloc( 512 * 1024 );
-if ( !buffer ) return;
-if ( (err = snd_pcm_open( &handle, card, device, SND_PCM_OPEN_PLAYBACK )) < 0 ) {
-  fprintf( stderr, "open failed: %s\n", snd_strerror( err ) );
-  return;
-}
-format.format = SND_PCM_SFMT_MU_LAW;
-format.rate = 8000;
-format.channels = 1;
-if ( (err = snd_pcm_playback_format( handle, &format )) < 0 ) {
-  fprintf( stderr, "format setup failed: %s\n", snd_strerror( err ) );
-  snd_pcm_close( handle );
-  return;
-}
-fd = open( "/tmp/test.au", O_RDONLY );
-if ( fd < 0 ) {
-  perror( "open file" );
-  snd_pcm_close( handle );
-  return;
-}
-idx = 0;
-count = read( fd, buffer, 512 * 1024 );
-if ( count <= 0 ) {
-  perror( "read from file" );
-  snd_pcm_close( handle );
-  return;
-}
-close( fd );
-if ( !memcmp( buffer, ".snd", 4 ) ) {
-  idx = (buffer[4]<<24)|(buffer[5]<<16)|(buffer[6]<<8)|(buffer[7]);
-  if ( idx > 128 ) idx = 128;
-  if ( idx > count ) idx = count;
-}
-size = snd_pcm_write( handle, &buffer[ idx ], count - idx );
-printf( "Bytes written %i from %i...\n", size, count - idx );
-snd_pcm_close( handle );
-free( buffer );
-
-
-
-

- - -
-Previous -Next -Table of Contents - - diff --git a/doc/soundapi.html b/doc/soundapi.html deleted file mode 100644 index ac5edcd4..00000000 --- a/doc/soundapi.html +++ /dev/null @@ -1,52 +0,0 @@ - - - -Advanced Linux Sound Architecture - Library API - - -Previous -Next -Table of Contents -
-

Advanced Linux Sound Architecture - Library API

- -

Jaroslav Kysela <perex@jcu.cz> with assistance from Alan Robinson

v0.0.3, 25 March 1998 -


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

-

-

1. Introduction

- -

-

2. Error Codes

- - -

-

3. Control Interface

- - -

-

4. Mixer Interface

- - -

-

5. Digital Audio (PCM) Interface

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