diff options
Diffstat (limited to 'drivers/gaudio')
-rw-r--r-- | drivers/gaudio/vs1053/gaudio_play_config.h | 15 | ||||
-rw-r--r-- | drivers/gaudio/vs1053/gaudio_play_lld.c | 34 | ||||
-rw-r--r-- | drivers/gaudio/vs1053/readme.txt | 14 |
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". |