Update of /cvsroot/alsa/alsa-lib/src/pcm
In directory sc8-pr-cvs1:/tmp/cvs-serv21759

Modified Files:
        pcm_direct.c pcm_dmix.c pcm_dshare.c pcm_dsnoop.c 
Log Message:
Fixed poll() behaviour for direct plugins, also added snd_pcm_hwsync() call to start 
callback

Index: pcm_direct.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_direct.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- pcm_direct.c        9 Jan 2004 18:32:05 -0000       1.11
+++ pcm_direct.c        21 Jan 2004 19:21:11 -0000      1.12
@@ -410,15 +410,23 @@
 {
        snd_pcm_direct_t *dmix = pcm->private_data;
        unsigned short events;
-       static snd_timer_read_t rbuf[5];        /* can be overwriten by multiple 
plugins, we don't need the value */
+       /* rbuf might be overwriten by multiple plugins */
+       /* we don't need the value */
+       static snd_timer_read_t rbuf[5];
 
        assert(pfds && nfds == 1 && revents);
        events = pfds[0].revents;
        if (events & POLLIN) {
-               events |= POLLOUT;
-               events &= ~POLLIN;
+               int empty = 0;
+               if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
+                       events |= POLLOUT;
+                       events &= ~POLLIN;
+                       empty = snd_pcm_mmap_playback_avail(pcm) < pcm->avail_min;
+               } else {
+                       empty = snd_pcm_mmap_capture_avail(pcm) < pcm->avail_min;
+               }
                /* empty the timer read queue */
-               while (snd_timer_read(dmix->timer, &rbuf, sizeof(rbuf)) == 
sizeof(rbuf)) ;
+               while (empty && snd_timer_read(dmix->timer, &rbuf, sizeof(rbuf)) == 
sizeof(rbuf)) ;
        }
        *revents = events;
        return 0;

Index: pcm_dmix.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_dmix.c,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -r1.47 -r1.48
--- pcm_dmix.c  20 Jan 2004 15:29:39 -0000      1.47
+++ pcm_dmix.c  21 Jan 2004 19:21:11 -0000      1.48
@@ -407,7 +407,6 @@
        }
        dmix->hw_ptr += diff;
        dmix->hw_ptr %= pcm->boundary;
-       // printf("sync ptr diff = %li\n", diff);
        if (pcm->stop_threshold >= pcm->boundary)       /* don't care */
                return 0;
        if ((avail = snd_pcm_mmap_playback_avail(pcm)) >= pcm->stop_threshold) {
@@ -545,6 +544,7 @@
        if (err < 0)
                return err;
        dmix->state = SND_PCM_STATE_RUNNING;
+       snd_pcm_hwsync(dmix->spcm);
        dmix->slave_appl_ptr = dmix->slave_hw_ptr = *dmix->spcm->hw.ptr;
        avail = snd_pcm_mmap_playback_hw_avail(pcm);
        if (avail < 0)

Index: pcm_dshare.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_dshare.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- pcm_dshare.c        20 Jan 2004 15:29:39 -0000      1.13
+++ pcm_dshare.c        21 Jan 2004 19:21:11 -0000      1.14
@@ -292,6 +292,7 @@
        if (err < 0)
                return err;
        dshare->state = SND_PCM_STATE_RUNNING;
+       snd_pcm_hwsync(dshare->spcm);
        dshare->slave_appl_ptr = dshare->slave_hw_ptr = *dshare->spcm->hw.ptr;
        avail = snd_pcm_mmap_playback_hw_avail(pcm);
        if (avail < 0)

Index: pcm_dsnoop.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_dsnoop.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- pcm_dsnoop.c        20 Jan 2004 15:29:39 -0000      1.13
+++ pcm_dsnoop.c        21 Jan 2004 19:21:11 -0000      1.14
@@ -274,6 +274,7 @@
        if (err < 0)
                return err;
        dsnoop->state = SND_PCM_STATE_RUNNING;
+       snd_pcm_hwsync(dsnoop->spcm);
        dsnoop->slave_appl_ptr = dsnoop->slave_hw_ptr = *dsnoop->spcm->hw.ptr;
        gettimeofday(&tv, 0);
        dsnoop->trigger_tstamp.tv_sec = tv.tv_sec;



-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to