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:
+
+
+
+
+- /usr/include/sys/asoundlib.h
+
+
- /usr/include/linux/asound.h
+
+
- /usr/include/linux/asoundid.h
+
+
+
+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_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 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.
+
+
+
+
+
+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;
+
+
+
+
+
+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.
+
+
+
+
+
+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.
+
+
+
+
+
+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
-
-
-
-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:
-
-- /usr/include/sys/asoundlib.h
-- /usr/include/linux/asound.h
-- /usr/include/linux/asoundid.h
-
-
-
-
-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
-
-
-
-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_.
-
-
-
-
-
-- 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.
-
-
-
-
-
-
-
-
-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
-
-
-
-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.
-
-
-
-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.
-
-
-
-
-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
-
-
-
-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.
-
-
-
-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;
-
-
-
-
-
-
-
-
-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
-
-
-
-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.
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-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
-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.
-
-
-
-
-
-
-
-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:
-
- - /usr/include/sys/asoundlib.h
-
- /usr/include/linux/asound.h
-
- /usr/include/linux/asoundid.h
-
-
-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_.
-
-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.
-
-
-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.
-
-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.
-
-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.
-
-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( &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 );
-
-
-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.
-
-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;
-
-
-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( &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 );
-
-
-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.
-
-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( &ero;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( &ero;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.
-
-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( &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 );
-
-
-
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 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