Update of /cvsroot/alsa/alsa-kernel/core/oss
In directory sc8-pr-cvs1:/tmp/cvs-serv9291

Modified Files:
        pcm_oss.c 
Log Message:
Replaced expensive STATUS ioctl with DELAY ioctl

Index: pcm_oss.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/core/oss/pcm_oss.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- pcm_oss.c   15 Jul 2003 18:03:48 -0000      1.40
+++ pcm_oss.c   15 Jul 2003 18:13:34 -0000      1.41
@@ -570,22 +570,22 @@
        return 0;
 }
 
-static int snd_pcm_oss_capture_position_fixup(snd_pcm_substream_t *substream, 
snd_pcm_status_t *status)
+static int snd_pcm_oss_capture_position_fixup(snd_pcm_substream_t *substream, 
snd_pcm_sframes_t *delay)
 {
        snd_pcm_runtime_t *runtime;
        snd_pcm_uframes_t frames;
        int err = 0;
 
        while (1) {
-               err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_STATUS, status);
+               err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DELAY, delay);
                if (err < 0)
                        break;
                runtime = substream->runtime;
-               if (status->avail <= runtime->buffer_size)
+               if (*delay <= runtime->buffer_size)
                        break;
                /* in case of overrun, skip whole periods like OSS/Linux driver does */
-               /* until avail <= buffer_size */
-               frames = (status->avail - runtime->buffer_size) + runtime->period_size 
- 1;
+               /* until avail(delay) <= buffer_size */
+               frames = (*delay - runtime->buffer_size) + runtime->period_size - 1;
                frames /= runtime->period_size;
                frames *= runtime->period_size;
                err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_FORWARD, 
&frames);
@@ -633,7 +633,7 @@
 snd_pcm_sframes_t snd_pcm_oss_read3(snd_pcm_substream_t *substream, char *ptr, 
snd_pcm_uframes_t frames, int in_kernel)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       snd_pcm_status_t status;
+       snd_pcm_sframes_t delay;
        int ret;
        while (1) {
                if (runtime->status->state == SNDRV_PCM_STATE_XRUN ||
@@ -652,7 +652,7 @@
                        if (ret < 0)
                                break;
                }
-               ret = snd_pcm_oss_capture_position_fixup(substream, &status);
+               ret = snd_pcm_oss_capture_position_fixup(substream, &delay);
                if (ret < 0)
                        break;
                if (in_kernel) {
@@ -1364,7 +1364,7 @@
 {      
        snd_pcm_substream_t *substream;
        snd_pcm_runtime_t *runtime;
-       snd_pcm_status_t status;
+       snd_pcm_sframes_t delay;
        struct count_info info;
        int err;
 
@@ -1382,18 +1382,17 @@
                        return -EFAULT;
                return 0;
        }
-       memset(&status, 0, sizeof(status));
        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
-               err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_STATUS, &status);
+               err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DELAY, &delay);
        } else {
-               err = snd_pcm_oss_capture_position_fixup(substream, &status);
+               err = snd_pcm_oss_capture_position_fixup(substream, &delay);
        }
        if (err < 0)
                return err;
        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
-               info.bytes = runtime->oss.bytes - snd_pcm_oss_bytes(substream, 
runtime->buffer_size - status.avail);
+               info.bytes = runtime->oss.bytes - snd_pcm_oss_bytes(substream, delay);
        } else {
-               info.bytes = runtime->oss.bytes + snd_pcm_oss_bytes(substream, 
status.avail);
+               info.bytes = runtime->oss.bytes + snd_pcm_oss_bytes(substream, delay);
        }
        info.ptr = snd_pcm_oss_bytes(substream, runtime->status->hw_ptr % 
runtime->buffer_size);
        if (atomic_read(&runtime->mmap_count)) {
@@ -1406,10 +1405,7 @@
                if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
                        snd_pcm_oss_simulate_fill(substream);
        } else {
-               if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-                       info.blocks = (runtime->buffer_size - status.avail) / 
runtime->period_size;
-               else
-                       info.blocks = status.avail / runtime->period_size;
+               info.blocks = delay / runtime->period_size;
        }
        if (copy_to_user(_info, &info, sizeof(info)))
                return -EFAULT;
@@ -1420,7 +1416,7 @@
 {
        snd_pcm_substream_t *substream;
        snd_pcm_runtime_t *runtime;
-       snd_pcm_status_t status;
+       snd_pcm_sframes_t avail;
        struct audio_buf_info info;
        int err;
 
@@ -1437,7 +1433,6 @@
 
        info.fragsize = runtime->oss.period_bytes;
        info.fragstotal = runtime->periods;
-       memset(&status, 0, sizeof(status));
        if (runtime->oss.prepare) {
                if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
                        info.bytes = runtime->oss.period_bytes * runtime->periods;
@@ -1448,23 +1443,17 @@
                }
        } else {
                if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
-                       err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_STATUS, 
&status);
+                       err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DELAY, 
&avail);
+                       avail = runtime->buffer_size - avail;
                } else {
-                       err = snd_pcm_oss_capture_position_fixup(substream, &status);
+                       err = snd_pcm_oss_capture_position_fixup(substream, &avail);
                }
                if (err < 0)
                        return err;
-               info.bytes = snd_pcm_oss_bytes(substream, status.avail);
-               info.fragments = status.avail / runtime->period_size;
+               info.bytes = snd_pcm_oss_bytes(substream, avail);
+               info.fragments = avail / runtime->period_size;
        }
 
-#if 0
-       /* very experimental stuff to get Quake2 working */
-       runtime->oss.period = (info.periods - 1) << 16;
-       for (tmp = info.fragsize; tmp > 1; tmp >>= 1)
-               runtime->oss.period++;
-       runtime->oss.subdivision = 1;   /* disable SUBDIVIDE */
-#endif
 #ifdef OSS_DEBUG
        printk("pcm_oss: space: bytes = %i, fragments = %i, fragstotal = %i, fragsize 
= %i\n", info.bytes, info.fragments, info.fragstotal, info.fragsize);
 #endif



-------------------------------------------------------
This SF.Net email sponsored by: Parasoft
Error proof Web apps, automate testing & more.
Download & eval WebKing and get a free book.
www.parasoft.com/bulletproofapps1
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to