A library which allows the playing of Wav files using the TLV320
Dependents: RSALB_hbridge_helloworld RSALB_lobster WavPlayer_test AudioCODEC_HelloWorld
WavPlayer.cpp@3:a7380cfc1987, 2012-09-21 (annotated)
- Committer:
- p07gbar
- Date:
- Fri Sep 21 14:24:00 2012 +0000
- Revision:
- 3:a7380cfc1987
- Parent:
- 2:d54e6966fa2b
Minor fix
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
p07gbar | 0:3695886f3495 | 1 | // TODO: Add licence and stop start remembering and fill buffer functions |
p07gbar | 0:3695886f3495 | 2 | |
p07gbar | 0:3695886f3495 | 3 | |
p07gbar | 0:3695886f3495 | 4 | |
p07gbar | 0:3695886f3495 | 5 | #include "WavPlayer.h" |
p07gbar | 0:3695886f3495 | 6 | |
p07gbar | 3:a7380cfc1987 | 7 | #define DEBUG 0 |
p07gbar | 0:3695886f3495 | 8 | #define debug_printf(args ...) if (DEBUG) printf(args) |
p07gbar | 0:3695886f3495 | 9 | |
p07gbar | 0:3695886f3495 | 10 | #define WAVPLAYER_PLAYER_BUF 1000 |
p07gbar | 0:3695886f3495 | 11 | |
p07gbar | 0:3695886f3495 | 12 | #define WAVPLAYER_OUTPUT_RATE 48000 |
p07gbar | 0:3695886f3495 | 13 | |
p07gbar | 0:3695886f3495 | 14 | #define WAVPLAYER_READ_MARGIN 0.9 |
p07gbar | 0:3695886f3495 | 15 | |
p07gbar | 0:3695886f3495 | 16 | #define WAVLPAYER_SLOW_MARGIN 5 |
p07gbar | 0:3695886f3495 | 17 | |
p07gbar | 0:3695886f3495 | 18 | #define WAVPLAYER_GEN_TEST 0 |
p07gbar | 0:3695886f3495 | 19 | |
p07gbar | 0:3695886f3495 | 20 | #define WAVPLAYER_GEN_FREQ 440 |
p07gbar | 0:3695886f3495 | 21 | |
p07gbar | 0:3695886f3495 | 22 | #if WAVPLAYER_GEN_TEST == 1 |
p07gbar | 0:3695886f3495 | 23 | #include "sinelookup.h" |
p07gbar | 0:3695886f3495 | 24 | #else |
p07gbar | 0:3695886f3495 | 25 | #define SINE16LENGTH 2 |
p07gbar | 0:3695886f3495 | 26 | #define SINE32LENGTH 2 |
p07gbar | 0:3695886f3495 | 27 | const int16_t sine16lookup[] = {0,10000}; |
p07gbar | 0:3695886f3495 | 28 | #endif |
p07gbar | 0:3695886f3495 | 29 | |
p07gbar | 0:3695886f3495 | 30 | WavPlayer* WavPlayer::instance; |
p07gbar | 0:3695886f3495 | 31 | //void WavPlayer::i2sisr(); |
p07gbar | 0:3695886f3495 | 32 | |
p07gbar | 0:3695886f3495 | 33 | WavPlayer::WavPlayer() : |
p07gbar | 0:3695886f3495 | 34 | flag_play(true), i2s(I2S_TRANSMIT, p5, p6, p7), codec(p9, p10)//, ext_flag(p22), //run_flag(p23) |
p07gbar | 0:3695886f3495 | 35 | { |
p07gbar | 0:3695886f3495 | 36 | instance = this; |
p07gbar | 0:3695886f3495 | 37 | codec.power(true); //power up TLV apart from analogue input |
p07gbar | 0:3695886f3495 | 38 | codec.stop(); |
p07gbar | 0:3695886f3495 | 39 | codec.frequency(WAVPLAYER_OUTPUT_RATE); //set sample frequency |
p07gbar | 0:3695886f3495 | 40 | codec.wordsize(16); //set transfer protocol |
p07gbar | 0:3695886f3495 | 41 | codec.master(false); |
p07gbar | 0:3695886f3495 | 42 | codec.headphone_volume(0.6); |
p07gbar | 0:3695886f3495 | 43 | //interrupt come from the I2STXFIFO only |
p07gbar | 0:3695886f3495 | 44 | |
p07gbar | 0:3695886f3495 | 45 | i2s.masterslave(I2S_MASTER); |
p07gbar | 0:3695886f3495 | 46 | i2s.attach(&WavPlayer::i2sisr); |
p07gbar | 0:3695886f3495 | 47 | |
p07gbar | 0:3695886f3495 | 48 | i2s.wordsize(16); |
p07gbar | 0:3695886f3495 | 49 | i2s.stereomono(I2S_MONO); |
p07gbar | 0:3695886f3495 | 50 | |
p07gbar | 0:3695886f3495 | 51 | i2s.frequency(WAVPLAYER_OUTPUT_RATE); |
p07gbar | 0:3695886f3495 | 52 | |
p07gbar | 0:3695886f3495 | 53 | //ext_flag = false; |
p07gbar | 0:3695886f3495 | 54 | |
p07gbar | 0:3695886f3495 | 55 | flag_vol = false; |
p07gbar | 0:3695886f3495 | 56 | volume = 1; |
p07gbar | 0:3695886f3495 | 57 | } |
p07gbar | 0:3695886f3495 | 58 | |
p07gbar | 0:3695886f3495 | 59 | WavPlayer::WavPlayer(FILE **fpp):flag_play(true), i2s(I2S_TRANSMIT, p5, p6, p7), codec(p9, p10)//, ext_flag(p22), //run_flag(p23) |
p07gbar | 0:3695886f3495 | 60 | { |
p07gbar | 0:3695886f3495 | 61 | instance = this; |
p07gbar | 0:3695886f3495 | 62 | codec.power(true); //power up TLV apart from analogue input |
p07gbar | 0:3695886f3495 | 63 | codec.stop(); |
p07gbar | 0:3695886f3495 | 64 | codec.frequency(WAVPLAYER_OUTPUT_RATE); //set sample frequency |
p07gbar | 0:3695886f3495 | 65 | codec.wordsize(16); //set transfer protocol |
p07gbar | 0:3695886f3495 | 66 | codec.master(false); |
p07gbar | 0:3695886f3495 | 67 | codec.headphone_volume(0.6); |
p07gbar | 0:3695886f3495 | 68 | //interrupt come from the I2STXFIFO only |
p07gbar | 0:3695886f3495 | 69 | |
p07gbar | 0:3695886f3495 | 70 | i2s.masterslave(I2S_MASTER); |
p07gbar | 0:3695886f3495 | 71 | i2s.attach(&WavPlayer::i2sisr); |
p07gbar | 0:3695886f3495 | 72 | |
p07gbar | 0:3695886f3495 | 73 | i2s.wordsize(16); |
p07gbar | 0:3695886f3495 | 74 | i2s.stereomono(I2S_MONO); |
p07gbar | 0:3695886f3495 | 75 | |
p07gbar | 0:3695886f3495 | 76 | i2s.frequency(WAVPLAYER_OUTPUT_RATE); |
p07gbar | 0:3695886f3495 | 77 | |
p07gbar | 0:3695886f3495 | 78 | //ext_flag = false; |
p07gbar | 0:3695886f3495 | 79 | |
p07gbar | 0:3695886f3495 | 80 | flag_vol = false; |
p07gbar | 0:3695886f3495 | 81 | volume = 1; |
p07gbar | 0:3695886f3495 | 82 | open(fpp); |
p07gbar | 0:3695886f3495 | 83 | } |
p07gbar | 0:3695886f3495 | 84 | |
p07gbar | 0:3695886f3495 | 85 | void WavPlayer::i2sisr() |
p07gbar | 0:3695886f3495 | 86 | { |
p07gbar | 0:3695886f3495 | 87 | instance->i2sisr_(); |
p07gbar | 0:3695886f3495 | 88 | } |
p07gbar | 0:3695886f3495 | 89 | |
p07gbar | 0:3695886f3495 | 90 | void WavPlayer::i2sisr_() |
p07gbar | 0:3695886f3495 | 91 | { |
p07gbar | 0:3695886f3495 | 92 | int to_write = i2s.max_fifo_points() - i2s.fifo_points(); |
p07gbar | 0:3695886f3495 | 93 | int temp[32]; |
p07gbar | 0:3695886f3495 | 94 | /*for(int i = 0; i < 32; i++) |
p07gbar | 0:3695886f3495 | 95 | { |
p07gbar | 0:3695886f3495 | 96 | temp[i] = 0; |
p07gbar | 0:3695886f3495 | 97 | }*/ |
p07gbar | 0:3695886f3495 | 98 | int destore[2]; |
p07gbar | 0:3695886f3495 | 99 | if (rbuf.numberStored() > to_write + 8 && flag_play) |
p07gbar | 0:3695886f3495 | 100 | { |
p07gbar | 0:3695886f3495 | 101 | for (int i = 0; i < to_write; i += 2) |
p07gbar | 0:3695886f3495 | 102 | { |
p07gbar | 0:3695886f3495 | 103 | rbuf.readFirst(destore); |
p07gbar | 0:3695886f3495 | 104 | rbuf.usedFirst(); |
p07gbar | 0:3695886f3495 | 105 | temp[i] = destore[0]; |
p07gbar | 0:3695886f3495 | 106 | temp[i+1] = destore[1]; |
p07gbar | 0:3695886f3495 | 107 | } |
p07gbar | 0:3695886f3495 | 108 | |
p07gbar | 0:3695886f3495 | 109 | i2s.write(temp, to_write); |
p07gbar | 0:3695886f3495 | 110 | } |
p07gbar | 0:3695886f3495 | 111 | else |
p07gbar | 0:3695886f3495 | 112 | { |
p07gbar | 0:3695886f3495 | 113 | for (int i = 0; i < to_write; i++) |
p07gbar | 0:3695886f3495 | 114 | { |
p07gbar | 0:3695886f3495 | 115 | temp[i] = 0; |
p07gbar | 0:3695886f3495 | 116 | } |
p07gbar | 0:3695886f3495 | 117 | i2s.write(temp, to_write); |
p07gbar | 0:3695886f3495 | 118 | isr_underrun++; |
p07gbar | 0:3695886f3495 | 119 | |
p07gbar | 0:3695886f3495 | 120 | } |
p07gbar | 0:3695886f3495 | 121 | |
p07gbar | 0:3695886f3495 | 122 | } |
p07gbar | 0:3695886f3495 | 123 | |
p07gbar | 0:3695886f3495 | 124 | void WavPlayer::open(FILE **fpp) |
p07gbar | 0:3695886f3495 | 125 | { |
p07gbar | 0:3695886f3495 | 126 | filepp = fpp; |
p07gbar | 0:3695886f3495 | 127 | if (*filepp == NULL) |
p07gbar | 0:3695886f3495 | 128 | printf( |
p07gbar | 0:3695886f3495 | 129 | "Please open a file before passing the file pointer pointer...\n\r"); |
p07gbar | 0:3695886f3495 | 130 | char temp[4]; |
p07gbar | 0:3695886f3495 | 131 | fgets_m(temp, 4, *filepp); |
p07gbar | 0:3695886f3495 | 132 | debug_printf("%s\n\r", temp); |
p07gbar | 0:3695886f3495 | 133 | if (strcmp(temp, "RIFF") != 0) |
p07gbar | 0:3695886f3495 | 134 | printf("This is not a RIFF file\n\r"); |
p07gbar | 0:3695886f3495 | 135 | fseekread(*filepp, temp, 8, 4); |
p07gbar | 0:3695886f3495 | 136 | if (strcmp(temp, "WAVE") != 0) |
p07gbar | 0:3695886f3495 | 137 | printf("This is not a WAVE file\n\r"); |
p07gbar | 2:d54e6966fa2b | 138 | |
p07gbar | 2:d54e6966fa2b | 139 | current_time = 0; |
p07gbar | 2:d54e6966fa2b | 140 | |
p07gbar | 0:3695886f3495 | 141 | getConfig(); |
p07gbar | 0:3695886f3495 | 142 | } |
p07gbar | 0:3695886f3495 | 143 | |
p07gbar | 0:3695886f3495 | 144 | int WavPlayer::getConfig() |
p07gbar | 0:3695886f3495 | 145 | { |
p07gbar | 0:3695886f3495 | 146 | char temp[4]; |
p07gbar | 0:3695886f3495 | 147 | clear(temp, 4); |
p07gbar | 0:3695886f3495 | 148 | fseekread(*filepp, temp, 4, 4); |
p07gbar | 0:3695886f3495 | 149 | config.file_size = getu32(temp, 4); |
p07gbar | 0:3695886f3495 | 150 | debug_printf("FileSize = %i\n\r", config.file_size); |
p07gbar | 0:3695886f3495 | 151 | |
p07gbar | 0:3695886f3495 | 152 | int chunkstart = findChunk(*filepp, "fmt ", 4, config.file_size, 12); |
p07gbar | 0:3695886f3495 | 153 | |
p07gbar | 0:3695886f3495 | 154 | if (chunkstart != -1) |
p07gbar | 0:3695886f3495 | 155 | { |
p07gbar | 0:3695886f3495 | 156 | |
p07gbar | 0:3695886f3495 | 157 | config.format_tag = fsru16(*filepp, chunkstart + 8); |
p07gbar | 0:3695886f3495 | 158 | debug_printf("Format_tag: %i\n\r", config.format_tag); |
p07gbar | 0:3695886f3495 | 159 | |
p07gbar | 0:3695886f3495 | 160 | config.channels = fsru16(*filepp, chunkstart + 10); |
p07gbar | 0:3695886f3495 | 161 | debug_printf("nChannels: %i\n\r", config.channels); |
p07gbar | 0:3695886f3495 | 162 | |
p07gbar | 0:3695886f3495 | 163 | config.samples_per_sec = fsru32(*filepp, chunkstart + 12); |
p07gbar | 0:3695886f3495 | 164 | debug_printf("nSamplesPerSec: %i\n\r", config.samples_per_sec); |
p07gbar | 0:3695886f3495 | 165 | |
p07gbar | 0:3695886f3495 | 166 | config.avg_bytes_per_sec = fsru32(*filepp, chunkstart + 16); |
p07gbar | 0:3695886f3495 | 167 | debug_printf("avg_bytes_per_sec: %i\n\r", config.avg_bytes_per_sec); |
p07gbar | 0:3695886f3495 | 168 | |
p07gbar | 0:3695886f3495 | 169 | config.block_align = fsru16(*filepp, chunkstart + 20); |
p07gbar | 0:3695886f3495 | 170 | debug_printf("block_align: %i\n\r", config.block_align); |
p07gbar | 0:3695886f3495 | 171 | |
p07gbar | 0:3695886f3495 | 172 | config.bits_per_sample = fsru16(*filepp, chunkstart + 22); |
p07gbar | 0:3695886f3495 | 173 | debug_printf( |
p07gbar | 0:3695886f3495 | 174 | "bits per sample: %i\n\r", config.bits_per_sample); |
p07gbar | 0:3695886f3495 | 175 | |
p07gbar | 0:3695886f3495 | 176 | } |
p07gbar | 0:3695886f3495 | 177 | |
p07gbar | 0:3695886f3495 | 178 | chunkstart = findChunk(*filepp, "data", 4, config.file_size, 12); |
p07gbar | 0:3695886f3495 | 179 | |
p07gbar | 0:3695886f3495 | 180 | if (chunkstart != -1) |
p07gbar | 0:3695886f3495 | 181 | { |
p07gbar | 0:3695886f3495 | 182 | config.data_length = fsru32(*filepp, chunkstart + 4); |
p07gbar | 0:3695886f3495 | 183 | debug_printf("Data Length: %i\n\r", config.data_length); |
p07gbar | 0:3695886f3495 | 184 | } |
p07gbar | 0:3695886f3495 | 185 | return 0; |
p07gbar | 0:3695886f3495 | 186 | |
p07gbar | 0:3695886f3495 | 187 | } |
p07gbar | 0:3695886f3495 | 188 | |
p07gbar | 0:3695886f3495 | 189 | float WavPlayer::play() |
p07gbar | 0:3695886f3495 | 190 | { |
p07gbar | 0:3695886f3495 | 191 | return play(float(config.data_length) / float(config.samples_per_sec)); |
p07gbar | 0:3695886f3495 | 192 | |
p07gbar | 0:3695886f3495 | 193 | } |
p07gbar | 0:3695886f3495 | 194 | |
p07gbar | 0:3695886f3495 | 195 | float WavPlayer::play(float time) |
p07gbar | 0:3695886f3495 | 196 | { |
p07gbar | 0:3695886f3495 | 197 | return play(current_time, time); |
p07gbar | 0:3695886f3495 | 198 | } |
p07gbar | 0:3695886f3495 | 199 | |
p07gbar | 0:3695886f3495 | 200 | float WavPlayer::play(float start, float timefor) |
p07gbar | 0:3695886f3495 | 201 | { |
p07gbar | 0:3695886f3495 | 202 | |
p07gbar | 0:3695886f3495 | 203 | #if WAVPLAYER_GEN_TEST == 1 |
p07gbar | 0:3695886f3495 | 204 | config.channels = 1; |
p07gbar | 0:3695886f3495 | 205 | config.samples_per_sec = 48000; |
p07gbar | 0:3695886f3495 | 206 | #endif |
p07gbar | 0:3695886f3495 | 207 | |
p07gbar | 0:3695886f3495 | 208 | float timeElapsed = 0; |
p07gbar | 0:3695886f3495 | 209 | int endPoint = int((start + timefor) * float(config.samples_per_sec)); |
p07gbar | 0:3695886f3495 | 210 | if (endPoint * config.block_align >= config.data_length) |
p07gbar | 0:3695886f3495 | 211 | endPoint = config.data_length / config.block_align; |
p07gbar | 0:3695886f3495 | 212 | //printf("Will end after: %i samples \n\r", endPoint); |
p07gbar | 0:3695886f3495 | 213 | int point = int(start * float(config.samples_per_sec)); |
p07gbar | 0:3695886f3495 | 214 | bool valid = true; |
p07gbar | 0:3695886f3495 | 215 | flag_play = false; |
p07gbar | 0:3695886f3495 | 216 | int dataOffset = findChunk(*filepp, "data", 4, config.file_size, 12) + 8 + (point * config.block_align); |
p07gbar | 0:3695886f3495 | 217 | |
p07gbar | 0:3695886f3495 | 218 | double timeComp = 0; |
p07gbar | 0:3695886f3495 | 219 | |
p07gbar | 0:3695886f3495 | 220 | double out_rate_t_p = 1 / double(WAVPLAYER_OUTPUT_RATE); |
p07gbar | 0:3695886f3495 | 221 | //printf("out_rate_t_p = %f\n\r", out_rate_t_p); |
p07gbar | 0:3695886f3495 | 222 | double out_rate_t_n = -1 / double(WAVPLAYER_OUTPUT_RATE); |
p07gbar | 0:3695886f3495 | 223 | double in_rate = 1 / double(config.samples_per_sec); //0.0000125 |
p07gbar | 0:3695886f3495 | 224 | //printf("in_rate = %f\n\r", in_rate); |
p07gbar | 0:3695886f3495 | 225 | |
p07gbar | 0:3695886f3495 | 226 | float phase = 0; |
p07gbar | 0:3695886f3495 | 227 | |
p07gbar | 0:3695886f3495 | 228 | if (dataOffset != -1) |
p07gbar | 0:3695886f3495 | 229 | { |
p07gbar | 0:3695886f3495 | 230 | fseek(*filepp, dataOffset, SEEK_SET); |
p07gbar | 0:3695886f3495 | 231 | |
p07gbar | 0:3695886f3495 | 232 | int16_t buffer[WAVPLAYER_PLAYER_BUF]; |
p07gbar | 0:3695886f3495 | 233 | |
p07gbar | 0:3695886f3495 | 234 | codec.start(); |
p07gbar | 0:3695886f3495 | 235 | //debug_printf("Expecting isr\n\r"); |
p07gbar | 0:3695886f3495 | 236 | |
p07gbar | 0:3695886f3495 | 237 | i2s.frequency(WAVPLAYER_OUTPUT_RATE); |
p07gbar | 0:3695886f3495 | 238 | |
p07gbar | 0:3695886f3495 | 239 | |
p07gbar | 0:3695886f3495 | 240 | if (config.channels == 1) |
p07gbar | 0:3695886f3495 | 241 | { |
p07gbar | 0:3695886f3495 | 242 | stereo = false; |
p07gbar | 0:3695886f3495 | 243 | i2s.stereomono(I2S_MONO); |
p07gbar | 0:3695886f3495 | 244 | } |
p07gbar | 0:3695886f3495 | 245 | else |
p07gbar | 0:3695886f3495 | 246 | { |
p07gbar | 0:3695886f3495 | 247 | stereo =true; |
p07gbar | 0:3695886f3495 | 248 | i2s.stereomono(I2S_STEREO); |
p07gbar | 0:3695886f3495 | 249 | } |
p07gbar | 0:3695886f3495 | 250 | |
p07gbar | 0:3695886f3495 | 251 | i2s.attach(&WavPlayer::i2sisr); |
p07gbar | 0:3695886f3495 | 252 | i2s.start(); |
p07gbar | 0:3695886f3495 | 253 | flag_play = true; |
p07gbar | 0:3695886f3495 | 254 | |
p07gbar | 0:3695886f3495 | 255 | while (valid && point < endPoint) |
p07gbar | 0:3695886f3495 | 256 | { |
p07gbar | 0:3695886f3495 | 257 | if (rbuf.numberStored() < RBLENGTH - 10) |
p07gbar | 0:3695886f3495 | 258 | { |
p07gbar | 0:3695886f3495 | 259 | |
p07gbar | 0:3695886f3495 | 260 | //timer.reset(); |
p07gbar | 0:3695886f3495 | 261 | //timer.start(); |
p07gbar | 0:3695886f3495 | 262 | int numToread = WAVPLAYER_PLAYER_BUF; |
p07gbar | 0:3695886f3495 | 263 | if (numToread > (RBLENGTH - 10) - rbuf.numberStored()) |
p07gbar | 0:3695886f3495 | 264 | { |
p07gbar | 0:3695886f3495 | 265 | numToread = (RBLENGTH - 10) - rbuf.numberStored(); |
p07gbar | 0:3695886f3495 | 266 | } |
p07gbar | 0:3695886f3495 | 267 | if (numToread + (point * (config.block_align/config.channels)) > config.data_length) |
p07gbar | 0:3695886f3495 | 268 | { |
p07gbar | 0:3695886f3495 | 269 | numToread = config.data_length - point * config.block_align; |
p07gbar | 0:3695886f3495 | 270 | valid = false; |
p07gbar | 0:3695886f3495 | 271 | debug_printf("EOF detected\n\r"); |
p07gbar | 0:3695886f3495 | 272 | } |
p07gbar | 0:3695886f3495 | 273 | if(numToread % 2 == 1) numToread--; |
p07gbar | 0:3695886f3495 | 274 | //printf("Generating\n\r"); |
p07gbar | 0:3695886f3495 | 275 | //run_flag = true; |
p07gbar | 0:3695886f3495 | 276 | //phase = sine_gen(buffer,numToread,float(config.samples_per_sec)/120,phase); |
p07gbar | 0:3695886f3495 | 277 | timer.reset(); |
p07gbar | 0:3695886f3495 | 278 | timer.start(); |
p07gbar | 0:3695886f3495 | 279 | //fread(buffer, config.block_align/config.channels, numToread, *filepp); |
p07gbar | 0:3695886f3495 | 280 | #if WAVPLAYER_GEN_TEST == 1 |
p07gbar | 0:3695886f3495 | 281 | phase = sine_gen(buffer,numToread,float(config.samples_per_sec)/WAVPLAYER_GEN_FREQ,phase); |
p07gbar | 0:3695886f3495 | 282 | #else |
p07gbar | 0:3695886f3495 | 283 | fread(buffer, config.block_align/config.channels, numToread, *filepp); |
p07gbar | 0:3695886f3495 | 284 | #endif |
p07gbar | 0:3695886f3495 | 285 | timer.stop(); |
p07gbar | 0:3695886f3495 | 286 | //printf("numToread:%f\n\r",float(numToread)); |
p07gbar | 0:3695886f3495 | 287 | if(numToread>=10) |
p07gbar | 0:3695886f3495 | 288 | { |
p07gbar | 0:3695886f3495 | 289 | read_time += (timer.read()/float(numToread)); |
p07gbar | 0:3695886f3495 | 290 | read_time_div += 1; |
p07gbar | 0:3695886f3495 | 291 | } |
p07gbar | 0:3695886f3495 | 292 | |
p07gbar | 0:3695886f3495 | 293 | |
p07gbar | 0:3695886f3495 | 294 | if(read_time/float(read_time_div) >= WAVPLAYER_READ_MARGIN / float(config.samples_per_sec*config.channels)) |
p07gbar | 0:3695886f3495 | 295 | { |
p07gbar | 0:3695886f3495 | 296 | slow_count++; |
p07gbar | 0:3695886f3495 | 297 | if(slow_count > WAVLPAYER_SLOW_MARGIN) |
p07gbar | 0:3695886f3495 | 298 | { |
p07gbar | 0:3695886f3495 | 299 | printf("Data rates not high enough to sustain read...%f seconds per read\n\r", read_time/float(read_time_div)); |
p07gbar | 0:3695886f3495 | 300 | valid = false; |
p07gbar | 0:3695886f3495 | 301 | break; |
p07gbar | 0:3695886f3495 | 302 | } |
p07gbar | 0:3695886f3495 | 303 | |
p07gbar | 0:3695886f3495 | 304 | } |
p07gbar | 0:3695886f3495 | 305 | |
p07gbar | 0:3695886f3495 | 306 | //run_flag = false; |
p07gbar | 0:3695886f3495 | 307 | int storer[2]; |
p07gbar | 0:3695886f3495 | 308 | for (int i = 0; i < numToread; i += 2) |
p07gbar | 0:3695886f3495 | 309 | { |
p07gbar | 0:3695886f3495 | 310 | |
p07gbar | 0:3695886f3495 | 311 | //run_flag = true; |
p07gbar | 0:3695886f3495 | 312 | |
p07gbar | 0:3695886f3495 | 313 | if (timeComp < out_rate_t_p && timeComp > out_rate_t_n) |
p07gbar | 0:3695886f3495 | 314 | { |
p07gbar | 0:3695886f3495 | 315 | storer[0] = (int) buffer[i]; |
p07gbar | 0:3695886f3495 | 316 | storer[1] = (int) buffer[i + 1]; |
p07gbar | 0:3695886f3495 | 317 | |
p07gbar | 0:3695886f3495 | 318 | //storer[0] = blip; |
p07gbar | 0:3695886f3495 | 319 | //storer[1] = blip; |
p07gbar | 0:3695886f3495 | 320 | timeComp += in_rate; |
p07gbar | 0:3695886f3495 | 321 | while (rbuf.numberStored() > RBLENGTH - 10) |
p07gbar | 0:3695886f3495 | 322 | { |
p07gbar | 0:3695886f3495 | 323 | //run_flag = true; |
p07gbar | 0:3695886f3495 | 324 | //run_flag = false; |
p07gbar | 0:3695886f3495 | 325 | } |
p07gbar | 0:3695886f3495 | 326 | rbuf.addToBuffer(storer); |
p07gbar | 0:3695886f3495 | 327 | timeComp -= out_rate_t_p; |
p07gbar | 0:3695886f3495 | 328 | //printf(",",timeComp); |
p07gbar | 0:3695886f3495 | 329 | point++; |
p07gbar | 0:3695886f3495 | 330 | //printf("straight %f\n\r",timeComp); |
p07gbar | 0:3695886f3495 | 331 | } |
p07gbar | 0:3695886f3495 | 332 | else if (timeComp >= out_rate_t_p) |
p07gbar | 0:3695886f3495 | 333 | { |
p07gbar | 0:3695886f3495 | 334 | |
p07gbar | 0:3695886f3495 | 335 | storer[0] = (int) buffer[i]; |
p07gbar | 0:3695886f3495 | 336 | storer[1] = (int) buffer[i + 1]; |
p07gbar | 0:3695886f3495 | 337 | |
p07gbar | 0:3695886f3495 | 338 | //storer[0] = blip; |
p07gbar | 0:3695886f3495 | 339 | //storer[1] = blip; |
p07gbar | 0:3695886f3495 | 340 | |
p07gbar | 0:3695886f3495 | 341 | timeComp += in_rate; |
p07gbar | 0:3695886f3495 | 342 | /*const float ct = 5; |
p07gbar | 0:3695886f3495 | 343 | float c = 0; |
p07gbar | 0:3695886f3495 | 344 | float bufi = float(buffer[i]); |
p07gbar | 0:3695886f3495 | 345 | float bufip = float((i+1 >= numToread) ? buffer[i+1] : bufi);*/ |
p07gbar | 0:3695886f3495 | 346 | |
p07gbar | 0:3695886f3495 | 347 | while (timeComp >= out_rate_t_p) |
p07gbar | 0:3695886f3495 | 348 | { |
p07gbar | 0:3695886f3495 | 349 | //storer[0] = int((((ct-c)/ct)*bufi)+((c/ct)*bufip)); |
p07gbar | 0:3695886f3495 | 350 | while (rbuf.numberStored() > RBLENGTH - 10) |
p07gbar | 0:3695886f3495 | 351 | { |
p07gbar | 0:3695886f3495 | 352 | //run_flag = true; |
p07gbar | 0:3695886f3495 | 353 | //run_flag = false; |
p07gbar | 0:3695886f3495 | 354 | } |
p07gbar | 0:3695886f3495 | 355 | rbuf.addToBuffer(storer); |
p07gbar | 0:3695886f3495 | 356 | timeComp -= out_rate_t_p; |
p07gbar | 0:3695886f3495 | 357 | //printf(";"); |
p07gbar | 0:3695886f3495 | 358 | //if(c < ct) c++; |
p07gbar | 0:3695886f3495 | 359 | } |
p07gbar | 0:3695886f3495 | 360 | point++; |
p07gbar | 0:3695886f3495 | 361 | |
p07gbar | 0:3695886f3495 | 362 | } |
p07gbar | 0:3695886f3495 | 363 | else if (timeComp <= out_rate_t_n) |
p07gbar | 0:3695886f3495 | 364 | { |
p07gbar | 0:3695886f3495 | 365 | timeComp += in_rate; |
p07gbar | 0:3695886f3495 | 366 | //printf("-"); |
p07gbar | 0:3695886f3495 | 367 | } |
p07gbar | 0:3695886f3495 | 368 | |
p07gbar | 0:3695886f3495 | 369 | //storer[1] = 0; |
p07gbar | 0:3695886f3495 | 370 | //if(i%1 == 0) printf("%i\n",int(storer[0]),int(storer[1])); |
p07gbar | 0:3695886f3495 | 371 | //run_flag = false; |
p07gbar | 0:3695886f3495 | 372 | |
p07gbar | 0:3695886f3495 | 373 | } |
p07gbar | 0:3695886f3495 | 374 | flag_play = true; |
p07gbar | 0:3695886f3495 | 375 | //timer.stop(); |
p07gbar | 0:3695886f3495 | 376 | //printf("point: %i\n\r",isr_underrun); |
p07gbar | 0:3695886f3495 | 377 | //read_time += timer; |
p07gbar | 0:3695886f3495 | 378 | //read_time_div =numToread; |
p07gbar | 0:3695886f3495 | 379 | |
p07gbar | 0:3695886f3495 | 380 | } |
p07gbar | 0:3695886f3495 | 381 | } |
p07gbar | 0:3695886f3495 | 382 | } |
p07gbar | 0:3695886f3495 | 383 | flag_play = false; |
p07gbar | 0:3695886f3495 | 384 | current_time = float(point)/float(config.samples_per_sec); |
p07gbar | 0:3695886f3495 | 385 | return current_time; |
p07gbar | 0:3695886f3495 | 386 | } |
p07gbar | 0:3695886f3495 | 387 | |
p07gbar | 0:3695886f3495 | 388 | int WavPlayer::fseekread(FILE *fp, char* str, int offset, int len) |
p07gbar | 0:3695886f3495 | 389 | { |
p07gbar | 0:3695886f3495 | 390 | fseek(fp, offset, SEEK_SET); |
p07gbar | 0:3695886f3495 | 391 | fgets_m(str, len, fp); |
p07gbar | 0:3695886f3495 | 392 | return len; |
p07gbar | 0:3695886f3495 | 393 | } |
p07gbar | 0:3695886f3495 | 394 | |
p07gbar | 0:3695886f3495 | 395 | uint32_t WavPlayer::getu32(char str[], int len) |
p07gbar | 0:3695886f3495 | 396 | { |
p07gbar | 0:3695886f3495 | 397 | uint32_t temp = 0; |
p07gbar | 0:3695886f3495 | 398 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 399 | { |
p07gbar | 0:3695886f3495 | 400 | temp += str[i] << (i * 8); |
p07gbar | 0:3695886f3495 | 401 | |
p07gbar | 0:3695886f3495 | 402 | } |
p07gbar | 0:3695886f3495 | 403 | return temp; |
p07gbar | 0:3695886f3495 | 404 | } |
p07gbar | 0:3695886f3495 | 405 | |
p07gbar | 0:3695886f3495 | 406 | uint16_t WavPlayer::getu16(char str[], int len) |
p07gbar | 0:3695886f3495 | 407 | { |
p07gbar | 0:3695886f3495 | 408 | uint16_t temp = 0; |
p07gbar | 0:3695886f3495 | 409 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 410 | { |
p07gbar | 0:3695886f3495 | 411 | temp += str[i] << (i * 8); |
p07gbar | 0:3695886f3495 | 412 | } |
p07gbar | 0:3695886f3495 | 413 | return temp; |
p07gbar | 0:3695886f3495 | 414 | } |
p07gbar | 0:3695886f3495 | 415 | |
p07gbar | 0:3695886f3495 | 416 | int32_t WavPlayer::get32(char str[], int len) |
p07gbar | 0:3695886f3495 | 417 | { |
p07gbar | 0:3695886f3495 | 418 | uint32_t temp = 0; |
p07gbar | 0:3695886f3495 | 419 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 420 | { |
p07gbar | 0:3695886f3495 | 421 | temp += str[i] << (i * 8); |
p07gbar | 0:3695886f3495 | 422 | |
p07gbar | 0:3695886f3495 | 423 | } |
p07gbar | 0:3695886f3495 | 424 | return temp; |
p07gbar | 0:3695886f3495 | 425 | } |
p07gbar | 0:3695886f3495 | 426 | |
p07gbar | 0:3695886f3495 | 427 | int16_t WavPlayer::get16(char str[], int len) |
p07gbar | 0:3695886f3495 | 428 | { |
p07gbar | 0:3695886f3495 | 429 | uint16_t temp = 0; |
p07gbar | 0:3695886f3495 | 430 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 431 | { |
p07gbar | 0:3695886f3495 | 432 | temp += str[i] << (i * 8); |
p07gbar | 0:3695886f3495 | 433 | } |
p07gbar | 0:3695886f3495 | 434 | return temp; |
p07gbar | 0:3695886f3495 | 435 | } |
p07gbar | 0:3695886f3495 | 436 | |
p07gbar | 0:3695886f3495 | 437 | uint32_t WavPlayer::fsru32(FILE *fp, int offset, int len) |
p07gbar | 0:3695886f3495 | 438 | { |
p07gbar | 0:3695886f3495 | 439 | char temp[4]; |
p07gbar | 0:3695886f3495 | 440 | fseekread(fp, temp, offset, len); |
p07gbar | 0:3695886f3495 | 441 | return getu32(temp, len); |
p07gbar | 0:3695886f3495 | 442 | } |
p07gbar | 0:3695886f3495 | 443 | |
p07gbar | 0:3695886f3495 | 444 | uint16_t WavPlayer::fsru16(FILE *fp, int offset, int len) |
p07gbar | 0:3695886f3495 | 445 | { |
p07gbar | 0:3695886f3495 | 446 | char temp[2]; |
p07gbar | 0:3695886f3495 | 447 | fseekread(fp, temp, offset, len); |
p07gbar | 0:3695886f3495 | 448 | return getu16(temp, len); |
p07gbar | 0:3695886f3495 | 449 | } |
p07gbar | 0:3695886f3495 | 450 | |
p07gbar | 0:3695886f3495 | 451 | void WavPlayer::clear(char* str, int len) |
p07gbar | 0:3695886f3495 | 452 | { |
p07gbar | 0:3695886f3495 | 453 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 454 | { |
p07gbar | 0:3695886f3495 | 455 | str[i] = 0; |
p07gbar | 0:3695886f3495 | 456 | } |
p07gbar | 0:3695886f3495 | 457 | } |
p07gbar | 0:3695886f3495 | 458 | |
p07gbar | 0:3695886f3495 | 459 | int WavPlayer::findChunk(FILE *fp, char* match, int len, int fileSize, |
p07gbar | 0:3695886f3495 | 460 | int startOffset) |
p07gbar | 0:3695886f3495 | 461 | { |
p07gbar | 0:3695886f3495 | 462 | char temp[5]; |
p07gbar | 0:3695886f3495 | 463 | int count = startOffset; |
p07gbar | 0:3695886f3495 | 464 | while ((count + 8) < fileSize) |
p07gbar | 0:3695886f3495 | 465 | { |
p07gbar | 0:3695886f3495 | 466 | clear(temp, 5); |
p07gbar | 0:3695886f3495 | 467 | fseekread(fp, temp, count, 4); |
p07gbar | 0:3695886f3495 | 468 | int chunksize = fsru32(fp, count + 4) + 8; |
p07gbar | 0:3695886f3495 | 469 | //debug_printf("@ %i Chunk Name: %s Size: %i\n\r", count, temp, chunksize); |
p07gbar | 0:3695886f3495 | 470 | |
p07gbar | 0:3695886f3495 | 471 | if (strcmp(temp, match) == 0) |
p07gbar | 0:3695886f3495 | 472 | { |
p07gbar | 0:3695886f3495 | 473 | return count; |
p07gbar | 0:3695886f3495 | 474 | } |
p07gbar | 0:3695886f3495 | 475 | count += chunksize; |
p07gbar | 0:3695886f3495 | 476 | } |
p07gbar | 0:3695886f3495 | 477 | return -1; |
p07gbar | 0:3695886f3495 | 478 | } |
p07gbar | 0:3695886f3495 | 479 | |
p07gbar | 0:3695886f3495 | 480 | int WavPlayer::findChunk(FILE *fp, char* match, int len, int startOffset) |
p07gbar | 0:3695886f3495 | 481 | { |
p07gbar | 0:3695886f3495 | 482 | return findChunk(fp, match, len, config.file_size, startOffset); |
p07gbar | 0:3695886f3495 | 483 | } |
p07gbar | 0:3695886f3495 | 484 | |
p07gbar | 0:3695886f3495 | 485 | void WavPlayer::fgets_m(char* str, int num, FILE* fp) |
p07gbar | 0:3695886f3495 | 486 | { |
p07gbar | 0:3695886f3495 | 487 | for (int i = 0; i < num; i++) |
p07gbar | 0:3695886f3495 | 488 | { |
p07gbar | 0:3695886f3495 | 489 | str[i] = fgetc(fp); |
p07gbar | 0:3695886f3495 | 490 | //printf("%c",str[i]); |
p07gbar | 0:3695886f3495 | 491 | } |
p07gbar | 0:3695886f3495 | 492 | } |
p07gbar | 0:3695886f3495 | 493 | |
p07gbar | 0:3695886f3495 | 494 | float WavPlayer::sine_gen(int16_t* buf, int len, float div, float phase) |
p07gbar | 0:3695886f3495 | 495 | { |
p07gbar | 0:3695886f3495 | 496 | #if WAVPLAYER_GEN_TEST == 1 |
p07gbar | 0:3695886f3495 | 497 | float t = SINE16LENGTH / div; |
p07gbar | 0:3695886f3495 | 498 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 499 | { |
p07gbar | 0:3695886f3495 | 500 | buf[i] = sine16lookup[int(phase)]; |
p07gbar | 0:3695886f3495 | 501 | //printf("%i\n\r",buf[i]); |
p07gbar | 0:3695886f3495 | 502 | phase += t; |
p07gbar | 0:3695886f3495 | 503 | while (phase >= SINE16LENGTH) |
p07gbar | 0:3695886f3495 | 504 | phase -= SINE16LENGTH; |
p07gbar | 0:3695886f3495 | 505 | } |
p07gbar | 0:3695886f3495 | 506 | #endif |
p07gbar | 0:3695886f3495 | 507 | return phase; |
p07gbar | 0:3695886f3495 | 508 | } |