Mbed Clock application using an NTP connection to get internet time and a terminal interface to send commands
Dependencies: 4DGL-uLCD-SE EthernetInterface NTPClient mbed-rtos mbed SDFileSystem wavfile
Recorder.cpp@2:c939d0501184, 2014-12-08 (annotated)
- Committer:
- dudanian
- Date:
- Mon Dec 08 23:30:49 2014 +0000
- Revision:
- 2:c939d0501184
- Parent:
- 1:c47a2f0816bb
Working better
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dudanian | 1:c47a2f0816bb | 1 | #include "Recorder.h" |
dudanian | 1:c47a2f0816bb | 2 | |
dudanian | 2:c939d0501184 | 3 | #define RAM_TOTAL 2048 |
dudanian | 1:c47a2f0816bb | 4 | |
dudanian | 2:c939d0501184 | 5 | AnalogOut dacout(p18); |
dudanian | 1:c47a2f0816bb | 6 | AnalogIn adcin(p20); |
dudanian | 2:c939d0501184 | 7 | DigitalOut led_play_ok(LED1); |
dudanian | 1:c47a2f0816bb | 8 | DigitalOut led_rec_ok(LED2); |
dudanian | 1:c47a2f0816bb | 9 | |
dudanian | 1:c47a2f0816bb | 10 | Ticker ticker; |
dudanian | 2:c939d0501184 | 11 | extern float *buffer; |
dudanian | 1:c47a2f0816bb | 12 | int rp = 0; |
dudanian | 1:c47a2f0816bb | 13 | int wp = 0; |
dudanian | 1:c47a2f0816bb | 14 | int dropout = 0; |
dudanian | 1:c47a2f0816bb | 15 | |
dudanian | 1:c47a2f0816bb | 16 | #define WAVFILE_ERROR_PRINT(RESULT) \ |
dudanian | 1:c47a2f0816bb | 17 | do { \ |
dudanian | 1:c47a2f0816bb | 18 | WavFileResult R = RESULT; \ |
dudanian | 1:c47a2f0816bb | 19 | if (R != WavFileResultOK) { \ |
dudanian | 1:c47a2f0816bb | 20 | char wavfile_error_print_text[BUFSIZ]; \ |
dudanian | 1:c47a2f0816bb | 21 | wavfile_result_string(R, wavfile_error_print_text, sizeof(wavfile_error_print_text)); \ |
dudanian | 1:c47a2f0816bb | 22 | printf("%s (code=%d)\r\n", wavfile_error_print_text, R); \ |
dudanian | 1:c47a2f0816bb | 23 | return 1; \ |
dudanian | 1:c47a2f0816bb | 24 | } \ |
dudanian | 1:c47a2f0816bb | 25 | } while(0) |
dudanian | 1:c47a2f0816bb | 26 | |
dudanian | 2:c939d0501184 | 27 | |
dudanian | 2:c939d0501184 | 28 | void tickplay(void) |
dudanian | 2:c939d0501184 | 29 | { |
dudanian | 2:c939d0501184 | 30 | /* |
dudanian | 2:c939d0501184 | 31 | * Check the play underflow |
dudanian | 2:c939d0501184 | 32 | */ |
dudanian | 2:c939d0501184 | 33 | if (rp != wp) { |
dudanian | 2:c939d0501184 | 34 | dacout = buffer[rp]; |
dudanian | 2:c939d0501184 | 35 | rp = (rp + 1) & (RAM_TOTAL - 1); |
dudanian | 2:c939d0501184 | 36 | } else { |
dudanian | 2:c939d0501184 | 37 | dropout++; |
dudanian | 2:c939d0501184 | 38 | } |
dudanian | 2:c939d0501184 | 39 | led_play_ok = !led_play_ok; |
dudanian | 2:c939d0501184 | 40 | } |
dudanian | 2:c939d0501184 | 41 | |
dudanian | 1:c47a2f0816bb | 42 | void tickrec(void) |
dudanian | 1:c47a2f0816bb | 43 | { |
dudanian | 1:c47a2f0816bb | 44 | int np = (wp + 1) & (RAM_TOTAL - 1); |
dudanian | 1:c47a2f0816bb | 45 | if (np != rp) { |
dudanian | 1:c47a2f0816bb | 46 | buffer[wp] = adcin; |
dudanian | 1:c47a2f0816bb | 47 | wp = np; |
dudanian | 1:c47a2f0816bb | 48 | } else { |
dudanian | 1:c47a2f0816bb | 49 | dropout++; |
dudanian | 1:c47a2f0816bb | 50 | } |
dudanian | 1:c47a2f0816bb | 51 | led_rec_ok = !led_rec_ok; |
dudanian | 1:c47a2f0816bb | 52 | } |
dudanian | 1:c47a2f0816bb | 53 | |
dudanian | 2:c939d0501184 | 54 | int play(const char *filename) |
dudanian | 2:c939d0501184 | 55 | { |
dudanian | 2:c939d0501184 | 56 | WavFileResult result; |
dudanian | 2:c939d0501184 | 57 | wavfile_info_t info; |
dudanian | 2:c939d0501184 | 58 | wavfile_data_t data; |
dudanian | 2:c939d0501184 | 59 | |
dudanian | 2:c939d0501184 | 60 | WAVFILE *wf = wavfile_open(filename, WavFileModeRead, &result); |
dudanian | 2:c939d0501184 | 61 | WAVFILE_ERROR_PRINT(result); |
dudanian | 2:c939d0501184 | 62 | WAVFILE_ERROR_PRINT(wavfile_read_info(wf, &info)); |
dudanian | 2:c939d0501184 | 63 | |
dudanian | 2:c939d0501184 | 64 | //printf("[PLAY:%s]\r\n", filename); |
dudanian | 2:c939d0501184 | 65 | //printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info) = %d\r\n", WAVFILE_INFO_AUDIO_FORMAT(&info)); |
dudanian | 2:c939d0501184 | 66 | //printf("\tWAVFILE_INFO_NUM_CHANNELS(&info) = %d\r\n", WAVFILE_INFO_NUM_CHANNELS(&info)); |
dudanian | 2:c939d0501184 | 67 | //printf("\tWAVFILE_INFO_SAMPLE_RATE(&info) = %d\r\n", WAVFILE_INFO_SAMPLE_RATE(&info)); |
dudanian | 2:c939d0501184 | 68 | //printf("\tWAVFILE_INFO_BYTE_RATE(&info) = %d\r\n", WAVFILE_INFO_BYTE_RATE(&info)); |
dudanian | 2:c939d0501184 | 69 | //printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info) = %d\r\n", WAVFILE_INFO_BLOCK_ALIGN(&info)); |
dudanian | 2:c939d0501184 | 70 | //printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\r\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info)); |
dudanian | 2:c939d0501184 | 71 | |
dudanian | 2:c939d0501184 | 72 | const int interval_us = 1000000 / WAVFILE_INFO_SAMPLE_RATE(&info); |
dudanian | 2:c939d0501184 | 73 | |
dudanian | 2:c939d0501184 | 74 | rp = 0; |
dudanian | 2:c939d0501184 | 75 | wp = 0; |
dudanian | 2:c939d0501184 | 76 | dropout = 0; |
dudanian | 2:c939d0501184 | 77 | ticker.attach_us(tickplay, interval_us); |
dudanian | 2:c939d0501184 | 78 | while (1) { |
dudanian | 2:c939d0501184 | 79 | int np = (wp + 1) & (RAM_TOTAL - 1); |
dudanian | 2:c939d0501184 | 80 | while (np == rp) { |
dudanian | 2:c939d0501184 | 81 | wait_us(1); |
dudanian | 2:c939d0501184 | 82 | } |
dudanian | 2:c939d0501184 | 83 | WAVFILE_ERROR_PRINT(wavfile_read_data(wf, &data)); |
dudanian | 2:c939d0501184 | 84 | if (WAVFILE_DATA_IS_END_OF_DATA(&data)) { |
dudanian | 2:c939d0501184 | 85 | break; |
dudanian | 2:c939d0501184 | 86 | } |
dudanian | 2:c939d0501184 | 87 | buffer[wp] = WAVFILE_DATA_CHANNEL_DATA(&data, 0); |
dudanian | 2:c939d0501184 | 88 | wp = np; |
dudanian | 2:c939d0501184 | 89 | } |
dudanian | 2:c939d0501184 | 90 | ticker.detach(); |
dudanian | 2:c939d0501184 | 91 | dacout = 0.5; |
dudanian | 2:c939d0501184 | 92 | led_play_ok = 0; |
dudanian | 2:c939d0501184 | 93 | //printf("\t-- Play done. (dropout=%d) --\r\n", dropout); |
dudanian | 2:c939d0501184 | 94 | |
dudanian | 2:c939d0501184 | 95 | WAVFILE_ERROR_PRINT(wavfile_close(wf)); |
dudanian | 2:c939d0501184 | 96 | return 0; |
dudanian | 2:c939d0501184 | 97 | } |
dudanian | 2:c939d0501184 | 98 | |
dudanian | 1:c47a2f0816bb | 99 | int rec(const char *filename, const int nsec) |
dudanian | 1:c47a2f0816bb | 100 | { |
dudanian | 1:c47a2f0816bb | 101 | WavFileResult result; |
dudanian | 1:c47a2f0816bb | 102 | wavfile_info_t info; |
dudanian | 1:c47a2f0816bb | 103 | wavfile_data_t data; |
dudanian | 1:c47a2f0816bb | 104 | |
dudanian | 1:c47a2f0816bb | 105 | WAVFILE_INFO_AUDIO_FORMAT(&info) = 1; |
dudanian | 1:c47a2f0816bb | 106 | WAVFILE_INFO_NUM_CHANNELS(&info) = 1; |
dudanian | 1:c47a2f0816bb | 107 | WAVFILE_INFO_SAMPLE_RATE(&info) = 11025; |
dudanian | 1:c47a2f0816bb | 108 | WAVFILE_INFO_BYTE_RATE(&info) = 22050; |
dudanian | 1:c47a2f0816bb | 109 | WAVFILE_INFO_BLOCK_ALIGN(&info) = 2; |
dudanian | 1:c47a2f0816bb | 110 | WAVFILE_INFO_BITS_PER_SAMPLE(&info) = 16; |
dudanian | 1:c47a2f0816bb | 111 | |
dudanian | 1:c47a2f0816bb | 112 | WAVFILE *wf = wavfile_open(filename, WavFileModeWrite, &result); |
dudanian | 1:c47a2f0816bb | 113 | WAVFILE_ERROR_PRINT(result); |
dudanian | 1:c47a2f0816bb | 114 | WAVFILE_ERROR_PRINT(wavfile_write_info(wf, &info)); |
dudanian | 1:c47a2f0816bb | 115 | |
dudanian | 1:c47a2f0816bb | 116 | //printf("[REC:%s]\r\n", filename); |
dudanian | 1:c47a2f0816bb | 117 | //printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info) = %d\r\n", WAVFILE_INFO_AUDIO_FORMAT(&info)); |
dudanian | 1:c47a2f0816bb | 118 | //printf("\tWAVFILE_INFO_NUM_CHANNELS(&info) = %d\r\n", WAVFILE_INFO_NUM_CHANNELS(&info)); |
dudanian | 1:c47a2f0816bb | 119 | //printf("\tWAVFILE_INFO_SAMPLE_RATE(&info) = %d\r\n", WAVFILE_INFO_SAMPLE_RATE(&info)); |
dudanian | 1:c47a2f0816bb | 120 | //printf("\tWAVFILE_INFO_BYTE_RATE(&info) = %d\r\n", WAVFILE_INFO_BYTE_RATE(&info)); |
dudanian | 1:c47a2f0816bb | 121 | //printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info) = %d\r\n", WAVFILE_INFO_BLOCK_ALIGN(&info)); |
dudanian | 1:c47a2f0816bb | 122 | //printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\r\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info)); |
dudanian | 1:c47a2f0816bb | 123 | |
dudanian | 1:c47a2f0816bb | 124 | const int interval_us = 1000000 / WAVFILE_INFO_SAMPLE_RATE(&info); |
dudanian | 1:c47a2f0816bb | 125 | const unsigned int samples_for_nsec = WAVFILE_INFO_SAMPLE_RATE(&info) * nsec; |
dudanian | 1:c47a2f0816bb | 126 | |
dudanian | 1:c47a2f0816bb | 127 | rp = 0; |
dudanian | 1:c47a2f0816bb | 128 | wp = 0; |
dudanian | 1:c47a2f0816bb | 129 | dropout = 0; |
dudanian | 1:c47a2f0816bb | 130 | unsigned int count = 0; |
dudanian | 1:c47a2f0816bb | 131 | ticker.attach_us(tickrec, interval_us); |
dudanian | 1:c47a2f0816bb | 132 | WAVFILE_DATA_NUM_CHANNELS(&data) = 1; |
dudanian | 1:c47a2f0816bb | 133 | while (1) { |
dudanian | 1:c47a2f0816bb | 134 | while (rp == wp) { |
dudanian | 1:c47a2f0816bb | 135 | wait_us(1); |
dudanian | 1:c47a2f0816bb | 136 | } |
dudanian | 1:c47a2f0816bb | 137 | |
dudanian | 1:c47a2f0816bb | 138 | WAVFILE_DATA_CHANNEL_DATA(&data, 0) = buffer[rp]; |
dudanian | 1:c47a2f0816bb | 139 | rp = (rp + 1) & (RAM_TOTAL - 1); |
dudanian | 1:c47a2f0816bb | 140 | WAVFILE_ERROR_PRINT(wavfile_write_data(wf, &data)); |
dudanian | 1:c47a2f0816bb | 141 | |
dudanian | 1:c47a2f0816bb | 142 | count++; |
dudanian | 1:c47a2f0816bb | 143 | if (count > samples_for_nsec) { |
dudanian | 1:c47a2f0816bb | 144 | break; |
dudanian | 1:c47a2f0816bb | 145 | } |
dudanian | 1:c47a2f0816bb | 146 | } |
dudanian | 1:c47a2f0816bb | 147 | ticker.detach(); |
dudanian | 1:c47a2f0816bb | 148 | led_rec_ok = 0; |
dudanian | 1:c47a2f0816bb | 149 | //printf("\t-- Rec done. (dropout=%d) --\r\n", dropout); |
dudanian | 1:c47a2f0816bb | 150 | |
dudanian | 1:c47a2f0816bb | 151 | WAVFILE_ERROR_PRINT(wavfile_close(wf)); |
dudanian | 1:c47a2f0816bb | 152 | return 0; |
dudanian | 1:c47a2f0816bb | 153 | } |