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

Modified Files:
        pcm_oss.c 
Log Message:
Fixed oops in oss_sync() routine.


Index: pcm_oss.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/core/oss/pcm_oss.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- pcm_oss.c   25 Sep 2003 18:55:43 -0000      1.50
+++ pcm_oss.c   29 Sep 2003 18:16:18 -0000      1.51
@@ -142,7 +142,7 @@
        case AFMT_U16_LE:       return SNDRV_PCM_FORMAT_U16_LE;
        case AFMT_U16_BE:       return SNDRV_PCM_FORMAT_U16_BE;
        case AFMT_MPEG:         return SNDRV_PCM_FORMAT_MPEG;
-       default:                        return SNDRV_PCM_FORMAT_U8;
+       default:                return SNDRV_PCM_FORMAT_U8;
        }
 }
 
@@ -554,6 +554,7 @@
        }
        runtime->oss.prepare = 0;
        runtime->oss.prev_hw_ptr_interrupt = 0;
+       runtime->oss.period_ptr = 0;
 
        return 0;
 }
@@ -818,6 +819,8 @@
                                        return xfer > 0 ? (snd_pcm_sframes_t)xfer : 
tmp;
                                runtime->oss.bytes += tmp;
                                runtime->oss.buffer_used = 0;
+                               runtime->oss.period_ptr += tmp;
+                               runtime->oss.period_ptr %= runtime->oss.period_bytes;
                        }
                } else {
                        tmp = snd_pcm_oss_write2(substream, (char *)buf, 
runtime->oss.period_bytes, 0);
@@ -974,6 +977,8 @@
        unsigned int saved_f_flags;
        snd_pcm_substream_t *substream;
        snd_pcm_runtime_t *runtime;
+       snd_pcm_format_t format;
+       unsigned long width;
        size_t size;
 
        substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_PLAYBACK];
@@ -981,24 +986,35 @@
                if ((err = snd_pcm_oss_make_ready(substream)) < 0)
                        return err;
                runtime = substream->runtime;
+               format = snd_pcm_oss_format_from(runtime->oss.format));
+               width = snd_pcm_format_physical_width(format);
                if (runtime->oss.buffer_used > 0) {
-                       snd_pcm_format_set_silence(runtime->format,
+                       size = (8 * (runtime->oss.period_bytes - 
runtime->oss.buffer_used) + 7) / width;
+                       snd_pcm_format_set_silence(format,
                                                   runtime->oss.buffer + 
runtime->oss.buffer_used,
-                                                  bytes_to_samples(runtime, 
runtime->oss.period_bytes - runtime->oss.buffer_used));
+                                                  size);
                        err = snd_pcm_oss_sync1(substream, runtime->oss.period_bytes);
                        if (err < 0)
                                return err;
+               } else if (runtime->oss.period_ptr > 0) {
+                       size = runtime->oss.period_bytes - runtime->oss.period_ptr;
+                       snd_pcm_format_set_silence(format,
+                                                  runtime->oss.buffer,
+                                                  size * 8 / width);
+                       err = snd_pcm_oss_sync1(substream, size);
+                       if (err < 0)
+                               return err;
                }
-               size = runtime->control->appl_ptr % runtime->period_size;
-               if (size > 0) {
-                       size = runtime->period_size - size;
-                        size *= runtime->channels;
-                       snd_pcm_format_set_silence(runtime->format,
+               size = runtime->oss.period_bytes;
+               size1 = frames_to_bytes(runtime, runtime->period_size);
+               while (size < size1) {
+                       snd_pcm_format_set_silence(format,
                                                   runtime->oss.buffer,
-                                                  size);
-                       err = snd_pcm_oss_sync1(substream, samples_to_bytes(runtime, 
size));
+                                                  (8 * runtime->oss.period_size + 7) 
/ width);
+                       err = snd_pcm_oss_sync1(substream, runtime->oss.period_bytes);
                        if (err < 0)
                                return err;
+                       size += runtime->oss.period_bytes;
                }
                saved_f_flags = substream->ffile->f_flags;
                substream->ffile->f_flags &= ~O_NONBLOCK;



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to