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
- Committer:
- dudanian
- Date:
- 2014-12-09
- Revision:
- 6:23c3adb0470d
- Parent:
- 2:c939d0501184
File content as of revision 6:23c3adb0470d:
#include "Recorder.h" #define RAM_TOTAL 2048 AnalogOut dacout(p18); AnalogIn adcin(p20); DigitalOut led_play_ok(LED1); DigitalOut led_rec_ok(LED2); Ticker ticker; extern float *buffer; int rp = 0; int wp = 0; int dropout = 0; #define WAVFILE_ERROR_PRINT(RESULT) \ do { \ WavFileResult R = RESULT; \ if (R != WavFileResultOK) { \ char wavfile_error_print_text[BUFSIZ]; \ wavfile_result_string(R, wavfile_error_print_text, sizeof(wavfile_error_print_text)); \ printf("%s (code=%d)\r\n", wavfile_error_print_text, R); \ return 1; \ } \ } while(0) void tickplay(void) { /* * Check the play underflow */ if (rp != wp) { dacout = buffer[rp]; rp = (rp + 1) & (RAM_TOTAL - 1); } else { dropout++; } led_play_ok = !led_play_ok; } void tickrec(void) { int np = (wp + 1) & (RAM_TOTAL - 1); if (np != rp) { buffer[wp] = adcin; wp = np; } else { dropout++; } led_rec_ok = !led_rec_ok; } int play(const char *filename) { WavFileResult result; wavfile_info_t info; wavfile_data_t data; WAVFILE *wf = wavfile_open(filename, WavFileModeRead, &result); WAVFILE_ERROR_PRINT(result); WAVFILE_ERROR_PRINT(wavfile_read_info(wf, &info)); //printf("[PLAY:%s]\r\n", filename); //printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info) = %d\r\n", WAVFILE_INFO_AUDIO_FORMAT(&info)); //printf("\tWAVFILE_INFO_NUM_CHANNELS(&info) = %d\r\n", WAVFILE_INFO_NUM_CHANNELS(&info)); //printf("\tWAVFILE_INFO_SAMPLE_RATE(&info) = %d\r\n", WAVFILE_INFO_SAMPLE_RATE(&info)); //printf("\tWAVFILE_INFO_BYTE_RATE(&info) = %d\r\n", WAVFILE_INFO_BYTE_RATE(&info)); //printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info) = %d\r\n", WAVFILE_INFO_BLOCK_ALIGN(&info)); //printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\r\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info)); const int interval_us = 1000000 / WAVFILE_INFO_SAMPLE_RATE(&info); rp = 0; wp = 0; dropout = 0; ticker.attach_us(tickplay, interval_us); while (1) { int np = (wp + 1) & (RAM_TOTAL - 1); while (np == rp) { wait_us(1); } WAVFILE_ERROR_PRINT(wavfile_read_data(wf, &data)); if (WAVFILE_DATA_IS_END_OF_DATA(&data)) { break; } buffer[wp] = WAVFILE_DATA_CHANNEL_DATA(&data, 0); wp = np; } ticker.detach(); dacout = 0.5; led_play_ok = 0; //printf("\t-- Play done. (dropout=%d) --\r\n", dropout); WAVFILE_ERROR_PRINT(wavfile_close(wf)); return 0; } int rec(const char *filename, const int nsec) { WavFileResult result; wavfile_info_t info; wavfile_data_t data; WAVFILE_INFO_AUDIO_FORMAT(&info) = 1; WAVFILE_INFO_NUM_CHANNELS(&info) = 1; WAVFILE_INFO_SAMPLE_RATE(&info) = 11025; WAVFILE_INFO_BYTE_RATE(&info) = 22050; WAVFILE_INFO_BLOCK_ALIGN(&info) = 2; WAVFILE_INFO_BITS_PER_SAMPLE(&info) = 16; WAVFILE *wf = wavfile_open(filename, WavFileModeWrite, &result); WAVFILE_ERROR_PRINT(result); WAVFILE_ERROR_PRINT(wavfile_write_info(wf, &info)); //printf("[REC:%s]\r\n", filename); //printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info) = %d\r\n", WAVFILE_INFO_AUDIO_FORMAT(&info)); //printf("\tWAVFILE_INFO_NUM_CHANNELS(&info) = %d\r\n", WAVFILE_INFO_NUM_CHANNELS(&info)); //printf("\tWAVFILE_INFO_SAMPLE_RATE(&info) = %d\r\n", WAVFILE_INFO_SAMPLE_RATE(&info)); //printf("\tWAVFILE_INFO_BYTE_RATE(&info) = %d\r\n", WAVFILE_INFO_BYTE_RATE(&info)); //printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info) = %d\r\n", WAVFILE_INFO_BLOCK_ALIGN(&info)); //printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\r\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info)); const int interval_us = 1000000 / WAVFILE_INFO_SAMPLE_RATE(&info); const unsigned int samples_for_nsec = WAVFILE_INFO_SAMPLE_RATE(&info) * nsec; rp = 0; wp = 0; dropout = 0; unsigned int count = 0; ticker.attach_us(tickrec, interval_us); WAVFILE_DATA_NUM_CHANNELS(&data) = 1; while (1) { while (rp == wp) { wait_us(1); } WAVFILE_DATA_CHANNEL_DATA(&data, 0) = buffer[rp]; rp = (rp + 1) & (RAM_TOTAL - 1); WAVFILE_ERROR_PRINT(wavfile_write_data(wf, &data)); count++; if (count > samples_for_nsec) { break; } } ticker.detach(); led_rec_ok = 0; //printf("\t-- Rec done. (dropout=%d) --\r\n", dropout); WAVFILE_ERROR_PRINT(wavfile_close(wf)); return 0; }