by Rob Toulson and Tim Wilmshurst from textbook "Fast and Effective Embedded Systems Design: Applying the ARM mbed"

Dependencies:   mbed

Committer:
robt
Date:
Sun Jun 16 15:20:07 2013 +0000
Revision:
0:0ba4b5723199
by Rob Toulson and Tim Wilmshurst from textbook "Fast and Effective Embedded Systems Design: Applying the ARM mbed"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
robt 0:0ba4b5723199 1 /* Program Example 11.5: 16-bit mono wave player
robt 0:0ba4b5723199 2 */
robt 0:0ba4b5723199 3 #include "mbed.h"
robt 0:0ba4b5723199 4 #include "SDFileSystem.h"
robt 0:0ba4b5723199 5 #define BUFFERSIZE 4096 // number of data in circular buffer
robt 0:0ba4b5723199 6 SDFileSystem sd(p5, p6, p7, p8, "sd");
robt 0:0ba4b5723199 7 AnalogOut DACout(p18);
robt 0:0ba4b5723199 8 Ticker SampleTicker;
robt 0:0ba4b5723199 9 int SampleRate;
robt 0:0ba4b5723199 10 float SamplePeriod; // sample period in microseconds
robt 0:0ba4b5723199 11 int CircularBuffer[BUFFERSIZE]; // circular buffer array
robt 0:0ba4b5723199 12 int ReadPointer=0;
robt 0:0ba4b5723199 13 int WritePointer=0;
robt 0:0ba4b5723199 14 bool EndOfFileFlag=0;
robt 0:0ba4b5723199 15
robt 0:0ba4b5723199 16 void DACFunction(void); // function prototype
robt 0:0ba4b5723199 17
robt 0:0ba4b5723199 18 int main() {
robt 0:0ba4b5723199 19 FILE *fp = fopen("/sd/testa.wav", "rb"); // open wave file
robt 0:0ba4b5723199 20 fseek(fp, 24, SEEK_SET); // move to byte 24
robt 0:0ba4b5723199 21 fread(&SampleRate, 4, 1, fp); // get sample frequency
robt 0:0ba4b5723199 22 SamplePeriod=(float)1/SampleRate; // calculate sample period as float
robt 0:0ba4b5723199 23 SampleTicker.attach(&DACFunction,SamplePeriod); // start output tick
robt 0:0ba4b5723199 24
robt 0:0ba4b5723199 25 while (!feof(fp)) { // loop until end of file is encountered
robt 0:0ba4b5723199 26 fread(&CircularBuffer[WritePointer], 2, 1, fp);
robt 0:0ba4b5723199 27 WritePointer=WritePointer+1; // increment Write Pointer
robt 0:0ba4b5723199 28 if (WritePointer>=BUFFERSIZE) { // if end of circular buffer
robt 0:0ba4b5723199 29 WritePointer=0; // go back to start of buffer
robt 0:0ba4b5723199 30 }
robt 0:0ba4b5723199 31 }
robt 0:0ba4b5723199 32 EndOfFileFlag=1;
robt 0:0ba4b5723199 33 fclose(fp);
robt 0:0ba4b5723199 34 }
robt 0:0ba4b5723199 35
robt 0:0ba4b5723199 36 // DAC function called at rate SamplePeriod
robt 0:0ba4b5723199 37 void DACFunction(void) {
robt 0:0ba4b5723199 38 if ((EndOfFileFlag==0)|(ReadPointer>0)) { // output while data available
robt 0:0ba4b5723199 39 DACout.write_u16(CircularBuffer[ReadPointer]); // output to DAC
robt 0:0ba4b5723199 40 ReadPointer=ReadPointer+1; // increment pointer
robt 0:0ba4b5723199 41 if (ReadPointer>=BUFFERSIZE) {
robt 0:0ba4b5723199 42 ReadPointer=0; // reset pointer if necessary
robt 0:0ba4b5723199 43 }
robt 0:0ba4b5723199 44 }
robt 0:0ba4b5723199 45 }
robt 0:0ba4b5723199 46