events = pfds[0].revents;
if (events & POLLIN) {
int empty = 0;
+ dmix->sync_ptr(pcm);
if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
events |= POLLOUT;
events &= ~POLLIN;
snd_pcm_uframes_t avail_max;
snd_pcm_uframes_t slave_appl_ptr;
snd_pcm_uframes_t slave_hw_ptr;
+ int (*sync_ptr)(snd_pcm_t *pcm);
snd_pcm_state_t state;
snd_htimestamp_t trigger_tstamp;
int server, client;
snd_pcm_sframes_t diff;
switch (snd_pcm_state(dmix->spcm)) {
- case SND_PCM_STATE_SUSPENDED:
- return -ESTRPIPE;
case SND_PCM_STATE_DISCONNECTED:
dmix->state = -ENOTTY;
return -ENOTTY;
pcm->private_data = dmix;
dmix->state = SND_PCM_STATE_OPEN;
dmix->slowptr = slowptr;
+ dmix->sync_ptr = snd_pcm_dmix_sync_ptr;
if (first_instance) {
ret = snd_pcm_open_slave(&spcm, root, sconf, stream, mode);
snd_pcm_sframes_t diff;
switch (snd_pcm_state(dshare->spcm)) {
- case SND_PCM_STATE_SUSPENDED:
- return -ESTRPIPE;
case SND_PCM_STATE_DISCONNECTED:
dshare->state = SNDRV_PCM_STATE_DISCONNECTED;
return -ENOTTY;
pcm->private_data = dshare;
dshare->state = SND_PCM_STATE_OPEN;
dshare->slowptr = slowptr;
+ dshare->sync_ptr = snd_pcm_dshare_sync_ptr;
if (first_instance) {
ret = snd_pcm_open_slave(&spcm, root, sconf, stream, mode);
/*
* 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_uframes_t slave_hw_ptr, old_slave_hw_ptr, avail;
snd_pcm_sframes_t diff;
switch (snd_pcm_state(dsnoop->spcm)) {
- case SND_PCM_STATE_SUSPENDED:
- return -ESTRPIPE;
case SND_PCM_STATE_DISCONNECTED:
dsnoop->state = SNDRV_PCM_STATE_DISCONNECTED;
return -ENOTTY;
}
if (avail > dsnoop->avail_max)
dsnoop->avail_max = avail;
- return diff;
+ return 0;
}
/*
pcm->private_data = dsnoop;
dsnoop->state = SND_PCM_STATE_OPEN;
dsnoop->slowptr = slowptr;
+ dsnoop->sync_ptr = snd_pcm_dsnoop_sync_ptr;
if (first_instance) {
ret = snd_pcm_open_slave(&spcm, root, sconf, stream, mode);