mirror of
				https://github.com/alsa-project/alsa-lib.git
				synced 2025-10-29 05:40:25 -04:00 
			
		
		
		
	Added initial comments for PCM plugins
This commit is contained in:
		
							parent
							
								
									6ead410b11
								
							
						
					
					
						commit
						a24b602f28
					
				
					 11 changed files with 796 additions and 28 deletions
				
			
		|  | @ -42,8 +42,16 @@ INPUT            = index.doxygen \ | ||||||
| 		   ../src/pcm/pcm_linear.c \ | 		   ../src/pcm/pcm_linear.c \ | ||||||
| 		   ../src/pcm/pcm_lfloat.c \ | 		   ../src/pcm/pcm_lfloat.c \ | ||||||
| 		   ../src/pcm/pcm_mulaw.c \ | 		   ../src/pcm/pcm_mulaw.c \ | ||||||
|  | 		   ../src/pcm/pcm_alaw.c \ | ||||||
|  | 		   ../src/pcm/pcm_adpcm.c \ | ||||||
|  | 		   ../src/pcm/pcm_route.c \ | ||||||
|  | 		   ../src/pcm/pcm_plug.c \ | ||||||
|  | 		   ../src/pcm/pcm_file.c \ | ||||||
|  | 		   ../src/pcm/pcm_multi.c \ | ||||||
|  | 		   ../src/pcm/pcm_share.c \ | ||||||
| 		   ../src/pcm/pcm_hooks.c \ | 		   ../src/pcm/pcm_hooks.c \ | ||||||
| 		   ../src/pcm/pcm_meter.c \ | 		   ../src/pcm/pcm_meter.c \ | ||||||
|  | 		   ../src/pcm/pcm_ladspa.c \ | ||||||
| 		   ../src/pcm/pcm_misc.c \ | 		   ../src/pcm/pcm_misc.c \ | ||||||
| 		   ../src/rawmidi \ | 		   ../src/rawmidi \ | ||||||
| 		   ../src/timer \ | 		   ../src/timer \ | ||||||
|  |  | ||||||
|  | @ -1,5 +1,14 @@ | ||||||
|  | /**
 | ||||||
|  |  * \file pcm/pcm_adpcm.c | ||||||
|  |  * \ingroup PCM_Plugins | ||||||
|  |  * \brief PCM Ima-ADPCM Conversion Plugin Interface | ||||||
|  |  * \author Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  |  * \author Uros Bizjak <uros@kss-loka.si> | ||||||
|  |  * \author Jaroslav Kysela <perex@suse.cz> | ||||||
|  |  * \date 2000-2001 | ||||||
|  |  */ | ||||||
| /*
 | /*
 | ||||||
|  *  PCM - Ima-ADPC conversion |  *  PCM - Ima-ADPCM conversion | ||||||
|  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> |  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  *  Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si> |  *  Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si> | ||||||
|  *                        Jaroslav Kysela <perex@suse.cz> |  *                        Jaroslav Kysela <perex@suse.cz> | ||||||
|  | @ -56,6 +65,8 @@ IMA compatability project proceedings, Vol 2, Issue 2, May 1992. | ||||||
| const char *_snd_module_pcm_adpcm = ""; | const char *_snd_module_pcm_adpcm = ""; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
|  | 
 | ||||||
| typedef void (*adpcm_f)(const snd_pcm_channel_area_t *dst_areas, | typedef void (*adpcm_f)(const snd_pcm_channel_area_t *dst_areas, | ||||||
| 			snd_pcm_uframes_t dst_offset, | 			snd_pcm_uframes_t dst_offset, | ||||||
| 			const snd_pcm_channel_area_t *src_areas, | 			const snd_pcm_channel_area_t *src_areas, | ||||||
|  | @ -73,6 +84,8 @@ typedef struct { | ||||||
| 	snd_pcm_adpcm_state_t *states; | 	snd_pcm_adpcm_state_t *states; | ||||||
| } snd_pcm_adpcm_t; | } snd_pcm_adpcm_t; | ||||||
| 
 | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| /* First table lookup for Ima-ADPCM quantizer */ | /* First table lookup for Ima-ADPCM quantizer */ | ||||||
| static char IndexAdjust[8] = { -1, -1, -1, -1, 2, 4, 6, 8 }; | static char IndexAdjust[8] = { -1, -1, -1, -1, 2, 4, 6, 8 }; | ||||||
| 
 | 
 | ||||||
|  | @ -196,6 +209,8 @@ static int adpcm_decoder(unsigned char code, snd_pcm_adpcm_state_t * state) | ||||||
| 	return (state->pred_val); | 	return (state->pred_val); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
|  | 
 | ||||||
