diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-07-24 09:56:39 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-07-24 09:56:39 -0600 |
commit | 9ee5cdfd37157507a9b40d4554b407037b6e2c77 (patch) | |
tree | ecf2093f5c73804007f02e3848c9de64b7aaeb8a | |
parent | 6ef0ea9652d085373feeb971f7b40f65b2be04b4 (diff) | |
download | nuttx-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.c | 59 | ||||
-rw-r--r-- | nuttx/drivers/audio/audio_null.c | 67 | ||||
-rw-r--r-- | nuttx/drivers/audio/vs1053.c | 3 | ||||
-rw-r--r-- | nuttx/drivers/audio/wm8904.c | 48 | ||||
-rw-r--r-- | nuttx/include/nuttx/audio/audio.h | 43 |
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. |