aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gaudio
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2014-06-23 18:44:50 +1000
committerinmarket <andrewh@inmarket.com.au>2014-06-23 18:44:50 +1000
commit16fba41d5079aec39d299dbf5481758320443dab (patch)
tree9ee0b8e8aec9b3e04ac71ecc934f84a7056b8ec5 /drivers/gaudio
parent8d1ce488005f6d08cc11c7842b8bc53be9cb3bb0 (diff)
downloaduGFX-16fba41d5079aec39d299dbf5481758320443dab.tar.gz
uGFX-16fba41d5079aec39d299dbf5481758320443dab.tar.bz2
uGFX-16fba41d5079aec39d299dbf5481758320443dab.zip
Added support for playing arbitrary format audio files with an intelligent audio processor like the VS1053 codec.
Demo added.
Diffstat (limited to 'drivers/gaudio')
-rw-r--r--drivers/gaudio/vs1053/gaudio_play_config.h15
-rw-r--r--drivers/gaudio/vs1053/gaudio_play_lld.c34
-rw-r--r--drivers/gaudio/vs1053/readme.txt14
3 files changed, 44 insertions, 19 deletions
diff --git a/drivers/gaudio/vs1053/gaudio_play_config.h b/drivers/gaudio/vs1053/gaudio_play_config.h
index bd2af503..51a3d273 100644
--- a/drivers/gaudio/vs1053/gaudio_play_config.h
+++ b/drivers/gaudio/vs1053/gaudio_play_config.h
@@ -14,10 +14,23 @@
/* Driver hardware support. */
/*===========================================================================*/
+/* Note:
+ * The VS1053 has an internal processor which can decode many file formats directly.
+ * If you want to use anything other than raw PCM then you should use GAUDIO_PLAY_FORMAT_FILE and pipe
+ * the entire file as if it was sound data. It doesn't matter if you choose the mono or stereo channel
+ * as the codec chip automatically detects the real format itself.
+ * No testing is made of the file format - if there is an error it can only be detected by the codec chip
+ * and its behaviour is undefined (we haven't tested).
+ * Note that some formats require a firmware patch to be installed to play correctly.
+ * In this case define VS1053_FIRMWARE_PATCH as TRUE in your gfxconf.h file and include the patch file
+ * in your project directory. The patch file MUST be called "vs1053_patch.plg".
+ */
#define GAUDIO_PLAY_MAX_SAMPLE_FREQUENCY 48000
-#define GAUDIO_PLAY_NUM_FORMATS 2
+#define GAUDIO_PLAY_NUM_FORMATS 3
#define GAUDIO_PLAY_FORMAT1 ARRAY_DATA_16BITSIGNED
#define GAUDIO_PLAY_FORMAT2 ARRAY_DATA_8BITUNSIGNED
+#define GAUDIO_PLAY_FORMAT3 ARRAY_DATA_UNKNOWN
+#define GAUDIO_PLAY_FORMAT_FILE ARRAY_DATA_UNKNOWN
#define GAUDIO_PLAY_NUM_CHANNELS 2
#define GAUDIO_PLAY_CHANNEL0_IS_STEREO FALSE
#define GAUDIO_PLAY_CHANNEL1_IS_STEREO TRUE
diff --git a/drivers/gaudio/vs1053/gaudio_play_lld.c b/drivers/gaudio/vs1053/gaudio_play_lld.c
index fc62fea2..e6c66043 100644
--- a/drivers/gaudio/vs1053/gaudio_play_lld.c
+++ b/drivers/gaudio/vs1053/gaudio_play_lld.c
@@ -242,7 +242,7 @@ bool_t gaudio_play_lld_init(uint16_t channel, uint32_t frequency, ArrayDataForma
0xFF, 0xFF, 0xFF, 0xFF,
};
- if (format != ARRAY_DATA_8BITUNSIGNED && format != ARRAY_DATA_16BITSIGNED)
+ if (format != ARRAY_DATA_8BITUNSIGNED && format != ARRAY_DATA_16BITSIGNED && format != ARRAY_DATA_UNKNOWN)
return FALSE;
if (frequency > VS1053_MAX_SAMPLE_RATE)
return FALSE;
@@ -254,21 +254,23 @@ bool_t gaudio_play_lld_init(uint16_t channel, uint32_t frequency, ArrayDataForma
}
// Setup
- bps = (gfxSampleFormatBits(format)+7)/8;
- if (channel == GAUDIO_PLAY_STEREO)
- bps *= 2;
- brate = frequency * bps;
-
- // Write the RIFF header
- waitforready();
- data_write(hdr1, sizeof(hdr1));
- buf[0] = channel == GAUDIO_PLAY_STEREO ? 2 : 1; buf[1] = 0; data_write(buf, 2);
- buf[0] = frequency; buf[1] = frequency>>8; buf[2] = frequency>>16; buf[3] = frequency>>24; data_write(buf, 4);
- buf[0] = brate; buf[1] = brate>>8; buf[2] = brate>>16; buf[3] = brate>>24; data_write(buf, 4);
- waitforready(); // 32 bytes max before checking
- buf[0] = bps; buf[1] = 0; data_write(buf, 2);
- buf[0] = gfxSampleFormatBits(format); buf[1] = 0; data_write(buf, 2);
- data_write(hdr2, sizeof(hdr2));
+ if (format == ARRAY_DATA_8BITUNSIGNED || format == ARRAY_DATA_16BITSIGNED) {
+ bps = (gfxSampleFormatBits(format)+7)/8;
+ if (channel == GAUDIO_PLAY_STEREO)
+ bps *= 2;
+ brate = frequency * bps;
+
+ // Write the RIFF header
+ waitforready();
+ data_write(hdr1, sizeof(hdr1));
+ buf[0] = channel == GAUDIO_PLAY_STEREO ? 2 : 1; buf[1] = 0; data_write(buf, 2);
+ buf[0] = frequency; buf[1] = frequency>>8; buf[2] = frequency>>16; buf[3] = frequency>>24; data_write(buf, 4);
+ buf[0] = brate; buf[1] = brate>>8; buf[2] = brate>>16; buf[3] = brate>>24; data_write(buf, 4);
+ waitforready(); // 32 bytes max before checking
+ buf[0] = bps; buf[1] = 0; data_write(buf, 2);
+ buf[0] = gfxSampleFormatBits(format); buf[1] = 0; data_write(buf, 2);
+ data_write(hdr2, sizeof(hdr2));
+ }
return TRUE;
}
diff --git a/drivers/gaudio/vs1053/readme.txt b/drivers/gaudio/vs1053/readme.txt
index 6e99e56f..d5d10145 100644
--- a/drivers/gaudio/vs1053/readme.txt
+++ b/drivers/gaudio/vs1053/readme.txt
@@ -1,4 +1,14 @@
This chip supports playing in many formats including MP3 etc.
-For this driver however we only support PCM in 8 bit unisgned and 16 bit signed formats.
+For this driver we support the standard PCM in 8 bit unsigned and 16 bit signed formats.
-Requires GFX_USE_GTIMER \ No newline at end of file
+Requires GFX_USE_GTIMER
+
+ * The VS1053 has an internal processor which can decode many file formats directly.
+ * If you want to use anything other than raw PCM then you should use GAUDIO_PLAY_FORMAT_FILE and pipe
+ * the entire file as if it was sound data. It doesn't matter if you choose the mono or stereo channel
+ * as the codec chip automatically detects the real format itself.
+ * No testing is made of the file format - if there is an error it can only be detected by the codec chip
+ * and its behaviour is undefined (we haven't tested).
+ * Note that some formats require a firmware patch to be installed to play correctly.
+ * In this case define VS1053_FIRMWARE_PATCH as TRUE in your gfxconf.h file and include the patch file
+ * in your project directory. The patch file MUST be called "vs1053_patch.plg".