[alsa-devel] [PATCH 2/2] ALSA: pcm: add arrangement for applying appl_ptr
Takashi Iwai
tiwai at suse.de
Fri May 26 08:40:47 CEST 2017
On Fri, 26 May 2017 02:30:47 +0200,
Takashi Sakamoto wrote:
>
> In callgraphs from below kernel APIs, position of application pointer on
> PCM buffer is changes, according to given parameters.
>
> - snd_pcm_lib_read()
> - snd_pcm_lib_readv()
> - snd_pcm_lib_write()
> - snd_pcm_lib_writev()
>
> This operation corresponds to application of new position to runtime of
> PCM substream and callback of driver's implementation for
> 'struct snd_pcm_ops.ack'.
>
> In a former commit, a new local function is added, 'apply_appl_ptr'. The
> above code block can be replaced with this function.
>
> This commit replaces the code block with call of the function. The function
> is renamed to be shared by several objects.
>
> Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
Queued now, but will be likely declined later due to the rewrites of
the code.
thanks,
Takashi
> ---
> sound/core/pcm_lib.c | 12 ++++++------
> sound/core/pcm_local.h | 3 +++
> sound/core/pcm_native.c | 11 ++++++-----
> 3 files changed, 15 insertions(+), 11 deletions(-)
>
> diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
> index e50548af4004..63a172455e00 100644
> --- a/sound/core/pcm_lib.c
> +++ b/sound/core/pcm_lib.c
> @@ -2091,9 +2091,9 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream,
> appl_ptr += frames;
> if (appl_ptr >= runtime->boundary)
> appl_ptr -= runtime->boundary;
> - runtime->control->appl_ptr = appl_ptr;
> - if (substream->ops->ack)
> - substream->ops->ack(substream);
> + err = snd_pcm_apply_appl_ptr(substream, appl_ptr);
> + if (err < 0)
> + goto _end_unlock;
>
> offset += frames;
> size -= frames;
> @@ -2323,9 +2323,9 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream,
> appl_ptr += frames;
> if (appl_ptr >= runtime->boundary)
> appl_ptr -= runtime->boundary;
> - runtime->control->appl_ptr = appl_ptr;
> - if (substream->ops->ack)
> - substream->ops->ack(substream);
> + err = snd_pcm_apply_appl_ptr(substream, appl_ptr);
> + if (err < 0)
> + goto _end_unlock;
>
> offset += frames;
> size -= frames;
> diff --git a/sound/core/pcm_local.h b/sound/core/pcm_local.h
> index 34c66decaaf2..5ac60cd6f4d9 100644
> --- a/sound/core/pcm_local.h
> +++ b/sound/core/pcm_local.h
> @@ -48,4 +48,7 @@ static inline void snd_pcm_timer_init(struct snd_pcm_substream *substream) {}
> static inline void snd_pcm_timer_done(struct snd_pcm_substream *substream) {}
> #endif
>
> +int snd_pcm_apply_appl_ptr(struct snd_pcm_substream *substream,
> + snd_pcm_uframes_t appl_ptr);
> +
> #endif /* __SOUND_CORE_PCM_LOCAL_H */
> diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
> index bf5d0f2acfb9..514f6707280e 100644
> --- a/sound/core/pcm_native.c
> +++ b/sound/core/pcm_native.c
> @@ -2454,8 +2454,8 @@ static int do_pcm_hwsync(struct snd_pcm_substream *substream)
> /* update to the given appl_ptr and call ack callback if needed;
> * when an error is returned, take back to the original value
> */
> -static int apply_appl_ptr(struct snd_pcm_substream *substream,
> - snd_pcm_uframes_t appl_ptr)
> +int snd_pcm_apply_appl_ptr(struct snd_pcm_substream *substream,
> + snd_pcm_uframes_t appl_ptr)
> {
> struct snd_pcm_runtime *runtime = substream->runtime;
> snd_pcm_uframes_t old_appl_ptr = runtime->control->appl_ptr;
> @@ -2488,7 +2488,7 @@ static snd_pcm_sframes_t forward_appl_ptr(struct snd_pcm_substream *substream,
> appl_ptr = runtime->control->appl_ptr + frames;
> if (appl_ptr >= (snd_pcm_sframes_t)runtime->boundary)
> appl_ptr -= runtime->boundary;
> - ret = apply_appl_ptr(substream, appl_ptr);
> + ret = snd_pcm_apply_appl_ptr(substream, appl_ptr);
> return ret < 0 ? ret : frames;
> }
>
> @@ -2508,7 +2508,7 @@ static snd_pcm_sframes_t rewind_appl_ptr(struct snd_pcm_substream *substream,
> appl_ptr = runtime->control->appl_ptr - frames;
> if (appl_ptr < 0)
> appl_ptr += runtime->boundary;
> - ret = apply_appl_ptr(substream, appl_ptr);
> + ret = snd_pcm_apply_appl_ptr(substream, appl_ptr);
> return ret < 0 ? ret : frames;
> }
>
> @@ -2636,7 +2636,8 @@ static int snd_pcm_sync_ptr(struct snd_pcm_substream *substream,
> }
> snd_pcm_stream_lock_irq(substream);
> if (!(sync_ptr.flags & SNDRV_PCM_SYNC_PTR_APPL)) {
> - err = apply_appl_ptr(substream, sync_ptr.c.control.appl_ptr);
> + err = snd_pcm_apply_appl_ptr(substream,
> + sync_ptr.c.control.appl_ptr);
> if (err < 0) {
> snd_pcm_stream_unlock_irq(substream);
> return err;
> --
> 2.11.0
>
More information about the Alsa-devel
mailing list