Play a wav clip in the headphones (or a speaker)

Dependencies:   mbed

Committer:
faif
Date:
Sun Feb 05 09:52:10 2017 +0000
Revision:
0:17458f91a0e9
Child:
1:91104d67b0af
Play a wav sound

Who changed what in which revision?

UserRevisionLine numberNew contents of line
faif 0:17458f91a0e9 1 #include "mbed.h"
faif 0:17458f91a0e9 2
faif 0:17458f91a0e9 3 Ticker rhythm;
faif 0:17458f91a0e9 4 LocalFileSystem fs("local"); // required even if it appears like it's not used
faif 0:17458f91a0e9 5
faif 0:17458f91a0e9 6 DigitalIn button(p20);
faif 0:17458f91a0e9 7 DigitalOut led(LED1);
faif 0:17458f91a0e9 8 AnalogOut headphones(p18);
faif 0:17458f91a0e9 9
faif 0:17458f91a0e9 10 void myrhythm();
faif 0:17458f91a0e9 11 void waitForButton(DigitalOut& led, DigitalIn& button);
faif 0:17458f91a0e9 12 void preloadFile(char* clip, int size, const char* path);
faif 0:17458f91a0e9 13 void playSound(char* clip, int size, AnalogOut& headphones);
faif 0:17458f91a0e9 14
faif 0:17458f91a0e9 15 enum
faif 0:17458f91a0e9 16 {
faif 0:17458f91a0e9 17 OFF = 0,
faif 0:17458f91a0e9 18 ON = 1
faif 0:17458f91a0e9 19 };
faif 0:17458f91a0e9 20
faif 0:17458f91a0e9 21 enum { MaxWavValue = 255 };
faif 0:17458f91a0e9 22
faif 0:17458f91a0e9 23 static const float ticker_rhythm = 13E-5; // 8 kHz sample rate (1/8000 sec delay)
faif 0:17458f91a0e9 24 static const char clip_path[] = "/local/blonde.wav";
faif 0:17458f91a0e9 25
faif 0:17458f91a0e9 26
faif 0:17458f91a0e9 27 bool done = false;
faif 0:17458f91a0e9 28
faif 0:17458f91a0e9 29
faif 0:17458f91a0e9 30 void myrhythm()
faif 0:17458f91a0e9 31 {
faif 0:17458f91a0e9 32 done = true;
faif 0:17458f91a0e9 33 }
faif 0:17458f91a0e9 34
faif 0:17458f91a0e9 35 int main ()
faif 0:17458f91a0e9 36 {
faif 0:17458f91a0e9 37 const int size = 30000; // 32K max in total (~30K is enough for testing)
faif 0:17458f91a0e9 38 char clip[size];
faif 0:17458f91a0e9 39
faif 0:17458f91a0e9 40 waitForButton(led, button);
faif 0:17458f91a0e9 41 preloadFile(clip, size, clip_path);
faif 0:17458f91a0e9 42
faif 0:17458f91a0e9 43 rhythm.attach(&myrhythm, ticker_rhythm);
faif 0:17458f91a0e9 44
faif 0:17458f91a0e9 45 while (true)
faif 0:17458f91a0e9 46 {
faif 0:17458f91a0e9 47 waitForButton(led, button);
faif 0:17458f91a0e9 48 playSound(clip, size, headphones);
faif 0:17458f91a0e9 49 }
faif 0:17458f91a0e9 50 }
faif 0:17458f91a0e9 51
faif 0:17458f91a0e9 52 void waitForButton(DigitalOut& led, DigitalIn& button)
faif 0:17458f91a0e9 53 {
faif 0:17458f91a0e9 54 led = ON;
faif 0:17458f91a0e9 55 while (!button) {};
faif 0:17458f91a0e9 56 led = OFF;
faif 0:17458f91a0e9 57 }
faif 0:17458f91a0e9 58
faif 0:17458f91a0e9 59 void preloadFile(char* clip, int size, const char* path)
faif 0:17458f91a0e9 60 {
faif 0:17458f91a0e9 61 FILE* file = fopen(path, "r");
faif 0:17458f91a0e9 62 for (int i = 0; i != size; ++i)
faif 0:17458f91a0e9 63 {
faif 0:17458f91a0e9 64 clip[i] = fgetc(file);
faif 0:17458f91a0e9 65 }
faif 0:17458f91a0e9 66 fclose(file);
faif 0:17458f91a0e9 67 }
faif 0:17458f91a0e9 68
faif 0:17458f91a0e9 69 void playSound(char* clip, int size, AnalogOut& headphones)
faif 0:17458f91a0e9 70 {
faif 0:17458f91a0e9 71 for (int i= 0; i != size; ++i)
faif 0:17458f91a0e9 72 {
faif 0:17458f91a0e9 73 while (!done) {};
faif 0:17458f91a0e9 74 done = false;
faif 0:17458f91a0e9 75 headphones = float(clip[i]) / MaxWavValue;
faif 0:17458f91a0e9 76 }
faif 0:17458f91a0e9 77 }