Update of /cvsroot/alsa/alsa-oss/alsa
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25512/alsa

Modified Files:
        alsa-oss-emul.h alsa-oss.c pcm.c 
Log Message:
- a try to let OSS mmap mode work with dmix plugin
- call avail_update in GETIPTR and GETOPTR functions (fixme)
- fixed/enhanced semantics of select_prepare (should work now)


Index: alsa-oss-emul.h
===================================================================
RCS file: /cvsroot/alsa/alsa-oss/alsa/alsa-oss-emul.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- alsa-oss-emul.h     10 Feb 2004 13:40:36 -0000      1.1
+++ alsa-oss-emul.h     18 Feb 2004 20:17:05 -0000      1.2
@@ -68,10 +68,10 @@
 extern void * lib_oss_pcm_mmap(void *start, size_t length, int prot, int flags, int 
fd, off_t offset);
 extern int lib_oss_pcm_munmap(void *start, size_t length);
 extern int lib_oss_pcm_ioctl(int fd, unsigned long int request, ...);
-extern int lib_oss_pcm_select_prepare(int fd, fd_set *readfds, fd_set *writefds, 
fd_set *exceptfds);
+extern int lib_oss_pcm_select_prepare(int fd, int fmode, fd_set *readfds, fd_set 
*writefds, fd_set *exceptfds);
 extern int lib_oss_pcm_select_result(int fd, fd_set *readfds, fd_set *writefds, 
fd_set *exceptfds);
 extern int lib_oss_pcm_poll_fds(int fd);
-extern int lib_oss_pcm_poll_prepare(int fd, struct pollfd *ufds);
+extern int lib_oss_pcm_poll_prepare(int fd, int fmode, struct pollfd *ufds);
 extern int lib_oss_pcm_poll_result(int fd, struct pollfd *ufds);
 
 extern int lib_oss_mixer_open(const char *pathname, int flags, ...);

Index: alsa-oss.c
===================================================================
RCS file: /cvsroot/alsa/alsa-oss/alsa/alsa-oss.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- alsa-oss.c  12 Feb 2004 18:51:37 -0000      1.5
+++ alsa-oss.c  18 Feb 2004 20:17:05 -0000      1.6
@@ -72,6 +72,7 @@
 
 typedef struct {
        fd_class_t class;
+       int oflags;
        void *mmap_area;
 } fd_t;
 
@@ -90,6 +91,8 @@
        va_end(args);
 
        switch (cmd) {
+       case F_GETFL:
+               return fds[fd]->oflags;
         case F_SETFL:
                result = lib_oss_pcm_nonblock(fd, (arg & O_NONBLOCK) ? 1 : 0);
                 if (result < 0) {
@@ -119,6 +122,8 @@
        va_end(args);
 
        switch (cmd) {
+       case F_GETFL:
+               return fds[fd]->oflags;
        default:
                DEBUG("mixer_fcntl(%d, ", fd);
                result = _fcntl(fd, cmd, arg);
@@ -200,6 +205,7 @@
                                return -1;
                        }
                        fds[fd]->class = FD_OSS_DSP;
+                       fds[fd]->oflags = oflag;
                        poll_fds_add += lib_oss_pcm_poll_fds(fd);
                }
        } else if (!strncmp(file, "/dev/mixer", 10)) {
@@ -212,6 +218,7 @@
                                return -1;
                        }
                        fds[fd]->class = FD_OSS_MIXER;
