mirror of
https://github.com/apache/nuttx.git
synced 2026-05-18 00:34:10 +08: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:
+46
-16
@@ -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;
|
||||
|
||||
|
||||
@@ -460,8 +460,8 @@ struct audio_info_s
|
||||
uint8_t channels; /* Number of channels (1, 2, 5, 7) */
|
||||
uint8_t format; /* Audio data format */
|
||||
uint8_t subformat; /* Audio subformat
|
||||
* (maybe should be combined with format?
|
||||
*/
|
||||
* (maybe should be combined with format?)
|
||||
*/
|
||||
};
|
||||
|
||||
/* This structure describes the preferred number and size of
|
||||
|
||||
Reference in New Issue
Block a user