Nuvoton
/
NuMaker-mbed-AudioPlayback-example
NuMaker audio playback
main.cpp@15:8527899eb9d3, 2020-04-28 (annotated)
- Committer:
- csyang2 csyang2@nuvoton.com
- Date:
- Tue Apr 28 20:32:41 2020 +0800
- Revision:
- 15:8527899eb9d3
- Parent:
- 12:6a21e1be7e7d
- Child:
- 17:65a16265cda2
Added NUMAKER_IOT_M487
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) { |
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 |
10:ca032f77d721 | 309 | #if defined(TARGET_NUMAKER_PFM_NANO130) |
csyang2 |
10:ca032f77d721 | 310 | for (int i = 0; i < 128; i++) { |
csyang2 |
10:ca032f77d721 | 311 | #else |
csyang2 | 5:492ea7d38e59 | 312 | for (int i = 0; i < 4096; i++) { |
csyang2 |
10:ca032f77d721 | 313 | #endif |
csyang2 | 5:492ea7d38e59 | 314 | audioBuf[i] = 0; |
csyang2 | 5:492ea7d38e59 | 315 | } |
csyang2 | 5:492ea7d38e59 | 316 | |
csyang2 csyang2@nuvoton.com | 15:8527899eb9d3 | 317 | #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487) |
csyang2 | 6:66ba9ac474ac | 318 | printf("Opening a new file test.pcm"); |
csyang2 | 6:66ba9ac474ac | 319 | fd = fopen("/fs/test.pcm", "w"); |
csyang2 | 6:66ba9ac474ac | 320 | errno_error(fd); |
ccli8 |
1:c3f10403b3db | 321 | #endif |
csyang2 | 5:492ea7d38e59 | 322 | |
csyang2 | 5:492ea7d38e59 | 323 | audio.attach(&record); |
csyang2 | 5:492ea7d38e59 | 324 | audio.format(samplingRate, channelCount, sampleBitLength); |
csyang2 | 5:492ea7d38e59 | 325 | |
csyang2 | 5:492ea7d38e59 | 326 | printf("Start recording...\r\n"); |
csyang2 | 5:492ea7d38e59 | 327 | audio.record(); |
csyang2 | 5:492ea7d38e59 | 328 | |
csyang2 | 5:492ea7d38e59 | 329 | drainAudioBuf(); |
csyang2 | 5:492ea7d38e59 | 330 | |
csyang2 csyang2@nuvoton.com | 15:8527899eb9d3 | 331 | #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487) |
csyang2 | 6:66ba9ac474ac | 332 | fclose(fd); |
csyang2 | 5:492ea7d38e59 | 333 | #endif |
csyang2 | 5:492ea7d38e59 | 334 | |
csyang2 | 5:492ea7d38e59 | 335 | printf("Stop recording.\r\n"); |
csyang2 | 5:492ea7d38e59 | 336 | audio.stop(); |
csyang2 | 5:492ea7d38e59 | 337 | } |
csyang2 | 5:492ea7d38e59 | 338 | |
csyang2 | 5:492ea7d38e59 | 339 | void demo_play(void) { |
csyang2 csyang2@nuvoton.com | 15:8527899eb9d3 | 340 | #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487) |
csyang2 | 6:66ba9ac474ac | 341 | printf("Opening file test.pcm read-only"); |
csyang2 | 6:66ba9ac474ac | 342 | fd = fopen("/fs/test.pcm", "r"); |
csyang2 |
10:ca032f77d721 | 343 | //fd = fopen("/fs/82.wav", "r"); |
csyang2 | 6:66ba9ac474ac | 344 | errno_error(fd); |
csyang2 | 5:492ea7d38e59 | 345 | |
csyang2 |
10:ca032f77d721 | 346 | //fseek(fd, 44, SEEK_SET); |
csyang2 | 5:492ea7d38e59 | 347 | |
csyang2 | 5:492ea7d38e59 | 348 | for (int i = 0; i < 4096; i++) { |
csyang2 | 5:492ea7d38e59 | 349 | audioBuf[i] = 0; |
csyang2 | 5:492ea7d38e59 | 350 | } |
csyang2 |
10:ca032f77d721 | 351 | #else |
csyang2 |
10:ca032f77d721 | 352 | for (int i = 0; i < 8; i++) { |
csyang2 |
10:ca032f77d721 | 353 | 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 | 354 | //printf("0x%08X\r\n", audioBuf[i]); |
csyang2 |
10:ca032f77d721 | 355 | } |
csyang2 | 5:492ea7d38e59 | 356 | #endif |
csyang2 | 5:492ea7d38e59 | 357 | |
csyang2 | 5:492ea7d38e59 | 358 | // disable headphone |
csyang2 | 5:492ea7d38e59 | 359 | hp_enable = 1; |
csyang2 | 5:492ea7d38e59 | 360 | |
csyang2 | 5:492ea7d38e59 | 361 | audio.attach(&play); |
csyang2 | 5:492ea7d38e59 | 362 | audio.format(samplingRate, channelCount, sampleBitLength); |
csyang2 | 5:492ea7d38e59 | 363 | |
csyang2 | 5:492ea7d38e59 | 364 | // enable headphone |
csyang2 |
10:ca032f77d721 | 365 | hp_enable = 0; |
csyang2 | 5:492ea7d38e59 | 366 | |
csyang2 | 5:492ea7d38e59 | 367 | printf("Start playing...\r\n"); |
csyang2 | 5:492ea7d38e59 | 368 | audio.start(); |
csyang2 | 5:492ea7d38e59 | 369 | |
csyang2 | 5:492ea7d38e59 | 370 | fillAudioBuf(); |
csyang2 | 5:492ea7d38e59 | 371 | |
csyang2 csyang2@nuvoton.com | 15:8527899eb9d3 | 372 | #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487) |
csyang2 | 6:66ba9ac474ac | 373 | fclose(fd); |
csyang2 | 6:66ba9ac474ac | 374 | #endif |
csyang2 | 6:66ba9ac474ac | 375 | |
csyang2 | 5:492ea7d38e59 | 376 | printf("Stop playing.\r\n"); |
csyang2 | 5:492ea7d38e59 | 377 | audio.stop(); |
csyang2 | 5:492ea7d38e59 | 378 | |
csyang2 | 5:492ea7d38e59 | 379 | // disable headphone |
csyang2 | 5:492ea7d38e59 | 380 | hp_enable = 1; |
ccli8 |
1:c3f10403b3db | 381 | } |
ccli8 |
1:c3f10403b3db | 382 | |
csyang2 |
10:ca032f77d721 | 383 | void demo_loopback(void) { |
csyang2 |
10:ca032f77d721 | 384 | // disable headphone |
csyang2 |
10:ca032f77d721 | 385 | hp_enable = 1; |
csyang2 |
10:ca032f77d721 | 386 | |
csyang2 |
10:ca032f77d721 | 387 | audio.attach(&loopback); |
csyang2 |
10:ca032f77d721 | 388 | audio.format(samplingRate, channelCount, sampleBitLength); |
csyang2 |
10:ca032f77d721 | 389 | |
csyang2 |
10:ca032f77d721 | 390 | // enable headphone |
csyang2 |
10:ca032f77d721 | 391 | hp_enable = 0; |
csyang2 |
10:ca032f77d721 | 392 | |
csyang2 |
10:ca032f77d721 | 393 | printf("Start loopback...\r\n"); |
csyang2 |
10:ca032f77d721 | 394 | audio.loopback(); |
csyang2 |
10:ca032f77d721 | 395 | |
csyang2 |
10:ca032f77d721 | 396 | while (1) { |
csyang2 |
10:ca032f77d721 | 397 | Thread::wait(500); |
csyang2 |
10:ca032f77d721 | 398 | printf("loopback\r\n"); |
csyang2 |
10:ca032f77d721 | 399 | } |
csyang2 |
10:ca032f77d721 | 400 | |
csyang2 |
10:ca032f77d721 | 401 | printf("Stop loopback.\r\n"); |
csyang2 |
10:ca032f77d721 | 402 | audio.stop(); |
csyang2 |
10:ca032f77d721 | 403 | |
csyang2 |
10:ca032f77d721 | 404 | // disable headphone |
csyang2 |
10:ca032f77d721 | 405 | hp_enable = 1; |
csyang2 |
10:ca032f77d721 | 406 | } |
csyang2 |
10:ca032f77d721 | 407 | |
ccli8 |
1:c3f10403b3db | 408 | int main(void) { |
ccli8 |
1:c3f10403b3db | 409 | led = 1; |
ccli8 |
1:c3f10403b3db | 410 | |
ccli8 |
1:c3f10403b3db | 411 | button.rise(&flip); |
ccli8 |
1:c3f10403b3db | 412 | |
csyang2 csyang2@nuvoton.com | 15:8527899eb9d3 | 413 | #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487) |
csyang2 | 6:66ba9ac474ac | 414 | int error = 0; |
csyang2 | 6:66ba9ac474ac | 415 | |
csyang2 | 6:66ba9ac474ac | 416 | printf("Mounting the filesystem on \"/fs\" "); |
csyang2 | 6:66ba9ac474ac | 417 | error = fs.mount(&bd); |
csyang2 | 6:66ba9ac474ac | 418 | return_error(error); |
csyang2 | 6:66ba9ac474ac | 419 | #endif |
csyang2 | 6:66ba9ac474ac | 420 | |
csyang2 |
10:ca032f77d721 | 421 | //demo_record(); |
ccli8 |
1:c3f10403b3db | 422 | |
csyang2 |
10:ca032f77d721 | 423 | //demo_play(); |
csyang2 |
10:ca032f77d721 | 424 | |
csyang2 |
10:ca032f77d721 | 425 | demo_loopback(); |
ccli8 |
1:c3f10403b3db | 426 | |
ccli8 |
1:c3f10403b3db | 427 | led = 0; |
ccli8 |
1:c3f10403b3db | 428 | } |