mirror of
https://github.com/apache/nuttx.git
synced 2026-05-30 21:36:28 +08:00
audio:add getlatency for virtio snd driver
add getlatency in virtio snd driver Signed-off-by: shipei <shipei@xiaomi.com>
This commit is contained in:
@@ -70,7 +70,9 @@ struct virtio_snd_buffer_s
|
|||||||
struct virtio_snd_dev_s
|
struct virtio_snd_dev_s
|
||||||
{
|
{
|
||||||
struct audio_lowerhalf_s dev;
|
struct audio_lowerhalf_s dev;
|
||||||
|
uint32_t cache_buffers;
|
||||||
uint32_t period_bytes;
|
uint32_t period_bytes;
|
||||||
|
uint32_t frame_size;
|
||||||
uint32_t index;
|
uint32_t index;
|
||||||
bool running;
|
bool running;
|
||||||
FAR void *priv;
|
FAR void *priv;
|
||||||
@@ -333,6 +335,7 @@ static void virtio_snd_pcm_notify_cb(FAR struct virtqueue *vq)
|
|||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
FAR struct virtio_snd_buffer_s *buf;
|
FAR struct virtio_snd_buffer_s *buf;
|
||||||
|
FAR struct virtio_snd_dev_s *sdev;
|
||||||
buf = virtqueue_get_buffer(vq, NULL, NULL);
|
buf = virtqueue_get_buffer(vq, NULL, NULL);
|
||||||
if (buf == NULL)
|
if (buf == NULL)
|
||||||
{
|
{
|
||||||
@@ -346,6 +349,8 @@ static void virtio_snd_pcm_notify_cb(FAR struct virtqueue *vq)
|
|||||||
buf->dev->upper(buf->dev->priv, AUDIO_CALLBACK_DEQUEUE,
|
buf->dev->upper(buf->dev->priv, AUDIO_CALLBACK_DEQUEUE,
|
||||||
&buf->apb, OK);
|
&buf->apb, OK);
|
||||||
#endif
|
#endif
|
||||||
|
sdev = (FAR struct virtio_snd_dev_s *)buf->dev;
|
||||||
|
sdev->cache_buffers--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -401,6 +406,7 @@ static int virtio_snd_send_pcm(FAR struct virtio_snd_dev_s *sdev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtqueue_kick(vq);
|
virtqueue_kick(vq);
|
||||||
|
sdev->cache_buffers++;
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@@ -736,6 +742,7 @@ static int virtio_snd_configure(FAR struct audio_lowerhalf_s *dev,
|
|||||||
rate = caps->ac_controls.hw[0] | (caps->ac_controls.b[3] << 16);
|
rate = caps->ac_controls.hw[0] | (caps->ac_controls.b[3] << 16);
|
||||||
bps = caps->ac_controls.b[2];
|
bps = caps->ac_controls.b[2];
|
||||||
ch = caps->ac_channels;
|
ch = caps->ac_channels;
|
||||||
|
sdev->frame_size = ch * bps / 8;
|
||||||
sdev->period_bytes =
|
sdev->period_bytes =
|
||||||
virtio_snd_get_period_bytes(rate, ch, bps,
|
virtio_snd_get_period_bytes(rate, ch, bps,
|
||||||
CONFIG_DRIVERS_VIRTIO_SOUND_PERIOD_TIME);
|
CONFIG_DRIVERS_VIRTIO_SOUND_PERIOD_TIME);
|
||||||
@@ -980,6 +987,7 @@ static int virtio_snd_ioctl(FAR struct audio_lowerhalf_s *dev,
|
|||||||
{
|
{
|
||||||
FAR struct virtio_snd_dev_s *sdev = (FAR struct virtio_snd_dev_s *)dev;
|
FAR struct virtio_snd_dev_s *sdev = (FAR struct virtio_snd_dev_s *)dev;
|
||||||
FAR struct ap_buffer_info_s *bufinfo;
|
FAR struct ap_buffer_info_s *bufinfo;
|
||||||
|
FAR long *latency = (FAR long *)arg;
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
@@ -989,6 +997,11 @@ static int virtio_snd_ioctl(FAR struct audio_lowerhalf_s *dev,
|
|||||||
bufinfo->buffer_size = sdev->period_bytes;
|
bufinfo->buffer_size = sdev->period_bytes;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AUDIOIOC_GETLATENCY:
|
||||||
|
*latency = sdev->cache_buffers * sdev->period_bytes /
|
||||||
|
sdev->frame_size;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user