Nuvoton
/
NuMaker-mbed-AudioPlayback-example
NuMaker audio playback
main.cpp@20:df54b4c86862, 2021-02-25 (annotated)
- 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?
User | Revision | Line number | New 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 | } |