+                       fds[fd]->oflags = oflag;
                }
        } else {
                fd = _open(file, oflag, mode);
@@ -376,8 +383,15 @@
                switch (fds[fd]->class) {
                case FD_OSS_DSP:
                {
-                       lib_oss_pcm_poll_prepare(fd, &pfds1[nfds1]);
-                       nfds1 += lib_oss_pcm_poll_fds(fd);
+                       unsigned short events = pfds[k].events;
+                       int fmode = 0;
+                       if (events & (POLLIN|POLLOUT))
+                               fmode = O_RDWR;
+                       else if (events & POLLIN)
+                               fmode = O_RDONLY;
+                       else
+                               fmode = O_WRONLY;
+                       nfds1 += lib_oss_pcm_poll_prepare(fd, fmode, &pfds1[nfds1]);
                        direct = 0;
                        break;
                }
@@ -454,21 +468,25 @@
        int count, count1;
        int fd;
        int direct = 1;
+
        if (rfds) {
                _rfds1 = *rfds;
-               rfds1 = &_rfds1;
-       } else
-               rfds1 = NULL;
+       } else {
+               FD_ZERO(&_rfds1);
+       }
+       rfds1 = &_rfds1;
        if (wfds) {
                _wfds1 = *wfds;
-               wfds1 = &_wfds1;
-       } else
-               wfds1 = NULL;
+       } else {
+               FD_ZERO(&_wfds1);
+       }
+       wfds1 = &_wfds1;
        if (efds) {
                _efds1 = *efds;
                efds1 = &_efds1;
-       } else
+       } else {
                efds1 = NULL;
+       }
        for (fd = 0; fd < nfds; ++fd) {
                int r = (rfds && FD_ISSET(fd, rfds));
                int w = (wfds && FD_ISSET(fd, wfds));
@@ -480,9 +498,26 @@
                switch (fds[fd]->class) {
                case FD_OSS_DSP:
                {
-                       lib_oss_pcm_select_prepare(fd, r ? rfds1 : NULL,
-                                                      w ? wfds1 : NULL,
-                                                      e ? efds1 : NULL);
+                       int res, fmode = 0;
+                       
+                       if (r & w)
+                               fmode = O_RDWR;
+                       else if (r)
+                               fmode = O_RDONLY;
+                       else
+                               fmode = O_WRONLY;
+                       res = lib_oss_pcm_select_prepare(fd, fmode, rfds1, wfds1,
+                                                        e ? efds1 : NULL);
+                       if (res < 0)
+                               return -1;
+                       if (nfds1 < res + 1)
+                               nfds1 = res + 1;
+                       if (r)
+                               FD_CLR(fd, rfds1);
+                       if (w)
+                               FD_CLR(fd, wfds1);
+                       if (e)
+                               FD_CLR(fd, efds1);
                        direct = 0;
                        break;
                }
@@ -530,15 +565,19 @@
                        if (result < 0 && e) {
                                FD_SET(fd, efds);
                                e1 = 1;
-                       } else if (result & OSS_WAIT_EVENT_ERROR) {
-                               FD_SET(fd, efds);
-                               e1 = 1;
-                       } else if (result & OSS_WAIT_EVENT_READ) {
-                               FD_SET(fd, rfds);
-                               r1 = 1;
-                       } else if (result & OSS_WAIT_EVENT_WRITE) {
-                               FD_SET(fd, wfds);
-                               w1 = 1;
+                       } else {
+                               if (result & OSS_WAIT_EVENT_ERROR) {
+                                       FD_SET(fd, efds);
+                                       e1 = 1;
+                               }
+                               if (result & OSS_WAIT_EVENT_READ) {
+                                       FD_SET(fd, rfds);
+                                       r1 = 1;
+                               }
+                               if (result & OSS_WAIT_EVENT_WRITE) {
+                                       FD_SET(fd, wfds);
+                                       w1 = 1;
+                               }
                        }
                        break;
                }

Index: pcm.c
===================================================================
RCS file: /cvsroot/alsa/alsa-oss/alsa/pcm.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- pcm.c       14 Feb 2004 18:42:17 -0000      1.4
+++ pcm.c       18 Feb 2004 20:17:05 -0000      1.5
@@ -522,8 +522,14 @@
                if (!(streams & (1 << k)))
                        continue;
                result = snd_pcm_open(&dsp->streams[k].pcm, name, k, pcm_mode);
-               if (result < 0)
+               if (result < 0) {
+                       if (k == 1 && dsp->streams[0].pcm != NULL) {
+                               dsp->streams[1].pcm = NULL;
+                               streams &= ~(1 << SND_PCM_STREAM_CAPTURE);
+                               result = 0;
+                       }
                        break;
+               }
        }
        if (result < 0) {
                result = 0;
@@ -680,11 +686,14 @@
                }
 #if USE_REWIND
                err = snd_pcm_rewind(pcm, str->alsa.buffer_size);
-               if (err < 0)
-                       return;
-               size = str->mmap_advance;
-//             fprintf(stderr, "delay=%ld rewind=%ld forward=%ld offset=%ld\n",
-//                     delay, err, size, snd_pcm_mmap_offset(pcm));
+               if (err < 0) {
+                       /* fallback to not very accurate method */
+                       size = str->mmap_advance - delay;
+               } else {
+                       size = str->mmap_advance;
+               }
+//             fprintf(stderr, "delay=%ld rewind=%ld forward=%ld\n",
+//                     delay, err, size);
 #else
                size = str->mmap_advance - delay;
 #endif
@@ -692,6 +701,8 @@
                        snd_pcm_uframes_t ofs;
                        snd_pcm_uframes_t frames = size;
                        snd_pcm_mmap_begin(pcm, &areas, &ofs, &frames);
