summaryrefslogtreecommitdiff
path: root/nuttx/audio
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-07-23 12:21:04 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-07-23 12:21:04 -0600
commit6d699ac12bf501de4585b3c9220c6d2118515320 (patch)
treef5457ece0c693eddac5e639d215a6e87deaad861 /nuttx/audio
parent3ba884fbe77421aa372827a31034f00c42407989 (diff)
downloadnuttx-6d699ac12bf501de4585b3c9220c6d2118515320.tar.gz
nuttx-6d699ac12bf501de4585b3c9220c6d2118515320.tar.bz2
nuttx-6d699ac12bf501de4585b3c9220c6d2118515320.zip
Add ioctls so that PCM decoder can configure the driver bitrate, num channels, and sample width
Diffstat (limited to 'nuttx/audio')
-rw-r--r--nuttx/audio/pcm_decode.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/nuttx/audio/pcm_decode.c b/nuttx/audio/pcm_decode.c
index d50fab198..83c623c02 100644
--- a/nuttx/audio/pcm_decode.c
+++ b/nuttx/audio/pcm_decode.c
@@ -695,12 +695,13 @@ static int pcm_enqueuebuffer(FAR struct audio_lowerhalf_s *dev,
FAR struct pcm_decode_s *priv = (FAR struct pcm_decode_s *)dev;
FAR struct audio_lowerhalf_s *lower;
apb_samp_t bytesleft;
+ int ret;
DEBUGASSERT(priv);
audvdbg("Received buffer %p, streaming=%d\n", apb, priv->streaming);
lower = priv->lower;
- DEBUGASSERT(lower && lower->ops->enqueuebuffer);
+ DEBUGASSERT(lower && lower->ops->enqueuebuffer && lower->ops->ioctl);
/* Are we streaming yet? */
@@ -734,8 +735,33 @@ static int pcm_enqueuebuffer(FAR struct audio_lowerhalf_s *dev,
priv->streaming = true;
- /* Configure the lower level for the number of channels and bitrate */
-#warning Missing logic
+ /* Configure the lower level for the number of channels, bitrate,
+ * and sample bitwidth.
+ */
+
+ ret = lower->ops->ioctl(lower, AUDIOIOC_BITRATE,
+ (unsigned long)priv->samprate);
+ if (ret < 0)
+ {
+ auddbg("ERROR: Failed to set bit rate: %d\n", ret);
+ return ret;
+ }
+
+ ret = lower->ops->ioctl(lower, AUDIOIOC_NCHANNELS,
+ (unsigned long)priv->nchannels);
+ if (ret < 0)
+ {
+ auddbg("ERROR: Failed to set number of channels: %d\n", ret);
+ return ret;
+ }
+
+ ret = lower->ops->ioctl(lower, AUDIOIOC_SAMPWIDTH,
+ (unsigned long)priv->bpsamp);
+ if (ret < 0)
+ {
+ auddbg("ERROR: Failed to set sample width: %d\n", ret);
+ return ret;
+ }
/* Bump up the data offset and pass the buffer to the lower level */