This adds a new callback "buffer" in dai_ops and platform. The runtime->delay is reported to sound core as sum of delay and buffer value. The buffer value is also reported independently to pcm core for error checks
Signed-off-by: Vinod Koul vinod.koul@linux.intel.com --- include/sound/soc-dai.h | 6 ++++++ include/sound/soc.h | 6 ++++++ sound/soc/soc-pcm.c | 13 ++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h index 628db7b..b0c84df 100644 --- a/include/sound/soc-dai.h +++ b/include/sound/soc-dai.h @@ -182,6 +182,12 @@ struct snd_soc_dai_ops { */ snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *, struct snd_soc_dai *); + /* + * For hardware based buffer reporting + * Optional. + */ + snd_pcm_sframes_t (*buffer)(struct snd_pcm_substream *, + struct snd_soc_dai *); };
/* diff --git a/include/sound/soc.h b/include/sound/soc.h index 313b766..f50bdf9 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -795,6 +795,12 @@ struct snd_soc_platform_driver { */ snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *, struct snd_soc_dai *); + /* + * For hardware based buffer reporting + * Optional. + */ + snd_pcm_sframes_t (*buffer)(struct snd_pcm_substream *, + struct snd_soc_dai *);
/* platform stream pcm ops */ struct snd_pcm_ops *ops; diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index ef22d0b..605337f 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -674,6 +674,7 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream) struct snd_pcm_runtime *runtime = substream->runtime; snd_pcm_uframes_t offset = 0; snd_pcm_sframes_t delay = 0; + snd_pcm_sframes_t buffer = 0;
if (platform->driver->ops && platform->driver->ops->pointer) offset = platform->driver->ops->pointer(substream); @@ -687,7 +688,17 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream) if (platform->driver->delay) delay += platform->driver->delay(substream, codec_dai);
- runtime->delay = delay; + if (cpu_dai->driver->ops->buffer) + buffer += cpu_dai->driver->ops->buffer(substream, cpu_dai); + + if (codec_dai->driver->ops->buffer) + buffer += codec_dai->driver->ops->buffer(substream, codec_dai); + + if (platform->driver->buffer) + buffer += platform->driver->buffer(substream, codec_dai); + + runtime->delay = delay + buffer; + runtime->device_buffer = buffer;
return offset; }