This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit f8ab192285ae0caa1b2b642195efe256fb3eb6a4 Author: yangyalei <[email protected]> AuthorDate: Thu Jun 12 16:46:06 2025 +0800 nuttx/audio: Update app write head in enqueuebuffer update aplication pointer in enqueuebuffer Signed-off-by: yangyalei <[email protected]> --- audio/audio.c | 62 +++++++++++++++++++++++++++++++++------------ include/nuttx/audio/audio.h | 4 +-- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/audio/audio.c b/audio/audio.c index aab28fed55a..9275a943c0c 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -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; diff --git a/include/nuttx/audio/audio.h b/include/nuttx/audio/audio.h index a206ec25362..952c8a282d0 100644 --- a/include/nuttx/audio/audio.h +++ b/include/nuttx/audio/audio.h @@ -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
