diff --git a/arch/sim/src/sim/posix/sim_alsa.c b/arch/sim/src/sim/posix/sim_alsa.c index cf77448d806..640f8243742 100644 --- a/arch/sim/src/sim/posix/sim_alsa.c +++ b/arch/sim/src/sim/posix/sim_alsa.c @@ -600,6 +600,38 @@ static int sim_audio_ioctl(struct audio_lowerhalf_s *dev, int cmd, audinfo("%s , arg: %s\n", __func__, (char *)arg); } break; + case AUDIOIOC_GETLATENCY: + { + long *latency = (long *)arg; + long remain = 0; + dq_entry_t *cur; + + if (!priv->pcm) + { + ret = -ENXIO; + break; + } + + ret = snd_pcm_delay(priv->pcm, latency); + if (ret < 0) + { + return ret; + } + else + { + remain = priv->aux->nbytes - priv->aux->curbyte; + + for (cur = dq_peek(&priv->pendq); cur; cur = dq_next(cur)) + { + struct ap_buffer_s *apb = (struct ap_buffer_s *)cur; + remain += apb->nbytes - apb->curbyte; + } + + *latency += remain / priv->frame_size; + } + } + break; + default: ret = -ENOTTY; break; diff --git a/include/nuttx/audio/audio.h b/include/nuttx/audio/audio.h index 7bb3021f989..49124360ff7 100644 --- a/include/nuttx/audio/audio.h +++ b/include/nuttx/audio/audio.h @@ -112,6 +112,7 @@ #define AUDIOIOC_HWRESET _AUDIOIOC(16) #define AUDIOIOC_SETBUFFERINFO _AUDIOIOC(17) #define AUDIOIOC_SETPARAMTER _AUDIOIOC(18) +#define AUDIOIOC_GETLATENCY _AUDIOIOC(19) /* Audio Device Types *******************************************************/