+                       if (frames == 0)
+                               break;
 //                     fprintf(stderr, "copy %ld %ld %d\n", ofs, frames, dsp->format);
                        snd_pcm_areas_copy(areas, ofs, str->mmap_areas, ofs, 
                                           dsp->channels, frames,
@@ -1027,6 +1038,7 @@
                                oss_dsp_mmap_update(dsp, SND_PCM_STREAM_CAPTURE, 
delay);
                }
                /* FIXME */
+               snd_pcm_avail_update(pcm);
                hw_ptr = _snd_pcm_mmap_hw_ptr(pcm);
                info->bytes = hw_ptr;
                info->bytes *= str->frame_bytes;
@@ -1066,6 +1078,7 @@
                                oss_dsp_mmap_update(dsp, SND_PCM_STREAM_PLAYBACK, 
delay);
                }
                /* FIXME */
+               snd_pcm_avail_update(pcm);
                hw_ptr = _snd_pcm_mmap_hw_ptr(pcm);
                info->bytes = hw_ptr;
                info->bytes *= str->frame_bytes;
@@ -1264,10 +1277,10 @@
        return 0;
 }
 
-int lib_oss_pcm_select_prepare(int fd, fd_set *readfds, fd_set *writefds, fd_set 
*exceptfds)
+int lib_oss_pcm_select_prepare(int fd, int fmode, fd_set *readfds, fd_set *writefds, 
fd_set *exceptfds)
 {
        oss_dsp_t *dsp = look_for_dsp(fd);
-       int k;
+       int k, maxfd = -1;
 
        if (dsp == NULL) {
                errno = EBADFD;
@@ -1278,6 +1291,10 @@
                int err, count;
                if (!pcm)
                        continue;
+               if ((fmode & O_ACCMODE) == O_RDONLY && snd_pcm_stream(pcm) == 
SND_PCM_STREAM_PLAYBACK)
+                       continue;
+               if ((fmode & O_ACCMODE) == O_WRONLY && snd_pcm_stream(pcm) == 
SND_PCM_STREAM_CAPTURE)
+                       continue;
                count = snd_pcm_poll_descriptors_count(pcm);
                if (count < 0) {
                        errno = -count;
@@ -1294,6 +1311,8 @@
                        for (j = 0; j < count; j++) {
                                int fd = ufds[j].fd;
                                unsigned short events = ufds[j].events;
+                               if (maxfd < fd)
+                                       maxfd = fd;
                                if (readfds) {
                                        FD_CLR(fd, readfds);
                                        if (events & POLLIN)
@@ -1312,7 +1331,7 @@
                        }
                }
        }       
-       return 0;
+       return maxfd;
 }
 
 int lib_oss_pcm_select_result(int fd, fd_set *readfds, fd_set *writefds, fd_set 
*exceptfds)
@@ -1363,7 +1382,7 @@
                                result |= OSS_WAIT_EVENT_ERROR;
                        if (revents & POLLIN)
                                result |= OSS_WAIT_EVENT_READ;
-                       if (revents & POLLIN)
+                       if (revents & POLLOUT)
                                result |= OSS_WAIT_EVENT_WRITE;
                }
        }       
@@ -1394,10 +1413,10 @@
        return result;
 }
 
-int lib_oss_pcm_poll_prepare(int fd, struct pollfd *ufds)
+int lib_oss_pcm_poll_prepare(int fd, int fmode, struct pollfd *ufds)
 {
        oss_dsp_t *dsp = look_for_dsp(fd);
-       int k;
+       int k, result = 0;
 
        if (dsp == NULL) {
                errno = EBADFD;
@@ -1408,6 +1427,10 @@
                int err, count;
                if (!pcm)
                        continue;
+               if ((fmode & O_ACCMODE) == O_RDONLY && snd_pcm_stream(pcm) == 
SND_PCM_STREAM_PLAYBACK)
+                       continue;
+               if ((fmode & O_ACCMODE) == O_WRONLY && snd_pcm_stream(pcm) == 
SND_PCM_STREAM_CAPTURE)
+                       continue;
                count = snd_pcm_poll_descriptors_count(pcm);
                if (count < 0) {
                        errno = -count;
@@ -1419,8 +1442,9 @@
                        return -1;
                }
                ufds += count;
+               result += count;
        }       
-       return 0;
+       return result;
 }
 
 int lib_oss_pcm_poll_result(int fd, struct pollfd *ufds)



-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to