by Rob Toulson and Tim Wilmshurst from textbook "Fast and Effective Embedded Systems Design: Applying the ARM mbed"
main.cpp@0:0ba4b5723199, 2013-06-16 (annotated)
- 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?
User | Revision | Line number | New 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 |