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