NuMaker audio playback

Committer:
csyang2
Date:
Tue Apr 03 14:11:03 2018 +0800
Revision:
12:6a21e1be7e7d
Parent:
10:ca032f77d721
Child:
15:8527899eb9d3
Add PE_13 for headphone enable

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ccli8 1:c3f10403b3db 1 #include "mbed.h"
ccli8 1:c3f10403b3db 2
csyang2 10:ca032f77d721 3 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_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
ccli8 1:c3f10403b3db 38 #endif
Chuck Young 4:0b5c342628ff 39
ccli8 1:c3f10403b3db 40 InterruptIn button(SW2); // button SW2
ccli8 1:c3f10403b3db 41 DigitalOut led(LED1); // flashing LED1(rgbled1)
ccli8 1:c3f10403b3db 42
csyang2 10:ca032f77d721 43 #if defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 44 int audioBuf[128];
csyang2 10:ca032f77d721 45 #else
csyang2 5:492ea7d38e59 46 int audioBuf[4096];
csyang2 10:ca032f77d721 47 #endif
csyang2 5:492ea7d38e59 48
ccli8 1:c3f10403b3db 49 int readPtr = 0;
csyang2 5:492ea7d38e59 50 int writePtr = 0;
csyang2 5:492ea7d38e59 51
csyang2 5:492ea7d38e59 52 int samplingRate = 8000;
csyang2 10:ca032f77d721 53 char channelCount = 2;
csyang2 5:492ea7d38e59 54 char sampleBitLength = 16;
ccli8 1:c3f10403b3db 55
csyang2 10:ca032f77d721 56 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
csyang2 6:66ba9ac474ac 57 FILE *fd;
ccli8 1:c3f10403b3db 58
csyang2 5:492ea7d38e59 59 int theta = 0;
ccli8 1:c3f10403b3db 60
csyang2 6:66ba9ac474ac 61 void return_error(int ret_val) {
csyang2 6:66ba9ac474ac 62 if (ret_val)
csyang2 6:66ba9ac474ac 63 printf("Failure. %d\r\n", ret_val);
csyang2 6:66ba9ac474ac 64 else
csyang2 6:66ba9ac474ac 65 printf("done.\r\n");
csyang2 6:66ba9ac474ac 66 }
csyang2 6:66ba9ac474ac 67
csyang2 6:66ba9ac474ac 68 void errno_error(void* ret_val) {
csyang2 6:66ba9ac474ac 69 if (ret_val == NULL)
csyang2 6:66ba9ac474ac 70 printf(" Failure. %d \r\n", errno);
csyang2 6:66ba9ac474ac 71 else
csyang2 6:66ba9ac474ac 72 printf(" done.\r\n");
csyang2 6:66ba9ac474ac 73 }
csyang2 6:66ba9ac474ac 74
csyang2 10:ca032f77d721 75 #elif defined(TARGET_NUMAKER_PFM_M453) || defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 76 // 1k sine wave@sampling rate 8kHz stereo 16-bit
csyang2 10:ca032f77d721 77 const char sine1k[] = {
csyang2 10:ca032f77d721 78 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x50, 0x0B, 0x50, 0x0B, 0x00, 0x08, 0x00, 0x08,
csyang2 10:ca032f77d721 79 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xF8, 0xB0, 0xF4, 0xB0, 0xF4, 0x00, 0xF8, 0x00, 0xF8
ccli8 1:c3f10403b3db 80 };
csyang2 5:492ea7d38e59 81
csyang2 5:492ea7d38e59 82 int flag = 0;
ccli8 1:c3f10403b3db 83 #endif
ccli8 1:c3f10403b3db 84
ccli8 1:c3f10403b3db 85 void flip(void) {
ccli8 1:c3f10403b3db 86 led = !led;
ccli8 1:c3f10403b3db 87 }
ccli8 1:c3f10403b3db 88
csyang2 5:492ea7d38e59 89 void play(void) {
ccli8 1:c3f10403b3db 90 #if defined(TARGET_NUMAKER_PFM_NUC472)
ccli8 1:c3f10403b3db 91 audio.write(audioBuf, readPtr, 4);
ccli8 1:c3f10403b3db 92 readPtr += 4;
ccli8 1:c3f10403b3db 93 readPtr &= 0xFFF;
ccli8 1:c3f10403b3db 94 theta -= 4;
ccli8 1:c3f10403b3db 95 #elif defined(TARGET_NUMAKER_PFM_M453)
csyang2 5:492ea7d38e59 96 if (flag == 0) {
csyang2 10:ca032f77d721 97 audio.write((int *)sine1k, readPtr, 1);
csyang2 10:ca032f77d721 98 readPtr += 1;
csyang2 10:ca032f77d721 99 readPtr &= 0x7; // sine1k / 4 - 1
csyang2 5:492ea7d38e59 100 } else {
csyang2 10:ca032f77d721 101 audio.write(audioBuf, readPtr, 1);
csyang2 10:ca032f77d721 102 readPtr += 1;
csyang2 5:492ea7d38e59 103 readPtr &= 0xFFF;
csyang2 5:492ea7d38e59 104 }
csyang2 10:ca032f77d721 105 #elif defined(TARGET_NUMAKER_PFM_M487)
csyang2 10:ca032f77d721 106 audio.write(audioBuf, readPtr, 4);
csyang2 10:ca032f77d721 107 readPtr += 4;
csyang2 10:ca032f77d721 108 readPtr &= 0xFFF;
csyang2 10:ca032f77d721 109 theta -= 4;
csyang2 10:ca032f77d721 110 #elif defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 111 audio.write((int *)audioBuf, readPtr, 1);
csyang2 10:ca032f77d721 112 readPtr += 1;
csyang2 10:ca032f77d721 113 readPtr &= 0x7; // sine1k / 4 - 1
ccli8 1:c3f10403b3db 114 #endif
ccli8 1:c3f10403b3db 115 }
ccli8 1:c3f10403b3db 116
csyang2 5:492ea7d38e59 117 void record(void) {
csyang2 5:492ea7d38e59 118 audio.read();
csyang2 5:492ea7d38e59 119
csyang2 5:492ea7d38e59 120 #if defined(TARGET_NUMAKER_PFM_NUC472)
csyang2 5:492ea7d38e59 121 audioBuf[writePtr] = audio.rxBuffer[0];
csyang2 5:492ea7d38e59 122 audioBuf[++writePtr] = audio.rxBuffer[1];
csyang2 5:492ea7d38e59 123 audioBuf[++writePtr] = audio.rxBuffer[2];
csyang2 5:492ea7d38e59 124 audioBuf[++writePtr] = audio.rxBuffer[3];
csyang2 5:492ea7d38e59 125 ++writePtr;
csyang2 5:492ea7d38e59 126 theta += 4;
csyang2 5:492ea7d38e59 127 if (writePtr > 4094) {
csyang2 5:492ea7d38e59 128 writePtr = 0;
csyang2 5:492ea7d38e59 129 }
csyang2 5:492ea7d38e59 130 #elif defined(TARGET_NUMAKER_PFM_M453)
csyang2 5:492ea7d38e59 131 audioBuf[writePtr] = audio.rxBuffer[0];
csyang2 5:492ea7d38e59 132 audioBuf[++writePtr] = audio.rxBuffer[1];
csyang2 5:492ea7d38e59 133 ++writePtr;
csyang2 5:492ea7d38e59 134 if (writePtr > 4094) {
csyang2 5:492ea7d38e59 135 writePtr = 0;
csyang2 5:492ea7d38e59 136 flag = 1;
csyang2 5:492ea7d38e59 137 }
csyang2 10:ca032f77d721 138 #elif defined(TARGET_NUMAKER_PFM_M487)
csyang2 10:ca032f77d721 139 audioBuf[writePtr] = audio.rxBuffer[0];
csyang2 10:ca032f77d721 140 //audioBuf[++writePtr] = audio.rxBuffer[1];
csyang2 10:ca032f77d721 141 //audioBuf[++writePtr] = audio.rxBuffer[2];
csyang2 10:ca032f77d721 142 //audioBuf[++writePtr] = audio.rxBuffer[3];
csyang2 10:ca032f77d721 143 //audioBuf[++writePtr] = audio.rxBuffer[4];
csyang2 10:ca032f77d721 144 //audioBuf[++writePtr] = audio.rxBuffer[5];
csyang2 10:ca032f77d721 145 //audioBuf[++writePtr] = audio.rxBuffer[6];
csyang2 10:ca032f77d721 146 //audioBuf[++writePtr] = audio.rxBuffer[7];
csyang2 10:ca032f77d721 147 ++writePtr;
csyang2 10:ca032f77d721 148 theta += 1;
csyang2 10:ca032f77d721 149 if (writePtr > 4094) {
csyang2 10:ca032f77d721 150 writePtr = 0;
csyang2 10:ca032f77d721 151 }
csyang2 10:ca032f77d721 152 #elif defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 153 /* note
csyang2 10:ca032f77d721 154 due to SRAM size limitation
csyang2 10:ca032f77d721 155 just demo loopback
csyang2 10:ca032f77d721 156 */
csyang2 10:ca032f77d721 157 #endif
csyang2 10:ca032f77d721 158 }
csyang2 10:ca032f77d721 159
csyang2 10:ca032f77d721 160 void loopback(void) {
csyang2 10:ca032f77d721 161 audio.readwrite();
csyang2 5:492ea7d38e59 162 }
csyang2 5:492ea7d38e59 163
ccli8 1:c3f10403b3db 164 void fillAudioBuf(void) {
ccli8 1:c3f10403b3db 165 #if defined(TARGET_NUMAKER_PFM_NUC472)
csyang2 6:66ba9ac474ac 166 while (!feof(fd)) {
ccli8 1:c3f10403b3db 167 if (theta < 4096) {
ccli8 1:c3f10403b3db 168 // read 2 integers
csyang2 6:66ba9ac474ac 169 fread(&audioBuf[writePtr], 4, 2, fd);
csyang2 10:ca032f77d721 170 audio.lock(); // protect shared variable
ccli8 1:c3f10403b3db 171 theta += 2;
csyang2 10:ca032f77d721 172 audio.unlock(); // protect shared variable
ccli8 1:c3f10403b3db 173 writePtr += 2;
ccli8 1:c3f10403b3db 174 writePtr &= 0xFFF;
ccli8 1:c3f10403b3db 175 }
ccli8 1:c3f10403b3db 176 }
ccli8 1:c3f10403b3db 177 #elif defined(TARGET_NUMAKER_PFM_M453)
csyang2 5:492ea7d38e59 178 while (1) {
csyang2 5:492ea7d38e59 179 Thread::wait(500);
csyang2 10:ca032f77d721 180 printf("fill\r\n");
csyang2 10:ca032f77d721 181 }
csyang2 10:ca032f77d721 182 #elif defined(TARGET_NUMAKER_PFM_M487)
csyang2 10:ca032f77d721 183 while (!feof(fd)) {
csyang2 10:ca032f77d721 184 if (theta < 4096) {
csyang2 10:ca032f77d721 185 // read 2 integers
csyang2 10:ca032f77d721 186 fread(&audioBuf[writePtr], 4, 2, fd);
csyang2 10:ca032f77d721 187 audio.lock(); // protect shared variable
csyang2 10:ca032f77d721 188 theta += 2;
csyang2 10:ca032f77d721 189 audio.unlock(); // protect shared variable
csyang2 10:ca032f77d721 190 writePtr += 2;
csyang2 10:ca032f77d721 191 writePtr &= 0xFFF;
csyang2 10:ca032f77d721 192 }
csyang2 10:ca032f77d721 193 }
csyang2 10:ca032f77d721 194 #elif defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 195 while (1) {
csyang2 10:ca032f77d721 196 Thread::wait(500);
csyang2 10:ca032f77d721 197 printf("fill\r\n");
csyang2 5:492ea7d38e59 198 }
csyang2 5:492ea7d38e59 199 #endif
csyang2 5:492ea7d38e59 200 }
csyang2 5:492ea7d38e59 201
csyang2 5:492ea7d38e59 202 void drainAudioBuf(void) {
csyang2 5:492ea7d38e59 203 #if defined(TARGET_NUMAKER_PFM_NUC472)
csyang2 5:492ea7d38e59 204 int i = 0;
csyang2 5:492ea7d38e59 205 while (1) {
csyang2 5:492ea7d38e59 206 if (theta > 512 ) {
csyang2 6:66ba9ac474ac 207 fwrite(&audioBuf[readPtr], 4, 128, fd);
csyang2 10:ca032f77d721 208 audio.lock(); // protect shared variable
csyang2 5:492ea7d38e59 209 theta -= 128;
csyang2 10:ca032f77d721 210 audio.unlock(); // protect shared variable
csyang2 5:492ea7d38e59 211 readPtr += 128;
csyang2 5:492ea7d38e59 212 if (readPtr > 4094)
csyang2 5:492ea7d38e59 213 readPtr = 0;
csyang2 5:492ea7d38e59 214
csyang2 5:492ea7d38e59 215 i += 512;
csyang2 5:492ea7d38e59 216 }
csyang2 5:492ea7d38e59 217
csyang2 5:492ea7d38e59 218 /* record about 10 seconds PCM */
csyang2 5:492ea7d38e59 219 if (i >= samplingRate*channelCount*sampleBitLength/8*10)
csyang2 5:492ea7d38e59 220 break;
csyang2 5:492ea7d38e59 221 }
csyang2 5:492ea7d38e59 222 #elif defined(TARGET_NUMAKER_PFM_M453)
csyang2 5:492ea7d38e59 223 while (flag == 0) {
csyang2 5:492ea7d38e59 224 Thread::wait(500);
csyang2 5:492ea7d38e59 225 }
csyang2 10:ca032f77d721 226 #elif defined(TARGET_NUMAKER_PFM_M487)
csyang2 10:ca032f77d721 227 int i = 0;
csyang2 10:ca032f77d721 228 while (1) {
csyang2 10:ca032f77d721 229 if (theta > 512 ) {
csyang2 10:ca032f77d721 230 fwrite(&audioBuf[readPtr], 4, 128, fd);
csyang2 10:ca032f77d721 231 audio.lock(); // protect shared variable
csyang2 10:ca032f77d721 232 theta -= 128;
csyang2 10:ca032f77d721 233 audio.unlock(); // protect shared variable
csyang2 10:ca032f77d721 234 readPtr += 128;
csyang2 10:ca032f77d721 235 if (readPtr > 4094)
csyang2 10:ca032f77d721 236 readPtr = 0;
csyang2 10:ca032f77d721 237
csyang2 10:ca032f77d721 238 i += 512;
csyang2 10:ca032f77d721 239 }
csyang2 10:ca032f77d721 240
csyang2 10:ca032f77d721 241 /* record about 10 seconds PCM */
csyang2 10:ca032f77d721 242 if (i >= samplingRate*channelCount*sampleBitLength/8*10)
csyang2 10:ca032f77d721 243 break;
csyang2 10:ca032f77d721 244 }
csyang2 10:ca032f77d721 245 #elif defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 246 while (flag == 0) {
csyang2 10:ca032f77d721 247 Thread::wait(500);
csyang2 10:ca032f77d721 248 }
csyang2 5:492ea7d38e59 249 #endif
csyang2 5:492ea7d38e59 250 }
csyang2 5:492ea7d38e59 251
csyang2 5:492ea7d38e59 252 void demo_record(void) {
csyang2 10:ca032f77d721 253 #if defined(TARGET_NUMAKER_PFM_NANO130)
csyang2 10:ca032f77d721 254 for (int i = 0; i < 128; i++) {
csyang2 10:ca032f77d721 255 #else
csyang2 5:492ea7d38e59 256 for (int i = 0; i < 4096; i++) {
csyang2 10:ca032f77d721 257 #endif
csyang2 5:492ea7d38e59 258 audioBuf[i] = 0;
csyang2 5:492ea7d38e59 259 }
csyang2 5:492ea7d38e59 260
csyang2 10:ca032f77d721 261 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
csyang2 6:66ba9ac474ac 262 printf("Opening a new file test.pcm");
csyang2 6:66ba9ac474ac 263 fd = fopen("/fs/test.pcm", "w");
csyang2 6:66ba9ac474ac 264 errno_error(fd);
ccli8 1:c3f10403b3db 265 #endif
csyang2 5:492ea7d38e59 266
csyang2 5:492ea7d38e59 267 audio.attach(&record);
csyang2 5:492ea7d38e59 268 audio.format(samplingRate, channelCount, sampleBitLength);
csyang2 5:492ea7d38e59 269
csyang2 5:492ea7d38e59 270 printf("Start recording...\r\n");
csyang2 5:492ea7d38e59 271 audio.record();
csyang2 5:492ea7d38e59 272
csyang2 5:492ea7d38e59 273 drainAudioBuf();
csyang2 5:492ea7d38e59 274
csyang2 10:ca032f77d721 275 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
csyang2 6:66ba9ac474ac 276 fclose(fd);
csyang2 5:492ea7d38e59 277 #endif
csyang2 5:492ea7d38e59 278
csyang2 5:492ea7d38e59 279 printf("Stop recording.\r\n");
csyang2 5:492ea7d38e59 280 audio.stop();
csyang2 5:492ea7d38e59 281 }
csyang2 5:492ea7d38e59 282
csyang2 5:492ea7d38e59 283 void demo_play(void) {
csyang2 10:ca032f77d721 284 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
csyang2 6:66ba9ac474ac 285 printf("Opening file test.pcm read-only");
csyang2 6:66ba9ac474ac 286 fd = fopen("/fs/test.pcm", "r");
csyang2 10:ca032f77d721 287 //fd = fopen("/fs/82.wav", "r");
csyang2 6:66ba9ac474ac 288 errno_error(fd);
csyang2 5:492ea7d38e59 289
csyang2 10:ca032f77d721 290 //fseek(fd, 44, SEEK_SET);
csyang2 5:492ea7d38e59 291
csyang2 5:492ea7d38e59 292 for (int i = 0; i < 4096; i++) {
csyang2 5:492ea7d38e59 293 audioBuf[i] = 0;
csyang2 5:492ea7d38e59 294 }
csyang2 10:ca032f77d721 295 #else
csyang2 10:ca032f77d721 296 for (int i = 0; i < 8; i++) {
csyang2 10:ca032f77d721 297 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 298 //printf("0x%08X\r\n", audioBuf[i]);
csyang2 10:ca032f77d721 299 }
csyang2 5:492ea7d38e59 300 #endif
csyang2 5:492ea7d38e59 301
csyang2 5:492ea7d38e59 302 // disable headphone
csyang2 5:492ea7d38e59 303 hp_enable = 1;
csyang2 5:492ea7d38e59 304
csyang2 5:492ea7d38e59 305 audio.attach(&play);
csyang2 5:492ea7d38e59 306 audio.format(samplingRate, channelCount, sampleBitLength);
csyang2 5:492ea7d38e59 307
csyang2 5:492ea7d38e59 308 // enable headphone
csyang2 10:ca032f77d721 309 hp_enable = 0;
csyang2 5:492ea7d38e59 310
csyang2 5:492ea7d38e59 311 printf("Start playing...\r\n");
csyang2 5:492ea7d38e59 312 audio.start();
csyang2 5:492ea7d38e59 313
csyang2 5:492ea7d38e59 314 fillAudioBuf();
csyang2 5:492ea7d38e59 315
csyang2 10:ca032f77d721 316 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
csyang2 6:66ba9ac474ac 317 fclose(fd);
csyang2 6:66ba9ac474ac 318 #endif
csyang2 6:66ba9ac474ac 319
csyang2 5:492ea7d38e59 320 printf("Stop playing.\r\n");
csyang2 5:492ea7d38e59 321 audio.stop();
csyang2 5:492ea7d38e59 322
csyang2 5:492ea7d38e59 323 // disable headphone
csyang2 5:492ea7d38e59 324 hp_enable = 1;
ccli8 1:c3f10403b3db 325 }
ccli8 1:c3f10403b3db 326
csyang2 10:ca032f77d721 327 void demo_loopback(void) {
csyang2 10:ca032f77d721 328 // disable headphone
csyang2 10:ca032f77d721 329 hp_enable = 1;
csyang2 10:ca032f77d721 330
csyang2 10:ca032f77d721 331 audio.attach(&loopback);
csyang2 10:ca032f77d721 332 audio.format(samplingRate, channelCount, sampleBitLength);
csyang2 10:ca032f77d721 333
csyang2 10:ca032f77d721 334 // enable headphone
csyang2 10:ca032f77d721 335 hp_enable = 0;
csyang2 10:ca032f77d721 336
csyang2 10:ca032f77d721 337 printf("Start loopback...\r\n");
csyang2 10:ca032f77d721 338 audio.loopback();
csyang2 10:ca032f77d721 339
csyang2 10:ca032f77d721 340 while (1) {
csyang2 10:ca032f77d721 341 Thread::wait(500);
csyang2 10:ca032f77d721 342 printf("loopback\r\n");
csyang2 10:ca032f77d721 343 }
csyang2 10:ca032f77d721 344
csyang2 10:ca032f77d721 345 printf("Stop loopback.\r\n");
csyang2 10:ca032f77d721 346 audio.stop();
csyang2 10:ca032f77d721 347
csyang2 10:ca032f77d721 348 // disable headphone
csyang2 10:ca032f77d721 349 hp_enable = 1;
csyang2 10:ca032f77d721 350 }
csyang2 10:ca032f77d721 351
ccli8 1:c3f10403b3db 352 int main(void) {
ccli8 1:c3f10403b3db 353 led = 1;
ccli8 1:c3f10403b3db 354
ccli8 1:c3f10403b3db 355 button.rise(&flip);
ccli8 1:c3f10403b3db 356
csyang2 10:ca032f77d721 357 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
csyang2 6:66ba9ac474ac 358 int error = 0;
csyang2 6:66ba9ac474ac 359
csyang2 6:66ba9ac474ac 360 printf("Mounting the filesystem on \"/fs\" ");
csyang2 6:66ba9ac474ac 361 error = fs.mount(&bd);
csyang2 6:66ba9ac474ac 362 return_error(error);
csyang2 6:66ba9ac474ac 363 #endif
csyang2 6:66ba9ac474ac 364
csyang2 10:ca032f77d721 365 //demo_record();
ccli8 1:c3f10403b3db 366
csyang2 10:ca032f77d721 367 //demo_play();
csyang2 10:ca032f77d721 368
csyang2 10:ca032f77d721 369 demo_loopback();
ccli8 1:c3f10403b3db 370
ccli8 1:c3f10403b3db 371 led = 0;
ccli8 1:c3f10403b3db 372 }