Blame src/pcm/pcm_asym.c

Packit Service db8eaa
/**
Packit Service db8eaa
 * \file pcm/pcm_asym.c
Packit Service db8eaa
 * \ingroup PCM_Plugins
Packit Service db8eaa
 * \brief PCM Asymmetrical Plugin Interface
Packit Service db8eaa
 * \author Takashi Iwai <tiwai@suse.de>
Packit Service db8eaa
 * \date 2003
Packit Service db8eaa
 */
Packit Service db8eaa
Packit Service db8eaa
#include "pcm_local.h"
Packit Service db8eaa
Packit Service db8eaa
#ifndef PIC
Packit Service db8eaa
/* entry for static linking */
Packit Service db8eaa
const char *_snd_module_pcm_asym = "";
Packit Service db8eaa
#endif
Packit Service db8eaa
Packit Service db8eaa
/*! \page pcm_plugins
Packit Service db8eaa
Packit Service db8eaa
\section pcm_plugins_asym Plugin: asym
Packit Service db8eaa
Packit Service db8eaa
This plugin is a combination of playback and capture PCM streams.
Packit Service db8eaa
Slave PCMs can be defined asymmetrically for both directions.
Packit Service db8eaa
Packit Service db8eaa
\code
Packit Service db8eaa
pcm.name {
Packit Service db8eaa
        type asym               # Asym PCM
Packit Service db8eaa
        playback STR            # Playback slave name
Packit Service db8eaa
        # or
Packit Service db8eaa
        playback {              # Playback slave definition
Packit Service db8eaa
                pcm STR         # Slave PCM name
Packit Service db8eaa
                # or
Packit Service db8eaa
                pcm { }         # Slave PCM definition
Packit Service db8eaa
        }
Packit Service db8eaa
        capture STR             # Capture slave name
Packit Service db8eaa
        # or
Packit Service db8eaa
        capture {               # Capture slave definition
Packit Service db8eaa
                pcm STR         # Slave PCM name
Packit Service db8eaa
                # or
Packit Service db8eaa
                pcm { }         # Slave PCM definition
Packit Service db8eaa
        }
Packit Service db8eaa
}
Packit Service db8eaa
\endcode
Packit Service db8eaa
Packit Service db8eaa
For example, you can combine a dmix plugin and a dsnoop plugin as
Packit Service db8eaa
as a single PCM for playback and capture directions, respectively.
Packit Service db8eaa
\code
Packit Service db8eaa
pcm.duplex {
Packit Service db8eaa
	type asym
Packit Service db8eaa
	playback.pcm "dmix"
Packit Service db8eaa
	capture.pcm "dsnoop"
Packit Service db8eaa
}
Packit Service db8eaa
\endcode
Packit Service db8eaa
Packit Service db8eaa
By defining only a single direction, the resultant PCM becomes
Packit Service db8eaa
half-duplex.
Packit Service db8eaa
Packit Service db8eaa
\subsection pcm_plugins_asym_funcref Function reference
Packit Service db8eaa
Packit Service db8eaa
    Packit Service db8eaa
      
  • _snd_pcm_asym_open()
  • Packit Service db8eaa
    Packit Service db8eaa
    Packit Service db8eaa
    */
    Packit Service db8eaa
    Packit Service db8eaa
    /**
    Packit Service db8eaa
     * \brief Creates a new asym stream PCM
    Packit Service db8eaa
     * \param pcmp Returns created PCM handle
    Packit Service db8eaa
     * \param name Name of PCM
    Packit Service db8eaa
     * \param root Root configuration node
    Packit Service db8eaa
     * \param conf Configuration node with copy PCM description
    Packit Service db8eaa
     * \param stream Stream type
    Packit Service db8eaa
     * \param mode Stream mode
    Packit Service db8eaa
     * \retval zero on success otherwise a negative error code
    Packit Service db8eaa
     * \warning Using of this function might be dangerous in the sense
    Packit Service db8eaa
     *          of compatibility reasons. The prototype might be freely
    Packit Service db8eaa
     *          changed in future.
    Packit Service db8eaa
     */
    Packit Service db8eaa
    int _snd_pcm_asym_open(snd_pcm_t **pcmp, const char *name ATTRIBUTE_UNUSED,
    Packit Service db8eaa
    			 snd_config_t *root, snd_config_t *conf,
    Packit Service db8eaa
    			 snd_pcm_stream_t stream, int mode)
    Packit Service db8eaa
    {
    Packit Service db8eaa
    	snd_config_iterator_t i, next;
    Packit Service db8eaa
    	int err;
    Packit Service db8eaa
    	snd_config_t *slave = NULL, *sconf;
    Packit Service db8eaa
    	snd_config_for_each(i, next, conf) {
    Packit Service db8eaa
    		snd_config_t *n = snd_config_iterator_entry(i);
    Packit Service db8eaa
    		const char *id;
    Packit Service db8eaa
    		if (snd_config_get_id(n, &id) < 0)
    Packit Service db8eaa
    			continue;
    Packit Service db8eaa
    		if (snd_pcm_conf_generic_id(id))
    Packit Service db8eaa
    			continue;
    Packit Service db8eaa
    		if (strcmp(id, "playback") == 0) {
    Packit Service db8eaa
    			if (stream == SND_PCM_STREAM_PLAYBACK)
    Packit Service db8eaa
    				slave = n;
    Packit Service db8eaa
    			continue;
    Packit Service db8eaa
    		}
    Packit Service db8eaa
    		if (strcmp(id, "capture") == 0) {
    Packit Service db8eaa
    			if (stream == SND_PCM_STREAM_CAPTURE)
    Packit Service db8eaa
    				slave = n;
    Packit Service db8eaa
    			continue;
    Packit Service db8eaa
    		}
    Packit Service db8eaa
    		SNDERR("Unknown field %s", id);
    Packit Service db8eaa
    		return -EINVAL;
    Packit Service db8eaa
    	}
    Packit Service db8eaa
    	if (! slave) {
    Packit Service db8eaa
    		SNDERR("%s slave is not defined",
    Packit Service db8eaa
    		       stream == SND_PCM_STREAM_PLAYBACK ? "playback" : "capture");
    Packit Service db8eaa
    		return -EINVAL;
    Packit Service db8eaa
    	}
    Packit Service db8eaa
    	err = snd_pcm_slave_conf(root, slave, &sconf, 0);
    Packit Service db8eaa
    	if (err < 0)
    Packit Service db8eaa
    		return err;
    Packit Service db8eaa
    	err = snd_pcm_open_named_slave(pcmp, name, root, sconf, stream,
    Packit Service db8eaa
    				       mode, conf);
    Packit Service db8eaa
    	snd_config_delete(sconf);
    Packit Service db8eaa
    	return err;
    Packit Service db8eaa
    }
    Packit Service db8eaa
    #ifndef DOC_HIDDEN
    Packit Service db8eaa
    SND_DLSYM_BUILD_VERSION(_snd_pcm_asym_open, SND_PCM_DLSYM_VERSION);
    Packit Service db8eaa
    #endif