[PATCH] 2.4.15: fix for i810_audio problems under KDE

From: Andris Pavenis (pavenis@latnet.lv)
Date: Fri Nov 23 2001 - 06:21:14 EST


i810_audio doesn't work under KDE for 2.4.15 (realy already for a rather
long time). I'm only getting garbled sound unless i810_audio.c is patched.
Perhaps the reason is use of non blocked output by artsd.

Included patch reverts one change between 2.4.6-ac1 and 2.4.6-ac2 and
also includes patch from Tobias Diedrich
( http://www.cs.helsinki.fi/linux/linux-kernel/2001-44/1023.html ).
As far as I have tested it fixes all problems I have met with i810_audio.

Andris

--- i810_audio.c~1 Tue Nov 20 11:23:24 2001
+++ i810_audio.c Tue Nov 20 13:08:05 2001
@@ -1405,10 +1405,9 @@
                 if (dmabuf->count < 0) {
                         dmabuf->count = 0;
                 }
- cnt = dmabuf->dmasize - dmabuf->fragsize - dmabuf->count;
- // this is to make the copy_from_user simpler below
- if(cnt > (dmabuf->dmasize - swptr))
- cnt = dmabuf->dmasize - swptr;
+ cnt = dmabuf->dmasize - swptr;
+ if(cnt > (dmabuf->dmasize - dmabuf->count))
+ cnt = dmabuf->dmasize - dmabuf->count;
                 spin_unlock_irqrestore(&state->card->lock, flags);
 
 #ifdef DEBUG2
@@ -1419,16 +1418,13 @@
                 if (cnt <= 0) {
                         unsigned long tmo;
                         // There is data waiting to be played
+ i810_update_lvi(state,0);
                         if(!dmabuf->enable && dmabuf->count) {
                                 /* force the starting incase SETTRIGGER has been used */
                                 /* to stop it, otherwise this is a deadlock situation */
                                 dmabuf->trigger |= PCM_ENABLE_OUTPUT;
                                 start_dac(state);
                         }
- // Update the LVI pointer in case we have already
- // written data in this syscall and are just waiting
- // on the tail bit of data
- i810_update_lvi(state,0);
                         if (file->f_flags & O_NONBLOCK) {
                                 if (!ret) ret = -EAGAIN;
                                 goto ret;
@@ -1860,7 +1856,7 @@
                 if(dmabuf->mapped)
                         abinfo.bytes = dmabuf->count;
                 else
- abinfo.bytes = dmabuf->dmasize - dmabuf->count;
+ abinfo.bytes = dmabuf->dmasize - dmabuf->fragsize - dmabuf->count;
                 abinfo.fragments = abinfo.bytes / dmabuf->userfragsize;
                 spin_unlock_irqrestore(&state->card->lock, flags);
 #ifdef DEBUG

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Nov 23 2001 - 21:00:33 EST