summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-07-24 09:56:39 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-07-24 09:56:39 -0600
commit9ee5cdfd37157507a9b40d4554b407037b6e2c77 (patch)
treeecf2093f5c73804007f02e3848c9de64b7aaeb8a
parent6ef0ea9652d085373feeb971f7b40f65b2be04b4 (diff)
downloadnuttx-9ee5cdfd37157507a9b40d4554b407037b6e2c77.tar.gz
nuttx-9ee5cdfd37157507a9b40d4554b407037b6e2c77.tar.bz2
nuttx-9ee5cdfd37157507a9b40d4554b407037b6e2c77.zip
Audio: Get rid of the decoder->driver IOCTLs that I added a couple of commits back; Use existing configure method
-rw-r--r--nuttx/audio/pcm_decode.c59
-rw-r--r--nuttx/drivers/audio/audio_null.c67
-rw-r--r--nuttx/drivers/audio/vs1053.c3
-rw-r--r--nuttx/drivers/audio/wm8904.c48
-rw-r--r--nuttx/include/nuttx/audio/audio.h43
5 files changed, 115 insertions, 105 deletions
diff --git a/nuttx/audio/pcm_decode.c b/nuttx/audio/pcm_decode.c
index 83c623c02..45937fd12 100644
--- a/nuttx/audio/pcm_decode.c
+++ b/nuttx/audio/pcm_decode.c
@@ -95,6 +95,12 @@ struct pcm_decode_s
FAR struct audio_lowerhalf_s *lower;
+ /* Session returned from the lower level driver */
+
+#ifdef CONFIG_AUDIO_MULTI_SESSION
+ FAR void *session;
+#endif
+
/* These are values extracted from WAV file header */
uint32_t samprate; /* 8000, 44100, ... */
@@ -701,7 +707,7 @@ static int pcm_enqueuebuffer(FAR struct audio_lowerhalf_s *dev,
audvdbg("Received buffer %p, streaming=%d\n", apb, priv->streaming);
lower = priv->lower;
- DEBUGASSERT(lower && lower->ops->enqueuebuffer && lower->ops->ioctl);
+ DEBUGASSERT(lower && lower->ops->enqueuebuffer && lower->ops->configure);
/* Are we streaming yet? */
@@ -731,6 +737,8 @@ static int pcm_enqueuebuffer(FAR struct audio_lowerhalf_s *dev,
if (pcm_parsewav(priv, &apb->samp[apb->curbyte]))
{
+ struct audio_caps_s caps;
+
/* Now we are streaming */
priv->streaming = true;
@@ -739,27 +747,23 @@ static int pcm_enqueuebuffer(FAR struct audio_lowerhalf_s *dev,
* 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;
- }
+ DEBUGASSERT(priv->samprate < 65535);
- 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;
- }
+ caps.ac_len = sizeof(struct audio_caps_s);
+ caps.ac_type = AUDIO_TYPE_OUTPUT;
+ caps.ac_channels = priv->nchannels;
- ret = lower->ops->ioctl(lower, AUDIOIOC_SAMPWIDTH,
- (unsigned long)priv->bpsamp);
+ *((uint16_t *)&caps.ac_controls[0]) = (uint16_t)priv->samprate;
+ caps.ac_controls[2] = priv->bpsamp;
+
+#ifdef CONFIG_AUDIO_MULTI_SESSION
+ ret = lower->ops->configure(lower, priv->session, &caps);
+#else
+ ret = lower->ops->configure(lower, &caps);
+#endif
if (ret < 0)
{
- auddbg("ERROR: Failed to set sample width: %d\n", ret);
+ auddbg("ERROR: Failed to set PCM configuration: %d\n", ret);
return ret;
}
@@ -849,14 +853,22 @@ static int pcm_reserve(FAR struct audio_lowerhalf_s *dev)
{
FAR struct pcm_decode_s *priv = (FAR struct pcm_decode_s *)dev;
FAR struct audio_lowerhalf_s *lower;
+ int ret;
+#ifdef CONFIG_AUDIO_MULTI_SESSION
+ DEBUGASSERT(priv && session);
+#else
DEBUGASSERT(priv);
+#endif
/* It is not necessary to reserve the upper half. What we really need to
* do is to reserved the lower device driver for exclusive use by the PCM
* decoder. That effectively reserves the upper PCM decoder along with
* the lower driver (which is then not available for use by other
* decoders).
+ *
+ * We do, however, need to remember the session returned by the lower
+ * level.
*/
lower = priv->lower;
@@ -864,10 +876,17 @@ static int pcm_reserve(FAR struct audio_lowerhalf_s *dev)
audvdbg("Defer to lower reserve\n");
#ifdef CONFIG_AUDIO_MULTI_SESSION
- return lower->ops->reserve(lower, session);
+ ret = lower->ops->reserve(lower, &priv->session);
+
+ /* Return a copy of the session to the caller */
+
+ *session = priv->session;
+
#else
- return lower->ops->reserve(lower);
+ ret = lower->ops->reserve(lower);
#endif
+
+ return ret;
}
/****************************************************************************
diff --git a/nuttx/drivers/audio/audio_null.c b/nuttx/drivers/audio/audio_null.c
index b9495d4f1..401cf1d75 100644
--- a/nuttx/drivers/audio/audio_null.c
+++ b/nuttx/drivers/audio/audio_null.c
@@ -349,6 +349,53 @@ static int null_configure(FAR struct audio_lowerhalf_s *dev,
FAR const struct audio_caps_s *caps)
#endif
{
+ audvdbg("ac_type: %d\n", caps->ac_type);
+
+ /* Process the configure operation */
+
+ switch (caps->ac_type)
+ {
+ case AUDIO_TYPE_FEATURE:
+ audvdbg(" AUDIO_TYPE_FEATURE\:n");
+
+ /* Process based on Feature Unit */
+
+ switch (*((uint16_t *)caps->ac_format))
+ {
+#ifndef CONFIG_AUDIO_EXCLUDE_VOLUME
+ case AUDIO_FU_VOLUME:
+ audvdbg(" Volume: %d\n", *(uint16_t *)caps->ac_controls);
+ break;
+#endif /* CONFIG_AUDIO_EXCLUDE_VOLUME */
+
+#ifndef CONFIG_AUDIO_EXCLUDE_TONE
+ case AUDIO_FU_BASS:
+ audvdbg(" Bass: %d\n", caps->ac_controls[0]);
+ break;
+
+ case AUDIO_FU_TREBLE:
+ audvdbg(" Treble: %d\n", caps->ac_controls[0]);
+ break;
+#endif /* CONFIG_AUDIO_EXCLUDE_TONE */
+
+ default:
+ auddbg(" Unrecognized feature unit\n");
+ break;
+ }
+ break;
+
+ case AUDIO_TYPE_OUTPUT:
+ audvdbg(" AUDIO_TYPE_OUTPUT:\n");
+ audvdbg(" Number of channels: %u\n", caps->ac_channels);
+ audvdbg(" Sample rate: %u\n", *(uint16_t*)&ac_controls[0]);
+ audvdbg(" Sample width: %u\n", ac_controls[2]);
+ break;
+
+ case AUDIO_TYPE_PROCESSING:
+ audvdbg(" AUDIO_TYPE_PROCESSING:\n");
+ break;
+ }
+
audvdbg("Return OK\n");
return OK;
}
@@ -679,26 +726,6 @@ static int null_ioctl(FAR struct audio_lowerhalf_s *dev, int cmd,
break;
#endif
- /* Data stream configuration */
-
- case AUDIOIOC_BITRATE:
- {
- audvdbg("AUDIOIOC_BITRATE: Set bit rate: %lu\n", arg);
- }
- break;
-
- case AUDIOIOC_NCHANNELS:
- {
- audvdbg("AUDIOIOC_NCHANNELS: Set number of channels: %lu\n", arg);
- }
- break;
-
- case AUDIOIOC_SAMPWIDTH:
- {
- audvdbg("AUDIOIOC_SAMPWIDTH: Set sample width: %lu\n", arg);
- }
- break;
-
default:
break;
}
diff --git a/nuttx/drivers/audio/vs1053.c b/nuttx/drivers/audio/vs1053.c
index e7b7cc059..32d04df15 100644
--- a/nuttx/drivers/audio/vs1053.c
+++ b/nuttx/drivers/audio/vs1053.c
@@ -833,6 +833,9 @@ static int vs1053_configure(FAR struct audio_lowerhalf_s *lower,
break;
+ case AUDIO_TYPE_OUTPUT:
+ break;
+
case AUDIO_TYPE_PROCESSING:
/* We only support STEREO_EXTENDER */
diff --git a/nuttx/drivers/audio/wm8904.c b/nuttx/drivers/audio/wm8904.c
index 6b496844c..a7bec06be 100644
--- a/nuttx/drivers/audio/wm8904.c
+++ b/nuttx/drivers/audio/wm8904.c
@@ -730,13 +730,14 @@ static int wm8904_configure(FAR struct audio_lowerhalf_s *dev,
#endif
int ret = OK;
- audvdbg("Entry\n");
+ audvdbg("ac_type: %d\n", caps->ac_type);
/* Process the configure operation */
switch (caps->ac_type)
{
case AUDIO_TYPE_FEATURE:
+ audvdbg(" AUDIO_TYPE_FEATURE\:n");
/* Process based on Feature Unit */
@@ -748,6 +749,8 @@ static int wm8904_configure(FAR struct audio_lowerhalf_s *dev,
/* Set the volume */
uint16_t volume = *(uint16_t *)caps->ac_controls;
+ audvdbg(" Volume: %d\n", volume);
+
if (volume >= 0 && volume <= 1000)
{
/* Scale the volume setting to the range {0.. 63} */
@@ -770,6 +773,8 @@ static int wm8904_configure(FAR struct audio_lowerhalf_s *dev,
*/
uint8_t bass = caps->ac_controls[0];
+ audvdbg(" Bass: %d\n", bass);
+
if (bass <= 100)
{
wm8904_setbass(priv, bass);
@@ -788,6 +793,8 @@ static int wm8904_configure(FAR struct audio_lowerhalf_s *dev,
*/
uint8_t treble = caps->ac_controls[0];
+ audvdbg(" Treble: %d\n", treble);
+
if (treble <= 100)
{
wm8904_settreble(priv, treble);
@@ -801,19 +808,21 @@ static int wm8904_configure(FAR struct audio_lowerhalf_s *dev,
#endif /* CONFIG_AUDIO_EXCLUDE_TONE */
default:
+ auddbg(" Unrecognized feature unit\n");
ret = -ENOTTY;
break;
}
break;
- case AUDIO_TYPE_PROCESSING:
- {
- /* We only support STEREO_EXTENDER */
+ case AUDIO_TYPE_OUTPUT:
+ audvdbg(" AUDIO_TYPE_OUTPUT:\n");
+ audvdbg(" Number of channels: %u\n", caps->ac_channels);
+ audvdbg(" Sample rate: %u\n", *(uint16_t*)&ac_controls[0]);
+ audvdbg(" Sample width: %u\n", ac_controls[2]);
+#warning Missing logic
+ break;
- if (*((uint16_t *) caps->ac_format) == AUDIO_PU_STEREO_EXTENDER)
- {
- }
- }
+ case AUDIO_TYPE_PROCESSING:
break;
}
@@ -1467,29 +1476,8 @@ static int wm8904_ioctl(FAR struct audio_lowerhalf_s *dev, int cmd,
break;
#endif
- /* Data stream configuration */
-
- case AUDIOIOC_BITRATE:
- {
- audvdbg("AUDIOIOC_BITRATE: Set bit rate: %lu\n", arg);
-#warning Missing logic
- }
- break;
-
- case AUDIOIOC_NCHANNELS:
- {
- audvdbg("AUDIOIOC_NCHANNELS: Set number of channels: %lu\n", arg);
-#warning Missing logic
- }
- break;
-
- case AUDIOIOC_SAMPWIDTH:
- {
- audvdbg("AUDIOIOC_SAMPWIDTH: Set sample width: %lu\n", arg);
-#warning Missing logic
- }
- break;
default:
+ audvdbg("Ignored\n");
break;
}
diff --git a/nuttx/include/nuttx/audio/audio.h b/nuttx/include/nuttx/audio/audio.h
index 8ce09b0f8..0230437b7 100644
--- a/nuttx/include/nuttx/audio/audio.h
+++ b/nuttx/include/nuttx/audio/audio.h
@@ -122,33 +122,6 @@
#define AUDIOIOC_UNREGISTERMQ _AUDIOIOC(15)
#define AUDIOIOC_HWRESET _AUDIOIOC(16)
-/* Additional ioctl commands support operations between audio decoders
- * and low-level audio drivers. This ioctls are not used by the higher
- * level audio logic and need be implemented only in low-level audio
- * drivers that are driven by a decoder.
- *
- * AUDIOIOC_BITRATE - Set bit rate
- *
- * ioctl argument: Audio bit rate in bits per second
- * Range: 1-65535 BPS (Compare to AUDIO_BIT_RATE_* definitions)
- *
- * AUDIOIOC_NCHANNELS - Set number of audio channels
- *
- * ioctl argument: Number of audio channels. 1=MONO, 2=STEREO, etc.
- * Range: 1-255, however most drivers will support only
- * 1 and possibly 2
- *
- * AUDIOIOC_SAMPWIDTH - Set sample bit width
- *
- * ioctl argument: Sample bit width: 8=8-bit data, 16=16-bit data, etc.
- * Range: 1-255, however, many drivers will support only
- * one sample bit width.
- */
-
-#define AUDIOIOC_BITRATE _AUDIOIOC(17)
-#define AUDIOIOC_NCHANNELS _AUDIOIOC(18)
-#define AUDIOIOC_SAMPWIDTH _AUDIOIOC(19)
-
/* Audio Device Types *******************************************************/
/* The NuttX audio interface support different types of audio devices for
* input, output, synthesis, and manipulation of audio data. A given driver/
@@ -184,8 +157,8 @@
#define AUDIO_FMT_WAV 0x07
#define AUDIO_FMT_MP3 0x08
#define AUDIO_FMT_MIDI 0x09
-#define AUDIO_FMT_OGG_VORBIS 0x0A
-#define AUDIO_FMT_FLAC 0x0B
+#define AUDIO_FMT_OGG_VORBIS 0x0a
+#define AUDIO_FMT_FLAC 0x0b
/* Audio Sub-Format Types ***************************************************/
@@ -199,11 +172,11 @@
#define AUDIO_SUBFMT_PCM_S8 0x07
#define AUDIO_SUBFMT_PCM_U16_LE 0x08
#define AUDIO_SUBFMT_PCM_S16_BE 0x09
-#define AUDIO_SUBFMT_PCM_S16_LE 0x0A
-#define AUDIO_SUBFMT_PCM_U16_BE 0x0B
-#define AUDIO_SUBFMT_MIDI_0 0x0C
-#define AUDIO_SUBFMT_MIDI_1 0x0D
-#define AUDIO_SUBFMT_MIDI_2 0x0E
+#define AUDIO_SUBFMT_PCM_S16_LE 0x0a
+#define AUDIO_SUBFMT_PCM_U16_BE 0x0b
+#define AUDIO_SUBFMT_MIDI_0 0x0c
+#define AUDIO_SUBFMT_MIDI_1 0x0d
+#define AUDIO_SUBFMT_MIDI_2 0x0e
/* Supported Sampling Rates *************************************************/
@@ -276,7 +249,7 @@
/* Audio Pipeline Buffer (AP Buffer) flags **********************************/
-#define AUDIO_ABP_ALIGNMENT 0x000F /* Mask to define buffer alignment */
+#define AUDIO_ABP_ALIGNMENT 0x000f /* Mask to define buffer alignment */
#define AUDIO_ABP_CANDMA 0x0010 /* Set if the data is DMA'able */
#define AUDIO_ABP_STATIC 0x0020 /* Set if statically allocated */
#define AUDIO_ABP_ACTIVE 0x0040 /* Set if this buffer is still active.