Wave file player helloworld for mbed LCP1768 running mbed OS 5. See https://os.mbed.com/users/4180_1/notebook/using-a-speaker-for-audio-output/
main.cpp@2:509911a88b64, 2019-10-02 (annotated)
- Committer:
- 4180_1
- Date:
- Wed Oct 02 13:45:40 2019 +0000
- Revision:
- 2:509911a88b64
- Parent:
- 0:9ed9bcd7cc87
ver 1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
HighTide | 0:9ed9bcd7cc87 | 1 | #include "mbed.h" |
4180_1 | 2:509911a88b64 | 2 | // Waveplayer Helloworld for mbed LP1768 running mbed OS 5 |
4180_1 | 2:509911a88b64 | 3 | // NOTE: Need "target.components_add": ["SD"] in json project file! |
4180_1 | 2:509911a88b64 | 4 | // This adds the filesystem driver below for SD cards in an OS 5 project |
4180_1 | 2:509911a88b64 | 5 | // See https://os.mbed.com/users/4180_1/notebook/using-a-speaker-for-audio-output/ |
4180_1 | 2:509911a88b64 | 6 | // for additional details |
HighTide | 0:9ed9bcd7cc87 | 7 | #include "SDBlockDevice.h" |
HighTide | 0:9ed9bcd7cc87 | 8 | #include "FATFileSystem.h" |
HighTide | 0:9ed9bcd7cc87 | 9 | #include "wave_player.h" |
HighTide | 0:9ed9bcd7cc87 | 10 | |
HighTide | 0:9ed9bcd7cc87 | 11 | // LED Components |
HighTide | 0:9ed9bcd7cc87 | 12 | PwmOut led(LED1); |
4180_1 | 2:509911a88b64 | 13 | DigitalOut led4(LED4); |
HighTide | 0:9ed9bcd7cc87 | 14 | |
HighTide | 0:9ed9bcd7cc87 | 15 | // SD File System Components |
HighTide | 0:9ed9bcd7cc87 | 16 | SDBlockDevice sd(p5, p6, p7, p8); |
HighTide | 0:9ed9bcd7cc87 | 17 | FATFileSystem fs("sd"); |
HighTide | 0:9ed9bcd7cc87 | 18 | |
HighTide | 0:9ed9bcd7cc87 | 19 | // Audio Components |
HighTide | 0:9ed9bcd7cc87 | 20 | AnalogOut dac(p18); |
HighTide | 0:9ed9bcd7cc87 | 21 | PwmOut speaker(p25); |
4180_1 | 2:509911a88b64 | 22 | //outputs audio to both DAC and PWM pin |
4180_1 | 2:509911a88b64 | 23 | //select one to drive speaker |
HighTide | 0:9ed9bcd7cc87 | 24 | wave_player wav(&dac, &speaker); |
HighTide | 0:9ed9bcd7cc87 | 25 | |
HighTide | 0:9ed9bcd7cc87 | 26 | Thread led_thread, audio_thread; |
HighTide | 0:9ed9bcd7cc87 | 27 | |
4180_1 | 2:509911a88b64 | 28 | void led_siren() |
4180_1 | 2:509911a88b64 | 29 | { |
HighTide | 0:9ed9bcd7cc87 | 30 | const int build_time = 100; |
HighTide | 0:9ed9bcd7cc87 | 31 | while (1) { |
HighTide | 0:9ed9bcd7cc87 | 32 | //LED warm up effect using PWM |
HighTide | 0:9ed9bcd7cc87 | 33 | for(int i=0; i<build_time; i++) { |
HighTide | 0:9ed9bcd7cc87 | 34 | led = i / (float) build_time; |
HighTide | 0:9ed9bcd7cc87 | 35 | ThisThread::sleep_for(1000.0*0.02); |
HighTide | 0:9ed9bcd7cc87 | 36 | } |
HighTide | 0:9ed9bcd7cc87 | 37 | //LED at full brightness level |
HighTide | 0:9ed9bcd7cc87 | 38 | led = 1.0; |
HighTide | 0:9ed9bcd7cc87 | 39 | ThisThread::sleep_for(1000.0*0.25); |
HighTide | 0:9ed9bcd7cc87 | 40 | //LED cool down effect using PWM |
HighTide | 0:9ed9bcd7cc87 | 41 | for(int i=build_time-1; i>0; i--) { |
HighTide | 0:9ed9bcd7cc87 | 42 | led = i/ (float) build_time; |
HighTide | 0:9ed9bcd7cc87 | 43 | ThisThread::sleep_for(1000.0*0.02); |
HighTide | 0:9ed9bcd7cc87 | 44 | } |
HighTide | 0:9ed9bcd7cc87 | 45 | //LED off |
HighTide | 0:9ed9bcd7cc87 | 46 | led = 0.0; |
HighTide | 0:9ed9bcd7cc87 | 47 | ThisThread::sleep_for(1000.0*1.5); |
HighTide | 0:9ed9bcd7cc87 | 48 | } |
HighTide | 0:9ed9bcd7cc87 | 49 | } |
HighTide | 0:9ed9bcd7cc87 | 50 | |
4180_1 | 2:509911a88b64 | 51 | void play_audio() |
4180_1 | 2:509911a88b64 | 52 | { |
HighTide | 0:9ed9bcd7cc87 | 53 | FILE * wav_file; |
4180_1 | 2:509911a88b64 | 54 | speaker.period(1.0/400000.0); //increase PWM clock rate for audio |
4180_1 | 2:509911a88b64 | 55 | sd.init(); |
4180_1 | 2:509911a88b64 | 56 | sd.frequency(25000000); //increase SPI clock rate for audio |
HighTide | 0:9ed9bcd7cc87 | 57 | while (1) { |
HighTide | 0:9ed9bcd7cc87 | 58 | fs.mount(&sd); |
4180_1 | 2:509911a88b64 | 59 | //need sample.wav file on SD card |
4180_1 | 2:509911a88b64 | 60 | //wave file format mono 16Khz or less (not mp3!) |
4180_1 | 2:509911a88b64 | 61 | wav_file = fopen("/sd/sample.wav", "r"); |
HighTide | 0:9ed9bcd7cc87 | 62 | wav.play(wav_file); |
HighTide | 0:9ed9bcd7cc87 | 63 | fclose(wav_file); |
HighTide | 0:9ed9bcd7cc87 | 64 | fs.unmount(); |
4180_1 | 2:509911a88b64 | 65 | wait(1); |
HighTide | 0:9ed9bcd7cc87 | 66 | } |
HighTide | 0:9ed9bcd7cc87 | 67 | } |
HighTide | 0:9ed9bcd7cc87 | 68 | |
HighTide | 0:9ed9bcd7cc87 | 69 | // main() runs in its own thread in the OS |
HighTide | 0:9ed9bcd7cc87 | 70 | int main() |
4180_1 | 2:509911a88b64 | 71 | { |
HighTide | 0:9ed9bcd7cc87 | 72 | led_thread.start(led_siren); |
HighTide | 0:9ed9bcd7cc87 | 73 | audio_thread.start(play_audio); |
HighTide | 0:9ed9bcd7cc87 | 74 | while (true) { |
HighTide | 0:9ed9bcd7cc87 | 75 | ThisThread::sleep_for(500); |
4180_1 | 2:509911a88b64 | 76 | led4 = !led4; |
HighTide | 0:9ed9bcd7cc87 | 77 | } |
HighTide | 0:9ed9bcd7cc87 | 78 | } |