]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Added sync_ptr callback
authorJaroslav Kysela <perex@perex.cz>
Fri, 23 Jan 2004 13:04:43 +0000 (13:04 +0000)
committerJaroslav Kysela <perex@perex.cz>
Fri, 23 Jan 2004 13:04:43 +0000 (13:04 +0000)
src/pcm/pcm_direct.c
src/pcm/pcm_direct.h
src/pcm/pcm_dmix.c
src/pcm/pcm_dshare.c
src/pcm/pcm_dsnoop.c

index 82b9cbfe966ba28eab33a75dc3cdb3ecf66c98b8..44fada7fcb9d50c2ae7f5da134398f5991be265b 100644 (file)
@@ -418,6 +418,7 @@ int snd_pcm_direct_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned in
        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;
index b826712aebed3d7aee2a544bd7822e45158fc93a..1ccefa5b44b4d98618813c342f6005bc98232078 100644 (file)
@@ -89,6 +89,7 @@ struct snd_pcm_direct {
        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;
index fa121f46857b6b03aa879da762f08fb7d57c8a16..7865cbe493ed61cfc3f184846af8beecb211b8fa 100644 (file)
@@ -386,8 +386,6 @@ static int snd_pcm_dmix_sync_ptr(snd_pcm_t *pcm)
        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;
@@ -839,6 +837,7 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
        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);
index cf1293f54a54fa4ede1a92f04c30fc9fac3b18d2..92ca366337497160a6ea29ba7b111af0295998fc 100644 (file)
@@ -133,8 +133,6 @@ static int snd_pcm_dshare_sync_ptr(snd_pcm_t *pcm)
        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;
@@ -597,6 +595,7 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
        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);
index 7bc036e16f2d74646ac6d8fd3715867b17d12c7a..0789667691e88914b3d614a3ac1bd7d962789297 100644 (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
  */
-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;
@@ -151,7 +149,7 @@ static snd_pcm_sframes_t snd_pcm_dsnoop_sync_ptr(snd_pcm_t *pcm)
        }
        if (avail > dsnoop->avail_max)
                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;
        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);