mirror of
https://github.com/apache/nuttx.git
synced 2026-08-01 20:28:58 +00:00
nuttx/audio: Update app write head in enqueuebuffer
update aplication pointer in enqueuebuffer Signed-off-by: yangyalei <yangyalei@xiaomi.com>
This commit is contained in:
parent
374a102af7
commit
f8ab192285
2 changed files with 48 additions and 18 deletions
|
|
@ -739,6 +739,48 @@ static int audio_allocbuffer(FAR struct audio_upperhalf_s *upper,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: audio_enqueuebuffer
|
||||
*
|
||||
* Description:
|
||||
* Handle the AUDIOIOC_ENQUEUEBUFFER ioctl command
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int audio_enqueuebuffer(FAR struct file *filep,
|
||||
FAR struct audio_buf_desc_s *bufdesc)
|
||||
{
|
||||
FAR struct inode *inode = filep->f_inode;
|
||||
FAR struct audio_upperhalf_s *upper = inode->i_private;
|
||||
FAR struct audio_lowerhalf_s *lower = upper->dev;
|
||||
FAR struct audio_openpriv_s *priv = filep->f_priv;
|
||||
irqstate_t flags;
|
||||
int ret;
|
||||
|
||||
DEBUGASSERT(lower->ops->enqueuebuffer != NULL);
|
||||
|
||||
if (bufdesc->u.buffer)
|
||||
{
|
||||
ret = lower->ops->enqueuebuffer(lower, bufdesc->u.buffer);
|
||||
if (ret != OK)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
flags = spin_lock_irqsave(&upper->spinlock);
|
||||
upper->status->head++;
|
||||
spin_unlock_irqrestore(&upper->spinlock, flags);
|
||||
}
|
||||
else
|
||||
{
|
||||
flags = spin_lock_irqsave(&upper->spinlock);
|
||||
priv->head += bufdesc->numbytes;
|
||||
spin_unlock_irqrestore(&upper->spinlock, flags);
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: audio_ioctl
|
||||
*
|
||||
|
|
@ -753,8 +795,6 @@ static int audio_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||
FAR struct audio_upperhalf_s *upper = inode->i_private;
|
||||
FAR struct audio_lowerhalf_s *lower = upper->dev;
|
||||
FAR struct audio_openpriv_s *priv = filep->f_priv;
|
||||
FAR struct audio_buf_desc_s *bufdesc;
|
||||
irqstate_t flags;
|
||||
int ret;
|
||||
|
||||
audinfo("cmd: %d arg: %ld\n", cmd, arg);
|
||||
|
|
@ -902,8 +942,7 @@ static int audio_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||
{
|
||||
audinfo("AUDIOIOC_ALLOCBUFFER\n");
|
||||
|
||||
bufdesc = (FAR struct audio_buf_desc_s *) arg;
|
||||
ret = audio_allocbuffer(upper, bufdesc);
|
||||
ret = audio_allocbuffer(upper, (FAR struct audio_buf_desc_s *)arg);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -916,8 +955,7 @@ static int audio_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||
{
|
||||
audinfo("AUDIOIOC_FREEBUFFER\n");
|
||||
|
||||
bufdesc = (FAR struct audio_buf_desc_s *) arg;
|
||||
ret = audio_freebuffer(upper, bufdesc);
|
||||
ret = audio_freebuffer(upper, (FAR struct audio_buf_desc_s *)arg);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -930,16 +968,8 @@ static int audio_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||
{
|
||||
audinfo("AUDIOIOC_ENQUEUEBUFFER\n");
|
||||
|
||||
DEBUGASSERT(lower->ops->enqueuebuffer != NULL);
|
||||
|
||||
bufdesc = (FAR struct audio_buf_desc_s *) arg;
|
||||
ret = lower->ops->enqueuebuffer(lower, bufdesc->u.buffer);
|
||||
if (ret == OK)
|
||||
{
|
||||
flags = spin_lock_irqsave_nopreempt(&upper->spinlock);
|
||||
upper->status->head++;
|
||||
spin_unlock_irqrestore_nopreempt(&upper->spinlock, flags);
|
||||
}
|
||||
ret =
|
||||
audio_enqueuebuffer(filep, (FAR struct audio_buf_desc_s *)arg);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue