]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Allow ioplugins to override snd_pcm_delay()
authorPierre Ossman <ossman@cendio.se>
Fri, 26 May 2006 15:08:18 +0000 (17:08 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 26 May 2006 15:08:18 +0000 (17:08 +0200)
Some io plug-ins might want to adjust the reported delay value and not
strictly follow the current buffer usage (that's why we have two calls
after all).

Allow them to specify a delay() callback and use the previous behaviour
if they don't.

Signed-off-by: Pierre Ossman <ossman@cendio.se>
include/pcm_ioplug.h
src/pcm/pcm_ioplug.c

index 58f97be6e411c76acafb31b18916b333892f0324..f8a23f693bc6a5c291749354699978e225a4cec5 100644 (file)
@@ -65,7 +65,7 @@ typedef struct snd_pcm_ioplug_callback snd_pcm_ioplug_callback_t;
  */
 #define SND_PCM_IOPLUG_VERSION_MAJOR   1       /**< Protocol major version */
 #define SND_PCM_IOPLUG_VERSION_MINOR   0       /**< Protocol minor version */
-#define SND_PCM_IOPLUG_VERSION_TINY    0       /**< Protocol tiny version */
+#define SND_PCM_IOPLUG_VERSION_TINY    1       /**< Protocol tiny version */
 /**
  * IO-plugin protocol version
  */
@@ -184,6 +184,10 @@ struct snd_pcm_ioplug_callback {
         * dump; optional
         */
        void (*dump)(snd_pcm_ioplug_t *io, snd_output_t *out);
+       /**
+        * get the delay for the running PCM; optional
+        */
+       int (*delay)(snd_pcm_ioplug_t *io, snd_pcm_sframes_t *delayp);
 };
 
 
index ed8c508004131f36031ac36672383a2c031dbb41..dbef48e06a745480934a52f6eddd60ae35d63826 100644 (file)
@@ -111,8 +111,15 @@ static int snd_pcm_ioplug_hwsync(snd_pcm_t *pcm)
 
 static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
 {
-       snd_pcm_ioplug_hw_ptr_update(pcm);
-       *delayp = snd_pcm_mmap_hw_avail(pcm); 
+       ioplug_priv_t *io = pcm->private_data;
+
+       if (io->data->version >= 0x010001 &&
+           io->data->callback->delay)
+               return io->data->callback->delay(io->data, delayp);
+       else {
+               snd_pcm_ioplug_hw_ptr_update(pcm);
+               *delayp = snd_pcm_mmap_hw_avail(pcm);
+       }
        return 0;
 }
 
@@ -877,7 +884,9 @@ int snd_pcm_ioplug_create(snd_pcm_ioplug_t *ioplug, const char *name,
               ioplug->callback->stop &&
               ioplug->callback->pointer);
 
-       if (ioplug->version != SND_PCM_IOPLUG_VERSION) {
+       /* We support 1.0.0 to current */
+       if (ioplug->version < 0x010000 ||
+           ioplug->version > SND_PCM_IOPLUG_VERSION) {
                SNDERR("ioplug: Plugin version mismatch\n");
                return -ENXIO;
        }