1d5ac70f0Sopenharmony_ci/** 2d5ac70f0Sopenharmony_ci * \file pcm/pcm_empty.c 3d5ac70f0Sopenharmony_ci * \ingroup PCM_Plugins 4d5ac70f0Sopenharmony_ci * \brief PCM Empty Plugin Interface 5d5ac70f0Sopenharmony_ci * \author Jaroslav Kysela <perex@perex.cz> 6d5ac70f0Sopenharmony_ci * \date 2006 7d5ac70f0Sopenharmony_ci */ 8d5ac70f0Sopenharmony_ci/* 9d5ac70f0Sopenharmony_ci * PCM - Empty plugin 10d5ac70f0Sopenharmony_ci * Copyright (c) 2006 by Jaroslav Kysela <perex@perex.cz> 11d5ac70f0Sopenharmony_ci * 12d5ac70f0Sopenharmony_ci * 13d5ac70f0Sopenharmony_ci * This library is free software; you can redistribute it and/or modify 14d5ac70f0Sopenharmony_ci * it under the terms of the GNU Lesser General Public License as 15d5ac70f0Sopenharmony_ci * published by the Free Software Foundation; either version 2.1 of 16d5ac70f0Sopenharmony_ci * the License, or (at your option) any later version. 17d5ac70f0Sopenharmony_ci * 18d5ac70f0Sopenharmony_ci * This program is distributed in the hope that it will be useful, 19d5ac70f0Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 20d5ac70f0Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21d5ac70f0Sopenharmony_ci * GNU Lesser General Public License for more details. 22d5ac70f0Sopenharmony_ci * 23d5ac70f0Sopenharmony_ci * You should have received a copy of the GNU Lesser General Public 24d5ac70f0Sopenharmony_ci * License along with this library; if not, write to the Free Software 25d5ac70f0Sopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 26d5ac70f0Sopenharmony_ci * 27d5ac70f0Sopenharmony_ci */ 28d5ac70f0Sopenharmony_ci 29d5ac70f0Sopenharmony_ci#include "pcm_local.h" 30d5ac70f0Sopenharmony_ci#include "pcm_plugin.h" 31d5ac70f0Sopenharmony_ci 32d5ac70f0Sopenharmony_ci#ifndef PIC 33d5ac70f0Sopenharmony_ci/* entry for static linking */ 34d5ac70f0Sopenharmony_ciconst char *_snd_module_pcm_empty = ""; 35d5ac70f0Sopenharmony_ci#endif 36d5ac70f0Sopenharmony_ci 37d5ac70f0Sopenharmony_ci/*! \page pcm_plugins 38d5ac70f0Sopenharmony_ci 39d5ac70f0Sopenharmony_ci\section pcm_plugins_empty Plugin: Empty 40d5ac70f0Sopenharmony_ci 41d5ac70f0Sopenharmony_ciThis plugin just redirects the PCM stream to another plugin. 42d5ac70f0Sopenharmony_ci 43d5ac70f0Sopenharmony_ci\code 44d5ac70f0Sopenharmony_cipcm.name { 45d5ac70f0Sopenharmony_ci type empty # Null PCM 46d5ac70f0Sopenharmony_ci slave STR # Slave name 47d5ac70f0Sopenharmony_ci # or 48d5ac70f0Sopenharmony_ci slave { # Slave definition 49d5ac70f0Sopenharmony_ci pcm STR # Slave PCM name 50d5ac70f0Sopenharmony_ci # or 51d5ac70f0Sopenharmony_ci pcm { } # Slave PCM definition 52d5ac70f0Sopenharmony_ci [format STR] # Slave format 53d5ac70f0Sopenharmony_ci [channels INT] # Slave channels 54d5ac70f0Sopenharmony_ci } 55d5ac70f0Sopenharmony_ci} 56d5ac70f0Sopenharmony_ci\endcode 57d5ac70f0Sopenharmony_ci 58d5ac70f0Sopenharmony_ci\subsection pcm_plugins_empty_funcref Function reference 59d5ac70f0Sopenharmony_ci 60d5ac70f0Sopenharmony_ci<UL> 61d5ac70f0Sopenharmony_ci <LI>_snd_pcm_empty_open() 62d5ac70f0Sopenharmony_ci</UL> 63d5ac70f0Sopenharmony_ci 64d5ac70f0Sopenharmony_ci*/ 65d5ac70f0Sopenharmony_ci 66d5ac70f0Sopenharmony_ci/** 67d5ac70f0Sopenharmony_ci * \brief Creates a new Empty PCM 68d5ac70f0Sopenharmony_ci * \param pcmp Returns created PCM handle 69d5ac70f0Sopenharmony_ci * \param name Name of PCM 70d5ac70f0Sopenharmony_ci * \param root Root configuration node 71d5ac70f0Sopenharmony_ci * \param conf Configuration node with empty PCM description 72d5ac70f0Sopenharmony_ci * \param stream Stream type 73d5ac70f0Sopenharmony_ci * \param mode Stream mode 74d5ac70f0Sopenharmony_ci * \retval zero on success otherwise a negative error code 75d5ac70f0Sopenharmony_ci * \warning Using of this function might be dangerous in the sense 76d5ac70f0Sopenharmony_ci * of compatibility reasons. The prototype might be freely 77d5ac70f0Sopenharmony_ci * changed in future. 78d5ac70f0Sopenharmony_ci */ 79d5ac70f0Sopenharmony_ciint _snd_pcm_empty_open(snd_pcm_t **pcmp, const char *name ATTRIBUTE_UNUSED, 80d5ac70f0Sopenharmony_ci snd_config_t *root, snd_config_t *conf, 81d5ac70f0Sopenharmony_ci snd_pcm_stream_t stream, int mode) 82d5ac70f0Sopenharmony_ci{ 83d5ac70f0Sopenharmony_ci snd_config_t *slave = NULL, *sconf; 84d5ac70f0Sopenharmony_ci snd_config_iterator_t i, next; 85d5ac70f0Sopenharmony_ci int err; 86d5ac70f0Sopenharmony_ci 87d5ac70f0Sopenharmony_ci snd_config_for_each(i, next, conf) { 88d5ac70f0Sopenharmony_ci snd_config_t *n = snd_config_iterator_entry(i); 89d5ac70f0Sopenharmony_ci const char *id; 90d5ac70f0Sopenharmony_ci if (snd_config_get_id(n, &id) < 0) 91d5ac70f0Sopenharmony_ci continue; 92d5ac70f0Sopenharmony_ci if (snd_pcm_conf_generic_id(id)) 93d5ac70f0Sopenharmony_ci continue; 94d5ac70f0Sopenharmony_ci if (strcmp(id, "slave") == 0) { 95d5ac70f0Sopenharmony_ci slave = n; 96d5ac70f0Sopenharmony_ci continue; 97d5ac70f0Sopenharmony_ci } 98d5ac70f0Sopenharmony_ci SNDERR("Unknown field %s", id); 99d5ac70f0Sopenharmony_ci return -EINVAL; 100d5ac70f0Sopenharmony_ci } 101d5ac70f0Sopenharmony_ci if (!slave) { 102d5ac70f0Sopenharmony_ci SNDERR("slave is not defined"); 103d5ac70f0Sopenharmony_ci return -EINVAL; 104d5ac70f0Sopenharmony_ci } 105d5ac70f0Sopenharmony_ci err = snd_pcm_slave_conf(root, slave, &sconf, 0); 106d5ac70f0Sopenharmony_ci if (err < 0) 107d5ac70f0Sopenharmony_ci return err; 108d5ac70f0Sopenharmony_ci err = snd_pcm_open_named_slave(pcmp, name, root, sconf, stream, 109d5ac70f0Sopenharmony_ci mode, conf); 110d5ac70f0Sopenharmony_ci snd_config_delete(sconf); 111d5ac70f0Sopenharmony_ci return err; 112d5ac70f0Sopenharmony_ci} 113d5ac70f0Sopenharmony_ci#ifndef DOC_HIDDEN 114d5ac70f0Sopenharmony_ciSND_DLSYM_BUILD_VERSION(_snd_pcm_empty_open, SND_PCM_DLSYM_VERSION); 115d5ac70f0Sopenharmony_ci#endif 116