[alsa-devel] [PATCH] pcm_dshare: Do not discard slave reported delay in status result.
Takashi Iwai
tiwai at suse.de
Thu Nov 17 11:31:30 CET 2016
On Thu, 17 Nov 2016 09:20:16 +0100,
Alan Young wrote:
>
> snd_pcm_dshare_status() gets the underlying status from the slave PCM.
> This may contain a delay value that includes elements such as codec and
> other transfer delays. Use this as the base for the returned delay
> value, adjusted for any frames buffered locally (within the dshare
> plugin).
>
> Note: snd_pcm_dshare_delay() is not updated.
Thanks for the patch, but it doesn't look like a proper patch to be
applied to the latest git tree. I guess you created a patch on top of
the modified tree.
Please rebase and resubmit.
Also, don't forget to add your sign-off. We prefer having it in
alsa-lib code like the kernel code (although it's not strictly
needed).
Takashi
> ---
> src/pcm/pcm_dshare.c | 45 ++++++++++++++++++++++++++++-----------------
> 1 file changed, 28 insertions(+), 17 deletions(-)
>
> diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c
> index c5b3178..9b478a7 100644
> --- a/src/pcm/pcm_dshare.c
> +++ b/src/pcm/pcm_dshare.c
> @@ -157,23 +157,14 @@ static void snd_pcm_dshare_sync_area(snd_pcm_t *pcm)
> /*
> * synchronize hardware pointer (hw_ptr) with ours
> */
> -static int snd_pcm_dshare_sync_ptr(snd_pcm_t *pcm)
> +static int snd_pcm_dshare_sync_ptr0(snd_pcm_t *pcm, snd_pcm_uframes_t slave_hw_ptr)
> {
> snd_pcm_direct_t *dshare = pcm->private_data;
> - snd_pcm_uframes_t slave_hw_ptr, old_slave_hw_ptr, avail;
> + snd_pcm_uframes_t old_slave_hw_ptr, avail;
> snd_pcm_sframes_t diff;
>
> - switch (snd_pcm_state(dshare->spcm)) {
> - case SND_PCM_STATE_DISCONNECTED:
> - dshare->state = SNDRV_PCM_STATE_DISCONNECTED;
> - return -ENODEV;
> - default:
> - break;
> - }
> - if (dshare->slowptr)
> - snd_pcm_hwsync(dshare->spcm);
> old_slave_hw_ptr = dshare->slave_hw_ptr;
> - slave_hw_ptr = dshare->slave_hw_ptr = *dshare->spcm->hw.ptr;
> + dshare->slave_hw_ptr = slave_hw_ptr;
> diff = slave_hw_ptr - old_slave_hw_ptr;
> if (diff == 0) /* fast path */
> return 0;
> @@ -207,6 +198,24 @@ static int snd_pcm_dshare_sync_ptr(snd_pcm_t *pcm)
> return 0;
> }
> +static int snd_pcm_dshare_sync_ptr(snd_pcm_t *pcm)
> +{
> + snd_pcm_direct_t *dshare = pcm->private_data;
> +
> + switch (snd_pcm_state(dshare->spcm)) {
> + case SND_PCM_STATE_DISCONNECTED:
> + dshare->state = SNDRV_PCM_STATE_DISCONNECTED;
> + return -ENODEV;
> + default:
> + break;
> + }
> +
> + if (dshare->slowptr)
> + snd_pcm_hwsync(dshare->spcm);
> +
> + return snd_pcm_dshare_sync_ptr0(pcm, *dshare->spcm->hw.ptr);
> +}
> +
> /*
> * plugin implementation
> */
> @@ -215,22 +224,24 @@ static int snd_pcm_dshare_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
> {
> snd_pcm_direct_t *dshare = pcm->private_data;
> + memset(status, 0, sizeof(*status));
> + snd_pcm_status(dshare->spcm, status);
> +
> switch (dshare->state) {
> case SNDRV_PCM_STATE_DRAINING:
> case SNDRV_PCM_STATE_RUNNING:
> - snd_pcm_dshare_sync_ptr(pcm);
> + snd_pcm_dshare_sync_ptr0(pcm, status->hw_ptr);
> + status->delay += snd_pcm_mmap_playback_delay(pcm)
> + + status->avail - dshare->spcm->buffer_size;
> break;
> default:
> break;
> }
> - memset(status, 0, sizeof(*status));
> - snd_pcm_status(dshare->spcm, status);
> - status->state = snd_pcm_state(dshare->spcm);
> +
> status->trigger_tstamp = dshare->trigger_tstamp;
> status->avail = snd_pcm_mmap_playback_avail(pcm);
> status->avail_max = status->avail > dshare->avail_max ? status->avail : dshare->avail_max;
> dshare->avail_max = 0;
> - status->delay = snd_pcm_mmap_playback_delay(pcm);
> return 0;
> }
> --
> 2.5.5
>
More information about the Alsa-devel
mailing list