NuMaker audio playback

Committer:
SHLIU1@OANBE02333.nuvoton.com
Date:
Thu Feb 25 16:19:36 2021 +0800
Revision:
20:df54b4c86862
Parent:
17:65a16265cda2
Support the both V5.X and V6.X for mbed-os

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) {
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 204 #if MBED_MAJOR_VERSION >= 6
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 205 ThisThread::sleep_for(500);
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 206 #else
csyang2 5:492ea7d38e59 207 Thread::wait(500);
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 208 #endif
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 209
csyang2 10:ca032f77d721 210 printf("fill\r\n");
csyang2 10:ca032f77d721 211 }
csyang2 10:ca032f77d721 212 #elif defined(TARGET_NUMAKER_PFM_M487)
csyang2 10:ca032f77d721 213 while (!feof(fd)) {
csyang2 10:ca032f77d721 214 if (theta < 4096) {
csyang2 10:ca032f77d721 215 // read 2 integers
csyang2 10:ca032f77d721 216 fread(&audioBuf[writePtr], 4, 2, fd);
csyang2 10:ca032f77d721 217 audio.lock(); // protect shared variable
csyang2 10:ca032f77d721 218 theta += 2;
csyang2 10:ca032f77d721 219 audio.unlock(); // protect shared variable
csyang2 10:ca032f77d721 220 writePtr += 2;
csyang2 10:ca032f77d721 221 writePtr &= 0xFFF;
csyang2 10:ca032f77d721 222 }
csyang2 10:ca032f77d721 223 }
csyang2 10:ca032f77d721 224 #elif defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 225 while (1) {
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 226 #if MBED_MAJOR_VERSION >= 6
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 227 ThisThread::sleep_for(500);
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 228 #else
csyang2 10:ca032f77d721 229 Thread::wait(500);
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 230 #endif
csyang2 10:ca032f77d721 231 printf("fill\r\n");
csyang2 5:492ea7d38e59 232 }
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 233 #elif defined(TARGET_NUMAKER_IOT_M487)
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 234 while (!feof(fd)) {
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 235 if (theta < 4096) {
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 236 // read 2 integers
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 237 fread(&audioBuf[writePtr], 4, 2, fd);
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 238 audio.lock(); // protect shared variable
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 239 theta += 2;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 240 audio.unlock(); // protect shared variable
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 241 writePtr += 2;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 242 writePtr &= 0xFFF;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 243 }
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 244 }
csyang2 5:492ea7d38e59 245 #endif
csyang2 5:492ea7d38e59 246 }
csyang2 5:492ea7d38e59 247
csyang2 5:492ea7d38e59 248 void drainAudioBuf(void) {
csyang2 5:492ea7d38e59 249 #if defined(TARGET_NUMAKER_PFM_NUC472)
csyang2 5:492ea7d38e59 250 int i = 0;
csyang2 5:492ea7d38e59 251 while (1) {
csyang2 5:492ea7d38e59 252 if (theta > 512 ) {
csyang2 6:66ba9ac474ac 253 fwrite(&audioBuf[readPtr], 4, 128, fd);
csyang2 10:ca032f77d721 254 audio.lock(); // protect shared variable
csyang2 5:492ea7d38e59 255 theta -= 128;
csyang2 10:ca032f77d721 256 audio.unlock(); // protect shared variable
csyang2 5:492ea7d38e59 257 readPtr += 128;
csyang2 5:492ea7d38e59 258 if (readPtr > 4094)
csyang2 5:492ea7d38e59 259 readPtr = 0;
csyang2 5:492ea7d38e59 260
csyang2 5:492ea7d38e59 261 i += 512;
csyang2 5:492ea7d38e59 262 }
csyang2 5:492ea7d38e59 263
csyang2 5:492ea7d38e59 264 /* record about 10 seconds PCM */
csyang2 5:492ea7d38e59 265 if (i >= samplingRate*channelCount*sampleBitLength/8*10)
csyang2 5:492ea7d38e59 266 break;
csyang2 5:492ea7d38e59 267 }
csyang2 5:492ea7d38e59 268 #elif defined(TARGET_NUMAKER_PFM_M453)
csyang2 5:492ea7d38e59 269 while (flag == 0) {
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 270 #if MBED_MAJOR_VERSION >= 6
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 271 ThisThread::sleep_for(500);
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 272 #else
csyang2 5:492ea7d38e59 273 Thread::wait(500);
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 274 #endif
csyang2 5:492ea7d38e59 275 }
csyang2 10:ca032f77d721 276 #elif defined(TARGET_NUMAKER_PFM_M487)
csyang2 10:ca032f77d721 277 int i = 0;
csyang2 10:ca032f77d721 278 while (1) {
csyang2 10:ca032f77d721 279 if (theta > 512 ) {
csyang2 10:ca032f77d721 280 fwrite(&audioBuf[readPtr], 4, 128, fd);
csyang2 10:ca032f77d721 281 audio.lock(); // protect shared variable
csyang2 10:ca032f77d721 282 theta -= 128;
csyang2 10:ca032f77d721 283 audio.unlock(); // protect shared variable
csyang2 10:ca032f77d721 284 readPtr += 128;
csyang2 10:ca032f77d721 285 if (readPtr > 4094)
csyang2 10:ca032f77d721 286 readPtr = 0;
csyang2 10:ca032f77d721 287
csyang2 10:ca032f77d721 288 i += 512;
csyang2 10:ca032f77d721 289 }
csyang2 10:ca032f77d721 290
csyang2 10:ca032f77d721 291 /* record about 10 seconds PCM */
csyang2 10:ca032f77d721 292 if (i >= samplingRate*channelCount*sampleBitLength/8*10)
csyang2 10:ca032f77d721 293 break;
csyang2 10:ca032f77d721 294 }
csyang2 10:ca032f77d721 295 #elif defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 296 while (flag == 0) {
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 297 #if MBED_MAJOR_VERSION >= 6
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 298 ThisThread::sleep_for(500);
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 299 #else
csyang2 10:ca032f77d721 300 Thread::wait(500);
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 301 #endif
csyang2 10:ca032f77d721 302 }
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 303 #elif defined(TARGET_NUMAKER_IOT_M487)
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 304 int i = 0;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 305 while (1) {
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 306 if (theta > 512 ) {
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 307 fwrite(&audioBuf[readPtr], 4, 128, fd);
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 308 audio.lock(); // protect shared variable
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 309 theta -= 128;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 310 audio.unlock(); // protect shared variable
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 311 readPtr += 128;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 312 if (readPtr > 4094)
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 313 readPtr = 0;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 314
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 315 i += 512;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 316 }
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 317
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 318 /* record about 10 seconds PCM */
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 319 if (i >= samplingRate*channelCount*sampleBitLength/8*10)
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 320 break;
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 321 }
csyang2 5:492ea7d38e59 322 #endif
csyang2 5:492ea7d38e59 323 }
csyang2 5:492ea7d38e59 324
csyang2 5:492ea7d38e59 325 void demo_record(void) {
csyang2 csyang2@nuvoton.com 17:65a16265cda2 326 /* Init global varibles first */
csyang2 csyang2@nuvoton.com 17:65a16265cda2 327 readPtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 328 writePtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 329 theta = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 330
csyang2 10:ca032f77d721 331 #if defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 332 for (int i = 0; i < 128; i++) {
csyang2 10:ca032f77d721 333 #else
csyang2 5:492ea7d38e59 334 for (int i = 0; i < 4096; i++) {
csyang2 10:ca032f77d721 335 #endif
csyang2 5:492ea7d38e59 336 audioBuf[i] = 0;
csyang2 5:492ea7d38e59 337 }
csyang2 5:492ea7d38e59 338
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 339 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 340 printf("Opening a new file test.pcm");
csyang2 6:66ba9ac474ac 341 fd = fopen("/fs/test.pcm", "w");
csyang2 6:66ba9ac474ac 342 errno_error(fd);
ccli8 1:c3f10403b3db 343 #endif
csyang2 5:492ea7d38e59 344
csyang2 5:492ea7d38e59 345 audio.attach(&record);
csyang2 5:492ea7d38e59 346 audio.format(samplingRate, channelCount, sampleBitLength);
csyang2 5:492ea7d38e59 347
csyang2 5:492ea7d38e59 348 printf("Start recording...\r\n");
csyang2 5:492ea7d38e59 349 audio.record();
csyang2 5:492ea7d38e59 350
csyang2 5:492ea7d38e59 351 drainAudioBuf();
csyang2 5:492ea7d38e59 352
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 353 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 354 fclose(fd);
csyang2 5:492ea7d38e59 355 #endif
csyang2 5:492ea7d38e59 356
csyang2 5:492ea7d38e59 357 printf("Stop recording.\r\n");
csyang2 5:492ea7d38e59 358 audio.stop();
csyang2 5:492ea7d38e59 359 }
csyang2 5:492ea7d38e59 360
csyang2 5:492ea7d38e59 361 void demo_play(void) {
csyang2 csyang2@nuvoton.com 17:65a16265cda2 362 /* Init global varibles first */
csyang2 csyang2@nuvoton.com 17:65a16265cda2 363 readPtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 364 writePtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 365 theta = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 366
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 367 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 368 printf("Opening file test.pcm read-only");
csyang2 6:66ba9ac474ac 369 fd = fopen("/fs/test.pcm", "r");
csyang2 10:ca032f77d721 370 //fd = fopen("/fs/82.wav", "r");
csyang2 6:66ba9ac474ac 371 errno_error(fd);
csyang2 5:492ea7d38e59 372
csyang2 10:ca032f77d721 373 //fseek(fd, 44, SEEK_SET);
csyang2 5:492ea7d38e59 374
csyang2 5:492ea7d38e59 375 for (int i = 0; i < 4096; i++) {
csyang2 5:492ea7d38e59 376 audioBuf[i] = 0;
csyang2 5:492ea7d38e59 377 }
csyang2 10:ca032f77d721 378 #else
csyang2 10:ca032f77d721 379 for (int i = 0; i < 8; i++) {
csyang2 10:ca032f77d721 380 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 381 //printf("0x%08X\r\n", audioBuf[i]);
csyang2 10:ca032f77d721 382 }
csyang2 5:492ea7d38e59 383 #endif
csyang2 5:492ea7d38e59 384
csyang2 5:492ea7d38e59 385 // disable headphone
csyang2 5:492ea7d38e59 386 hp_enable = 1;
csyang2 5:492ea7d38e59 387
csyang2 5:492ea7d38e59 388 audio.attach(&play);
csyang2 5:492ea7d38e59 389 audio.format(samplingRate, channelCount, sampleBitLength);
csyang2 5:492ea7d38e59 390
csyang2 5:492ea7d38e59 391 // enable headphone
csyang2 10:ca032f77d721 392 hp_enable = 0;
csyang2 5:492ea7d38e59 393
csyang2 5:492ea7d38e59 394 printf("Start playing...\r\n");
csyang2 5:492ea7d38e59 395 audio.start();
csyang2 5:492ea7d38e59 396
csyang2 5:492ea7d38e59 397 fillAudioBuf();
csyang2 5:492ea7d38e59 398
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 399 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 400 fclose(fd);
csyang2 6:66ba9ac474ac 401 #endif
csyang2 6:66ba9ac474ac 402
csyang2 5:492ea7d38e59 403 printf("Stop playing.\r\n");
csyang2 5:492ea7d38e59 404 audio.stop();
csyang2 5:492ea7d38e59 405
csyang2 5:492ea7d38e59 406 // disable headphone
csyang2 5:492ea7d38e59 407 hp_enable = 1;
ccli8 1:c3f10403b3db 408 }
ccli8 1:c3f10403b3db 409
csyang2 10:ca032f77d721 410 void demo_loopback(void) {
csyang2 csyang2@nuvoton.com 17:65a16265cda2 411 /* Init global varibles first */
csyang2 csyang2@nuvoton.com 17:65a16265cda2 412 readPtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 413 writePtr = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 414 theta = 0;
csyang2 csyang2@nuvoton.com 17:65a16265cda2 415
csyang2 10:ca032f77d721 416 // disable headphone
csyang2 10:ca032f77d721 417 hp_enable = 1;
csyang2 10:ca032f77d721 418
csyang2 10:ca032f77d721 419 audio.attach(&loopback);
csyang2 10:ca032f77d721 420 audio.format(samplingRate, channelCount, sampleBitLength);
csyang2 10:ca032f77d721 421
csyang2 10:ca032f77d721 422 // enable headphone
csyang2 10:ca032f77d721 423 hp_enable = 0;
csyang2 10:ca032f77d721 424
csyang2 10:ca032f77d721 425 printf("Start loopback...\r\n");
csyang2 10:ca032f77d721 426 audio.loopback();
csyang2 10:ca032f77d721 427
csyang2 10:ca032f77d721 428 while (1) {
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 429 #if MBED_MAJOR_VERSION >= 6
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 430 ThisThread::sleep_for(500);
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 431 #else
csyang2 10:ca032f77d721 432 Thread::wait(500);
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 433 #endif
csyang2 10:ca032f77d721 434 printf("loopback\r\n");
csyang2 10:ca032f77d721 435 }
csyang2 10:ca032f77d721 436
csyang2 10:ca032f77d721 437 printf("Stop loopback.\r\n");
csyang2 10:ca032f77d721 438 audio.stop();
csyang2 10:ca032f77d721 439
csyang2 10:ca032f77d721 440 // disable headphone
csyang2 10:ca032f77d721 441 hp_enable = 1;
csyang2 10:ca032f77d721 442 }
csyang2 10:ca032f77d721 443
ccli8 1:c3f10403b3db 444 int main(void) {
ccli8 1:c3f10403b3db 445 led = 1;
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 446 #ifdef MBED_MAJOR_VERSION
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 447 printf("Mbed OS version %d.%d.%d\r\n\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
SHLIU1@OANBE02333.nuvoton.com 20:df54b4c86862 448 #endif
ccli8 1:c3f10403b3db 449 button.rise(&flip);
ccli8 1:c3f10403b3db 450
csyang2 csyang2@nuvoton.com 15:8527899eb9d3 451 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
csyang2 6:66ba9ac474ac 452 int error = 0;
csyang2 6:66ba9ac474ac 453
csyang2 6:66ba9ac474ac 454 printf("Mounting the filesystem on \"/fs\" ");
csyang2 6:66ba9ac474ac 455 error = fs.mount(&bd);
csyang2 6:66ba9ac474ac 456 return_error(error);
csyang2 6:66ba9ac474ac 457 #endif
csyang2 6:66ba9ac474ac 458
csyang2 10:ca032f77d721 459 //demo_record();
ccli8 1:c3f10403b3db 460
csyang2 10:ca032f77d721 461 //demo_play();
csyang2 10:ca032f77d721 462
csyang2 10:ca032f77d721 463 demo_loopback();
ccli8 1:c3f10403b3db 464
ccli8 1:c3f10403b3db 465 led = 0;
ccli8 1:c3f10403b3db 466 }