ok connect pin 17 and 18 connect headphone to 18 joy up to record joy down to playback

Dependencies:   FatFileSystem MSCFileSystem SDHCFileSystem mbed wavfile

Fork of SimpleWaveRecorderPlayer by Shinichiro Nakamura

Committer:
avnisha
Date:
Fri Mar 14 03:41:37 2014 +0000
Revision:
1:8604a6be9da1
Parent:
0:1a515b688b8c
ok

Who changed what in which revision?

UserRevisionLine numberNew contents of line
avnisha 1:8604a6be9da1 1
shintamainjp 0:1a515b688b8c 2
shintamainjp 0:1a515b688b8c 3 #include "mbed.h"
avnisha 1:8604a6be9da1 4 #include "MSCFileSystem.h"
shintamainjp 0:1a515b688b8c 5 #include "wavfile.h"
shintamainjp 0:1a515b688b8c 6
avnisha 1:8604a6be9da1 7 DigitalIn record(p13);
avnisha 1:8604a6be9da1 8 DigitalIn playback(p16);
avnisha 1:8604a6be9da1 9 AnalogOut Aout(p18);
avnisha 1:8604a6be9da1 10 AnalogIn pot1(p19);
avnisha 1:8604a6be9da1 11 Timeout genTime;
avnisha 1:8604a6be9da1 12 int genOn;
avnisha 1:8604a6be9da1 13
avnisha 1:8604a6be9da1 14
avnisha 1:8604a6be9da1 15 float i = 0;
avnisha 1:8604a6be9da1 16 void tickgen(void)
avnisha 1:8604a6be9da1 17 {
avnisha 1:8604a6be9da1 18 Aout = i;
avnisha 1:8604a6be9da1 19 i = i + 0.1;
avnisha 1:8604a6be9da1 20 if (i > 1.0) i = 0.0;
avnisha 1:8604a6be9da1 21 }
avnisha 1:8604a6be9da1 22
avnisha 1:8604a6be9da1 23
avnisha 1:8604a6be9da1 24 void genTimeout() {
avnisha 1:8604a6be9da1 25 genOn = 0;
avnisha 1:8604a6be9da1 26 }
avnisha 1:8604a6be9da1 27
avnisha 1:8604a6be9da1 28 void generate()
avnisha 1:8604a6be9da1 29 {
avnisha 1:8604a6be9da1 30 while(genOn) {
avnisha 1:8604a6be9da1 31 for(float i=0.0; i<1.0; i+=0.1) {
avnisha 1:8604a6be9da1 32 Aout = i;
avnisha 1:8604a6be9da1 33 wait(0.00001+(0.0001*pot1.read()));
avnisha 1:8604a6be9da1 34 }
avnisha 1:8604a6be9da1 35 }
avnisha 1:8604a6be9da1 36 }
avnisha 1:8604a6be9da1 37
avnisha 1:8604a6be9da1 38
shintamainjp 0:1a515b688b8c 39 #define RAM_TOTAL 0x1000
shintamainjp 0:1a515b688b8c 40
shintamainjp 0:1a515b688b8c 41 AnalogOut dacout(p18);
avnisha 1:8604a6be9da1 42 AnalogIn adcin(p17);
shintamainjp 0:1a515b688b8c 43 DigitalOut led_play_ok(LED1);
shintamainjp 0:1a515b688b8c 44 DigitalOut led_rec_ok(LED2);
shintamainjp 0:1a515b688b8c 45
shintamainjp 0:1a515b688b8c 46 Timer timer;
shintamainjp 0:1a515b688b8c 47 Timer iometer;
shintamainjp 0:1a515b688b8c 48 Ticker ticker;
avnisha 1:8604a6be9da1 49 Ticker tickgenerate;
avnisha 1:8604a6be9da1 50 MSCFileSystem fs("fs");
shintamainjp 0:1a515b688b8c 51
shintamainjp 0:1a515b688b8c 52 float buffer[RAM_TOTAL];
shintamainjp 0:1a515b688b8c 53 int rp = 0;
shintamainjp 0:1a515b688b8c 54 int wp = 0;
shintamainjp 0:1a515b688b8c 55 int dropout = 0;
shintamainjp 0:1a515b688b8c 56
shintamainjp 0:1a515b688b8c 57 #define WAVFILE_ERROR_PRINT(RESULT) \
shintamainjp 0:1a515b688b8c 58 do { \
shintamainjp 0:1a515b688b8c 59 WavFileResult R = RESULT; \
shintamainjp 0:1a515b688b8c 60 if (R != WavFileResultOK) { \
shintamainjp 0:1a515b688b8c 61 char wavfile_error_print_text[BUFSIZ]; \
shintamainjp 0:1a515b688b8c 62 wavfile_result_string(R, wavfile_error_print_text, sizeof(wavfile_error_print_text)); \
shintamainjp 0:1a515b688b8c 63 printf("%s (code=%d)\r\n", wavfile_error_print_text, R); \
shintamainjp 0:1a515b688b8c 64 return 1; \
shintamainjp 0:1a515b688b8c 65 } \
shintamainjp 0:1a515b688b8c 66 } while(0)
shintamainjp 0:1a515b688b8c 67
shintamainjp 0:1a515b688b8c 68 void tickdummy(void)
shintamainjp 0:1a515b688b8c 69 {
shintamainjp 0:1a515b688b8c 70 }
shintamainjp 0:1a515b688b8c 71
shintamainjp 0:1a515b688b8c 72 void tickplay(void)
shintamainjp 0:1a515b688b8c 73 {
shintamainjp 0:1a515b688b8c 74 /*
shintamainjp 0:1a515b688b8c 75 * Check the play underflow
shintamainjp 0:1a515b688b8c 76 */
shintamainjp 0:1a515b688b8c 77 if (rp != wp) {
shintamainjp 0:1a515b688b8c 78 dacout = buffer[rp];
shintamainjp 0:1a515b688b8c 79 rp = (rp + 1) & (RAM_TOTAL - 1);
shintamainjp 0:1a515b688b8c 80 } else {
shintamainjp 0:1a515b688b8c 81 dropout++;
shintamainjp 0:1a515b688b8c 82 }
shintamainjp 0:1a515b688b8c 83 led_play_ok = !led_play_ok;
shintamainjp 0:1a515b688b8c 84 }
shintamainjp 0:1a515b688b8c 85
shintamainjp 0:1a515b688b8c 86 void tickrec(void)
shintamainjp 0:1a515b688b8c 87 {
shintamainjp 0:1a515b688b8c 88 /*
shintamainjp 0:1a515b688b8c 89 * Check the rec overflow
shintamainjp 0:1a515b688b8c 90 */
shintamainjp 0:1a515b688b8c 91 int np = (wp + 1) & (RAM_TOTAL - 1);
shintamainjp 0:1a515b688b8c 92 if (np != rp) {
shintamainjp 0:1a515b688b8c 93 buffer[wp] = adcin;
shintamainjp 0:1a515b688b8c 94 wp = np;
shintamainjp 0:1a515b688b8c 95 } else {
shintamainjp 0:1a515b688b8c 96 dropout++;
shintamainjp 0:1a515b688b8c 97 }
shintamainjp 0:1a515b688b8c 98 led_rec_ok = !led_rec_ok;
shintamainjp 0:1a515b688b8c 99 }
shintamainjp 0:1a515b688b8c 100
shintamainjp 0:1a515b688b8c 101 int play(const char *filename)
shintamainjp 0:1a515b688b8c 102 {
shintamainjp 0:1a515b688b8c 103 WavFileResult result;
shintamainjp 0:1a515b688b8c 104 wavfile_info_t info;
shintamainjp 0:1a515b688b8c 105 wavfile_data_t data;
shintamainjp 0:1a515b688b8c 106
shintamainjp 0:1a515b688b8c 107 WAVFILE *wf = wavfile_open(filename, WavFileModeRead, &result);
shintamainjp 0:1a515b688b8c 108 WAVFILE_ERROR_PRINT(result);
shintamainjp 0:1a515b688b8c 109 WAVFILE_ERROR_PRINT(wavfile_read_info(wf, &info));
shintamainjp 0:1a515b688b8c 110
avnisha 1:8604a6be9da1 111 //printf("[PLAY:%s]\r\n", filename);
avnisha 1:8604a6be9da1 112 //printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info) = %d\r\n", WAVFILE_INFO_AUDIO_FORMAT(&info));
avnisha 1:8604a6be9da1 113 //printf("\tWAVFILE_INFO_NUM_CHANNELS(&info) = %d\r\n", WAVFILE_INFO_NUM_CHANNELS(&info));
avnisha 1:8604a6be9da1 114 //printf("\tWAVFILE_INFO_SAMPLE_RATE(&info) = %d\r\n", WAVFILE_INFO_SAMPLE_RATE(&info));
avnisha 1:8604a6be9da1 115 //printf("\tWAVFILE_INFO_BYTE_RATE(&info) = %d\r\n", WAVFILE_INFO_BYTE_RATE(&info));
avnisha 1:8604a6be9da1 116 //printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info) = %d\r\n", WAVFILE_INFO_BLOCK_ALIGN(&info));
avnisha 1:8604a6be9da1 117 //printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\r\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info));
shintamainjp 0:1a515b688b8c 118
shintamainjp 0:1a515b688b8c 119 const int interval_us = 1000000 / WAVFILE_INFO_SAMPLE_RATE(&info);
shintamainjp 0:1a515b688b8c 120
shintamainjp 0:1a515b688b8c 121 rp = 0;
shintamainjp 0:1a515b688b8c 122 wp = 0;
shintamainjp 0:1a515b688b8c 123 dropout = 0;
shintamainjp 0:1a515b688b8c 124 ticker.attach_us(tickplay, interval_us);
shintamainjp 0:1a515b688b8c 125 while (1) {
shintamainjp 0:1a515b688b8c 126 int np = (wp + 1) & (RAM_TOTAL - 1);
shintamainjp 0:1a515b688b8c 127 while (np == rp) {
shintamainjp 0:1a515b688b8c 128 wait_us(1);
shintamainjp 0:1a515b688b8c 129 }
shintamainjp 0:1a515b688b8c 130 WAVFILE_ERROR_PRINT(wavfile_read_data(wf, &data));
shintamainjp 0:1a515b688b8c 131 if (WAVFILE_DATA_IS_END_OF_DATA(&data)) {
shintamainjp 0:1a515b688b8c 132 break;
shintamainjp 0:1a515b688b8c 133 }
shintamainjp 0:1a515b688b8c 134 buffer[wp] = WAVFILE_DATA_CHANNEL_DATA(&data, 0);
shintamainjp 0:1a515b688b8c 135 wp = np;
shintamainjp 0:1a515b688b8c 136 }
shintamainjp 0:1a515b688b8c 137 ticker.detach();
shintamainjp 0:1a515b688b8c 138 dacout = 0.5;
shintamainjp 0:1a515b688b8c 139 led_play_ok = 0;
shintamainjp 0:1a515b688b8c 140 printf("\t-- Play done. (dropout=%d) --\r\n", dropout);
shintamainjp 0:1a515b688b8c 141
shintamainjp 0:1a515b688b8c 142 WAVFILE_ERROR_PRINT(wavfile_close(wf));
shintamainjp 0:1a515b688b8c 143 return 0;
shintamainjp 0:1a515b688b8c 144 }
shintamainjp 0:1a515b688b8c 145
shintamainjp 0:1a515b688b8c 146 int rec(const char *filename, const int nsec)
shintamainjp 0:1a515b688b8c 147 {
shintamainjp 0:1a515b688b8c 148 WavFileResult result;
shintamainjp 0:1a515b688b8c 149 wavfile_info_t info;
shintamainjp 0:1a515b688b8c 150 wavfile_data_t data;
shintamainjp 0:1a515b688b8c 151
shintamainjp 0:1a515b688b8c 152 WAVFILE_INFO_AUDIO_FORMAT(&info) = 1;
shintamainjp 0:1a515b688b8c 153 WAVFILE_INFO_NUM_CHANNELS(&info) = 1;
shintamainjp 0:1a515b688b8c 154 WAVFILE_INFO_SAMPLE_RATE(&info) = 11025;
shintamainjp 0:1a515b688b8c 155 WAVFILE_INFO_BYTE_RATE(&info) = 22050;
shintamainjp 0:1a515b688b8c 156 WAVFILE_INFO_BLOCK_ALIGN(&info) = 2;
shintamainjp 0:1a515b688b8c 157 WAVFILE_INFO_BITS_PER_SAMPLE(&info) = 16;
shintamainjp 0:1a515b688b8c 158
shintamainjp 0:1a515b688b8c 159 WAVFILE *wf = wavfile_open(filename, WavFileModeWrite, &result);
shintamainjp 0:1a515b688b8c 160 WAVFILE_ERROR_PRINT(result);
shintamainjp 0:1a515b688b8c 161 WAVFILE_ERROR_PRINT(wavfile_write_info(wf, &info));
shintamainjp 0:1a515b688b8c 162
avnisha 1:8604a6be9da1 163 //printf("[REC:%s]\r\n", filename);
avnisha 1:8604a6be9da1 164 //printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info) = %d\r\n", WAVFILE_INFO_AUDIO_FORMAT(&info));
avnisha 1:8604a6be9da1 165 //printf("\tWAVFILE_INFO_NUM_CHANNELS(&info) = %d\r\n", WAVFILE_INFO_NUM_CHANNELS(&info));
avnisha 1:8604a6be9da1 166 //printf("\tWAVFILE_INFO_SAMPLE_RATE(&info) = %d\r\n", WAVFILE_INFO_SAMPLE_RATE(&info));
avnisha 1:8604a6be9da1 167 //printf("\tWAVFILE_INFO_BYTE_RATE(&info) = %d\r\n", WAVFILE_INFO_BYTE_RATE(&info));
avnisha 1:8604a6be9da1 168 //printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info) = %d\r\n", WAVFILE_INFO_BLOCK_ALIGN(&info));
avnisha 1:8604a6be9da1 169 //printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\r\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info));
shintamainjp 0:1a515b688b8c 170
shintamainjp 0:1a515b688b8c 171 const int interval_us = 1000000 / WAVFILE_INFO_SAMPLE_RATE(&info);
shintamainjp 0:1a515b688b8c 172 const unsigned int samples_for_nsec = WAVFILE_INFO_SAMPLE_RATE(&info) * nsec;
shintamainjp 0:1a515b688b8c 173
shintamainjp 0:1a515b688b8c 174 rp = 0;
shintamainjp 0:1a515b688b8c 175 wp = 0;
shintamainjp 0:1a515b688b8c 176 dropout = 0;
shintamainjp 0:1a515b688b8c 177 unsigned int count = 0;
shintamainjp 0:1a515b688b8c 178 ticker.attach_us(tickrec, interval_us);
shintamainjp 0:1a515b688b8c 179 WAVFILE_DATA_NUM_CHANNELS(&data) = 1;
shintamainjp 0:1a515b688b8c 180 while (1) {
shintamainjp 0:1a515b688b8c 181 while (rp == wp) {
shintamainjp 0:1a515b688b8c 182 wait_us(1);
shintamainjp 0:1a515b688b8c 183 }
shintamainjp 0:1a515b688b8c 184
shintamainjp 0:1a515b688b8c 185 WAVFILE_DATA_CHANNEL_DATA(&data, 0) = buffer[rp];
shintamainjp 0:1a515b688b8c 186 rp = (rp + 1) & (RAM_TOTAL - 1);
shintamainjp 0:1a515b688b8c 187 WAVFILE_ERROR_PRINT(wavfile_write_data(wf, &data));
shintamainjp 0:1a515b688b8c 188
shintamainjp 0:1a515b688b8c 189 count++;
shintamainjp 0:1a515b688b8c 190 if (count > samples_for_nsec) {
shintamainjp 0:1a515b688b8c 191 break;
shintamainjp 0:1a515b688b8c 192 }
shintamainjp 0:1a515b688b8c 193 }
shintamainjp 0:1a515b688b8c 194 ticker.detach();
shintamainjp 0:1a515b688b8c 195 led_rec_ok = 0;
shintamainjp 0:1a515b688b8c 196 printf("\t-- Rec done. (dropout=%d) --\r\n", dropout);
shintamainjp 0:1a515b688b8c 197
shintamainjp 0:1a515b688b8c 198 WAVFILE_ERROR_PRINT(wavfile_close(wf));
shintamainjp 0:1a515b688b8c 199 return 0;
shintamainjp 0:1a515b688b8c 200 }
shintamainjp 0:1a515b688b8c 201
shintamainjp 0:1a515b688b8c 202
shintamainjp 0:1a515b688b8c 203
shintamainjp 0:1a515b688b8c 204 int main(void)
shintamainjp 0:1a515b688b8c 205 {
avnisha 1:8604a6be9da1 206 //printf("\r\n\r\n");
avnisha 1:8604a6be9da1 207 //printf("=======================================================\r\n");
avnisha 1:8604a6be9da1 208 //printf(" A simple wave recorder & player on mbed \r\n");
avnisha 1:8604a6be9da1 209 //printf(" Copyright(C) 2012 Shinichiro Nakamura (CuBeatSystems) \r\n");
avnisha 1:8604a6be9da1 210 //printf("=======================================================\r\n");
shintamainjp 0:1a515b688b8c 211
shintamainjp 0:1a515b688b8c 212 ticker.attach_us(tickdummy, 100);
shintamainjp 0:1a515b688b8c 213 wait(1);
shintamainjp 0:1a515b688b8c 214 ticker.detach();
shintamainjp 0:1a515b688b8c 215
avnisha 1:8604a6be9da1 216 static const char *target_filename = "/fs/rec-test.wav";
avnisha 1:8604a6be9da1 217
avnisha 1:8604a6be9da1 218 while (1) {
avnisha 1:8604a6be9da1 219
avnisha 1:8604a6be9da1 220 if (record == 1) {
avnisha 1:8604a6be9da1 221 /*
avnisha 1:8604a6be9da1 222 * generate data
shintamainjp 0:1a515b688b8c 223 */
avnisha 1:8604a6be9da1 224
avnisha 1:8604a6be9da1 225 genOn = 1;
avnisha 1:8604a6be9da1 226 printf("gen/rec on\n");
avnisha 1:8604a6be9da1 227 tickgenerate.attach_us(tickgen, 10);
avnisha 1:8604a6be9da1 228 rec(target_filename, 10);
avnisha 1:8604a6be9da1 229 tickgenerate.detach();
avnisha 1:8604a6be9da1 230 printf("gen/rec off\n");
avnisha 1:8604a6be9da1 231 }
avnisha 1:8604a6be9da1 232
avnisha 1:8604a6be9da1 233 if (playback == 1) {
avnisha 1:8604a6be9da1 234
shintamainjp 0:1a515b688b8c 235 /*
shintamainjp 0:1a515b688b8c 236 * Play it!
shintamainjp 0:1a515b688b8c 237 */
avnisha 1:8604a6be9da1 238 printf("play on\n");
shintamainjp 0:1a515b688b8c 239 if (play(target_filename) != 0) {
shintamainjp 0:1a515b688b8c 240 break;
shintamainjp 0:1a515b688b8c 241 }
avnisha 1:8604a6be9da1 242 printf("play off\n");
shintamainjp 0:1a515b688b8c 243 }
shintamainjp 0:1a515b688b8c 244 }
shintamainjp 0:1a515b688b8c 245
shintamainjp 0:1a515b688b8c 246 return 0;
shintamainjp 0:1a515b688b8c 247 }