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

Modified Files:
        pcm_oss.c 
Log Message:
Fixed comments in pcm_oss.h
Fixed sync() routine for the partial playback transfers


Index: pcm_oss.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/core/oss/pcm_oss.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- pcm_oss.c   8 Sep 2003 07:14:17 -0000       1.48
+++ pcm_oss.c   10 Sep 2003 13:51:30 -0000      1.49
@@ -937,46 +937,68 @@
        return 0;
 }
 
+static int snd_pcm_oss_sync1(snd_pcm_substream_t *substream, size_t size)
+{
+       snd_pcm_runtime_t *runtime;
+       ssize_t result = 0;
+       wait_queue_t wait;
+
+       runtime = substream->runtime;
+       init_waitqueue_entry(&wait, current);
+       add_wait_queue(&runtime->sleep, &wait);
+       while (1) {
+               result = snd_pcm_oss_write2(substream, runtime->oss.buffer, size, 1);
+               if (result > 0) {
+                       runtime->oss.buffer_used = 0;
+                       result = 0;
+                       break;
+               }
+               if (result != 0 && result != -EAGAIN)
+                       break;
+               result = 0;
+               set_current_state(TASK_INTERRUPTIBLE);
+               schedule();
+               if (signal_pending(current)) {
+                       result = -ERESTARTSYS;
+                       break;
+               }
+               set_current_state(TASK_RUNNING);
+       }
+       remove_wait_queue(&runtime->sleep, &wait);
+       return result;
+}
+
 static int snd_pcm_oss_sync(snd_pcm_oss_file_t *pcm_oss_file)
 {
        int err = 0;
        unsigned int saved_f_flags;
        snd_pcm_substream_t *substream;
        snd_pcm_runtime_t *runtime;
-       ssize_t result;
-       wait_queue_t wait;
+       size_t size;
 
        substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_PLAYBACK];
        if (substream != NULL) {
                if ((err = snd_pcm_oss_make_ready(substream)) < 0)
                        return err;
-               
                runtime = substream->runtime;
                if (runtime->oss.buffer_used > 0) {
                        snd_pcm_format_set_silence(runtime->format,
                                                   runtime->oss.buffer + 
runtime->oss.buffer_used,
                                                   bytes_to_samples(runtime, 
runtime->oss.period_bytes - runtime->oss.buffer_used));
-                       init_waitqueue_entry(&wait, current);
-                       add_wait_queue(&runtime->sleep, &wait);
-                       while (1) {
-                               result = snd_pcm_oss_write2(substream, 
runtime->oss.buffer, runtime->oss.period_bytes, 1);
-                               if (result > 0) {
-                                       runtime->oss.buffer_used = 0;
-                                       break;
-                               }
-                               if (result != 0 && result != -EAGAIN)
-                                       break;
-                               set_current_state(TASK_INTERRUPTIBLE);
-                               schedule();
-                               if (signal_pending(current)) {
-                                       result = -ERESTARTSYS;
-                                       break;
-                               }
-                       }
-                       set_current_state(TASK_RUNNING);
-                       remove_wait_queue(&runtime->sleep, &wait);
-                       if (result < 0)
-                               return result;
+                       err = snd_pcm_oss_sync1(substream, runtime->oss.period_bytes);
+                       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,
+                                                  runtime->oss.buffer,
+                                                  size);
+                       err = snd_pcm_oss_sync1(substream, samples_to_bytes(runtime, 
size));
+                       if (err < 0)
+                               return err;
                }
                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