diff options
author | Takashi Iwai <tiwai@suse.de> | 2008-10-12 21:07:14 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-05-05 08:47:21 -0400 |
commit | 4bbe1ddf89a5ba3ec30fe5980912d8bda3a3cbb2 (patch) | |
tree | c57b1b83a23bd80535ea5b9220d07a3ab09df955 /sound | |
parent | 091438dd5668396328a3419abcbc6591159eb8d1 (diff) |
ALSA: Add extra delay count in PCM
Added runtime->delay field to adjust the delayed samples for snd_pcm_delay().
Typically a hardware FIFO length is stored in this field, so that the
extra delay between hwptr and applptr can be computed.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/pcm_native.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index fc6f98e257df..cb769d415db7 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c | |||
@@ -587,14 +587,15 @@ int snd_pcm_status(struct snd_pcm_substream *substream, | |||
587 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 587 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
588 | status->avail = snd_pcm_playback_avail(runtime); | 588 | status->avail = snd_pcm_playback_avail(runtime); |
589 | if (runtime->status->state == SNDRV_PCM_STATE_RUNNING || | 589 | if (runtime->status->state == SNDRV_PCM_STATE_RUNNING || |
590 | runtime->status->state == SNDRV_PCM_STATE_DRAINING) | 590 | runtime->status->state == SNDRV_PCM_STATE_DRAINING) { |
591 | status->delay = runtime->buffer_size - status->avail; | 591 | status->delay = runtime->buffer_size - status->avail; |
592 | else | 592 | status->delay += runtime->delay; |
593 | } else | ||
593 | status->delay = 0; | 594 | status->delay = 0; |
594 | } else { | 595 | } else { |
595 | status->avail = snd_pcm_capture_avail(runtime); | 596 | status->avail = snd_pcm_capture_avail(runtime); |
596 | if (runtime->status->state == SNDRV_PCM_STATE_RUNNING) | 597 | if (runtime->status->state == SNDRV_PCM_STATE_RUNNING) |
597 | status->delay = status->avail; | 598 | status->delay = status->avail + runtime->delay; |
598 | else | 599 | else |
599 | status->delay = 0; | 600 | status->delay = 0; |
600 | } | 601 | } |
@@ -2404,6 +2405,7 @@ static int snd_pcm_delay(struct snd_pcm_substream *substream, | |||
2404 | n = snd_pcm_playback_hw_avail(runtime); | 2405 | n = snd_pcm_playback_hw_avail(runtime); |
2405 | else | 2406 | else |
2406 | n = snd_pcm_capture_avail(runtime); | 2407 | n = snd_pcm_capture_avail(runtime); |
2408 | n += runtime->delay; | ||
2407 | break; | 2409 | break; |
2408 | case SNDRV_PCM_STATE_XRUN: | 2410 | case SNDRV_PCM_STATE_XRUN: |
2409 | err = -EPIPE; | 2411 | err = -EPIPE; |