[alsa-devel] reset of kernel input buffer for /dev/dsp
Takashi Iwai
tiwai at suse.de
Mon Nov 29 09:58:57 CET 2010
At Mon, 29 Nov 2010 17:40:03 +0900,
Amit Nagal wrote:
>
> Hi ,
>
> Thanx for the reply .
>
> we tried SNDCTL_DSP_RESET , but it is not flushing the kernel pcm
> buffer for us .
It should. It abandons the pending data and resets to the initial
state before starting the stream.
But, it might be a bug in OSS emulation later. It doesn't seem to
reset the internal buffer. Try the patch below.
> any other method which we can use ?
> also please lets us the function available with alsa - lib which
> serves the purpose of flushing
> the kernel pcm buffer .
snd_pcm_drop() corresponds to it.
Takashi
---
diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c
index 5c8c7df..a4411a3 100644
--- a/sound/core/oss/pcm_oss.c
+++ b/sound/core/oss/pcm_oss.c
@@ -1510,16 +1510,19 @@ static ssize_t snd_pcm_oss_read1(struct snd_pcm_substream *substream, char __use
static int snd_pcm_oss_reset(struct snd_pcm_oss_file *pcm_oss_file)
{
struct snd_pcm_substream *substream;
+ struct snd_pcm_runtime *runtime;
+ int i;
- substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_PLAYBACK];
- if (substream != NULL) {
- snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL);
- substream->runtime->oss.prepare = 1;
- }
- substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE];
- if (substream != NULL) {
+ for (i = 0; i < 2; i++) {
+ substream = pcm_oss_file->streams[i];
+ if (!substream)
+ continue;
+ runtime = substream->runtine;
snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL);
- substream->runtime->oss.prepare = 1;
+ runtime->oss.prepare = 1;
+ runtime->oss.buffer_used = 0;
+ runtime->oss.prev_hw_ptr_period = 0;
+ runtime->oss.period_ptr = 0;
}
return 0;
}
More information about the Alsa-devel
mailing list