NuMaker audio playback

Committer:
csyang2 csyang2@nuvoton.com
Date:
Fri Jul 03 10:37:45 2020 +0800
Revision:
17:65a16265cda2
Parent:
15:8527899eb9d3
Child:
20:df54b4c86862
Updated main.cpp to initial global variables properly

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ccli8 1:c3f10403b3db 1 #include "mbed.h"
ccli8 1:c3f10403b3db 2
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 3 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 4 #include "FATFileSystem.h"
csyang2 6:66ba9ac474ac 5 #include "NuSDBlockDevice.h"
csyang2 6:66ba9ac474ac 6 #include <stdio.h>
csyang2 6:66ba9ac474ac 7 #include <errno.h>
ccli8 1:c3f10403b3db 8
csyang2 6:66ba9ac474ac 9 NuSDBlockDevice bd(MBED_CONF_APP_SD_DAT0, MBED_CONF_APP_SD_DAT1, MBED_CONF_APP_SD_DAT2, MBED_CONF_APP_SD_DAT3, // SD DAT0-3
csyang2 6:66ba9ac474ac 10 MBED_CONF_APP_SD_CMD, MBED_CONF_APP_SD_CLK, MBED_CONF_APP_SD_CD); // SD CMD/CLK/CD
csyang2 6:66ba9ac474ac 11 FATFileSystem fs("fs");
csyang2 10:ca032f77d721 12 #endif
csyang2 5:492ea7d38e59 13
csyang2 10:ca032f77d721 14 #if defined(TARGET_NUMAKER_PFM_NUC472)
csyang2 10:ca032f77d721 15 #include "NAU8822L.h"
csyang2 10:ca032f77d721 16
csyang2 10:ca032f77d721 17 NAU8822L audio(MBED_CONF_APP_I2C_SDA, MBED_CONF_APP_I2C_SCL, MBED_CONF_APP_I2C_ADDR, MBED_CONF_APP_I2S_DO,
csyang2 10:ca032f77d721 18 MBED_CONF_APP_I2S_DI, MBED_CONF_APP_I2S_BCLK, MBED_CONF_APP_I2S_MCLK, MBED_CONF_APP_I2S_LRCK); // NAU8822L object
csyang2 10:ca032f77d721 19 DigitalOut hp_enable(PH_2);
ccli8 1:c3f10403b3db 20 #elif defined(TARGET_NUMAKER_PFM_M453)
csyang2 10:ca032f77d721 21 #include "NAU8822L.h"
csyang2 10:ca032f77d721 22
csyang2 10:ca032f77d721 23 NAU8822L audio(MBED_CONF_APP_I2C_SDA, MBED_CONF_APP_I2C_SCL, MBED_CONF_APP_I2C_ADDR, MBED_CONF_APP_I2S_DO,
csyang2 10:ca032f77d721 24 MBED_CONF_APP_I2S_DI, MBED_CONF_APP_I2S_BCLK, MBED_CONF_APP_I2S_MCLK, MBED_CONF_APP_I2S_LRCK); // NAU8822L object
ccli8 1:c3f10403b3db 25 DigitalOut hp_enable(PE_1);
csyang2 10:ca032f77d721 26 #elif defined(TARGET_NUMAKER_PFM_M487)
csyang2 10:ca032f77d721 27 #include "NAU88L25.h"
csyang2 5:492ea7d38e59 28
csyang2 10:ca032f77d721 29 NAU88L25 audio(MBED_CONF_APP_I2C_SDA, MBED_CONF_APP_I2C_SCL, MBED_CONF_APP_I2C_ADDR, MBED_CONF_APP_I2S_DO,
csyang2 10:ca032f77d721 30 MBED_CONF_APP_I2S_DI, MBED_CONF_APP_I2S_BCLK, MBED_CONF_APP_I2S_MCLK, MBED_CONF_APP_I2S_LRCK); // NAU88L25 object
csyang2 12:6a21e1be7e7d 31 DigitalOut hp_enable(PE_13);
csyang2 10:ca032f77d721 32 #elif defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 33 #include "NAU88L25.h"
csyang2 10:ca032f77d721 34
csyang2 10:ca032f77d721 35 NAU88L25 audio(MBED_CONF_APP_I2C_SDA, MBED_CONF_APP_I2C_SCL, MBED_CONF_APP_I2C_ADDR, MBED_CONF_APP_I2S_DO,
csyang2 10:ca032f77d721 36 MBED_CONF_APP_I2S_DI, MBED_CONF_APP_I2S_BCLK, MBED_CONF_APP_I2S_MCLK, MBED_CONF_APP_I2S_LRCK); // NAU88L25 object
csyang2 10:ca032f77d721 37 DigitalOut hp_enable(LED2); //dummy function
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 38 #elif defined(TARGET_NUMAKER_IOT_M487)
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 39 #include "NAU88L25.h"
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 40
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 41 NAU88L25 audio(MBED_CONF_APP_I2C_SDA, MBED_CONF_APP_I2C_SCL, MBED_CONF_APP_I2C_ADDR, MBED_CONF_APP_I2S_DO,
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 42 MBED_CONF_APP_I2S_DI, MBED_CONF_APP_I2S_BCLK, MBED_CONF_APP_I2S_MCLK, MBED_CONF_APP_I2S_LRCK); // NAU88L25 object
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 43 DigitalOut hp_enable(PE_13);
ccli8 1:c3f10403b3db 44 #endif
Chuck Young 4:0b5c342628ff 45
ccli8 1:c3f10403b3db 46 InterruptIn button(SW2); // button SW2
ccli8 1:c3f10403b3db 47 DigitalOut led(LED1); // flashing LED1(rgbled1)
ccli8 1:c3f10403b3db 48
csyang2 10:ca032f77d721 49 #if defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 50 int audioBuf[128];
csyang2 10:ca032f77d721 51 #else
csyang2 5:492ea7d38e59 52 int audioBuf[4096];
csyang2 10:ca032f77d721 53 #endif
csyang2 5:492ea7d38e59 54
ccli8 1:c3f10403b3db 55 int readPtr = 0;
csyang2 5:492ea7d38e59 56 int writePtr = 0;
csyang2 5:492ea7d38e59 57
csyang2 5:492ea7d38e59 58 int samplingRate = 8000;
csyang2 10:ca032f77d721 59 char channelCount = 2;
csyang2 5:492ea7d38e59 60 char sampleBitLength = 16;
ccli8 1:c3f10403b3db 61
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 62 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 63 FILE *fd;
ccli8 1:c3f10403b3db 64
csyang2 5:492ea7d38e59 65 int theta = 0;
ccli8 1:c3f10403b3db 66
csyang2 6:66ba9ac474ac 67 void return_error(int ret_val) {
csyang2 6:66ba9ac474ac 68 if (ret_val)
csyang2 6:66ba9ac474ac 69 printf("Failure. %d\r\n", ret_val);
csyang2 6:66ba9ac474ac 70 else
csyang2 6:66ba9ac474ac 71 printf("done.\r\n");
csyang2 6:66ba9ac474ac 72 }
csyang2 6:66ba9ac474ac 73
csyang2 6:66ba9ac474ac 74 void errno_error(void* ret_val) {
csyang2 6:66ba9ac474ac 75 if (ret_val == NULL)
csyang2 6:66ba9ac474ac 76 printf(" Failure. %d \r\n", errno);
csyang2 6:66ba9ac474ac 77 else
csyang2 6:66ba9ac474ac 78 printf(" done.\r\n");
csyang2 6:66ba9ac474ac 79 }
csyang2 6:66ba9ac474ac 80
csyang2 10:ca032f77d721 81 #elif defined(TARGET_NUMAKER_PFM_M453) || defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 82 // 1k sine wave@sampling rate 8kHz stereo 16-bit
csyang2 10:ca032f77d721 83 const char sine1k[] = {
csyang2 10:ca032f77d721 84 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x50, 0x0B, 0x50, 0x0B, 0x00, 0x08, 0x00, 0x08,
csyang2 10:ca032f77d721 85 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xF8, 0xB0, 0xF4, 0xB0, 0xF4, 0x00, 0xF8, 0x00, 0xF8
ccli8 1:c3f10403b3db 86 };
csyang2 5:492ea7d38e59 87
csyang2 5:492ea7d38e59 88 int flag = 0;
ccli8 1:c3f10403b3db 89 #endif
ccli8 1:c3f10403b3db 90
ccli8 1:c3f10403b3db 91 void flip(void) {
ccli8 1:c3f10403b3db 92 led = !led;
ccli8 1:c3f10403b3db 93 }
ccli8 1:c3f10403b3db 94
csyang2 5:492ea7d38e59 95 void play(void) {
ccli8 1:c3f10403b3db 96 #if defined(TARGET_NUMAKER_PFM_NUC472)
ccli8 1:c3f10403b3db 97 audio.write(audioBuf, readPtr, 4);
ccli8 1:c3f10403b3db 98 readPtr += 4;
ccli8 1:c3f10403b3db 99 readPtr &= 0xFFF;
ccli8 1:c3f10403b3db 100 theta -= 4;
ccli8 1:c3f10403b3db 101 #elif defined(TARGET_NUMAKER_PFM_M453)
csyang2 5:492ea7d38e59 102 if (flag == 0) {
csyang2 10:ca032f77d721 103 audio.write((int *)sine1k, readPtr, 1);
csyang2 10:ca032f77d721 104 readPtr += 1;
csyang2 10:ca032f77d721 105 readPtr &= 0x7; // sine1k / 4 - 1
csyang2 5:492ea7d38e59 106 } else {
csyang2 10:ca032f77d721 107 audio.write(audioBuf, readPtr, 1);
csyang2 10:ca032f77d721 108 readPtr += 1;
csyang2 5:492ea7d38e59 109 readPtr &= 0xFFF;
csyang2 5:492ea7d38e59 110 }
csyang2 10:ca032f77d721 111 #elif defined(TARGET_NUMAKER_PFM_M487)
csyang2 10:ca032f77d721 112 audio.write(audioBuf, readPtr, 4);
csyang2 10:ca032f77d721 113 readPtr += 4;
csyang2 10:ca032f77d721 114 readPtr &= 0xFFF;
csyang2 10:ca032f77d721 115 theta -= 4;
csyang2 10:ca032f77d721 116 #elif defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 117 audio.write((int *)audioBuf, readPtr, 1);
csyang2 10:ca032f77d721 118 readPtr += 1;
csyang2 10:ca032f77d721 119 readPtr &= 0x7; // sine1k / 4 - 1
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 120 #elif defined(TARGET_NUMAKER_IOT_M487)
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 121 audio.write(audioBuf, readPtr, 4);
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 122 readPtr += 4;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 123 readPtr &= 0xFFF;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 124 theta -= 4;
ccli8 1:c3f10403b3db 125 #endif
ccli8 1:c3f10403b3db 126 }
ccli8 1:c3f10403b3db 127
csyang2 5:492ea7d38e59 128 void record(void) {
csyang2 5:492ea7d38e59 129 audio.read();
csyang2 5:492ea7d38e59 130
csyang2 5:492ea7d38e59 131 #if defined(TARGET_NUMAKER_PFM_NUC472)
csyang2 5:492ea7d38e59 132 audioBuf[writePtr] = audio.rxBuffer[0];
csyang2 5:492ea7d38e59 133 audioBuf[++writePtr] = audio.rxBuffer[1];
csyang2 5:492ea7d38e59 134 audioBuf[++writePtr] = audio.rxBuffer[2];
csyang2 5:492ea7d38e59 135 audioBuf[++writePtr] = audio.rxBuffer[3];
csyang2 5:492ea7d38e59 136 ++writePtr;
csyang2 5:492ea7d38e59 137 theta += 4;
csyang2 5:492ea7d38e59 138 if (writePtr > 4094) {
csyang2 5:492ea7d38e59 139 writePtr = 0;
csyang2 5:492ea7d38e59 140 }
csyang2 5:492ea7d38e59 141 #elif defined(TARGET_NUMAKER_PFM_M453)
csyang2 5:492ea7d38e59 142 audioBuf[writePtr] = audio.rxBuffer[0];
csyang2 5:492ea7d38e59 143 audioBuf[++writePtr] = audio.rxBuffer[1];
csyang2 5:492ea7d38e59 144 ++writePtr;
csyang2 5:492ea7d38e59 145 if (writePtr > 4094) {
csyang2 5:492ea7d38e59 146 writePtr = 0;
csyang2 5:492ea7d38e59 147 flag = 1;
csyang2 5:492ea7d38e59 148 }
csyang2 10:ca032f77d721 149 #elif defined(TARGET_NUMAKER_PFM_M487)
csyang2 10:ca032f77d721 150 audioBuf[writePtr] = audio.rxBuffer[0];
csyang2 10:ca032f77d721 151 //audioBuf[++writePtr] = audio.rxBuffer[1];
csyang2 10:ca032f77d721 152 //audioBuf[++writePtr] = audio.rxBuffer[2];
csyang2 10:ca032f77d721 153 //audioBuf[++writePtr] = audio.rxBuffer[3];
csyang2 10:ca032f77d721 154 //audioBuf[++writePtr] = audio.rxBuffer[4];
csyang2 10:ca032f77d721 155 //audioBuf[++writePtr] = audio.rxBuffer[5];
csyang2 10:ca032f77d721 156 //audioBuf[++writePtr] = audio.rxBuffer[6];
csyang2 10:ca032f77d721 157 //audioBuf[++writePtr] = audio.rxBuffer[7];
csyang2 10:ca032f77d721 158 ++writePtr;
csyang2 10:ca032f77d721 159 theta += 1;
csyang2 10:ca032f77d721 160 if (writePtr > 4094) {
csyang2 10:ca032f77d721 161 writePtr = 0;
csyang2 10:ca032f77d721 162 }
csyang2 10:ca032f77d721 163 #elif defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 164 /* note
csyang2 10:ca032f77d721 165 due to SRAM size limitation
csyang2 10:ca032f77d721 166 just demo loopback
csyang2 10:ca032f77d721 167 */
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 168 #elif defined(TARGET_NUMAKER_IOT_M487)
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 169 audioBuf[writePtr] = audio.rxBuffer[0];
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 170 //audioBuf[++writePtr] = audio.rxBuffer[1];
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 171 //audioBuf[++writePtr] = audio.rxBuffer[2];
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 172 //audioBuf[++writePtr] = audio.rxBuffer[3];
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 173 //audioBuf[++writePtr] = audio.rxBuffer[4];
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 174 //audioBuf[++writePtr] = audio.rxBuffer[5];
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 175 //audioBuf[++writePtr] = audio.rxBuffer[6];
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 176 //audioBuf[++writePtr] = audio.rxBuffer[7];
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 177 ++writePtr;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 178 theta += 1;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 179 if (writePtr > 4094) {
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 180 writePtr = 0;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 181 }
csyang2 10:ca032f77d721 182 #endif
csyang2 10:ca032f77d721 183 }
csyang2 10:ca032f77d721 184
csyang2 10:ca032f77d721 185 void loopback(void) {
csyang2 10:ca032f77d721 186 audio.readwrite();
csyang2 5:492ea7d38e59 187 }
csyang2 5:492ea7d38e59 188
ccli8 1:c3f10403b3db 189 void fillAudioBuf(void) {
ccli8 1:c3f10403b3db 190 #if defined(TARGET_NUMAKER_PFM_NUC472)
csyang2 6:66ba9ac474ac 191 while (!feof(fd)) {
ccli8 1:c3f10403b3db 192 if (theta < 4096) {
ccli8 1:c3f10403b3db 193 // read 2 integers
csyang2 6:66ba9ac474ac 194 fread(&audioBuf[writePtr], 4, 2, fd);
csyang2 10:ca032f77d721 195 audio.lock(); // protect shared variable
ccli8 1:c3f10403b3db 196 theta += 2;
csyang2 10:ca032f77d721 197 audio.unlock(); // protect shared variable
ccli8 1:c3f10403b3db 198 writePtr += 2;
ccli8 1:c3f10403b3db 199 writePtr &= 0xFFF;
ccli8 1:c3f10403b3db 200 }
ccli8 1:c3f10403b3db 201 }
ccli8 1:c3f10403b3db 202 #elif defined(TARGET_NUMAKER_PFM_M453)
csyang2 5:492ea7d38e59 203 while (1) {
csyang2 5:492ea7d38e59 204 Thread::wait(500);
csyang2 10:ca032f77d721 205 printf("fill\r\n");
csyang2 10:ca032f77d721 206 }
csyang2 10:ca032f77d721 207 #elif defined(TARGET_NUMAKER_PFM_M487)
csyang2 10:ca032f77d721 208 while (!feof(fd)) {
csyang2 10:ca032f77d721 209 if (theta < 4096) {
csyang2 10:ca032f77d721 210 // read 2 integers
csyang2 10:ca032f77d721 211 fread(&audioBuf[writePtr], 4, 2, fd);
csyang2 10:ca032f77d721 212 audio.lock(); // protect shared variable
csyang2 10:ca032f77d721 213 theta += 2;
csyang2 10:ca032f77d721 214 audio.unlock(); // protect shared variable
csyang2 10:ca032f77d721 215 writePtr += 2;
csyang2 10:ca032f77d721 216 writePtr &= 0xFFF;
csyang2 10:ca032f77d721 217 }
csyang2 10:ca032f77d721 218 }
csyang2 10:ca032f77d721 219 #elif defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 220 while (1) {
csyang2 10:ca032f77d721 221 Thread::wait(500);
csyang2 10:ca032f77d721 222 printf("fill\r\n");
csyang2 5:492ea7d38e59 223 }
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 224 #elif defined(TARGET_NUMAKER_IOT_M487)
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 225 while (!feof(fd)) {
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 226 if (theta < 4096) {
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 227 // read 2 integers
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 228 fread(&audioBuf[writePtr], 4, 2, fd);
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 229 audio.lock(); // protect shared variable
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 230 theta += 2;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 231 audio.unlock(); // protect shared variable
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 232 writePtr += 2;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 233 writePtr &= 0xFFF;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 234 }
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 235 }
csyang2 5:492ea7d38e59 236 #endif
csyang2 5:492ea7d38e59 237 }
csyang2 5:492ea7d38e59 238
csyang2 5:492ea7d38e59 239 void drainAudioBuf(void) {
csyang2 5:492ea7d38e59 240 #if defined(TARGET_NUMAKER_PFM_NUC472)
csyang2 5:492ea7d38e59 241 int i = 0;
csyang2 5:492ea7d38e59 242 while (1) {
csyang2 5:492ea7d38e59 243 if (theta > 512 ) {
csyang2 6:66ba9ac474ac 244 fwrite(&audioBuf[readPtr], 4, 128, fd);
csyang2 10:ca032f77d721 245 audio.lock(); // protect shared variable
csyang2 5:492ea7d38e59 246 theta -= 128;
csyang2 10:ca032f77d721 247 audio.unlock(); // protect shared variable
csyang2 5:492ea7d38e59 248 readPtr += 128;
csyang2 5:492ea7d38e59 249 if (readPtr > 4094)
csyang2 5:492ea7d38e59 250 readPtr = 0;
csyang2 5:492ea7d38e59 251
csyang2 5:492ea7d38e59 252 i += 512;
csyang2 5:492ea7d38e59 253 }
csyang2 5:492ea7d38e59 254
csyang2 5:492ea7d38e59 255 /* record about 10 seconds PCM */
csyang2 5:492ea7d38e59 256 if (i >= samplingRate*channelCount*sampleBitLength/8*10)
csyang2 5:492ea7d38e59 257 break;
csyang2 5:492ea7d38e59 258 }
csyang2 5:492ea7d38e59 259 #elif defined(TARGET_NUMAKER_PFM_M453)
csyang2 5:492ea7d38e59 260 while (flag == 0) {
csyang2 5:492ea7d38e59 261 Thread::wait(500);
csyang2 5:492ea7d38e59 262 }
csyang2 10:ca032f77d721 263 #elif defined(TARGET_NUMAKER_PFM_M487)
csyang2 10:ca032f77d721 264 int i = 0;
csyang2 10:ca032f77d721 265 while (1) {
csyang2 10:ca032f77d721 266 if (theta > 512 ) {
csyang2 10:ca032f77d721 267 fwrite(&audioBuf[readPtr], 4, 128, fd);
csyang2 10:ca032f77d721 268 audio.lock(); // protect shared variable
csyang2 10:ca032f77d721 269 theta -= 128;
csyang2 10:ca032f77d721 270 audio.unlock(); // protect shared variable
csyang2 10:ca032f77d721 271 readPtr += 128;
csyang2 10:ca032f77d721 272 if (readPtr > 4094)
csyang2 10:ca032f77d721 273 readPtr = 0;
csyang2 10:ca032f77d721 274
csyang2 10:ca032f77d721 275 i += 512;
csyang2 10:ca032f77d721 276 }
csyang2 10:ca032f77d721 277
csyang2 10:ca032f77d721 278 /* record about 10 seconds PCM */
csyang2 10:ca032f77d721 279 if (i >= samplingRate*channelCount*sampleBitLength/8*10)
csyang2 10:ca032f77d721 280 break;
csyang2 10:ca032f77d721 281 }
csyang2 10:ca032f77d721 282 #elif defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 283 while (flag == 0) {
csyang2 10:ca032f77d721 284 Thread::wait(500);
csyang2 10:ca032f77d721 285 }
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 286 #elif defined(TARGET_NUMAKER_IOT_M487)
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 287 int i = 0;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 288 while (1) {
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 289 if (theta > 512 ) {
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 290 fwrite(&audioBuf[readPtr], 4, 128, fd);
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 291 audio.lock(); // protect shared variable
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 292 theta -= 128;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 293 audio.unlock(); // protect shared variable
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 294 readPtr += 128;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 295 if (readPtr > 4094)
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 296 readPtr = 0;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 297
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 298 i += 512;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 299 }
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 300
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 301 /* record about 10 seconds PCM */
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 302 if (i >= samplingRate*channelCount*sampleBitLength/8*10)
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 303 break;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 304 }
csyang2 5:492ea7d38e59 305 #endif
csyang2 5:492ea7d38e59 306 }
csyang2 5:492ea7d38e59 307
csyang2 5:492ea7d38e59 308 void demo_record(void) {
csyang2 csyang2@nuvoton.com 17:65a16265cda2 309 /* Init global varibles first */
csyang2 csyang2@nuvoton.com 17:65a16265cda2 310 readPtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 311 writePtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 312 theta = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 313
csyang2 10:ca032f77d721 314 #if defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 315 for (int i = 0; i < 128; i++) {
csyang2 10:ca032f77d721 316 #else
csyang2 5:492ea7d38e59 317 for (int i = 0; i < 4096; i++) {
csyang2 10:ca032f77d721 318 #endif
csyang2 5:492ea7d38e59 319 audioBuf[i] = 0;
csyang2 5:492ea7d38e59 320 }
csyang2 5:492ea7d38e59 321
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 322 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 323 printf("Opening a new file test.pcm");
csyang2 6:66ba9ac474ac 324 fd = fopen("/fs/test.pcm", "w");
csyang2 6:66ba9ac474ac 325 errno_error(fd);
ccli8 1:c3f10403b3db 326 #endif
csyang2 5:492ea7d38e59 327
csyang2 5:492ea7d38e59 328 audio.attach(&record);
csyang2 5:492ea7d38e59 329 audio.format(samplingRate, channelCount, sampleBitLength);
csyang2 5:492ea7d38e59 330
csyang2 5:492ea7d38e59 331 printf("Start recording...\r\n");
csyang2 5:492ea7d38e59 332 audio.record();
csyang2 5:492ea7d38e59 333
csyang2 5:492ea7d38e59 334 drainAudioBuf();
csyang2 5:492ea7d38e59 335
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 336 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 337 fclose(fd);
csyang2 5:492ea7d38e59 338 #endif
csyang2 5:492ea7d38e59 339
csyang2 5:492ea7d38e59 340 printf("Stop recording.\r\n");
csyang2 5:492ea7d38e59 341 audio.stop();
csyang2 5:492ea7d38e59 342 }
csyang2 5:492ea7d38e59 343
csyang2 5:492ea7d38e59 344 void demo_play(void) {
csyang2 csyang2@nuvoton.com 17:65a16265cda2 345 /* Init global varibles first */
csyang2 csyang2@nuvoton.com 17:65a16265cda2 346 readPtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 347 writePtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 348 theta = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 349
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 350 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 351 printf("Opening file test.pcm read-only");
csyang2 6:66ba9ac474ac 352 fd = fopen("/fs/test.pcm", "r");
csyang2 10:ca032f77d721 353 //fd = fopen("/fs/82.wav", "r");
csyang2 6:66ba9ac474ac 354 errno_error(fd);
csyang2 5:492ea7d38e59 355
csyang2 10:ca032f77d721 356 //fseek(fd, 44, SEEK_SET);
csyang2 5:492ea7d38e59 357
csyang2 5:492ea7d38e59 358 for (int i = 0; i < 4096; i++) {
csyang2 5:492ea7d38e59 359 audioBuf[i] = 0;
csyang2 5:492ea7d38e59 360 }
csyang2 10:ca032f77d721 361 #else
csyang2 10:ca032f77d721 362 for (int i = 0; i < 8; i++) {
csyang2 10:ca032f77d721 363 audioBuf[i] = (sine1k[i * 4 + 3] << 24) | (sine1k[i * 4 + 2] << 16) | (sine1k[i * 4 + 1] << 8) | (sine1k[i * 4 + 0] << 0);
csyang2 10:ca032f77d721 364 //printf("0x%08X\r\n", audioBuf[i]);
csyang2 10:ca032f77d721 365 }
csyang2 5:492ea7d38e59 366 #endif
csyang2 5:492ea7d38e59 367
csyang2 5:492ea7d38e59 368 // disable headphone
csyang2 5:492ea7d38e59 369 hp_enable = 1;
csyang2 5:492ea7d38e59 370
csyang2 5:492ea7d38e59 371 audio.attach(&play);
csyang2 5:492ea7d38e59 372 audio.format(samplingRate, channelCount, sampleBitLength);
csyang2 5:492ea7d38e59 373
csyang2 5:492ea7d38e59 374 // enable headphone
csyang2 10:ca032f77d721 375 hp_enable = 0;
csyang2 5:492ea7d38e59 376
csyang2 5:492ea7d38e59 377 printf("Start playing...\r\n");
csyang2 5:492ea7d38e59 378 audio.start();
csyang2 5:492ea7d38e59 379
csyang2 5:492ea7d38e59 380 fillAudioBuf();
csyang2 5:492ea7d38e59 381
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 382 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 383 fclose(fd);
csyang2 6:66ba9ac474ac 384 #endif
csyang2 6:66ba9ac474ac 385
csyang2 5:492ea7d38e59 386 printf("Stop playing.\r\n");
csyang2 5:492ea7d38e59 387 audio.stop();
csyang2 5:492ea7d38e59 388
csyang2 5:492ea7d38e59 389 // disable headphone
csyang2 5:492ea7d38e59 390 hp_enable = 1;
ccli8 1:c3f10403b3db 391 }
ccli8 1:c3f10403b3db 392
csyang2 10:ca032f77d721 393 void demo_loopback(void) {
csyang2 csyang2@nuvoton.com 17:65a16265cda2 394 /* Init global varibles first */
csyang2 csyang2@nuvoton.com 17:65a16265cda2 395 readPtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 396 writePtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 397 theta = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 398
csyang2 10:ca032f77d721 399 // disable headphone
csyang2 10:ca032f77d721 400 hp_enable = 1;
csyang2 10:ca032f77d721 401
csyang2 10:ca032f77d721 402 audio.attach(&loopback);
csyang2 10:ca032f77d721 403 audio.format(samplingRate, channelCount, sampleBitLength);
csyang2 10:ca032f77d721 404
csyang2 10:ca032f77d721 405 // enable headphone
csyang2 10:ca032f77d721 406 hp_enable = 0;
csyang2 10:ca032f77d721 407
csyang2 10:ca032f77d721 408 printf("Start loopback...\r\n");
csyang2 10:ca032f77d721 409 audio.loopback();
csyang2 10:ca032f77d721 410
csyang2 10:ca032f77d721 411 while (1) {
csyang2 10:ca032f77d721 412 Thread::wait(500);
csyang2 10:ca032f77d721 413 printf("loopback\r\n");
csyang2 10:ca032f77d721 414 }
csyang2 10:ca032f77d721 415
csyang2 10:ca032f77d721 416 printf("Stop loopback.\r\n");
csyang2 10:ca032f77d721 417 audio.stop();
csyang2 10:ca032f77d721 418
csyang2 10:ca032f77d721 419 // disable headphone
csyang2 10:ca032f77d721 420 hp_enable = 1;
csyang2 10:ca032f77d721 421 }
csyang2 10:ca032f77d721 422
ccli8 1:c3f10403b3db 423 int main(void) {
ccli8 1:c3f10403b3db 424 led = 1;
ccli8 1:c3f10403b3db 425
ccli8 1:c3f10403b3db 426 button.rise(&flip);
ccli8 1:c3f10403b3db 427
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 428 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 429 int error = 0;
csyang2 6:66ba9ac474ac 430
csyang2 6:66ba9ac474ac 431 printf("Mounting the filesystem on \"/fs\" ");
csyang2 6:66ba9ac474ac 432 error = fs.mount(&bd);
csyang2 6:66ba9ac474ac 433 return_error(error);
csyang2 6:66ba9ac474ac 434 #endif
csyang2 6:66ba9ac474ac 435
csyang2 10:ca032f77d721 436 //demo_record();
ccli8 1:c3f10403b3db 437
csyang2 10:ca032f77d721 438 //demo_play();
csyang2 10:ca032f77d721 439
csyang2 10:ca032f77d721 440 demo_loopback();
ccli8 1:c3f10403b3db 441
ccli8 1:c3f10403b3db 442 led = 0;
ccli8 1:c3f10403b3db 443 }