android_kernel_google_msm/include/sound/soc-dpcm.h
Gopikrishnaiah Anandan 1f42244c54 ASoC: dpcm: Add Dynamic PCM core operations.
The Dynamic PCM core allows digital audio data to be dynamically
routed between different ALSA PCMs and DAI links on SoC CPUs with
on chip DSP devices. e.g. audio data could be played on pcm:0,0 and
routed to any (or all) SoC DAI links.

Dynamic PCM introduces the concept of Front End (FE) PCMs and Back
End (BE) PCMs. The FE PCMs are normal ALSA PCM devices except that
they can dynamically route digital audio data to any supported BE
PCM. A BE PCM has no ALSA device, but represents a DAI link and it's
substream and audio HW parameters.

Signed-off-by: Gopikrishnaiah Anandan <agopik@codeaurora.org>
2013-02-25 11:41:10 -08:00

109 lines
2.8 KiB
C

/*
* linux/sound/soc-dpcm.h -- ALSA SoC Dynamic PCM Support
*
* Author: Liam Girdwood <lrg@ti.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef __LINUX_SND_SOC_DPCM_H
#define __LINUX_SND_SOC_DPCM_H
#include <sound/pcm.h>
/*
* Types of runtime_update to perform (e.g. originated from FE PCM ops
* or audio route changes triggered by muxes/mixers.
*/
#define SND_SOC_DPCM_UPDATE_NO 0
#define SND_SOC_DPCM_UPDATE_BE 1
#define SND_SOC_DPCM_UPDATE_FE 2
/*
* Dynamic PCM Frontend -> Backend link state.
*/
enum snd_soc_dpcm_link_state {
SND_SOC_DPCM_LINK_STATE_NEW = 0, /* newly created path */
SND_SOC_DPCM_LINK_STATE_FREE, /* path to be dismantled */
};
/*
* Dynamic PCM params link
* This links together a FE and BE DAI at runtime and stores the link
* state information and the hw_params configuration.
*/
struct snd_soc_dpcm_params {
/* FE and BE DAIs*/
struct snd_soc_pcm_runtime *be;
struct snd_soc_pcm_runtime *fe;
/* link state */
enum snd_soc_dpcm_link_state state;
struct list_head list_be;
struct list_head list_fe;
/* hw params for this link - may be different for each link */
struct snd_pcm_hw_params hw_params;
#ifdef CONFIG_DEBUG_FS
struct dentry *debugfs_state;
#endif
};
/*
* Bespoke Trigger() Helper API
*/
/* is the PCM operation for this FE ? */
static inline int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe,
int stream)
{
return (fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE);
}
/* is the PCM operation for this BE ? */
static inline int snd_soc_dpcm_be_can_update(struct snd_soc_pcm_runtime *fe,
struct snd_soc_pcm_runtime *be, int stream)
{
if ((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_FE) ||
((fe->dpcm[stream].runtime_update == SND_SOC_DPCM_UPDATE_BE) &&
be->dpcm[stream].runtime_update))
return 1;
else
return 0;
}
/* trigger platform driver only */
static inline int
snd_soc_dpcm_platform_trigger(struct snd_pcm_substream *substream,
int cmd, struct snd_soc_platform *platform)
{
if (platform->driver->ops->trigger)
return platform->driver->ops->trigger(substream, cmd);
return 0;
}
int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe,
struct snd_soc_pcm_runtime *be, int stream);
static inline struct snd_pcm_substream *
snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream)
{
return be->pcm->streams[stream].substream;
}
static inline enum snd_soc_dpcm_state
snd_soc_dpcm_be_get_state(struct snd_soc_pcm_runtime *be, int stream)
{
return be->dpcm[stream].state;
}
static inline void snd_soc_dpcm_be_set_state(struct snd_soc_pcm_runtime *be,
int stream, enum snd_soc_dpcm_state state)
{
be->dpcm[stream].state = state;
}
#endif