mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-09-21 03:43:03 +00:00
ASoC: pcm: Add delay_blk feature
Add delay_blk() to pcm, platform and DAI ops. The pcm delay_blk() op collects the audio DSP path delays from the low-level drivers and sets the runtime->delay field to their aggregate. Change-Id: Ib7e10f44ab8ccb46dc2f5825081d0afef662d827 Signed-off-by: Kenneth Westfield <kwestfie@codeaurora.org>
This commit is contained in:
parent
7a7dca4023
commit
8f1992d60c
|
@ -73,12 +73,13 @@ struct snd_pcm_ops {
|
|||
int (*prepare)(struct snd_pcm_substream *substream);
|
||||
int (*trigger)(struct snd_pcm_substream *substream, int cmd);
|
||||
snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
|
||||
int (*delay_blk)(struct snd_pcm_substream *substream);
|
||||
int (*wall_clock)(struct snd_pcm_substream *substream,
|
||||
struct timespec *audio_ts);
|
||||
int (*copy)(struct snd_pcm_substream *substream, int channel,
|
||||
snd_pcm_uframes_t pos,
|
||||
void __user *buf, snd_pcm_uframes_t count);
|
||||
int (*silence)(struct snd_pcm_substream *substream, int channel,
|
||||
int (*silence)(struct snd_pcm_substream *substream, int channel,
|
||||
snd_pcm_uframes_t pos, snd_pcm_uframes_t count);
|
||||
struct page *(*page)(struct snd_pcm_substream *substream,
|
||||
unsigned long offset);
|
||||
|
|
|
@ -832,6 +832,16 @@ struct snd_soc_platform_driver {
|
|||
snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
|
||||
struct snd_soc_dai *);
|
||||
|
||||
/*
|
||||
* For platform-caused delay reporting, where the thread blocks waiting
|
||||
* for the delay amount to be determined. Defining this will cause the
|
||||
* ASoC core to skip calling the delay callbacks for all components in
|
||||
* the runtime.
|
||||
* Optional.
|
||||
*/
|
||||
snd_pcm_sframes_t (*delay_blk)(struct snd_pcm_substream *,
|
||||
struct snd_soc_dai *);
|
||||
|
||||
/* platform stream pcm ops */
|
||||
const struct snd_pcm_ops *ops;
|
||||
|
||||
|
|
|
@ -744,6 +744,9 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
|
|||
if (platform->driver->ops && platform->driver->ops->pointer)
|
||||
offset = platform->driver->ops->pointer(substream);
|
||||
|
||||
if (platform->driver->delay_blk)
|
||||
return offset;
|
||||
|
||||
if (cpu_dai->driver->ops->delay)
|
||||
delay += cpu_dai->driver->ops->delay(substream, cpu_dai);
|
||||
|
||||
|
@ -758,6 +761,21 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
|
|||
return offset;
|
||||
}
|
||||
|
||||
static int soc_pcm_delay_blk(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_platform *platform = rtd->platform;
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
snd_pcm_sframes_t delay = 0;
|
||||
|
||||
if (platform->driver->delay_blk)
|
||||
delay = platform->driver->delay_blk(substream, rtd->codec_dai);
|
||||
|
||||
runtime->delay = delay;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* connect a FE and BE */
|
||||
static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe,
|
||||
struct snd_soc_pcm_runtime *be, int stream)
|
||||
|
@ -2391,6 +2409,7 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
|
|||
rtd->ops.hw_free = dpcm_fe_dai_hw_free;
|
||||
rtd->ops.close = dpcm_fe_dai_close;
|
||||
rtd->ops.pointer = soc_pcm_pointer;
|
||||
rtd->ops.delay_blk = soc_pcm_delay_blk;
|
||||
rtd->ops.ioctl = soc_pcm_ioctl;
|
||||
rtd->ops.compat_ioctl = soc_pcm_compat_ioctl;
|
||||
} else {
|
||||
|
@ -2401,6 +2420,7 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
|
|||
rtd->ops.hw_free = soc_pcm_hw_free;
|
||||
rtd->ops.close = soc_pcm_close;
|
||||
rtd->ops.pointer = soc_pcm_pointer;
|
||||
rtd->ops.delay_blk = soc_pcm_delay_blk;
|
||||
rtd->ops.ioctl = soc_pcm_ioctl;
|
||||
rtd->ops.compat_ioctl = soc_pcm_compat_ioctl;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue