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

Dependencies:   mbed

main.cpp

Committer:
robt
Date:
2013-06-16
Revision:
0:0ba4b5723199

File content as of revision 0:0ba4b5723199:

/* Program Example 11.5: 16-bit mono wave player
                                                             */
#include "mbed.h"
#include "SDFileSystem.h"
#define BUFFERSIZE 4096              // number of data in circular buffer
SDFileSystem sd(p5, p6, p7, p8, "sd");
AnalogOut DACout(p18);
Ticker SampleTicker;
int SampleRate;
float SamplePeriod;                       // sample period in microseconds
int CircularBuffer[BUFFERSIZE];           // circular buffer array
int ReadPointer=0;
int WritePointer=0;
bool EndOfFileFlag=0;

void DACFunction(void);                   // function prototype

int main() {
  FILE  *fp = fopen("/sd/testa.wav", "rb");     // open wave file
  fseek(fp, 24, SEEK_SET);                      // move to byte 24
  fread(&SampleRate, 4, 1, fp);                 // get sample frequency
  SamplePeriod=(float)1/SampleRate;   // calculate sample period as float
  SampleTicker.attach(&DACFunction,SamplePeriod);   // start output tick

  while (!feof(fp)) {          // loop until end of file is encountered 
    fread(&CircularBuffer[WritePointer], 2, 1, fp);
    WritePointer=WritePointer+1;        // increment Write Pointer
    if (WritePointer>=BUFFERSIZE) {     // if end of circular buffer
        WritePointer=0;                 // go back to start of buffer   
    }
  }
  EndOfFileFlag=1;
  fclose(fp);
}

// DAC function called at rate SamplePeriod
void DACFunction(void) {
  if ((EndOfFileFlag==0)|(ReadPointer>0)) { // output while data available
    DACout.write_u16(CircularBuffer[ReadPointer]);   // output to DAC
    ReadPointer=ReadPointer+1;                       // increment pointer
    if (ReadPointer>=BUFFERSIZE) {
      ReadPointer=0;                      // reset pointer if necessary
    }
  }
}