| void snd_pcm_adpcm_decode(const snd_pcm_channel_area_t *dst_areas, | void snd_pcm_adpcm_decode(const snd_pcm_channel_area_t *dst_areas, | ||||||
| 			  snd_pcm_uframes_t dst_offset, | 			  snd_pcm_uframes_t dst_offset, | ||||||
| 			  const snd_pcm_channel_area_t *src_areas, | 			  const snd_pcm_channel_area_t *src_areas, | ||||||
|  | @ -302,6 +317,8 @@ void snd_pcm_adpcm_encode(const snd_pcm_channel_area_t *dst_areas, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| static int snd_pcm_adpcm_hw_refine_cprepare(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) | static int snd_pcm_adpcm_hw_refine_cprepare(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) | ||||||
| { | { | ||||||
| 	snd_pcm_adpcm_t *adpcm = pcm->private_data; | 	snd_pcm_adpcm_t *adpcm = pcm->private_data; | ||||||
|  | @ -495,7 +512,7 @@ static void snd_pcm_adpcm_dump(snd_pcm_t *pcm, snd_output_t *out) | ||||||
| 	snd_pcm_dump(adpcm->plug.slave, out); | 	snd_pcm_dump(adpcm->plug.slave, out); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| snd_pcm_ops_t snd_pcm_adpcm_ops = { | static snd_pcm_ops_t snd_pcm_adpcm_ops = { | ||||||
| 	close: snd_pcm_plugin_close, | 	close: snd_pcm_plugin_close, | ||||||
| 	info: snd_pcm_plugin_info, | 	info: snd_pcm_plugin_info, | ||||||
| 	hw_refine: snd_pcm_adpcm_hw_refine, | 	hw_refine: snd_pcm_adpcm_hw_refine, | ||||||
|  | @ -510,6 +527,18 @@ snd_pcm_ops_t snd_pcm_adpcm_ops = { | ||||||
| 	munmap: snd_pcm_plugin_munmap, | 	munmap: snd_pcm_plugin_munmap, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new Ima-ADPCM conversion PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param sformat Slave (destination) format | ||||||
|  |  * \param slave Slave PCM handle | ||||||
|  |  * \param close_slave When set, the slave PCM handle is closed with copy PCM | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int snd_pcm_adpcm_open(snd_pcm_t **pcmp, const char *name, snd_pcm_format_t sformat, snd_pcm_t *slave, int close_slave) | int snd_pcm_adpcm_open(snd_pcm_t **pcmp, const char *name, snd_pcm_format_t sformat, snd_pcm_t *slave, int close_slave) | ||||||
| { | { | ||||||
| 	snd_pcm_t *pcm; | 	snd_pcm_t *pcm; | ||||||
|  | @ -546,6 +575,49 @@ int snd_pcm_adpcm_open(snd_pcm_t **pcmp, const char *name, snd_pcm_format_t sfor | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*! \page pcm_plugins
 | ||||||
|  | 
 | ||||||
|  | \section pcm_plugins_adpcm Plugin: Ima-ADPCM | ||||||
|  | 
 | ||||||
|  | This plugin converts Ima-ADPCM samples to linear or linear to Mu-Law samples | ||||||
|  | from master Ima-ADPCM conversion PCM to given slave PCM. The channel count, | ||||||
|  | format and rate must match for both of them. | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm.name { | ||||||
|  |         type adpcm              # Ima-ADPCM conversion PCM | ||||||
|  |         slave STR               # Slave name | ||||||
|  |         # or | ||||||
|  |         slave {                 # Slave definition | ||||||
|  |                 pcm STR         # Slave PCM name | ||||||
|  |                 # or | ||||||
|  |                 pcm { }         # Slave PCM definition | ||||||
|  |         } | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | \subsection pcm_plugins_adpcm_funcref Function reference | ||||||
|  | 
 | ||||||
|  | <UL> | ||||||
|  |   <LI>snd_pcm_adpcm_open() | ||||||
|  |   <LI>_snd_pcm_adpcm_open() | ||||||
|  | </UL> | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new Ima-ADPCM conversion PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param root Root configuration node | ||||||
|  |  * \param conf Configuration node with copy PCM description | ||||||
|  |  * \param stream Stream type | ||||||
|  |  * \param mode Stream mode | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int _snd_pcm_adpcm_open(snd_pcm_t **pcmp, const char *name, | int _snd_pcm_adpcm_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 			snd_config_t *root, snd_config_t *conf,  | 			snd_config_t *root, snd_config_t *conf,  | ||||||
| 			snd_pcm_stream_t stream, int mode) | 			snd_pcm_stream_t stream, int mode) | ||||||
|  | @ -592,4 +664,6 @@ int _snd_pcm_adpcm_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 		snd_pcm_close(spcm); | 		snd_pcm_close(spcm); | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
| SND_DLSYM_BUILD_VERSION(_snd_pcm_adpcm_open, SND_PCM_DLSYM_VERSION); | SND_DLSYM_BUILD_VERSION(_snd_pcm_adpcm_open, SND_PCM_DLSYM_VERSION); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | @ -1,3 +1,10 @@ | ||||||
|  | /**
 | ||||||
|  |  * \file pcm/pcm_alaw.c | ||||||
|  |  * \ingroup PCM_Plugins | ||||||
|  |  * \brief PCM A-Law Conversion Plugin Interface | ||||||
|  |  * \author Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  |  * \date 2000-2001 | ||||||
|  |  */ | ||||||
| /*
 | /*
 | ||||||
|  *  PCM - A-Law conversion |  *  PCM - A-Law conversion | ||||||
|  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> |  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  | @ -28,6 +35,8 @@ | ||||||
| const char *_snd_module_pcm_alaw = ""; | const char *_snd_module_pcm_alaw = ""; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
|  | 
 | ||||||
| typedef void (*alaw_f)(const snd_pcm_channel_area_t *dst_areas, | typedef void (*alaw_f)(const snd_pcm_channel_area_t *dst_areas, | ||||||
| 		       snd_pcm_uframes_t dst_offset, | 		       snd_pcm_uframes_t dst_offset, | ||||||
| 		       const snd_pcm_channel_area_t *src_areas, | 		       const snd_pcm_channel_area_t *src_areas, | ||||||
|  | @ -43,6 +52,8 @@ typedef struct { | ||||||
| 	snd_pcm_format_t sformat; | 	snd_pcm_format_t sformat; | ||||||
| } snd_pcm_alaw_t; | } snd_pcm_alaw_t; | ||||||
| 
 | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| static inline int val_seg(int val) | static inline int val_seg(int val) | ||||||
| { | { | ||||||
| 	int r = 1; | 	int r = 1; | ||||||
|  | @ -126,6 +137,8 @@ static int alaw_to_s16(unsigned char a_val) | ||||||
| 	return ((a_val & 0x80) ? t : -t); | 	return ((a_val & 0x80) ? t : -t); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
|  | 
 | ||||||
| void snd_pcm_alaw_decode(const snd_pcm_channel_area_t *dst_areas, | void snd_pcm_alaw_decode(const snd_pcm_channel_area_t *dst_areas, | ||||||
| 			 snd_pcm_uframes_t dst_offset, | 			 snd_pcm_uframes_t dst_offset, | ||||||
| 			 const snd_pcm_channel_area_t *src_areas, | 			 const snd_pcm_channel_area_t *src_areas, | ||||||
|  | @ -201,6 +214,8 @@ void snd_pcm_alaw_encode(const snd_pcm_channel_area_t *dst_areas, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #endif /* DOC_HIDDEN */ | ||||||
|  | 
 | ||||||
| static int snd_pcm_alaw_hw_refine_cprepare(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) | static int snd_pcm_alaw_hw_refine_cprepare(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) | ||||||
| { | { | ||||||
| 	snd_pcm_alaw_t *alaw = pcm->private_data; | 	snd_pcm_alaw_t *alaw = pcm->private_data; | ||||||
|  | @ -369,7 +384,7 @@ static void snd_pcm_alaw_dump(snd_pcm_t *pcm, snd_output_t *out) | ||||||
| 	snd_pcm_dump(alaw->plug.slave, out); | 	snd_pcm_dump(alaw->plug.slave, out); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| snd_pcm_ops_t snd_pcm_alaw_ops = { | static snd_pcm_ops_t snd_pcm_alaw_ops = { | ||||||
| 	close: snd_pcm_plugin_close, | 	close: snd_pcm_plugin_close, | ||||||
| 	info: snd_pcm_plugin_info, | 	info: snd_pcm_plugin_info, | ||||||
| 	hw_refine: snd_pcm_alaw_hw_refine, | 	hw_refine: snd_pcm_alaw_hw_refine, | ||||||
|  | @ -384,6 +399,18 @@ snd_pcm_ops_t snd_pcm_alaw_ops = { | ||||||
| 	munmap: snd_pcm_plugin_munmap, | 	munmap: snd_pcm_plugin_munmap, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new A-Law conversion PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param sformat Slave (destination) format | ||||||
|  |  * \param slave Slave PCM handle | ||||||
|  |  * \param close_slave When set, the slave PCM handle is closed with copy PCM | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */            | ||||||
| int snd_pcm_alaw_open(snd_pcm_t **pcmp, const char *name, snd_pcm_format_t sformat, snd_pcm_t *slave, int close_slave) | int snd_pcm_alaw_open(snd_pcm_t **pcmp, const char *name, snd_pcm_format_t sformat, snd_pcm_t *slave, int close_slave) | ||||||
| { | { | ||||||
| 	snd_pcm_t *pcm; | 	snd_pcm_t *pcm; | ||||||
|  | @ -419,6 +446,49 @@ int snd_pcm_alaw_open(snd_pcm_t **pcmp, const char *name, snd_pcm_format_t sform | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*! \page pcm_plugins
 | ||||||
|  | 
 | ||||||
|  | \section pcm_plugins_alaw Plugin: A-Law | ||||||
|  | 
 | ||||||
|  | This plugin converts A-Law samples to linear or linear to A-Law samples | ||||||
|  | from master A-Law conversion PCM to given slave PCM. The channel count, | ||||||
|  | format and rate must match for both of them. | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm.name { | ||||||
|  |         type alaw               # A-Law conversion PCM | ||||||
|  |         slave STR               # Slave name | ||||||
|  |         # or | ||||||
|  |         slave {                 # Slave definition | ||||||
|  |                 pcm STR         # Slave PCM name | ||||||
|  |                 # or | ||||||
|  |                 pcm { }         # Slave PCM definition | ||||||
|  |         } | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | \subsection pcm_plugins_alaw_funcref Function reference | ||||||
|  | 
 | ||||||
|  | <UL> | ||||||
|  |   <LI>snd_pcm_alaw_open() | ||||||
|  |   <LI>_snd_pcm_alaw_open() | ||||||
|  | </UL> | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new A-Law conversion PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param root Root configuration node | ||||||
|  |  * \param conf Configuration node with copy PCM description | ||||||
|  |  * \param stream Stream type | ||||||
|  |  * \param mode Stream mode | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int _snd_pcm_alaw_open(snd_pcm_t **pcmp, const char *name, | int _snd_pcm_alaw_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 		       snd_config_t *root, snd_config_t *conf,  | 		       snd_config_t *root, snd_config_t *conf,  | ||||||
| 		       snd_pcm_stream_t stream, int mode) | 		       snd_pcm_stream_t stream, int mode) | ||||||
|  | @ -465,4 +535,6 @@ int _snd_pcm_alaw_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 		snd_pcm_close(spcm); | 		snd_pcm_close(spcm); | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
| SND_DLSYM_BUILD_VERSION(_snd_pcm_alaw_open, SND_PCM_DLSYM_VERSION); | SND_DLSYM_BUILD_VERSION(_snd_pcm_alaw_open, SND_PCM_DLSYM_VERSION); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | @ -1,3 +1,10 @@ | ||||||
|  | /**
 | ||||||
|  |  * \file pcm/pcm_file.c | ||||||
|  |  * \ingroup PCM_Plugins | ||||||
|  |  * \brief PCM File Plugin Interface | ||||||
|  |  * \author Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  |  * \date 2000-2001 | ||||||
|  |  */ | ||||||
| /*
 | /*
 | ||||||
|  *  PCM - File plugin |  *  PCM - File plugin | ||||||
|  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> |  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  | @ -28,6 +35,8 @@ | ||||||
| const char *_snd_module_pcm_file = ""; | const char *_snd_module_pcm_file = ""; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
|  | 
 | ||||||
| typedef enum _snd_pcm_file_format { | typedef enum _snd_pcm_file_format { | ||||||
| 	SND_PCM_FILE_FORMAT_RAW | 	SND_PCM_FILE_FORMAT_RAW | ||||||
| } snd_pcm_file_format_t; | } snd_pcm_file_format_t; | ||||||
|  | @ -48,6 +57,8 @@ typedef struct { | ||||||
| 	size_t buffer_bytes; | 	size_t buffer_bytes; | ||||||
| } snd_pcm_file_t; | } snd_pcm_file_t; | ||||||
| 
 | 
 | ||||||
|  | #endif /* DOC_HIDDEN */ | ||||||
|  | 
 | ||||||
| static void snd_pcm_file_write_bytes(snd_pcm_t *pcm, size_t bytes) | static void snd_pcm_file_write_bytes(snd_pcm_t *pcm, size_t bytes) | ||||||
| { | { | ||||||
| 	snd_pcm_file_t *file = pcm->private_data; | 	snd_pcm_file_t *file = pcm->private_data; | ||||||
|  | @ -373,7 +384,7 @@ static void snd_pcm_file_dump(snd_pcm_t *pcm, snd_output_t *out) | ||||||
| 	snd_pcm_dump(file->slave, out); | 	snd_pcm_dump(file->slave, out); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| snd_pcm_ops_t snd_pcm_file_ops = { | static snd_pcm_ops_t snd_pcm_file_ops = { | ||||||
| 	close: snd_pcm_file_close, | 	close: snd_pcm_file_close, | ||||||
| 	info: snd_pcm_file_info, | 	info: snd_pcm_file_info, | ||||||
| 	hw_refine: snd_pcm_file_hw_refine, | 	hw_refine: snd_pcm_file_hw_refine, | ||||||
|  | @ -388,7 +399,7 @@ snd_pcm_ops_t snd_pcm_file_ops = { | ||||||
| 	munmap: snd_pcm_file_munmap, | 	munmap: snd_pcm_file_munmap, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| snd_pcm_fast_ops_t snd_pcm_file_fast_ops = { | static snd_pcm_fast_ops_t snd_pcm_file_fast_ops = { | ||||||
| 	status: snd_pcm_file_status, | 	status: snd_pcm_file_status, | ||||||
| 	state: snd_pcm_file_state, | 	state: snd_pcm_file_state, | ||||||
| 	delay: snd_pcm_file_delay, | 	delay: snd_pcm_file_delay, | ||||||
|  | @ -408,7 +419,23 @@ snd_pcm_fast_ops_t snd_pcm_file_fast_ops = { | ||||||
| 	mmap_commit: snd_pcm_file_mmap_commit, | 	mmap_commit: snd_pcm_file_mmap_commit, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| int snd_pcm_file_open(snd_pcm_t **pcmp, const char *name, const char *fname, int fd, const char *fmt, snd_pcm_t *slave, int close_slave) | /**
 | ||||||
|  |  * \brief Creates a new File PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param fname Filename (or NULL if file descriptor is available) | ||||||
|  |  * \param fd File descriptor | ||||||
|  |  * \param fmt File format ("raw" is supported only) | ||||||
|  |  * \param slave Slave PCM handle | ||||||
|  |  * \param close_slave When set, the slave PCM handle is closed with copy PCM | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
|  | int snd_pcm_file_open(snd_pcm_t **pcmp, const char *name, | ||||||
|  | 		      const char *fname, int fd, const char *fmt, | ||||||
|  | 		      snd_pcm_t *slave, int close_slave) | ||||||
| { | { | ||||||
| 	snd_pcm_t *pcm; | 	snd_pcm_t *pcm; | ||||||
| 	snd_pcm_file_t *file; | 	snd_pcm_file_t *file; | ||||||
|  | @ -461,6 +488,51 @@ int snd_pcm_file_open(snd_pcm_t **pcmp, const char *name, const char *fname, int | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*! \page pcm_plugins
 | ||||||
|  | 
 | ||||||
|  | \section pcm_plugins_file Plugin: File | ||||||
|  | 
 | ||||||
|  | This plugin stores contents of a PCM stream to file. | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm.name { | ||||||
|  |         type file               # File PCM | ||||||
|  |         slave STR               # Slave name | ||||||
|  |         # or | ||||||
|  |         slave {                 # Slave definition | ||||||
|  |                 pcm STR         # Slave PCM name | ||||||
|  |                 # or | ||||||
|  |                 pcm { }         # Slave PCM definition | ||||||
|  |         } | ||||||
|  | 	file STR		# Filename | ||||||
|  | 	or | ||||||
|  | 	file INT		# File descriptor number | ||||||
|  | 	[format STR]		# File format (only "raw" at the moment) | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | \subsection pcm_plugins_file_funcref Function reference | ||||||
|  | 
 | ||||||
|  | <UL> | ||||||
|  |   <LI>snd_pcm_file_open() | ||||||
|  |   <LI>_snd_pcm_file_open() | ||||||
|  | </UL> | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new File PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param root Root configuration node | ||||||
|  |  * \param conf Configuration node with File PCM description | ||||||
|  |  * \param stream Stream type | ||||||
|  |  * \param mode Stream mode | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int _snd_pcm_file_open(snd_pcm_t **pcmp, const char *name, | int _snd_pcm_file_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 		       snd_config_t *root, snd_config_t *conf,  | 		       snd_config_t *root, snd_config_t *conf,  | ||||||
| 		       snd_pcm_stream_t stream, int mode) | 		       snd_pcm_stream_t stream, int mode) | ||||||
|  | @ -526,4 +598,6 @@ int _snd_pcm_file_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 		snd_pcm_close(spcm); | 		snd_pcm_close(spcm); | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
| SND_DLSYM_BUILD_VERSION(_snd_pcm_file_open, SND_PCM_DLSYM_VERSION); | SND_DLSYM_BUILD_VERSION(_snd_pcm_file_open, SND_PCM_DLSYM_VERSION); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | @ -1,3 +1,10 @@ | ||||||
|  | /**
 | ||||||
|  |  * \file pcm/pcm_ladspa.c | ||||||
|  |  * \ingroup PCM_Plugins | ||||||
|  |  * \brief ALSA Plugin <-> LADSPA Plugin Interface | ||||||
|  |  * \author Jaroslav Kysela <perex@suse.cz> | ||||||
|  |  * \date 2001 | ||||||
|  |  */ | ||||||
| /*
 | /*
 | ||||||
|  *  PCM - LADSPA integration plugin |  *  PCM - LADSPA integration plugin | ||||||
|  *  Copyright (c) 2001 by Jaroslav Kysela <perex@suse.cz> |  *  Copyright (c) 2001 by Jaroslav Kysela <perex@suse.cz> | ||||||
|  | @ -32,6 +39,8 @@ | ||||||
| const char *_snd_module_pcm_ladspa = ""; | const char *_snd_module_pcm_ladspa = ""; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
|  | 
 | ||||||
| #define NO_ASSIGN	0xffffffff | #define NO_ASSIGN	0xffffffff | ||||||
| 
 | 
 | ||||||
| typedef enum _snd_pcm_ladspa_policy { | typedef enum _snd_pcm_ladspa_policy { | ||||||
|  | @ -89,6 +98,8 @@ typedef struct { | ||||||
| 	struct list_head instances; | 	struct list_head instances; | ||||||
| } snd_pcm_ladspa_plugin_t; | } snd_pcm_ladspa_plugin_t; | ||||||
| 
 | 
 | ||||||
|  | #endif /* DOC_HIDDEN */ | ||||||
|  | 
 | ||||||
| static int snd_pcm_ladspa_find_port(unsigned int *res, | static int snd_pcm_ladspa_find_port(unsigned int *res, | ||||||
| 				    snd_pcm_ladspa_plugin_t *lplug, | 				    snd_pcm_ladspa_plugin_t *lplug, | ||||||
| 				    LADSPA_PortDescriptor pdesc, | 				    LADSPA_PortDescriptor pdesc, | ||||||
|  | @ -684,7 +695,7 @@ static void snd_pcm_ladspa_dump(snd_pcm_t *pcm, snd_output_t *out) | ||||||
| 	snd_pcm_dump(ladspa->plug.slave, out); | 	snd_pcm_dump(ladspa->plug.slave, out); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| snd_pcm_ops_t snd_pcm_ladspa_ops = { | static snd_pcm_ops_t snd_pcm_ladspa_ops = { | ||||||
| 	close: snd_pcm_ladspa_close, | 	close: snd_pcm_ladspa_close, | ||||||
| 	info: snd_pcm_plugin_info, | 	info: snd_pcm_plugin_info, | ||||||
| 	hw_refine: snd_pcm_ladspa_hw_refine, | 	hw_refine: snd_pcm_ladspa_hw_refine, | ||||||
|  | @ -1095,6 +1106,18 @@ static int snd_pcm_ladspa_build_plugins(struct list_head *list, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new LADSPA<->ALSA Plugin | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param sformat Slave (destination) format | ||||||
|  |  * \param slave Slave PCM handle | ||||||
|  |  * \param close_slave When set, the slave PCM handle is closed with copy PCM | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int snd_pcm_ladspa_open(snd_pcm_t **pcmp, const char *name, | int snd_pcm_ladspa_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 			const char *ladspa_path, | 			const char *ladspa_path, | ||||||
| 			snd_config_t *ladspa_pplugins, | 			snd_config_t *ladspa_pplugins, | ||||||
|  | @ -1154,6 +1177,70 @@ int snd_pcm_ladspa_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*! \page pcm_plugins
 | ||||||
|  | 
 | ||||||
|  | \section pcm_plugins_ladpsa Plugin: LADSPA <-> ALSA | ||||||
|  | 
 | ||||||
|  | This plugin allows to apply a set of LADPSA plugins. | ||||||
|  | The input and output format is always #SND_PCM_FORMAT_FLOAT (note: this type | ||||||
|  | can be either little or big-endian depending on architecture). | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm.name { | ||||||
|  |         type ladspa             # ALSA<->LADSPA PCM | ||||||
|  |         slave STR               # Slave name | ||||||
|  |         # or | ||||||
|  |         slave {                 # Slave definition | ||||||
|  |                 pcm STR         # Slave PCM name | ||||||
|  |                 # or | ||||||
|  |                 pcm { }         # Slave PCM definition | ||||||
|  |         } | ||||||
|  | 	path STR		# Path (directory) with LADSPA plugins | ||||||
|  | 	plugins |		# Definition for both directions | ||||||
|  |         playback_plugins |	# Definition for playback direction | ||||||
|  | 	capture_plugins {	# Definition for capture direction | ||||||
|  | 		N {		# Configuration for LADPSA plugin N | ||||||
|  | 			id INT		# LADSPA plugin ID (for example 1043) | ||||||
|  | 			label STR	# LADSPA plugin label (for example 'delay_5s') | ||||||
|  | 			filename STR	# Full filename of .so library with LADSPA plugin code | ||||||
|  | 			policy STR	# Policy can be 'none' or 'duplicate' | ||||||
|  | 			input | output { | ||||||
|  | 				bindings { | ||||||
|  | 					C INT or STR	# C - channel, INT - audio port index, STR - audio port name | ||||||
|  | 				} | ||||||
|  | 				controls { | ||||||
|  | 					I INT or REAL	# I - control port index, INT or REAL - control value | ||||||
|  | 					# or | ||||||
|  | 					STR INT or REAL	# STR - control port name, INT or REAL - control value | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | \subsection pcm_plugins_ladspa_funcref Function reference | ||||||
|  | 
 | ||||||
|  | <UL> | ||||||
|  |   <LI>snd_pcm_ladspa_open() | ||||||
|  |   <LI>_snd_pcm_ladspa_open() | ||||||
|  | </UL> | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new LADSPA<->ALSA PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param root Root configuration node | ||||||
|  |  * \param conf Configuration node with LADSPA<->ALSA PCM description | ||||||
|  |  * \param stream Stream type | ||||||
|  |  * \param mode Stream mode | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int _snd_pcm_ladspa_open(snd_pcm_t **pcmp, const char *name, | int _snd_pcm_ladspa_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 			 snd_config_t *root, snd_config_t *conf,  | 			 snd_config_t *root, snd_config_t *conf,  | ||||||
| 			 snd_pcm_stream_t stream, int mode) | 			 snd_pcm_stream_t stream, int mode) | ||||||
|  | @ -1218,4 +1305,6 @@ int _snd_pcm_ladspa_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 		snd_pcm_close(spcm); | 		snd_pcm_close(spcm); | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
| SND_DLSYM_BUILD_VERSION(_snd_pcm_ladspa_open, SND_PCM_DLSYM_VERSION); | SND_DLSYM_BUILD_VERSION(_snd_pcm_ladspa_open, SND_PCM_DLSYM_VERSION); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | @ -575,7 +575,7 @@ static void snd_pcm_meter_dump(snd_pcm_t *pcm, snd_output_t *out) | ||||||
| 	snd_pcm_dump(meter->slave, out); | 	snd_pcm_dump(meter->slave, out); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| snd_pcm_ops_t snd_pcm_meter_ops = { | static snd_pcm_ops_t snd_pcm_meter_ops = { | ||||||
| 	close: snd_pcm_meter_close, | 	close: snd_pcm_meter_close, | ||||||
| 	info: snd_pcm_meter_info, | 	info: snd_pcm_meter_info, | ||||||
| 	hw_refine: snd_pcm_meter_hw_refine, | 	hw_refine: snd_pcm_meter_hw_refine, | ||||||
|  | @ -590,7 +590,7 @@ snd_pcm_ops_t snd_pcm_meter_ops = { | ||||||
| 	munmap: snd_pcm_meter_munmap, | 	munmap: snd_pcm_meter_munmap, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| snd_pcm_fast_ops_t snd_pcm_meter_fast_ops = { | static snd_pcm_fast_ops_t snd_pcm_meter_fast_ops = { | ||||||
| 	status: snd_pcm_meter_status, | 	status: snd_pcm_meter_status, | ||||||
| 	state: snd_pcm_meter_state, | 	state: snd_pcm_meter_state, | ||||||
| 	delay: snd_pcm_meter_delay, | 	delay: snd_pcm_meter_delay, | ||||||
|  | @ -610,6 +610,18 @@ snd_pcm_fast_ops_t snd_pcm_meter_fast_ops = { | ||||||
| 	mmap_commit: snd_pcm_meter_mmap_commit, | 	mmap_commit: snd_pcm_meter_mmap_commit, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new Meter PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param frequency Update frequency | ||||||
|  |  * \param slave Slave PCM handle | ||||||
|  |  * \param close_slave When set, the slave PCM handle is closed with copy PCM | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int snd_pcm_meter_open(snd_pcm_t **pcmp, const char *name, unsigned int frequency, | int snd_pcm_meter_open(snd_pcm_t **pcmp, const char *name, unsigned int frequency, | ||||||
| 		       snd_pcm_t *slave, int close_slave) | 		       snd_pcm_t *slave, int close_slave) | ||||||
| { | { | ||||||
|  | @ -730,6 +742,63 @@ static int snd_pcm_meter_add_scope_conf(snd_pcm_t *pcm, const char *name, | ||||||
| 	return err >= 0 ? open_func(pcm, name, root, conf) : err; | 	return err >= 0 ? open_func(pcm, name, root, conf) : err; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*! \page pcm_plugins
 | ||||||
|  | 
 | ||||||
|  | \section pcm_plugins_meter Plugin: Meter | ||||||
|  | 
 | ||||||
|  | Show meter (visual waveform representation). | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm_scope_type.NAME { | ||||||
|  | 	[lib STR]		# Library file (default libasound.so) | ||||||
|  | 	[open STR]		# Open function (default _snd_pcm_scope_NAME_open) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pcm_scope.name { | ||||||
|  | 	type STR		# Scope type | ||||||
|  | 	... | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pcm.name { | ||||||
|  |         type meter              # Meter PCM | ||||||
|  |         slave STR               # Slave name | ||||||
|  |         # or | ||||||
|  |         slave {                 # Slave definition | ||||||
|  |                 pcm STR         # Slave PCM name | ||||||
|  |                 # or | ||||||
|  |                 pcm { }         # Slave PCM definition | ||||||
|  |         } | ||||||
|  | 	[frequency INT]		# Updates per second | ||||||
|  | 	scopes { | ||||||
|  | 		ID STR		# Scope name (see pcm_scope) | ||||||
|  | 		# or | ||||||
|  | 		ID { }		# Scope definition (see pcm_scope) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | \subsection pcm_plugins_meter_funcref Function reference | ||||||
|  | 
 | ||||||
|  | <UL> | ||||||
|  |   <LI>snd_pcm_meter_open() | ||||||
|  |   <LI>_snd_pcm_meter_open() | ||||||
|  | </UL> | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new Meter PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param root Root configuration node | ||||||
|  |  * \param conf Configuration node with Meter PCM description | ||||||
|  |  * \param stream Stream type | ||||||
|  |  * \param mode Stream mode | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int _snd_pcm_meter_open(snd_pcm_t **pcmp, const char *name, | int _snd_pcm_meter_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 			snd_config_t *root, snd_config_t *conf,  | 			snd_config_t *root, snd_config_t *conf,  | ||||||
| 			snd_pcm_stream_t stream, int mode) | 			snd_pcm_stream_t stream, int mode) | ||||||
|  |  | ||||||
|  | @ -1,3 +1,10 @@ | ||||||
|  | /**
 | ||||||
|  |  * \file pcm/pcm_multi.c | ||||||
|  |  * \ingroup PCM_Plugins | ||||||
|  |  * \brief PCM Multi Streams to One Conversion Plugin Interface | ||||||
|  |  * \author Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  |  * \date 2000-2001 | ||||||
|  |  */ | ||||||
| /*
 | /*
 | ||||||
|  *  PCM - Multi |  *  PCM - Multi | ||||||
|  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> |  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  | @ -31,6 +38,8 @@ | ||||||
| const char *_snd_module_pcm_multi = ""; | const char *_snd_module_pcm_multi = ""; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| 	snd_pcm_t *pcm; | 	snd_pcm_t *pcm; | ||||||
| 	unsigned int channels_count; | 	unsigned int channels_count; | ||||||
|  | @ -51,6 +60,8 @@ typedef struct { | ||||||
| 	snd_pcm_multi_channel_t *channels; | 	snd_pcm_multi_channel_t *channels; | ||||||
| } snd_pcm_multi_t; | } snd_pcm_multi_t; | ||||||
| 
 | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| static int snd_pcm_multi_close(snd_pcm_t *pcm) | static int snd_pcm_multi_close(snd_pcm_t *pcm) | ||||||
| { | { | ||||||
| 	snd_pcm_multi_t *multi = pcm->private_data; | 	snd_pcm_multi_t *multi = pcm->private_data; | ||||||
|  | @ -557,7 +568,7 @@ static void snd_pcm_multi_dump(snd_pcm_t *pcm, snd_output_t *out) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| snd_pcm_ops_t snd_pcm_multi_ops = { | static snd_pcm_ops_t snd_pcm_multi_ops = { | ||||||
| 	close: snd_pcm_multi_close, | 	close: snd_pcm_multi_close, | ||||||
| 	info: snd_pcm_multi_info, | 	info: snd_pcm_multi_info, | ||||||
| 	hw_refine: snd_pcm_multi_hw_refine, | 	hw_refine: snd_pcm_multi_hw_refine, | ||||||
|  | @ -572,7 +583,7 @@ snd_pcm_ops_t snd_pcm_multi_ops = { | ||||||
| 	munmap: snd_pcm_multi_munmap, | 	munmap: snd_pcm_multi_munmap, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| snd_pcm_fast_ops_t snd_pcm_multi_fast_ops = { | static snd_pcm_fast_ops_t snd_pcm_multi_fast_ops = { | ||||||
| 	status: snd_pcm_multi_status, | 	status: snd_pcm_multi_status, | ||||||
| 	state: snd_pcm_multi_state, | 	state: snd_pcm_multi_state, | ||||||
| 	delay: snd_pcm_multi_delay, | 	delay: snd_pcm_multi_delay, | ||||||
|  | @ -592,6 +603,23 @@ snd_pcm_fast_ops_t snd_pcm_multi_fast_ops = { | ||||||
| 	mmap_commit: snd_pcm_multi_mmap_commit, | 	mmap_commit: snd_pcm_multi_mmap_commit, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new Multi PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param slaves_count Count of slaves | ||||||
|  |  * \param master_slave Master slave number | ||||||
|  |  * \param slaves_pcm Array with slave PCMs | ||||||
|  |  * \param schannels_count Array with slave channel counts | ||||||
|  |  * \param channels_count Count of channels | ||||||
|  |  * \param sidxs Array with channels indexes to slaves | ||||||
|  |  * \param schannels Array with slave channels | ||||||
|  |  * \param close_slaves When set, the slave PCM handle is closed | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int snd_pcm_multi_open(snd_pcm_t **pcmp, const char *name, | int snd_pcm_multi_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 		       unsigned int slaves_count, unsigned int master_slave, | 		       unsigned int slaves_count, unsigned int master_slave, | ||||||
| 		       snd_pcm_t **slaves_pcm, unsigned int *schannels_count, | 		       snd_pcm_t **slaves_pcm, unsigned int *schannels_count, | ||||||
|  | @ -660,6 +688,57 @@ int snd_pcm_multi_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*! \page pcm_plugins
 | ||||||
|  | 
 | ||||||
|  | \section pcm_plugins_multi Plugin: Multiple streams to One | ||||||
|  | 
 | ||||||
|  | This plugin converts multiple streams to one. | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm.name { | ||||||
|  |         type multi              # Multiple streams conversion PCM | ||||||
|  |         slaves {		# Slaves definition | ||||||
|  | 		ID STR		# Slave PCM name | ||||||
|  | 		# or | ||||||
|  | 		ID { | ||||||
|  | 			pcm STR		# Slave PCM name | ||||||
|  | 			# or | ||||||
|  | 			pcm { } 	# Slave PCM definition | ||||||
|  | 			channels INT	# Slave channels | ||||||
|  | 		} | ||||||
|  |         } | ||||||
|  | 	bindings {		# Bindings table | ||||||
|  | 		N { | ||||||
|  | 			slave STR	# Slave key | ||||||
|  | 			channel INT	# Slave channel | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	[master INT]		# Define the master slave | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | \subsection pcm_plugins_multi_funcref Function reference | ||||||
|  | 
 | ||||||
|  | <UL> | ||||||
|  |   <LI>snd_pcm_multi_open() | ||||||
|  |   <LI>_snd_pcm_multi_open() | ||||||
|  | </UL> | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new Multi PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param root Root configuration node | ||||||
|  |  * \param conf Configuration node with Multi PCM description | ||||||
|  |  * \param stream Stream type | ||||||
|  |  * \param mode Stream mode | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int _snd_pcm_multi_open(snd_pcm_t **pcmp, const char *name, | int _snd_pcm_multi_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 			snd_config_t *root, snd_config_t *conf, | 			snd_config_t *root, snd_config_t *conf, | ||||||
| 			snd_pcm_stream_t stream, int mode) | 			snd_pcm_stream_t stream, int mode) | ||||||
|  | @ -874,4 +953,6 @@ _free: | ||||||
| 		free(channels_schannel); | 		free(channels_schannel); | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
| SND_DLSYM_BUILD_VERSION(_snd_pcm_multi_open, SND_PCM_DLSYM_VERSION); | SND_DLSYM_BUILD_VERSION(_snd_pcm_multi_open, SND_PCM_DLSYM_VERSION); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | @ -1,3 +1,10 @@ | ||||||
|  | /*
 | ||||||
|  |  * \file pcm/pcm_plug.c | ||||||
|  |  * \ingroup PCM_Plugins | ||||||
|  |  * \brief PCM Route & Volume Plugin Interface | ||||||
|  |  * \author Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  |  * \date 2000-2001 | ||||||
|  |  */ | ||||||
| /*
 | /*
 | ||||||
|  *  PCM - Plug |  *  PCM - Plug | ||||||
|  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> |  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  | @ -27,6 +34,8 @@ | ||||||
| const char *_snd_module_pcm_plug = ""; | const char *_snd_module_pcm_plug = ""; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
|  | 
 | ||||||
| enum snd_pcm_plug_route_policy { | enum snd_pcm_plug_route_policy { | ||||||
| 	PLUG_ROUTE_POLICY_NONE, | 	PLUG_ROUTE_POLICY_NONE, | ||||||
| 	PLUG_ROUTE_POLICY_DEFAULT, | 	PLUG_ROUTE_POLICY_DEFAULT, | ||||||
|  | @ -48,6 +57,8 @@ typedef struct { | ||||||
| 	unsigned int tt_ssize, tt_cused, tt_sused; | 	unsigned int tt_ssize, tt_cused, tt_sused; | ||||||
| } snd_pcm_plug_t; | } snd_pcm_plug_t; | ||||||
| 
 | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| static int snd_pcm_plug_close(snd_pcm_t *pcm) | static int snd_pcm_plug_close(snd_pcm_t *pcm) | ||||||
| { | { | ||||||
| 	snd_pcm_plug_t *plug = pcm->private_data; | 	snd_pcm_plug_t *plug = pcm->private_data; | ||||||
|  | @ -864,7 +875,7 @@ static void snd_pcm_plug_dump(snd_pcm_t *pcm, snd_output_t *out) | ||||||
| 	snd_pcm_dump(plug->slave, out); | 	snd_pcm_dump(plug->slave, out); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| snd_pcm_ops_t snd_pcm_plug_ops = { | static snd_pcm_ops_t snd_pcm_plug_ops = { | ||||||
| 	close: snd_pcm_plug_close, | 	close: snd_pcm_plug_close, | ||||||
| 	info: snd_pcm_plug_info, | 	info: snd_pcm_plug_info, | ||||||
| 	hw_refine: snd_pcm_plug_hw_refine, | 	hw_refine: snd_pcm_plug_hw_refine, | ||||||
|  | @ -879,6 +890,18 @@ snd_pcm_ops_t snd_pcm_plug_ops = { | ||||||
| 	munmap: snd_pcm_plug_munmap, | 	munmap: snd_pcm_plug_munmap, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new Plug PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param sformat Slave (destination) format | ||||||
|  |  * \param slave Slave PCM handle | ||||||
|  |  * \param close_slave When set, the slave PCM handle is closed with copy PCM | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int snd_pcm_plug_open(snd_pcm_t **pcmp, | int snd_pcm_plug_open(snd_pcm_t **pcmp, | ||||||
| 		      const char *name, | 		      const char *name, | ||||||
| 		      snd_pcm_format_t sformat, int schannels, int srate, | 		      snd_pcm_format_t sformat, int schannels, int srate, | ||||||
|  | @ -923,8 +946,61 @@ int snd_pcm_plug_open(snd_pcm_t **pcmp, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #define MAX_CHANNELS 64 | /*! \page pcm_plugins
 | ||||||
| 
 | 
 | ||||||
|  | \section pcm_plugins_plug Automatic conversion plugin | ||||||
|  | 
 | ||||||
|  | This plugin converts channels, rate and format on request. | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm.name { | ||||||
|  |         type plug               # Automatic conversion PCM | ||||||
|  |         slave STR               # Slave name | ||||||
|  |         # or | ||||||
|  |         slave {                 # Slave definition | ||||||
|  |                 pcm STR         # Slave PCM name | ||||||
|  |                 # or | ||||||
|  |                 pcm { }         # Slave PCM definition | ||||||
|  | 		[format STR]	# Slave format (default nearest) or "unchanged" | ||||||
|  | 		[channels INT]	# Slave channels (default nearest) or "unchanged" | ||||||
|  | 		[rate INT]	# Slave rate (default nearest) or "unchanged" | ||||||
|  |         } | ||||||
|  | 	route_policy STR	# route policy for automatic ttable generation | ||||||
|  | 				# STR can be 'default', 'average', 'copy', 'duplicate' | ||||||
|  | 				# average: result is average of input channels | ||||||
|  | 				# copy: only first channels are copied to destination | ||||||
|  | 				# duplicate: duplicate first set of channels | ||||||
|  | 				# default: copy policy, except for mono capture - sum | ||||||
|  | 	ttable {		# Transfer table (bidimensional compound of cchannels * schannels numbers) | ||||||
|  | 		CCHANNEL { | ||||||
|  | 			SCHANNEL REAL	# route value (0.0 - 1.0) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | \subsection pcm_plugins_plug_funcref Function reference | ||||||
|  | 
 | ||||||
|  | <UL> | ||||||
|  |   <LI>snd_pcm_plug_open() | ||||||
|  |   <LI>_snd_pcm_plug_open() | ||||||
|  | </UL> | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new Plug PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param root Root configuration node | ||||||
|  |  * \param conf Configuration node with Plug PCM description | ||||||
|  |  * \param stream Stream type | ||||||
|  |  * \param mode Stream mode | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int _snd_pcm_plug_open(snd_pcm_t **pcmp, const char *name, | int _snd_pcm_plug_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 		       snd_config_t *root, snd_config_t *conf,  | 		       snd_config_t *root, snd_config_t *conf,  | ||||||
| 		       snd_pcm_stream_t stream, int mode) | 		       snd_pcm_stream_t stream, int mode) | ||||||
|  | @ -991,9 +1067,17 @@ int _snd_pcm_plug_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 	if (err < 0) | 	if (err < 0) | ||||||
| 		return err; | 		return err; | ||||||
| 	if (tt) { | 	if (tt) { | ||||||
| 		ttable = malloc(MAX_CHANNELS * MAX_CHANNELS * sizeof(*ttable)); | 		err = snd_pcm_route_determine_ttable(tt, &csize, &ssize); | ||||||
| 		err = snd_pcm_route_load_ttable(tt, ttable, MAX_CHANNELS, MAX_CHANNELS, | 		if (err < 0) { | ||||||
| 						&cused, &sused, -1); | 			snd_config_delete(sconf); | ||||||
|  | 			return err; | ||||||
|  | 		} | ||||||
|  | 		ttable = malloc(csize * ssize * sizeof(*ttable)); | ||||||
|  | 		if (ttable == NULL) { | ||||||
|  | 			snd_config_delete(sconf); | ||||||
|  | 			return err; | ||||||
|  | 		} | ||||||
|  | 		err = snd_pcm_route_load_ttable(tt, ttable, csize, ssize, &cused, &sused, -1); | ||||||
| 		if (err < 0) { | 		if (err < 0) { | ||||||
| 			snd_config_delete(sconf); | 			snd_config_delete(sconf); | ||||||
| 			return err; | 			return err; | ||||||
|  | @ -1010,4 +1094,6 @@ int _snd_pcm_plug_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 		snd_pcm_close(spcm); | 		snd_pcm_close(spcm); | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
| SND_DLSYM_BUILD_VERSION(_snd_pcm_plug_open, SND_PCM_DLSYM_VERSION); | SND_DLSYM_BUILD_VERSION(_snd_pcm_plug_open, SND_PCM_DLSYM_VERSION); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | @ -26,13 +26,61 @@ | ||||||
|  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA |  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
|  | 
 | ||||||
| /*!
 | /*!
 | ||||||
|  * \page pcm_plugins PCM (digital audio) plugins | 
 | ||||||
|  *  | \page pcm_plugins PCM (digital audio) plugins | ||||||
|  * PCM plugins extends functionality and features of PCM devices. | 
 | ||||||
|  * The plugins take care about various sample conversions, sample | PCM plugins extends functionality and features of PCM devices. | ||||||
|  * copying among channels and so on. | The plugins take care about various sample conversions, sample | ||||||
|  */ | copying among channels and so on. | ||||||
|  | 
 | ||||||
|  | \section pcm_plugins_slave Slave definition | ||||||
|  | 
 | ||||||
|  | The slave plugin can be specified directly with a string or the definition | ||||||
|  | can be entered inside a compound configuration node. Some restrictions can | ||||||
|  | be also specified (like static rate or count of channels). | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm_slave.NAME { | ||||||
|  | 	pcm STR		# PCM name | ||||||
|  | 	# or | ||||||
|  | 	pcm { }		# PCM definition | ||||||
|  | 	format STR	# Format or "unchanged" | ||||||
|  | 	channels INT	# Count of channels or "unchanged" string | ||||||
|  | 	rate INT	# Rate in Hz or "unchanged" string | ||||||
|  | 	period_time INT	# Period time in us or "unchanged" string | ||||||
|  | 	buffer_time INT # Buffer time in us or "unchanged" string | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | Example: | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm_slave.slave_rate44100Hz { | ||||||
|  | 	pcm "hw:0,0" | ||||||
|  | 	rate 44100 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pcm.rate44100Hz { | ||||||
|  | 	type plug | ||||||
|  | 	slave slave_rate44100Hz | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | The equivalent configuration (in one compound): | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm.rate44100Hz { | ||||||
|  | 	type plug | ||||||
|  | 	slave { | ||||||
|  | 		pcm "hw:0,0" | ||||||
|  | 		rate 44100 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|    |    | ||||||
| #include <sys/shm.h> | #include <sys/shm.h> | ||||||
| #include <limits.h> | #include <limits.h> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,12 @@ | ||||||
|  | /**
 | ||||||
|  |  * \file pcm/pcm_route.c | ||||||
|  |  * \ingroup PCM_Plugins | ||||||
|  |  * \brief PCM Route & Volume Plugin Interface | ||||||
|  |  * \author Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  |  * \date 2000-2001 | ||||||
|  |  */ | ||||||
| /*
 | /*
 | ||||||
|  *  PCM - Linear conversion |  *  PCM - Route & Volume Plugin | ||||||
|  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> |  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  * |  * | ||||||
|  * |  * | ||||||
|  | @ -29,6 +36,8 @@ | ||||||
| const char *_snd_module_pcm_route = ""; | const char *_snd_module_pcm_route = ""; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
|  | 
 | ||||||
| /* The best possible hack to support missing optimization in gcc 2.7.2.3 */ | /* The best possible hack to support missing optimization in gcc 2.7.2.3 */ | ||||||
| #if SND_PCM_PLUGIN_ROUTE_RESOLUTION & (SND_PCM_PLUGIN_ROUTE_RESOLUTION - 1) != 0 | #if SND_PCM_PLUGIN_ROUTE_RESOLUTION & (SND_PCM_PLUGIN_ROUTE_RESOLUTION - 1) != 0 | ||||||
| #define div(a) a /= SND_PCM_PLUGIN_ROUTE_RESOLUTION | #define div(a) a /= SND_PCM_PLUGIN_ROUTE_RESOLUTION | ||||||
|  | @ -91,6 +100,7 @@ typedef struct { | ||||||
| 	snd_pcm_route_params_t params; | 	snd_pcm_route_params_t params; | ||||||
| } snd_pcm_route_t; | } snd_pcm_route_t; | ||||||
| 
 | 
 | ||||||
|  | #endif /* DOC_HIDDEN */ | ||||||
| 
 | 
 | ||||||
| static void snd_pcm_route_convert1_zero(const snd_pcm_channel_area_t *dst_area, | static void snd_pcm_route_convert1_zero(const snd_pcm_channel_area_t *dst_area, | ||||||
| 					snd_pcm_uframes_t dst_offset, | 					snd_pcm_uframes_t dst_offset, | ||||||
|  | @ -103,6 +113,8 @@ static void snd_pcm_route_convert1_zero(const snd_pcm_channel_area_t *dst_area, | ||||||
| 	snd_pcm_area_silence(dst_area, dst_offset, frames, params->dst_sfmt); | 	snd_pcm_area_silence(dst_area, dst_offset, frames, params->dst_sfmt); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
|  | 
 | ||||||
| static void snd_pcm_route_convert1_one(const snd_pcm_channel_area_t *dst_area, | static void snd_pcm_route_convert1_one(const snd_pcm_channel_area_t *dst_area, | ||||||
| 				       snd_pcm_uframes_t dst_offset, | 				       snd_pcm_uframes_t dst_offset, | ||||||
| 				       const snd_pcm_channel_area_t *src_areas, | 				       const snd_pcm_channel_area_t *src_areas, | ||||||
|  | @ -381,6 +393,8 @@ static void snd_pcm_route_convert1_many(const snd_pcm_channel_area_t *dst_area, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #endif /* DOC_HIDDEN */ | ||||||
|  | 
 | ||||||
| static void snd_pcm_route_convert(const snd_pcm_channel_area_t *dst_areas, | static void snd_pcm_route_convert(const snd_pcm_channel_area_t *dst_areas, | ||||||
| 				  snd_pcm_uframes_t dst_offset, | 				  snd_pcm_uframes_t dst_offset, | ||||||
| 				  const snd_pcm_channel_area_t *src_areas, | 				  const snd_pcm_channel_area_t *src_areas, | ||||||
|  | @ -646,7 +660,7 @@ static void snd_pcm_route_dump(snd_pcm_t *pcm, snd_output_t *out) | ||||||
| 	snd_pcm_dump(route->plug.slave, out); | 	snd_pcm_dump(route->plug.slave, out); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| snd_pcm_ops_t snd_pcm_route_ops = { | static snd_pcm_ops_t snd_pcm_route_ops = { | ||||||
| 	close: snd_pcm_route_close, | 	close: snd_pcm_route_close, | ||||||
| 	info: snd_pcm_plugin_info, | 	info: snd_pcm_plugin_info, | ||||||
| 	hw_refine: snd_pcm_route_hw_refine, | 	hw_refine: snd_pcm_route_hw_refine, | ||||||
|  | @ -732,7 +746,23 @@ static int route_load_ttable(snd_pcm_route_params_t *params, snd_pcm_stream_t st | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | /**
 | ||||||
|  |  * \brief Creates a new Route & Volume PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param sformat Slave format | ||||||
|  |  * \param schannels Slave channels | ||||||
|  |  * \param ttable Attenuation table | ||||||
|  |  * \param tt_ssize Attenuation table - slave size | ||||||
|  |  * \param tt_cused Attenuation table - client used count | ||||||
|  |  * \param tt_sused Attenuation table - slave used count | ||||||
|  |  * \param slave Slave PCM handle | ||||||
|  |  * \param close_slave When set, the slave PCM handle is closed with copy PCM | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int snd_pcm_route_open(snd_pcm_t **pcmp, const char *name, | int snd_pcm_route_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 		       snd_pcm_format_t sformat, int schannels, | 		       snd_pcm_format_t sformat, int schannels, | ||||||
| 		       snd_pcm_route_ttable_entry_t *ttable, | 		       snd_pcm_route_ttable_entry_t *ttable, | ||||||
|  | @ -779,6 +809,13 @@ int snd_pcm_route_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Determine route matrix sizes | ||||||
|  |  * \param tt Configuration root describing route matrix | ||||||
|  |  * \param tt_csize Returned client size in elements | ||||||
|  |  * \param tt_ssize Returned slave size in elements | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  */ | ||||||
| int snd_pcm_route_determine_ttable(snd_config_t *tt, | int snd_pcm_route_determine_ttable(snd_config_t *tt, | ||||||
| 				   unsigned int *tt_csize, | 				   unsigned int *tt_csize, | ||||||
| 				   unsigned int *tt_ssize) | 				   unsigned int *tt_ssize) | ||||||
|  | @ -828,7 +865,17 @@ int snd_pcm_route_determine_ttable(snd_config_t *tt, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* this functions is used from pcm_plug.c */ | /**
 | ||||||
|  |  * \brief Load route matrix | ||||||
|  |  * \param tt Configuration root describing route matrix | ||||||
|  |  * \param ttable Returned route matrix | ||||||
|  |  * \param tt_csize Client size in elements | ||||||
|  |  * \param tt_ssize Slave size in elements | ||||||
|  |  * \param tt_cused Used client elements | ||||||
|  |  * \param tt_sused Used slave elements | ||||||
|  |  * \param schannels Slave channels | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  */ | ||||||
| int snd_pcm_route_load_ttable(snd_config_t *tt, snd_pcm_route_ttable_entry_t *ttable, | int snd_pcm_route_load_ttable(snd_config_t *tt, snd_pcm_route_ttable_entry_t *ttable, | ||||||
| 			      unsigned int tt_csize, unsigned int tt_ssize, | 			      unsigned int tt_csize, unsigned int tt_ssize, | ||||||
| 			      unsigned int *tt_cused, unsigned int *tt_sused, | 			      unsigned int *tt_cused, unsigned int *tt_sused, | ||||||
|  | @ -892,6 +939,48 @@ int snd_pcm_route_load_ttable(snd_config_t *tt, snd_pcm_route_ttable_entry_t *tt | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*! \page pcm_plugins
 | ||||||
|  | 
 | ||||||
|  | \section pcm_plugins_route Plugin: Route & Volume | ||||||
|  | 
 | ||||||
|  | This plugin converts channels and applies volume during the conversion. | ||||||
|  | The format and rate must match for both of them. | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm.name { | ||||||
|  |         type route              # Route & Volume conversion PCM | ||||||
|  |         slave STR               # Slave name | ||||||
|  |         # or | ||||||
|  |         slave {                 # Slave definition | ||||||
|  |                 pcm STR         # Slave PCM name | ||||||
|  |                 # or | ||||||
|  |                 pcm { }         # Slave PCM definition | ||||||
|  |         } | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | \subsection pcm_plugins_route_funcref Function reference | ||||||
|  | 
 | ||||||
|  | <UL> | ||||||
|  |   <LI>snd_pcm_route_open() | ||||||
|  |   <LI>_snd_pcm_route_open() | ||||||
|  | </UL> | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new Route & Volume PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param root Root configuration node | ||||||
|  |  * \param conf Configuration node with Route & Volume PCM description | ||||||
|  |  * \param stream Stream type | ||||||
|  |  * \param mode Stream mode | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int _snd_pcm_route_open(snd_pcm_t **pcmp, const char *name, | int _snd_pcm_route_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 			snd_config_t *root, snd_config_t *conf,  | 			snd_config_t *root, snd_config_t *conf,  | ||||||
| 			snd_pcm_stream_t stream, int mode) | 			snd_pcm_stream_t stream, int mode) | ||||||
|  | @ -981,4 +1070,6 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 		snd_pcm_close(spcm); | 		snd_pcm_close(spcm); | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
| SND_DLSYM_BUILD_VERSION(_snd_pcm_route_open, SND_PCM_DLSYM_VERSION); | SND_DLSYM_BUILD_VERSION(_snd_pcm_route_open, SND_PCM_DLSYM_VERSION); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | @ -1,3 +1,10 @@ | ||||||
|  | /**
 | ||||||
|  |  * \file pcm/pcm_share.c | ||||||
|  |  * \ingroup PCM_Plugins | ||||||
|  |  * \brief PCM Share Plugin Interface | ||||||
|  |  * \author Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  |  * \date 2000-2001 | ||||||
|  |  */ | ||||||
| /*
 | /*
 | ||||||
|  *  PCM - Share |  *  PCM - Share | ||||||
|  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> |  *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> | ||||||
|  | @ -37,6 +44,8 @@ | ||||||
| const char *_snd_module_pcm_share = ""; | const char *_snd_module_pcm_share = ""; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
|  | 
 | ||||||
| static LIST_HEAD(snd_pcm_share_slaves); | static LIST_HEAD(snd_pcm_share_slaves); | ||||||
| static pthread_mutex_t snd_pcm_share_slaves_mutex = PTHREAD_MUTEX_INITIALIZER; | static pthread_mutex_t snd_pcm_share_slaves_mutex = PTHREAD_MUTEX_INITIALIZER; | ||||||
| 
 | 
 | ||||||
|  | @ -106,6 +115,8 @@ typedef struct { | ||||||
| 	int slave_socket; | 	int slave_socket; | ||||||
| } snd_pcm_share_t; | } snd_pcm_share_t; | ||||||
| 
 | 
 | ||||||
|  | #endif /* DOC_HIDDEN */ | ||||||
|  | 
 | ||||||
| static void _snd_pcm_share_stop(snd_pcm_t *pcm, snd_pcm_state_t state); | static void _snd_pcm_share_stop(snd_pcm_t *pcm, snd_pcm_state_t state); | ||||||
| 
 | 
 | ||||||
| static snd_pcm_uframes_t snd_pcm_share_slave_avail(snd_pcm_share_slave_t *slave) | static snd_pcm_uframes_t snd_pcm_share_slave_avail(snd_pcm_share_slave_t *slave) | ||||||
|  | @ -1177,7 +1188,7 @@ static void snd_pcm_share_dump(snd_pcm_t *pcm, snd_output_t *out) | ||||||
| 	snd_pcm_dump(slave->pcm, out); | 	snd_pcm_dump(slave->pcm, out); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| snd_pcm_ops_t snd_pcm_share_ops = { | static snd_pcm_ops_t snd_pcm_share_ops = { | ||||||
| 	close: snd_pcm_share_close, | 	close: snd_pcm_share_close, | ||||||
| 	info: snd_pcm_share_info, | 	info: snd_pcm_share_info, | ||||||
| 	hw_refine: snd_pcm_share_hw_refine, | 	hw_refine: snd_pcm_share_hw_refine, | ||||||
|  | @ -1192,7 +1203,7 @@ snd_pcm_ops_t snd_pcm_share_ops = { | ||||||
| 	munmap: snd_pcm_share_munmap, | 	munmap: snd_pcm_share_munmap, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| snd_pcm_fast_ops_t snd_pcm_share_fast_ops = { | static snd_pcm_fast_ops_t snd_pcm_share_fast_ops = { | ||||||
| 	status: snd_pcm_share_status, | 	status: snd_pcm_share_status, | ||||||
| 	state: snd_pcm_share_state, | 	state: snd_pcm_share_state, | ||||||
| 	delay: snd_pcm_share_delay, | 	delay: snd_pcm_share_delay, | ||||||
|  | @ -1212,6 +1223,25 @@ snd_pcm_fast_ops_t snd_pcm_share_fast_ops = { | ||||||
| 	mmap_commit: snd_pcm_share_mmap_commit, | 	mmap_commit: snd_pcm_share_mmap_commit, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new Share PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param sname Slave name | ||||||
|  |  * \param sformat Slave format | ||||||
|  |  * \param srate Slave rate | ||||||
|  |  * \param schannels Slave channels | ||||||
|  |  * \param speriod_time Slave period time | ||||||
|  |  * \param sbuffer_time Slave buffer time | ||||||
|  |  * \param channels Count of channels | ||||||
|  |  * \param channels_map Map of channels | ||||||
|  |  * \param stream Direction | ||||||
|  |  * \param mode PCM mode | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int snd_pcm_share_open(snd_pcm_t **pcmp, const char *name, const char *sname, | int snd_pcm_share_open(snd_pcm_t **pcmp, const char *name, const char *sname, | ||||||
| 		       snd_pcm_format_t sformat, int srate, | 		       snd_pcm_format_t sformat, int srate, | ||||||
| 		       unsigned int schannels, | 		       unsigned int schannels, | ||||||
|  | @ -1383,6 +1413,50 @@ int snd_pcm_share_open(snd_pcm_t **pcmp, const char *name, const char *sname, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*! \page pcm_plugins
 | ||||||
|  | 
 | ||||||
|  | \section pcm_plugins_share Plugin: Share | ||||||
|  | 
 | ||||||
|  | This plugin allows sharing of multiple channels with more clients. | ||||||
|  | 
 | ||||||
|  | \code | ||||||
|  | pcm.name { | ||||||
|  |         type share              # Share PCM | ||||||
|  |         slave STR               # Slave name | ||||||
|  |         # or | ||||||
|  |         slave {                 # Slave definition | ||||||
|  |                 pcm STR         # Slave PCM name | ||||||
|  |                 # or | ||||||
|  |                 pcm { }         # Slave PCM definition | ||||||
|  |         } | ||||||
|  | 	bindings { | ||||||
|  | 		N INT		# Slave channel INT for client channel N | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | \endcode | ||||||
|  | 
 | ||||||
|  | \subsection pcm_plugins_share_funcref Function reference | ||||||
|  | 
 | ||||||
|  | <UL> | ||||||
|  |   <LI>snd_pcm_share_open() | ||||||
|  |   <LI>_snd_pcm_share_open() | ||||||
|  | </UL> | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Creates a new Share PCM | ||||||
|  |  * \param pcmp Returns created PCM handle | ||||||
|  |  * \param name Name of PCM | ||||||
|  |  * \param root Root configuration node | ||||||
|  |  * \param conf Configuration node with Share PCM description | ||||||
|  |  * \param stream Stream type | ||||||
|  |  * \param mode Stream mode | ||||||
|  |  * \retval zero on success otherwise a negative error code | ||||||
|  |  * \warning Using of this function might be dangerous in the sense | ||||||
|  |  *          of compatibility reasons. The prototype might be freely | ||||||
|  |  *          changed in future. | ||||||
|  |  */ | ||||||
| int _snd_pcm_share_open(snd_pcm_t **pcmp, const char *name, | int _snd_pcm_share_open(snd_pcm_t **pcmp, const char *name, | ||||||
| 			snd_config_t *root, snd_config_t *conf, | 			snd_config_t *root, snd_config_t *conf, | ||||||
| 			snd_pcm_stream_t stream, int mode) | 			snd_pcm_stream_t stream, int mode) | ||||||
|  | @ -1502,4 +1576,6 @@ _free: | ||||||
| 		free((char *)sname); | 		free((char *)sname); | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
|  | #ifndef DOC_HIDDEN | ||||||
| SND_DLSYM_BUILD_VERSION(_snd_pcm_share_open, SND_PCM_DLSYM_VERSION); | SND_DLSYM_BUILD_VERSION(_snd_pcm_share_open, SND_PCM_DLSYM_VERSION); | ||||||
|  | #endif | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jaroslav Kysela
						Jaroslav Kysela