Michel Dänzer <michel@daenzer.net>

Apparently these changes from pcm_direct.c revisions 1.12 and 1.14 were
accidentally reverted in revision 1.15. Please reapply.
This commit is contained in:
Jaroslav Kysela 2004-03-05 18:36:19 +00:00
parent aed5c921d4
commit 84c40f4970

View file

@ -100,11 +100,21 @@ int snd_pcm_direct_semaphore_up(snd_pcm_direct_t *dmix, int sem_num)
int snd_pcm_direct_shm_create_or_connect(snd_pcm_direct_t *dmix) int snd_pcm_direct_shm_create_or_connect(snd_pcm_direct_t *dmix)
{ {
struct shmid_ds buf; struct shmid_ds buf;
int ret = 0; int tmpid, err;
retryget:
dmix->shmid = shmget(dmix->ipc_key, sizeof(snd_pcm_direct_share_t), IPC_CREAT | 0666); dmix->shmid = shmget(dmix->ipc_key, sizeof(snd_pcm_direct_share_t), IPC_CREAT | 0666);
if (dmix->shmid < 0) err = -errno;
return -errno; if (dmix->shmid < 0){
if (errno == EINVAL)
if ((tmpid = shmget(dmix->ipc_key, 0, 0666)) != -1)
if (!shmctl(tmpid, IPC_STAT, &buf))
if (!buf.shm_nattch)
/* no users so destroy the segment */
if (!shmctl(tmpid, IPC_RMID, NULL))
goto retryget;
return err;
}
dmix->shmptr = shmat(dmix->shmid, 0, 0); dmix->shmptr = shmat(dmix->shmid, 0, 0);
if (dmix->shmptr == (void *) -1) { if (dmix->shmptr == (void *) -1) {
snd_pcm_direct_shm_discard(dmix); snd_pcm_direct_shm_discard(dmix);
@ -117,9 +127,9 @@ int snd_pcm_direct_shm_create_or_connect(snd_pcm_direct_t *dmix)
} }
if (buf.shm_nattch == 1) { /* we're the first user, clear the segment */ if (buf.shm_nattch == 1) { /* we're the first user, clear the segment */
memset(dmix->shmptr, 0, sizeof(snd_pcm_direct_share_t)); memset(dmix->shmptr, 0, sizeof(snd_pcm_direct_share_t));
ret = 1; return 1;
} }
return ret; return 0;
} }
int snd_pcm_direct_shm_discard(snd_pcm_direct_t *dmix) int snd_pcm_direct_shm_discard(snd_pcm_direct_t *dmix)
@ -409,15 +419,23 @@ int snd_pcm_direct_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned in
{ {
snd_pcm_direct_t *dmix = pcm->private_data; snd_pcm_direct_t *dmix = pcm->private_data;
unsigned short events; 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); assert(pfds && nfds == 1 && revents);
events = pfds[0].revents; events = pfds[0].revents;
if (events & POLLIN) { if (events & POLLIN) {
int empty = 0;
if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
events |= POLLOUT; events |= POLLOUT;
events &= ~POLLIN; 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 */ /* 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; *revents = events;
return 0; return 0;