mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-31 22:25:35 -04:00
Allow ioplugins to override snd_pcm_delay()
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>
This commit is contained in:
parent
1d80c5b901
commit
3fd9369990
2 changed files with 17 additions and 4 deletions
|
|
@ -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_MAJOR 1 /**< Protocol major version */
|
||||||
#define SND_PCM_IOPLUG_VERSION_MINOR 0 /**< Protocol minor 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
|
* IO-plugin protocol version
|
||||||
*/
|
*/
|
||||||
|
|
@ -184,6 +184,10 @@ struct snd_pcm_ioplug_callback {
|
||||||
* dump; optional
|
* dump; optional
|
||||||
*/
|
*/
|
||||||
void (*dump)(snd_pcm_ioplug_t *io, snd_output_t *out);
|
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
|
||||||
{
|
{
|
||||||
snd_pcm_ioplug_hw_ptr_update(pcm);
|
ioplug_priv_t *io = pcm->private_data;
|
||||||
*delayp = snd_pcm_mmap_hw_avail(pcm);
|
|
||||||
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -877,7 +884,9 @@ int snd_pcm_ioplug_create(snd_pcm_ioplug_t *ioplug, const char *name,
|
||||||
ioplug->callback->stop &&
|
ioplug->callback->stop &&
|
||||||
ioplug->callback->pointer);
|
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");
|
SNDERR("ioplug: Plugin version mismatch\n");
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue