By Olga Nee and Alexandr Braverman.
The purpose of our project is to implement MP3 player using LPC2148 microcontroller and SD card interface.
1. Open source Fixed-point MP3 decoder library, developed by RealNetworks.
The library supports:
††††††††††† - layer 3
††††††††††† - MPEG1, MPEG2, and MPEG2.5 (low sampling frequency extensions)
††††††††††† - constant bitrate, variable bitrate, and free bitrate modes
- mono and all stereo modes (normal stereo, joint stereo, dual-mono)
We havenít used the dynamic memory allocation, but we have a rather static memory assignment. So, we changed mp3_init() function and added header file in which we perform static memory allocations needed by the decoder.
When we tried to run the program on the board we faced the problem of lack of RAM memory. Static allocations we made exceeded the amount of RAM (32 kB) on LPC2148. So we decided to use additional 8 kB of USB RAM. To use it we enabled USB power/clock, so we can use USB RAM: PCONP |= 1 << 31. We allocated
LPC2148 education board is equipped with 10 bit digital to analog converter.
The DAC is used as it is as audio output device. With this approach only a mono channel is supported. So, before storing mp3 file in the SD card, it is needed to convert it into the mono version. For this purpose we used Audacity, free open source software:
2. EFSL library released under GPL. The library supports FAT12/16/32 reading and writing on SD-cards. EFSL source code is available at:
Our player can also play simple WAV files. The minimal WAV file contains two required chunks: format chunk and data chunk. There are more complex WAV formats. But while converting CD to WAV format, most of software supply simple WAV files.
An amplifier was connected to DAC.
We used SanDisk microSD card with capacity of 2 GB.†
SD card works with SPI1. Here are jumper settings:
CPU operating frequency generated from a 12 MHz crystal is 60 MHz.
So Timer0, which supplies music sampling frequency, runs with 60 MHz CPU clock.
How we used mp3 decoder
How we used the decoder:
To use the decoder library properly, we allocated a buffer SDBuff of size 8192 Bytes to read from mp3 file amount of bytes which is at least the size of mp3 frame. Each time beginning of frame is found in this buffer and is decoded by the decoder. The result of decoding is kept in buffer outBuf of size 2304 Bytes. The sample rate of the decoded frame is stored in mp3FrameInfo.samprate .
After that the rate of counter, which determines at which rate the pcm samples are placed in DAC, is set to mp3FrameInfo.samprate .† And the content of outBuf is sampled by render_sample_block() function in the following way: the pcm samples are stored in a buffer of size 1536 which is sampled by dac at given rate. If there is not enough space in that buffer, we wait in loop until the next sample in the buffer is sampled.