Added sync_ptr callback

This commit is contained in:
Jaroslav Kysela 2004-01-23 13:04:43 +00:00
parent c508b496b4
commit 819a85fb2c
5 changed files with 7 additions and 8 deletions

View file

@ -418,6 +418,7 @@ int snd_pcm_direct_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned in
events = pfds[0].revents; events = pfds[0].revents;
if (events & POLLIN) { if (events & POLLIN) {
int empty = 0; int empty = 0;
dmix->sync_ptr(pcm);
if (pcm->stream == SND_PCM_STREAM_PLAYBACK) { if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
events |= POLLOUT; events |= POLLOUT;
events &= ~POLLIN; events &= ~POLLIN;

View file

@ -89,6 +89,7 @@ struct snd_pcm_direct {
snd_pcm_uframes_t avail_max; snd_pcm_uframes_t avail_max;
snd_pcm_uframes_t slave_appl_ptr; snd_pcm_uframes_t slave_appl_ptr;
snd_pcm_uframes_t slave_hw_ptr; snd_pcm_uframes_t slave_hw_ptr;
int (*sync_ptr)(snd_pcm_t *pcm);
snd_pcm_state_t state; snd_pcm_state_t state;
snd_htimestamp_t trigger_tstamp; snd_htimestamp_t trigger_tstamp;
int server, client; int server, client;

View file

@ -386,8 +386,6 @@ static int snd_pcm_dmix_sync_ptr(snd_pcm_t *pcm)
snd_pcm_sframes_t diff; snd_pcm_sframes_t diff;
switch (snd_pcm_state(dmix->spcm)) { switch (snd_pcm_state(dmix->spcm)) {
case SND_PCM_STATE_SUSPENDED:
return -ESTRPIPE;
case SND_PCM_STATE_DISCONNECTED: case SND_PCM_STATE_DISCONNECTED:
dmix->state = -ENOTTY; dmix->state = -ENOTTY;
return -ENOTTY; return -ENOTTY;
@ -839,6 +837,7 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
pcm->private_data = dmix; pcm->private_data = dmix;
dmix->state = SND_PCM_STATE_OPEN; dmix->state = SND_PCM_STATE_OPEN;
dmix->slowptr = slowptr; dmix->slowptr = slowptr;
dmix->sync_ptr = snd_pcm_dmix_sync_ptr;
if (first_instance) { if (first_instance) {
ret = snd_pcm_open_slave(&spcm, root, sconf, stream, mode); ret = snd_pcm_open_slave(&spcm, root, sconf, stream, mode);

View file

@ -133,8 +133,6 @@ static int snd_pcm_dshare_sync_ptr(snd_pcm_t *pcm)
snd_pcm_sframes_t diff; snd_pcm_sframes_t diff;
switch (snd_pcm_state(dshare->spcm)) { switch (snd_pcm_state(dshare->spcm)) {
case SND_PCM_STATE_SUSPENDED:
return -ESTRPIPE;
case SND_PCM_STATE_DISCONNECTED: case SND_PCM_STATE_DISCONNECTED:
dshare->state = SNDRV_PCM_STATE_DISCONNECTED; dshare->state = SNDRV_PCM_STATE_DISCONNECTED;
return -ENOTTY; return -ENOTTY;
@ -597,6 +595,7 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
pcm->private_data = dshare; pcm->private_data = dshare;
dshare->state = SND_PCM_STATE_OPEN; dshare->state = SND_PCM_STATE_OPEN;
dshare->slowptr = slowptr; dshare->slowptr = slowptr;
dshare->sync_ptr = snd_pcm_dshare_sync_ptr;
if (first_instance) { if (first_instance) {
ret = snd_pcm_open_slave(&spcm, root, sconf, stream, mode); ret = snd_pcm_open_slave(&spcm, root, sconf, stream, mode);

View file

@ -108,15 +108,13 @@ static void snd_pcm_dsnoop_sync_area(snd_pcm_t *pcm, snd_pcm_uframes_t slave_hw_
/* /*
* synchronize hardware pointer (hw_ptr) with ours * synchronize hardware pointer (hw_ptr) with ours
*/ */
static snd_pcm_sframes_t snd_pcm_dsnoop_sync_ptr(snd_pcm_t *pcm) static int snd_pcm_dsnoop_sync_ptr(snd_pcm_t *pcm)
{ {
snd_pcm_direct_t *dsnoop = pcm->private_data; snd_pcm_direct_t *dsnoop = pcm->private_data;
snd_pcm_uframes_t slave_hw_ptr, old_slave_hw_ptr, avail; snd_pcm_uframes_t slave_hw_ptr, old_slave_hw_ptr, avail;
snd_pcm_sframes_t diff; snd_pcm_sframes_t diff;
switch (snd_pcm_state(dsnoop->spcm)) { switch (snd_pcm_state(dsnoop->spcm)) {
case SND_PCM_STATE_SUSPENDED:
return -ESTRPIPE;
case SND_PCM_STATE_DISCONNECTED: case SND_PCM_STATE_DISCONNECTED:
dsnoop->state = SNDRV_PCM_STATE_DISCONNECTED; dsnoop->state = SNDRV_PCM_STATE_DISCONNECTED;
return -ENOTTY; return -ENOTTY;
@ -151,7 +149,7 @@ static snd_pcm_sframes_t snd_pcm_dsnoop_sync_ptr(snd_pcm_t *pcm)
} }
if (avail > dsnoop->avail_max) if (avail > dsnoop->avail_max)
dsnoop->avail_max = avail; dsnoop->avail_max = avail;
return diff; return 0;
} }
/* /*
@ -557,6 +555,7 @@ int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
pcm->private_data = dsnoop; pcm->private_data = dsnoop;
dsnoop->state = SND_PCM_STATE_OPEN; dsnoop->state = SND_PCM_STATE_OPEN;
dsnoop->slowptr = slowptr; dsnoop->slowptr = slowptr;
dsnoop->sync_ptr = snd_pcm_dsnoop_sync_ptr;
if (first_instance) { if (first_instance) {
ret = snd_pcm_open_slave(&spcm, root, sconf, stream, mode); ret = snd_pcm_open_slave(&spcm, root, sconf, stream, mode);