summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2013-10-28 12:11:52 -0600
committerGregory Nutt <gnutt@nuttx.org>2013-10-28 12:11:52 -0600
commitb0d39caa141e2ff68255263fff07982641a4f656 (patch)
tree8c5e57a609fb696b8ef4261464ca936b4e5e2bfe
parent022d45602666fd6966d721dde9635a62d8c56898 (diff)
downloadpx4-nuttx-b0d39caa141e2ff68255263fff07982641a4f656.tar.gz
px4-nuttx-b0d39caa141e2ff68255263fff07982641a4f656.tar.bz2
px4-nuttx-b0d39caa141e2ff68255263fff07982641a4f656.zip
Add for audio sub-format in audion system. From Ken Pettit
-rw-r--r--NxWidgets/ChangeLog.txt4
-rw-r--r--apps/ChangeLog.txt7
-rw-r--r--apps/include/nxplayer.h5
-rw-r--r--apps/system/nxplayer/nxplayer.c172
-rw-r--r--apps/system/nxplayer/nxplayer_main.c8
-rw-r--r--nuttx/ChangeLog29
-rw-r--r--nuttx/drivers/audio/vs1053.c47
-rw-r--r--nuttx/include/nuttx/audio/audio.h54
8 files changed, 246 insertions, 80 deletions
diff --git a/NxWidgets/ChangeLog.txt b/NxWidgets/ChangeLog.txt
index b7fd3e9f1..62a852aee 100644
--- a/NxWidgets/ChangeLog.txt
+++ b/NxWidgets/ChangeLog.txt
@@ -379,7 +379,7 @@
state due to e.g. powerdown or other manual intervention. From
Petteri Aimonen (2013-6-4).
-1.9 2013-xx-xx Gregory Nutt <gnutt@nuttx.org>
+1.9 2013-10-28 Gregory Nutt <gnutt@nuttx.org>
* NxWM::CCalibration.cxx/hxx: If CONFIG_NXWM_CALIBRATION_MESSAGES is
defined then CCalibration will provide some instructions in the center
@@ -398,3 +398,5 @@
* NxWM::CCalibration and NxWM::CTouchscreen: Add a complex touchscreen
scaling algorithm to handling the case where the measured X values also
vary with y position (and vice versa) (2013-10-17).
+
+1.10 2013-xx-xx Gregory Nutt <gnutt@nuttx.org>
diff --git a/apps/ChangeLog.txt b/apps/ChangeLog.txt
index 33b6820df..3979faf69 100644
--- a/apps/ChangeLog.txt
+++ b/apps/ChangeLog.txt
@@ -646,7 +646,7 @@
* apps/nshlib/nsh_fscmds.c: Fix NSH listing output for the case
of a single file. Provided by Lorenz Meier (2013-9-13).
-6.31 2013-xx-xx Gregory Nutt <gnutt@nuttx.org>
+6.31 2013-10-28 Gregory Nutt <gnutt@nuttx.org>
* apps/nshlib/nsh_netcmds.c: Remove a warning when DHCP is not
enabled (2013-9-17).
@@ -655,7 +655,7 @@
(2013-9017).
* apps/examples/ostest/Kconfig: Add configuration options for
the FPU test. There are still many OS test configuration
- optionst that do not appear in Kconfig (2013-9-18).
+ options that do not appear in Kconfig (2013-9-18).
* apps/examples/cc3000: Condition the CC3000 example on having
selected the CC3000 device. Otherwise, you are prompted for
this the CC3000 option on each 'make oldconfig' (2013-9-18).
@@ -702,4 +702,7 @@
* apps/examples/cc3000: Updates from David Sidrane (2013-10-25).
* apps/system/nxplayer: Implements a command line media
player. From Ken Pettit (2013-10-27).
+ * apps/system/nxplayer: Add logic to verify the audio sub-format.
+ From Ken Pettit (2013-10-28).
+6.31 2013-xx-xx Gregory Nutt <gnutt@nuttx.org>
diff --git a/apps/include/nxplayer.h b/apps/include/nxplayer.h
index a23474033..13f70c381 100644
--- a/apps/include/nxplayer.h
+++ b/apps/include/nxplayer.h
@@ -180,6 +180,8 @@ int nxplayer_setdevice(FAR struct nxplayer_s *pPlayer, char* device);
* filename - Pointer to pathname of the file to play
* filefmt - Format of audio in filename if known, AUDIO_FMT_UNDEF
* to let nxplayer_playfile() determine automatically.
+ * subfmt - Sub-Format of audio in filename if known, AUDIO_FMT_UNDEF
+ * to let nxplayer_playfile() determine automatically.
*
* Returned values:
* OK if file found, device found, and playback started.
@@ -187,7 +189,7 @@ int nxplayer_setdevice(FAR struct nxplayer_s *pPlayer, char* device);
**************************************************************************/
int nxplayer_playfile(FAR struct nxplayer_s *pPlayer, char* filename,
- int filefmt);
+ int filefmt, int subfmt);
/****************************************************************************
* Name: nxplayer_stop
@@ -353,4 +355,3 @@ int nxplayer_systemreset(FAR struct nxplayer_s *pPlayer);
#endif
#endif /* __APPS_SYSTEM_NXPLAYER_NXPLAYER_H */
-
diff --git a/apps/system/nxplayer/nxplayer.c b/apps/system/nxplayer/nxplayer.c
index 4745b929a..c39900cce 100644
--- a/apps/system/nxplayer/nxplayer.c
+++ b/apps/system/nxplayer/nxplayer.c
@@ -81,6 +81,7 @@ struct nxplayer_ext_fmt_s
{
const char *ext;
uint16_t format;
+ CODE int (*getsubformat)(FAR FILE *fd);
};
#endif
@@ -88,6 +89,10 @@ struct nxplayer_ext_fmt_s
* Private Function Prototypes
****************************************************************************/
+#ifdef CONFIG_AUDIO_FORMAT_MIDI
+int nxplayer_getmidisubformat(FAR FILE *fd);
+#endif
+
/****************************************************************************
* Private Data
****************************************************************************/
@@ -95,26 +100,26 @@ struct nxplayer_ext_fmt_s
#ifdef CONFIG_NXPLAYER_FMT_FROM_EXT
static const struct nxplayer_ext_fmt_s g_known_ext[] = {
#ifdef CONFIG_AUDIO_FORMAT_AC3
- { "ac3", AUDIO_FMT_AC3 },
+ { "ac3", AUDIO_FMT_AC3, NULL },
#endif
#ifdef CONFIG_AUDIO_FORMAT_MP3
- { "mp3", AUDIO_FMT_MP3 },
+ { "mp3", AUDIO_FMT_MP3, NULL },
#endif
#ifdef CONFIG_AUDIO_FORMAT_DTS
- { "dts", AUDIO_FMT_DTS },
+ { "dts", AUDIO_FMT_DTS, NULL },
#endif
#ifdef CONFIG_AUDIO_FORMAT_WMA
- { "wma", AUDIO_FMT_WMA },
+ { "wma", AUDIO_FMT_WMA, NULL },
#endif
#ifdef CONFIG_AUDIO_FORMAT_PCM
- { "wav", AUDIO_FMT_PCM },
+ { "wav", AUDIO_FMT_PCM, NULL },
#endif
#ifdef CONFIG_AUDIO_FORMAT_MIDI
- { "mid", AUDIO_FMT_MIDI },
- { "midi", AUDIO_FMT_MIDI },
+ { "mid", AUDIO_FMT_MIDI, nxplayer_getmidisubformat },
+ { "midi", AUDIO_FMT_MIDI, nxplayer_getmidisubformat },
#endif
#ifdef CONFIG_AUDIO_FORMAT_OGG_VORBIS
- { "ogg", AUDIO_FMT_OGG_VORBIS }
+ { "ogg", AUDIO_FMT_OGG_VORBIS, NULL }
#endif
};
static const int g_known_ext_count = sizeof(g_known_ext) /
@@ -140,12 +145,15 @@ static const int g_known_ext_count = sizeof(g_known_ext) /
*
****************************************************************************/
-static int nxplayer_opendevice(FAR struct nxplayer_s *pPlayer, int format)
+static int nxplayer_opendevice(FAR struct nxplayer_s *pPlayer, int format,
+ int subfmt)
{
struct dirent* pDevice;
- DIR* dirp;
+ DIR* dirp;
char path[64];
struct audio_caps_s caps;
+ uint8_t supported = TRUE;
+ uint8_t x;
/* If we have a preferred device, then open it */
@@ -156,7 +164,7 @@ static int nxplayer_opendevice(FAR struct nxplayer_s *pPlayer, int format)
* format is specified by the device
*/
- if (((pPlayer->prefformat & format) == 0) ||
+ if (((pPlayer->prefformat & (1 << (format - 1)) == 0) ||
((pPlayer->preftype & AUDIO_TYPE_OUTPUT) == 0))
{
/* Format not supported by the device */
@@ -223,19 +231,69 @@ static int nxplayer_opendevice(FAR struct nxplayer_s *pPlayer, int format)
caps.ac_len = sizeof(caps);
caps.ac_type = AUDIO_TYPE_QUERY;
caps.ac_subtype = AUDIO_TYPE_QUERY;
+
if (ioctl(pPlayer->devFd, AUDIOIOC_GETCAPS, (unsigned long) &caps)
== caps.ac_len)
{
/* Test if this device supports the format we want */
int ac_format = caps.ac_format[0] | (caps.ac_format[1] << 8);
- if (((ac_format & format) != 0) &&
+ if (((ac_format & (1 << (format - 1))) != 0) &&
(caps.ac_controls[0] & AUDIO_TYPE_OUTPUT))
{
- /* Yes, it supports this format. Use this device */
-
- closedir(dirp);
- return OK;
+ /* Do subformat detection */
+
+ if (subfmt != AUDIO_FMT_UNDEF)
+ {
+ /* Prepare to get sub-formats for this main format */
+
+ caps.ac_subtype = format;
+ caps.ac_format[0] = 0;
+ while (ioctl(pPlayer->devFd, AUDIOIOC_GETCAPS,
+ (unsigned long) &caps) == caps.ac_len)
+ {
+ /* Check the next set of 4 controls to find the subformat */
+ for (x = 0; x < sizeof(caps.ac_controls); x++)
+ {
+ if (caps.ac_controls[x] == subfmt)
+ {
+ /* Sub format supported! */
+
+ break;
+ }
+ else if (caps.ac_controls[x] == AUDIO_SUBFMT_END)
+ {
+ /* Sub format not supported */
+
+ supported = FALSE;
+ break;
+ }
+ }
+
+ /* If we reached the end of the subformat list, then
+ * break out of the loop.
+ */
+
+ if (x != sizeof(caps.ac_controls))
+ {
+ break;
+ }
+
+ /* Increment ac_format[0] to get next set of subformats */
+
+ caps.ac_format[0]++;
+ }
+ }
+
+ /* Test if subformat needed and detected */
+
+ if (supported)
+ {
+ /* Yes, it supports this format. Use this device */
+
+ closedir(dirp);
+ return OK;
+ }
}
}
@@ -258,6 +316,47 @@ static int nxplayer_opendevice(FAR struct nxplayer_s *pPlayer, int format)
}
/****************************************************************************
+ * Name: nxplayer_getmidisubformat
+ *
+ * nxplayer_getmidisubformat() reads the MIDI header and determins the
+ * MIDI format of the file.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_AUDIO_FORMAT_MIDI
+int nxplayer_getmidisubformat(FAR FILE *fd)
+{
+ char type[2];
+ int ret;
+
+ /* Seek to location 8 in the file (the format type) */
+
+ fseek(fd, 8, SEEK_SET);
+ fread(type, 1, 2, fd);
+
+ /* Set return value based on type */
+
+ switch (type[1])
+ {
+ case 0:
+ ret = AUDIO_SUBFMT_MIDI_0;
+ break;
+
+ case 1:
+ ret = AUDIO_SUBFMT_MIDI_1;
+ break;
+
+ case 2:
+ ret = AUDIO_SUBFMT_MIDI_2;
+ break;
+ }
+ fseek(fd, 0, SEEK_SET);
+
+ return ret;
+}
+#endif
+
+/****************************************************************************
* Name: nxplayer_fmtfromextension
*
* nxplayer_fmtfromextension() tries to determine the file format based
@@ -266,10 +365,12 @@ static int nxplayer_opendevice(FAR struct nxplayer_s *pPlayer, int format)
****************************************************************************/
#ifdef CONFIG_NXPLAYER_FMT_FROM_EXT
-static int nxplayer_fmtfromextension(char* pFilename)
+static inline int nxplayer_fmtfromextension(FAR struct nxplayer_s *pPlayer,
+ char* pFilename, int *subfmt)
{
- const char *pExt;
- int x, c;
+ const char *pExt;
+ uint8_t x;
+ uint8_t c;
/* Find the file extension, if any */
@@ -289,6 +390,14 @@ static int nxplayer_fmtfromextension(char* pFilename)
if (strcasecmp(pExt, g_known_ext[c].ext) == 0)
{
+ /* Test if we have a sub-format detection routine */
+
+ if (subfmt && g_known_ext[c].getsubformat)
+ {
+
+ *subfmt = g_known_ext[c].getsubformat(pPlayer->fileFd);
+ }
+
/* Return the format for this extension */
return g_known_ext[c].format;
@@ -1027,6 +1136,7 @@ int nxplayer_stop(FAR struct nxplayer_s *pPlayer)
sem_post(&pPlayer->sem); /* Release the semaphore */
return OK;
}
+
sem_post(&pPlayer->sem);
/* Notify the playback thread that it needs to cancel the playback */
@@ -1067,9 +1177,10 @@ int nxplayer_stop(FAR struct nxplayer_s *pPlayer)
*
****************************************************************************/
-int nxplayer_playfile(FAR struct nxplayer_s *pPlayer, char* pFilename, int filefmt)
+int nxplayer_playfile(FAR struct nxplayer_s *pPlayer, char* pFilename, int filefmt,
+ int subfmt)
{
- int ret;
+ int ret, tmpsubfmt = AUDIO_FMT_UNDEF;
struct mq_attr attr;
struct sched_param sparam;
pthread_attr_t tattr;
@@ -1106,7 +1217,9 @@ int nxplayer_playfile(FAR struct nxplayer_s *pPlayer, char* pFilename, int filef
/* File not found in the media dir. Do a search */
if (nxplayer_mediasearch(pPlayer, pFilename, path, sizeof(path)) != OK)
- return -ENOENT;
+ {
+ return -ENOENT;
+ }
#else
return -ENOENT;
#endif /* CONFIG_NXPLAYER_MEDIA_SEARCH */
@@ -1121,14 +1234,14 @@ int nxplayer_playfile(FAR struct nxplayer_s *pPlayer, char* pFilename, int filef
#ifdef CONFIG_NXPLAYER_FMT_FROM_EXT
if (filefmt == AUDIO_FMT_UNDEF)
- filefmt = nxplayer_fmtfromextension(pFilename);
+ filefmt = nxplayer_fmtfromextension(pPlayer, pFilename, &tmpsubfmt);
#endif
/* If type not identified, then test for known header types */
#ifdef CONFIG_NXPLAYER_FMT_FROM_HEADER
if (filefmt == AUDIO_FMT_UNDEF)
- filefmt = nxplayer_fmtfromheader(pPlayer);
+ filefmt = nxplayer_fmtfromheader(pPlayer, &subfmt, &tmpsubfmt);
#endif
/* Test if we determined the file format */
@@ -1141,9 +1254,16 @@ int nxplayer_playfile(FAR struct nxplayer_s *pPlayer, char* pFilename, int filef
goto err_out_nodev;
}
+ /* Test if we have a sub format assignment from above */
+
+ if (subfmt == AUDIO_FMT_UNDEF)
+ {
+ subfmt = tmpsubfmt;
+ }
+
/* Try to open the device */
- ret = nxplayer_opendevice(pPlayer, filefmt);
+ ret = nxplayer_opendevice(pPlayer, filefmt, subfmt);
if (ret < 0)
{
/* Error opening the device */
@@ -1224,12 +1344,14 @@ int nxplayer_playfile(FAR struct nxplayer_s *pPlayer, char* pFilename, int filef
err_out:
close(pPlayer->devFd);
pPlayer->devFd = -1;
+
err_out_nodev:
if (pPlayer->fileFd != NULL)
{
fclose(pPlayer->fileFd);
pPlayer->fileFd = NULL;
}
+
return ret;
}
diff --git a/apps/system/nxplayer/nxplayer_main.c b/apps/system/nxplayer/nxplayer_main.c
index ce94881cc..b4c7930d2 100644
--- a/apps/system/nxplayer/nxplayer_main.c
+++ b/apps/system/nxplayer/nxplayer_main.c
@@ -187,7 +187,7 @@ static int nxplayer_cmd_play(FAR struct nxplayer_s *pPlayer, char* parg)
/* Try to play the file specified */
- ret = nxplayer_playfile(pPlayer, parg, AUDIO_FMT_UNDEF);
+ ret = nxplayer_playfile(pPlayer, parg, AUDIO_FMT_UNDEF, AUDIO_FMT_UNDEF);
/* Test if the device file exists */
@@ -507,7 +507,11 @@ static int nxplayer_cmd_device(FAR struct nxplayer_s *pPlayer, char* parg)
static int nxplayer_cmd_quit(FAR struct nxplayer_s *pPlayer, char* parg)
{
- /* Nothing to do */
+ /* Stop the playback if any */
+
+#ifndef CONFIG_AUDIO_EXCLUDE_STOP
+ nxplayer_stop(pPlayer);
+#endif
return OK;
}
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index d63386c38..e376bdbf8 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -5559,7 +5559,7 @@
are just hacked out and gutted versions of the corresponding
STM32 files (2013-9-13).
-6.31 2013-xx-xx Gregory Nutt <gnutt@nuttx.org>
+6.31 2013-10-28 Gregory Nutt <gnutt@nuttx.org>
* nuttx/fs/romfs/fs_romfsutil.c: Back out part of a recent
ROMFS change (2013-9-14).
@@ -5571,7 +5571,7 @@
* configs/ and a few Ethernet drivers: Add the prefix ETH0
to all PHY configuration selections. This will allow us
to support to Ethernet MAC drivers with two different
- PHYS (identified with ETH0 and ETH1) (2013-9-17).
+ PHYs (identified with ETH0 and ETH1) (2013-9-17).
* net/Kconfig and drivers/net/Kconfig: Move PHY selections from
net/Kconfig to drivers/net/Kconfig where they belong. Add the previx
ETH0_ to each PHY selection. And a new configuration
@@ -5617,7 +5617,7 @@
endpoint from 0xff (invalid) to 10. This is not a critical change
but will avoid a complaint from the Linux driver when it overrides
the 0xff value (2013-9-22).
- * configs/zkit-arm-1769: LED1 is not user controllable after booting.
+ * configs/zkit-arm-1769: LED1 is now user controllable after booting.
From Rashid Fatah (2013-9-23).
* arch/arm/src/sama5/sam_hsmci.c: TX DMA disabled. It is just not
reliable. No idea why. RX DMA is still used (2013-9-23).
@@ -5654,9 +5654,9 @@
next outgoing packet from the TX done interrupt handling. From
Max Holtzberg (2013-9-27)
* sched/os_start.c: Should not call group_setupidlefiles() if there
- are not file descriptors (and, hence, no file system) (2013-9-27).
+ are no file descriptors (and, hence, no file system) (2013-9-27).
* arch/arm/src/sama5/sam_gmac.c: GMAC driver and GMII logic is
- code complete and readay for test (2013-9-27)
+ code complete and ready for test (2013-9-27)
* configs/compal_e86: Basic board support for the Motorola C139
(Compal E86) phone. From Craig Comstock (2013-9-27).
* configs/compal_e86: Converted to use the kconfig-frontends
@@ -5686,14 +5686,14 @@
From Alan Carvalho de Assis. (2013-9-30).
* net/net_sendfile: The high performance sendfile logic is
now functional. From Max Holtzberg (2013-9-30).
- * tools/define.sh: 'cut' long because as it once did. Script
+ * tools/define.sh: 'cut' no longer works as it once did. Script
adapted to observed behavior (2013-9-30).
* include/nuttx/net/route.h and net/net_*route.c: Partial
implementation of a routing table. Not yet hooked into the
build system (2013-10-1)
* include/net/route.h: Defines the application interface to
the routing table (2013-10-2).
- * configs/spark: Add configuratino for the Spark Core. The
+ * configs/spark: Add configuration for the Spark Core. The
initial check-in is basically the Maple Mini board (2013-10-2).
* include/net/route.h and libc/net/lib_addroute.c and delroute.c:
Add an application interface to manage the routing table
@@ -5724,7 +5724,7 @@
Max Holtzberg (2013-10-8).
* arch/arm/src/sama5/sam_lcd.c: LCDC driver is code complete and
incorporated into the build system (but still untested (2013-10-8).
- * configs/sama5d3x-ek/nx: Add an examples/nx configuratino that
+ * configs/sama5d3x-ek/nx: Add an examples/nx configuration that
will be used for the SAMA5 LCD bring-up (2013-10-8).
* configs/arduino-due/Kconfig and include/board.h: Add configuration
to select revision 3 of the Arduino Due which has some small
@@ -5749,7 +5749,7 @@
uip/uip_udpconn.c, uip/uip_udpinput.c: Changed the meaning of the
uip_*input functions. They now return success when a packet is
dropped; This is needed for the ENCX24J600 driver that must make
- a decision to return the packet or not: It should not retai
+ a decision to return the packet or not: It should not retry
dropped packets. From Max Holtzberg (2013-10-11).
* drivers/net/encx24j600.c and Kconfig: ENCX24J600: Improved descriptor
handling, free packets on rx abort interrupt. From Max Holtzberg
@@ -5768,7 +5768,7 @@
* configs/sama5d3x-ek/nxwm/defconfig: Now uses scaled icons in the
the NxWM taskbar (2013-10-15).
* configs/sama5d3x-ek/nxwm/defconfig: Use the 320x320 NuttX logo as
- the NxWM backgroun (2013-10-15).
+ the NxWM background (2013-10-15).
* arch/arm/src/stm32/chip/stm32f103c_pinmap.h: Pinmapping corrections
from David Sidrane (2013-10-16).
* configs/spark: The Spark device configuration is receiving some
@@ -5826,7 +5826,7 @@
driver into the build system; Verify the correct operation of the
SAMA5 RTC driver (2013-10-19).
* arch/arm/src/sama5/sam_wdt.c and .h: Add a SAMA5 watchdog timer
- drvier. Untested on initial check-in (2013-10-19).
+ driver. Untested on initial check-in (2013-10-19).
* arch/arm/src/sama5/sam_trng.c, sam_trng.h, and chip/sam_trng.h: Add
a /dev/random driver based on the SAMA5D3 TRNG peripheral (2013-10-20).
* configs/sama5d3x-3k/demo: The TRNG and /dev/random are now enabled
@@ -5893,8 +5893,8 @@
* drivers/audio/ and include/nuttx/audio/vs1053.h: Updated
VS1053 driver from ken Pettit (2013-10-27).
* configs/mikroe-stm32f4/: Updated configuration for the
- Mikrow STM32F4 board from Ken Pettit (2013-10-27).
- * arch/arm/src/stm32/stm32_spi.c: DMA-related fixe from Ken
+ Mikroe STM32F4 board from Ken Pettit (2013-10-27).
+ * arch/arm/src/stm32/stm32_spi.c: DMA-related fixes from Ken
Pettit (2013-10-27).
* sched/sched_releasetcb.c: Fix a cornercase: If sched_releasetcb()
is called as part of a failed pthread startup before the flags
@@ -5904,4 +5904,7 @@
modes: single channel or multiple channel with sequencer support.
software trigger or timer trigger; ADC channel interrupts or
DMA (2013-10-28).
+ * nuttx/drivers/audio/vs1053.c and nuttx/include/nuttx/audio/audio.h:
+ Add logic to verify the audio sub-format. From Ken Pettit (2013-10-28).
+6.32 2013-xx-xx Gregory Nutt <gnutt@nuttx.org>
diff --git a/nuttx/drivers/audio/vs1053.c b/nuttx/drivers/audio/vs1053.c
index 3e56c2019..76be87991 100644
--- a/nuttx/drivers/audio/vs1053.c
+++ b/nuttx/drivers/audio/vs1053.c
@@ -583,34 +583,54 @@ static int vs1053_getcaps(FAR struct audio_lowerhalf_s *lower, int type,
pCaps->ac_channels = 2; /* Stereo output */
- /* The input formats we can decode / accept */
+ switch (pCaps->ac_subtype)
+ {
+ case AUDIO_TYPE_QUERY:
+ /* The input formats we can decode / accept */
- pCaps->ac_format[0] = 0
+ *((uint16_t *) &pCaps->ac_format[0]) = 0
#ifdef CONFIG_AUDIO_FORMAT_AC3
- | AUDIO_FMT_AC3
+ | (1 << (AUDIO_FMT_AC3 - 1))
#endif
#ifdef CONFIG_AUDIO_FORMAT_MP3
- | AUDIO_FMT_MP3
+ | (1 << (AUDIO_FMT_MP3 - 1))
#endif
#ifdef CONFIG_AUDIO_FORMAT_WMA
- | AUDIO_FMT_WMA
+ | (1 << (AUDIO_FMT_WMA - 1))
#endif
#ifdef CONFIG_AUDIO_FORMAT_MIDI
- | AUDIO_FMT_MIDI
+ | (1 << (AUDIO_FMT_MIDI - 1))
#endif
#ifdef CONFIG_AUDIO_FORMAT_PCM
- | AUDIO_FMT_PCM
+ | (1 << (AUDIO_FMT_PCM - 1))
#endif
- ;
-
#ifdef CONFIG_AUDIO_FORMAT_OGG_VORBIS
- pCaps->ac_format[1] = (AUDIO_FMT_OGG_VORBIS) >> 8;
+ | (1 << (AUDIO_FMT_OGG_VORBIS - 1))
#endif
+ ;
+
+ /* The types of audio units we implement */
+
+ pCaps->ac_controls[0] = AUDIO_TYPE_OUTPUT | AUDIO_TYPE_FEATURE |
+ AUDIO_TYPE_PROCESSING;
+
+ break;
- /* The types of audio units we implement */
+ /* Report sub-formats for MIDI if requested */
- pCaps->ac_controls[0] = AUDIO_TYPE_OUTPUT | AUDIO_TYPE_FEATURE |
- AUDIO_TYPE_PROCESSING;
+#ifdef CONFIG_AUDIO_FORMAT_MIDI
+ case AUDIO_FMT_MIDI:
+ /* We only support Format 0 */
+
+ pCaps->ac_controls[0] = AUDIO_SUBFMT_MIDI_0;
+ pCaps->ac_controls[1] = AUDIO_SUBFMT_END;
+ break;
+#endif
+
+ default:
+ pCaps->ac_controls[0] = AUDIO_SUBFMT_END;
+ break;
+ }
break;
@@ -663,6 +683,7 @@ static int vs1053_getcaps(FAR struct audio_lowerhalf_s *lower, int type,
/* Fill in the ac_controls section with the Feature Units we have */
pCaps->ac_controls[0] = AUDIO_FU_VOLUME | AUDIO_FU_BASS | AUDIO_FU_TREBLE;
+ pCaps->ac_controls[1] = AUDIO_FU_BALANCE >> 8;
}
else
{
diff --git a/nuttx/include/nuttx/audio/audio.h b/nuttx/include/nuttx/audio/audio.h
index be03cc71e..6f1afc7f8 100644
--- a/nuttx/include/nuttx/audio/audio.h
+++ b/nuttx/include/nuttx/audio/audio.h
@@ -129,33 +129,40 @@
* is a list of bit-field definitons for defining the device type.
*/
-#define AUDIO_TYPE_QUERY 0x0000
-#define AUDIO_TYPE_INPUT 0x0002
-#define AUDIO_TYPE_OUTPUT 0x0004
-#define AUDIO_TYPE_MIXER 0x0008
-#define AUDIO_TYPE_SELECTOR 0x0010
-#define AUDIO_TYPE_FEATURE 0x0020
-#define AUDIO_TYPE_EFFECT 0x0040
-#define AUDIO_TYPE_PROCESSING 0x0080
-#define AUDIO_TYPE_EXTENSION 0x0100
+#define AUDIO_TYPE_QUERY 0x00
+#define AUDIO_TYPE_INPUT 0x02
+#define AUDIO_TYPE_OUTPUT 0x02
+#define AUDIO_TYPE_MIXER 0x04
+#define AUDIO_TYPE_SELECTOR 0x08
+#define AUDIO_TYPE_FEATURE 0x10
+#define AUDIO_TYPE_EFFECT 0x20
+#define AUDIO_TYPE_PROCESSING 0x40
+#define AUDIO_TYPE_EXTENSION 0x80
/* Audio Format Types *******************************************************/
-/* The following defines the audio data format types in NuttX. */
-
-#define AUDIO_FMT_UNDEF 0x000
-#define AUDIO_FMT_OTHER 0x001
-#define AUDIO_FMT_MPEG 0x002
-#define AUDIO_FMT_AC3 0x004
-#define AUDIO_FMT_WMA 0x008
-#define AUDIO_FMT_DTS 0x010
-#define AUDIO_FMT_PCM 0x020
-#define AUDIO_FMT_WAV 0x020
-#define AUDIO_FMT_MP3 0x040
-#define AUDIO_FMT_MIDI 0x080
-#define AUDIO_FMT_OGG_VORBIS 0x100
+/* The following defines the audio data format types in NuttX. During a
+ * format query, these will be converted to bit positions withing the
+ * ac_format field, meaning we currently only support up to 16 formats. To
+ * support more than that, we will use the FMT_OTHER entry, and the
+ * interfacing software can perform a second query to get the other formats.
+ */
+
+#define AUDIO_FMT_UNDEF 0x00
+#define AUDIO_FMT_OTHER 0x01
+#define AUDIO_FMT_MPEG 0x02
+#define AUDIO_FMT_AC3 0x03
+#define AUDIO_FMT_WMA 0x04
+#define AUDIO_FMT_DTS 0x05
+#define AUDIO_FMT_PCM 0x06
+#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
/* Audio Sub-Format Types ***************************************************/
+#define AUDIO_SUBFMT_END 0x00
#define AUDIO_SUBFMT_PCM_MP1 0x01
#define AUDIO_SUBFMT_PCM_MP2 0x02
#define AUDIO_SUBFMT_PCM_MP3 0x03
@@ -167,6 +174,9 @@
#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
/* Supported Sampling Rates *************************************************/