A library which allows the playing of Wav files using the TLV320
Dependents: RSALB_hbridge_helloworld RSALB_lobster WavPlayer_test AudioCODEC_HelloWorld
WavPlayer.cpp@0:3695886f3495, 2012-09-19 (annotated)
- Committer:
- p07gbar
- Date:
- Wed Sep 19 10:58:16 2012 +0000
- Revision:
- 0:3695886f3495
- Child:
- 2:d54e6966fa2b
Working stably
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 | 0:3695886f3495 | 7 | #define DEBUG 1 |
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 | 0:3695886f3495 | 138 | |
p07gbar | 0:3695886f3495 | 139 | getConfig(); |
p07gbar | 0:3695886f3495 | 140 | } |
p07gbar | 0:3695886f3495 | 141 | |
p07gbar | 0:3695886f3495 | 142 | int WavPlayer::getConfig() |
p07gbar | 0:3695886f3495 | 143 | { |
p07gbar | 0:3695886f3495 | 144 | char temp[4]; |
p07gbar | 0:3695886f3495 | 145 | clear(temp, 4); |
p07gbar | 0:3695886f3495 | 146 | fseekread(*filepp, temp, 4, 4); |
p07gbar | 0:3695886f3495 | 147 | config.file_size = getu32(temp, 4); |
p07gbar | 0:3695886f3495 | 148 | debug_printf("FileSize = %i\n\r", config.file_size); |
p07gbar | 0:3695886f3495 | 149 | |
p07gbar | 0:3695886f3495 | 150 | int chunkstart = findChunk(*filepp, "fmt ", 4, config.file_size, 12); |
p07gbar | 0:3695886f3495 | 151 | |
p07gbar | 0:3695886f3495 | 152 | if (chunkstart != -1) |
p07gbar | 0:3695886f3495 | 153 | { |
p07gbar | 0:3695886f3495 | 154 | |
p07gbar | 0:3695886f3495 | 155 | config.format_tag = fsru16(*filepp, chunkstart + 8); |
p07gbar | 0:3695886f3495 | 156 | debug_printf("Format_tag: %i\n\r", config.format_tag); |
p07gbar | 0:3695886f3495 | 157 | |
p07gbar | 0:3695886f3495 | 158 | config.channels = fsru16(*filepp, chunkstart + 10); |
p07gbar | 0:3695886f3495 | 159 | debug_printf("nChannels: %i\n\r", config.channels); |
p07gbar | 0:3695886f3495 | 160 | |
p07gbar | 0:3695886f3495 | 161 | config.samples_per_sec = fsru32(*filepp, chunkstart + 12); |
p07gbar | 0:3695886f3495 | 162 | debug_printf("nSamplesPerSec: %i\n\r", config.samples_per_sec); |
p07gbar | 0:3695886f3495 | 163 | |
p07gbar | 0:3695886f3495 | 164 | config.avg_bytes_per_sec = fsru32(*filepp, chunkstart + 16); |
p07gbar | 0:3695886f3495 | 165 | debug_printf("avg_bytes_per_sec: %i\n\r", config.avg_bytes_per_sec); |
p07gbar | 0:3695886f3495 | 166 | |
p07gbar | 0:3695886f3495 | 167 | config.block_align = fsru16(*filepp, chunkstart + 20); |
p07gbar | 0:3695886f3495 | 168 | debug_printf("block_align: %i\n\r", config.block_align); |
p07gbar | 0:3695886f3495 | 169 | |
p07gbar | 0:3695886f3495 | 170 | config.bits_per_sample = fsru16(*filepp, chunkstart + 22); |
p07gbar | 0:3695886f3495 | 171 | debug_printf( |
p07gbar | 0:3695886f3495 | 172 | "bits per sample: %i\n\r", config.bits_per_sample); |
p07gbar | 0:3695886f3495 | 173 | |
p07gbar | 0:3695886f3495 | 174 | } |
p07gbar | 0:3695886f3495 | 175 | |
p07gbar | 0:3695886f3495 | 176 | chunkstart = findChunk(*filepp, "data", 4, config.file_size, 12); |
p07gbar | 0:3695886f3495 | 177 | |
p07gbar | 0:3695886f3495 | 178 | if (chunkstart != -1) |
p07gbar | 0:3695886f3495 | 179 | { |
p07gbar | 0:3695886f3495 | 180 | config.data_length = fsru32(*filepp, chunkstart + 4); |
p07gbar | 0:3695886f3495 | 181 | debug_printf("Data Length: %i\n\r", config.data_length); |
p07gbar | 0:3695886f3495 | 182 | } |
p07gbar | 0:3695886f3495 | 183 | return 0; |
p07gbar | 0:3695886f3495 | 184 | |
p07gbar | 0:3695886f3495 | 185 | } |
p07gbar | 0:3695886f3495 | 186 | |
p07gbar | 0:3695886f3495 | 187 | float WavPlayer::play() |
p07gbar | 0:3695886f3495 | 188 | { |
p07gbar | 0:3695886f3495 | 189 | return play(float(config.data_length) / float(config.samples_per_sec)); |
p07gbar | 0:3695886f3495 | 190 | |
p07gbar | 0:3695886f3495 | 191 | } |
p07gbar | 0:3695886f3495 | 192 | |
p07gbar | 0:3695886f3495 | 193 | float WavPlayer::play(float time) |
p07gbar | 0:3695886f3495 | 194 | { |
p07gbar | 0:3695886f3495 | 195 | return play(current_time, time); |
p07gbar | 0:3695886f3495 | 196 | } |
p07gbar | 0:3695886f3495 | 197 | |
p07gbar | 0:3695886f3495 | 198 | float WavPlayer::play(float start, float timefor) |
p07gbar | 0:3695886f3495 | 199 | { |
p07gbar | 0:3695886f3495 | 200 | |
p07gbar | 0:3695886f3495 | 201 | #if WAVPLAYER_GEN_TEST == 1 |
p07gbar | 0:3695886f3495 | 202 | config.channels = 1; |
p07gbar | 0:3695886f3495 | 203 | config.samples_per_sec = 48000; |
p07gbar | 0:3695886f3495 | 204 | #endif |
p07gbar | 0:3695886f3495 | 205 | |
p07gbar | 0:3695886f3495 | 206 | float timeElapsed = 0; |
p07gbar | 0:3695886f3495 | 207 | int endPoint = int((start + timefor) * float(config.samples_per_sec)); |
p07gbar | 0:3695886f3495 | 208 | if (endPoint * config.block_align >= config.data_length) |
p07gbar | 0:3695886f3495 | 209 | endPoint = config.data_length / config.block_align; |
p07gbar | 0:3695886f3495 | 210 | //printf("Will end after: %i samples \n\r", endPoint); |
p07gbar | 0:3695886f3495 | 211 | int point = int(start * float(config.samples_per_sec)); |
p07gbar | 0:3695886f3495 | 212 | bool valid = true; |
p07gbar | 0:3695886f3495 | 213 | flag_play = false; |
p07gbar | 0:3695886f3495 | 214 | int dataOffset = findChunk(*filepp, "data", 4, config.file_size, 12) + 8 + (point * config.block_align); |
p07gbar | 0:3695886f3495 | 215 | |
p07gbar | 0:3695886f3495 | 216 | double timeComp = 0; |
p07gbar | 0:3695886f3495 | 217 | |
p07gbar | 0:3695886f3495 | 218 | double out_rate_t_p = 1 / double(WAVPLAYER_OUTPUT_RATE); |
p07gbar | 0:3695886f3495 | 219 | //printf("out_rate_t_p = %f\n\r", out_rate_t_p); |
p07gbar | 0:3695886f3495 | 220 | double out_rate_t_n = -1 / double(WAVPLAYER_OUTPUT_RATE); |
p07gbar | 0:3695886f3495 | 221 | double in_rate = 1 / double(config.samples_per_sec); //0.0000125 |
p07gbar | 0:3695886f3495 | 222 | //printf("in_rate = %f\n\r", in_rate); |
p07gbar | 0:3695886f3495 | 223 | |
p07gbar | 0:3695886f3495 | 224 | float phase = 0; |
p07gbar | 0:3695886f3495 | 225 | |
p07gbar | 0:3695886f3495 | 226 | if (dataOffset != -1) |
p07gbar | 0:3695886f3495 | 227 | { |
p07gbar | 0:3695886f3495 | 228 | fseek(*filepp, dataOffset, SEEK_SET); |
p07gbar | 0:3695886f3495 | 229 | |
p07gbar | 0:3695886f3495 | 230 | int16_t buffer[WAVPLAYER_PLAYER_BUF]; |
p07gbar | 0:3695886f3495 | 231 | |
p07gbar | 0:3695886f3495 | 232 | codec.start(); |
p07gbar | 0:3695886f3495 | 233 | //debug_printf("Expecting isr\n\r"); |
p07gbar | 0:3695886f3495 | 234 | |
p07gbar | 0:3695886f3495 | 235 | i2s.frequency(WAVPLAYER_OUTPUT_RATE); |
p07gbar | 0:3695886f3495 | 236 | |
p07gbar | 0:3695886f3495 | 237 | |
p07gbar | 0:3695886f3495 | 238 | if (config.channels == 1) |
p07gbar | 0:3695886f3495 | 239 | { |
p07gbar | 0:3695886f3495 | 240 | stereo = false; |
p07gbar | 0:3695886f3495 | 241 | i2s.stereomono(I2S_MONO); |
p07gbar | 0:3695886f3495 | 242 | } |
p07gbar | 0:3695886f3495 | 243 | else |
p07gbar | 0:3695886f3495 | 244 | { |
p07gbar | 0:3695886f3495 | 245 | stereo =true; |
p07gbar | 0:3695886f3495 | 246 | i2s.stereomono(I2S_STEREO); |
p07gbar | 0:3695886f3495 | 247 | } |
p07gbar | 0:3695886f3495 | 248 | |
p07gbar | 0:3695886f3495 | 249 | i2s.attach(&WavPlayer::i2sisr); |
p07gbar | 0:3695886f3495 | 250 | i2s.start(); |
p07gbar | 0:3695886f3495 | 251 | flag_play = true; |
p07gbar | 0:3695886f3495 | 252 | |
p07gbar | 0:3695886f3495 | 253 | while (valid && point < endPoint) |
p07gbar | 0:3695886f3495 | 254 | { |
p07gbar | 0:3695886f3495 | 255 | if (rbuf.numberStored() < RBLENGTH - 10) |
p07gbar | 0:3695886f3495 | 256 | { |
p07gbar | 0:3695886f3495 | 257 | |
p07gbar | 0:3695886f3495 | 258 | //timer.reset(); |
p07gbar | 0:3695886f3495 | 259 | //timer.start(); |
p07gbar | 0:3695886f3495 | 260 | int numToread = WAVPLAYER_PLAYER_BUF; |
p07gbar | 0:3695886f3495 | 261 | if (numToread > (RBLENGTH - 10) - rbuf.numberStored()) |
p07gbar | 0:3695886f3495 | 262 | { |
p07gbar | 0:3695886f3495 | 263 | numToread = (RBLENGTH - 10) - rbuf.numberStored(); |
p07gbar | 0:3695886f3495 | 264 | } |
p07gbar | 0:3695886f3495 | 265 | if (numToread + (point * (config.block_align/config.channels)) > config.data_length) |
p07gbar | 0:3695886f3495 | 266 | { |
p07gbar | 0:3695886f3495 | 267 | numToread = config.data_length - point * config.block_align; |
p07gbar | 0:3695886f3495 | 268 | valid = false; |
p07gbar | 0:3695886f3495 | 269 | debug_printf("EOF detected\n\r"); |
p07gbar | 0:3695886f3495 | 270 | } |
p07gbar | 0:3695886f3495 | 271 | if(numToread % 2 == 1) numToread--; |
p07gbar | 0:3695886f3495 | 272 | //printf("Generating\n\r"); |
p07gbar | 0:3695886f3495 | 273 | //run_flag = true; |
p07gbar | 0:3695886f3495 | 274 | //phase = sine_gen(buffer,numToread,float(config.samples_per_sec)/120,phase); |
p07gbar | 0:3695886f3495 | 275 | timer.reset(); |
p07gbar | 0:3695886f3495 | 276 | timer.start(); |
p07gbar | 0:3695886f3495 | 277 | //fread(buffer, config.block_align/config.channels, numToread, *filepp); |
p07gbar | 0:3695886f3495 | 278 | #if WAVPLAYER_GEN_TEST == 1 |
p07gbar | 0:3695886f3495 | 279 | phase = sine_gen(buffer,numToread,float(config.samples_per_sec)/WAVPLAYER_GEN_FREQ,phase); |
p07gbar | 0:3695886f3495 | 280 | #else |
p07gbar | 0:3695886f3495 | 281 | fread(buffer, config.block_align/config.channels, numToread, *filepp); |
p07gbar | 0:3695886f3495 | 282 | #endif |
p07gbar | 0:3695886f3495 | 283 | timer.stop(); |
p07gbar | 0:3695886f3495 | 284 | //printf("numToread:%f\n\r",float(numToread)); |
p07gbar | 0:3695886f3495 | 285 | if(numToread>=10) |
p07gbar | 0:3695886f3495 | 286 | { |
p07gbar | 0:3695886f3495 | 287 | read_time += (timer.read()/float(numToread)); |
p07gbar | 0:3695886f3495 | 288 | read_time_div += 1; |
p07gbar | 0:3695886f3495 | 289 | } |
p07gbar | 0:3695886f3495 | 290 | |
p07gbar | 0:3695886f3495 | 291 | |
p07gbar | 0:3695886f3495 | 292 | if(read_time/float(read_time_div) >= WAVPLAYER_READ_MARGIN / float(config.samples_per_sec*config.channels)) |
p07gbar | 0:3695886f3495 | 293 | { |
p07gbar | 0:3695886f3495 | 294 | slow_count++; |
p07gbar | 0:3695886f3495 | 295 | if(slow_count > WAVLPAYER_SLOW_MARGIN) |
p07gbar | 0:3695886f3495 | 296 | { |
p07gbar | 0:3695886f3495 | 297 | printf("Data rates not high enough to sustain read...%f seconds per read\n\r", read_time/float(read_time_div)); |
p07gbar | 0:3695886f3495 | 298 | valid = false; |
p07gbar | 0:3695886f3495 | 299 | break; |
p07gbar | 0:3695886f3495 | 300 | } |
p07gbar | 0:3695886f3495 | 301 | |
p07gbar | 0:3695886f3495 | 302 | } |
p07gbar | 0:3695886f3495 | 303 | |
p07gbar | 0:3695886f3495 | 304 | //run_flag = false; |
p07gbar | 0:3695886f3495 | 305 | int storer[2]; |
p07gbar | 0:3695886f3495 | 306 | for (int i = 0; i < numToread; i += 2) |
p07gbar | 0:3695886f3495 | 307 | { |
p07gbar | 0:3695886f3495 | 308 | |
p07gbar | 0:3695886f3495 | 309 | //run_flag = true; |
p07gbar | 0:3695886f3495 | 310 | |
p07gbar | 0:3695886f3495 | 311 | if (timeComp < out_rate_t_p && timeComp > out_rate_t_n) |
p07gbar | 0:3695886f3495 | 312 | { |
p07gbar | 0:3695886f3495 | 313 | storer[0] = (int) buffer[i]; |
p07gbar | 0:3695886f3495 | 314 | storer[1] = (int) buffer[i + 1]; |
p07gbar | 0:3695886f3495 | 315 | |
p07gbar | 0:3695886f3495 | 316 | //storer[0] = blip; |
p07gbar | 0:3695886f3495 | 317 | //storer[1] = blip; |
p07gbar | 0:3695886f3495 | 318 | timeComp += in_rate; |
p07gbar | 0:3695886f3495 | 319 | while (rbuf.numberStored() > RBLENGTH - 10) |
p07gbar | 0:3695886f3495 | 320 | { |
p07gbar | 0:3695886f3495 | 321 | //run_flag = true; |
p07gbar | 0:3695886f3495 | 322 | //run_flag = false; |
p07gbar | 0:3695886f3495 | 323 | } |
p07gbar | 0:3695886f3495 | 324 | rbuf.addToBuffer(storer); |
p07gbar | 0:3695886f3495 | 325 | timeComp -= out_rate_t_p; |
p07gbar | 0:3695886f3495 | 326 | //printf(",",timeComp); |
p07gbar | 0:3695886f3495 | 327 | point++; |
p07gbar | 0:3695886f3495 | 328 | //printf("straight %f\n\r",timeComp); |
p07gbar | 0:3695886f3495 | 329 | } |
p07gbar | 0:3695886f3495 | 330 | else if (timeComp >= out_rate_t_p) |
p07gbar | 0:3695886f3495 | 331 | { |
p07gbar | 0:3695886f3495 | 332 | |
p07gbar | 0:3695886f3495 | 333 | storer[0] = (int) buffer[i]; |
p07gbar | 0:3695886f3495 | 334 | storer[1] = (int) buffer[i + 1]; |
p07gbar | 0:3695886f3495 | 335 | |
p07gbar | 0:3695886f3495 | 336 | //storer[0] = blip; |
p07gbar | 0:3695886f3495 | 337 | //storer[1] = blip; |
p07gbar | 0:3695886f3495 | 338 | |
p07gbar | 0:3695886f3495 | 339 | timeComp += in_rate; |
p07gbar | 0:3695886f3495 | 340 | /*const float ct = 5; |
p07gbar | 0:3695886f3495 | 341 | float c = 0; |
p07gbar | 0:3695886f3495 | 342 | float bufi = float(buffer[i]); |
p07gbar | 0:3695886f3495 | 343 | float bufip = float((i+1 >= numToread) ? buffer[i+1] : bufi);*/ |
p07gbar | 0:3695886f3495 | 344 | |
p07gbar | 0:3695886f3495 | 345 | while (timeComp >= out_rate_t_p) |
p07gbar | 0:3695886f3495 | 346 | { |
p07gbar | 0:3695886f3495 | 347 | //storer[0] = int((((ct-c)/ct)*bufi)+((c/ct)*bufip)); |
p07gbar | 0:3695886f3495 | 348 | while (rbuf.numberStored() > RBLENGTH - 10) |
p07gbar | 0:3695886f3495 | 349 | { |
p07gbar | 0:3695886f3495 | 350 | //run_flag = true; |
p07gbar | 0:3695886f3495 | 351 | //run_flag = false; |
p07gbar | 0:3695886f3495 | 352 | } |
p07gbar | 0:3695886f3495 | 353 | rbuf.addToBuffer(storer); |
p07gbar | 0:3695886f3495 | 354 | timeComp -= out_rate_t_p; |
p07gbar | 0:3695886f3495 | 355 | //printf(";"); |
p07gbar | 0:3695886f3495 | 356 | //if(c < ct) c++; |
p07gbar | 0:3695886f3495 | 357 | } |
p07gbar | 0:3695886f3495 | 358 | point++; |
p07gbar | 0:3695886f3495 | 359 | |
p07gbar | 0:3695886f3495 | 360 | } |
p07gbar | 0:3695886f3495 | 361 | else if (timeComp <= out_rate_t_n) |
p07gbar | 0:3695886f3495 | 362 | { |
p07gbar | 0:3695886f3495 | 363 | timeComp += in_rate; |
p07gbar | 0:3695886f3495 | 364 | //printf("-"); |
p07gbar | 0:3695886f3495 | 365 | } |
p07gbar | 0:3695886f3495 | 366 | |
p07gbar | 0:3695886f3495 | 367 | //storer[1] = 0; |
p07gbar | 0:3695886f3495 | 368 | //if(i%1 == 0) printf("%i\n",int(storer[0]),int(storer[1])); |
p07gbar | 0:3695886f3495 | 369 | //run_flag = false; |
p07gbar | 0:3695886f3495 | 370 | |
p07gbar | 0:3695886f3495 | 371 | } |
p07gbar | 0:3695886f3495 | 372 | flag_play = true; |
p07gbar | 0:3695886f3495 | 373 | //timer.stop(); |
p07gbar | 0:3695886f3495 | 374 | //printf("point: %i\n\r",isr_underrun); |
p07gbar | 0:3695886f3495 | 375 | //read_time += timer; |
p07gbar | 0:3695886f3495 | 376 | //read_time_div =numToread; |
p07gbar | 0:3695886f3495 | 377 | |
p07gbar | 0:3695886f3495 | 378 | } |
p07gbar | 0:3695886f3495 | 379 | } |
p07gbar | 0:3695886f3495 | 380 | } |
p07gbar | 0:3695886f3495 | 381 | flag_play = false; |
p07gbar | 0:3695886f3495 | 382 | current_time = float(point)/float(config.samples_per_sec); |
p07gbar | 0:3695886f3495 | 383 | return current_time; |
p07gbar | 0:3695886f3495 | 384 | } |
p07gbar | 0:3695886f3495 | 385 | |
p07gbar | 0:3695886f3495 | 386 | int WavPlayer::fseekread(FILE *fp, char* str, int offset, int len) |
p07gbar | 0:3695886f3495 | 387 | { |
p07gbar | 0:3695886f3495 | 388 | fseek(fp, offset, SEEK_SET); |
p07gbar | 0:3695886f3495 | 389 | fgets_m(str, len, fp); |
p07gbar | 0:3695886f3495 | 390 | return len; |
p07gbar | 0:3695886f3495 | 391 | } |
p07gbar | 0:3695886f3495 | 392 | |
p07gbar | 0:3695886f3495 | 393 | uint32_t WavPlayer::getu32(char str[], int len) |
p07gbar | 0:3695886f3495 | 394 | { |
p07gbar | 0:3695886f3495 | 395 | uint32_t temp = 0; |
p07gbar | 0:3695886f3495 | 396 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 397 | { |
p07gbar | 0:3695886f3495 | 398 | temp += str[i] << (i * 8); |
p07gbar | 0:3695886f3495 | 399 | |
p07gbar | 0:3695886f3495 | 400 | } |
p07gbar | 0:3695886f3495 | 401 | return temp; |
p07gbar | 0:3695886f3495 | 402 | } |
p07gbar | 0:3695886f3495 | 403 | |
p07gbar | 0:3695886f3495 | 404 | uint16_t WavPlayer::getu16(char str[], int len) |
p07gbar | 0:3695886f3495 | 405 | { |
p07gbar | 0:3695886f3495 | 406 | uint16_t temp = 0; |
p07gbar | 0:3695886f3495 | 407 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 408 | { |
p07gbar | 0:3695886f3495 | 409 | temp += str[i] << (i * 8); |
p07gbar | 0:3695886f3495 | 410 | } |
p07gbar | 0:3695886f3495 | 411 | return temp; |
p07gbar | 0:3695886f3495 | 412 | } |
p07gbar | 0:3695886f3495 | 413 | |
p07gbar | 0:3695886f3495 | 414 | int32_t WavPlayer::get32(char str[], int len) |
p07gbar | 0:3695886f3495 | 415 | { |
p07gbar | 0:3695886f3495 | 416 | uint32_t temp = 0; |
p07gbar | 0:3695886f3495 | 417 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 418 | { |
p07gbar | 0:3695886f3495 | 419 | temp += str[i] << (i * 8); |
p07gbar | 0:3695886f3495 | 420 | |
p07gbar | 0:3695886f3495 | 421 | } |
p07gbar | 0:3695886f3495 | 422 | return temp; |
p07gbar | 0:3695886f3495 | 423 | } |
p07gbar | 0:3695886f3495 | 424 | |
p07gbar | 0:3695886f3495 | 425 | int16_t WavPlayer::get16(char str[], int len) |
p07gbar | 0:3695886f3495 | 426 | { |
p07gbar | 0:3695886f3495 | 427 | uint16_t temp = 0; |
p07gbar | 0:3695886f3495 | 428 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 429 | { |
p07gbar | 0:3695886f3495 | 430 | temp += str[i] << (i * 8); |
p07gbar | 0:3695886f3495 | 431 | } |
p07gbar | 0:3695886f3495 | 432 | return temp; |
p07gbar | 0:3695886f3495 | 433 | } |
p07gbar | 0:3695886f3495 | 434 | |
p07gbar | 0:3695886f3495 | 435 | uint32_t WavPlayer::fsru32(FILE *fp, int offset, int len) |
p07gbar | 0:3695886f3495 | 436 | { |
p07gbar | 0:3695886f3495 | 437 | char temp[4]; |
p07gbar | 0:3695886f3495 | 438 | fseekread(fp, temp, offset, len); |
p07gbar | 0:3695886f3495 | 439 | return getu32(temp, len); |
p07gbar | 0:3695886f3495 | 440 | } |
p07gbar | 0:3695886f3495 | 441 | |
p07gbar | 0:3695886f3495 | 442 | uint16_t WavPlayer::fsru16(FILE *fp, int offset, int len) |
p07gbar | 0:3695886f3495 | 443 | { |
p07gbar | 0:3695886f3495 | 444 | char temp[2]; |
p07gbar | 0:3695886f3495 | 445 | fseekread(fp, temp, offset, len); |
p07gbar | 0:3695886f3495 | 446 | return getu16(temp, len); |
p07gbar | 0:3695886f3495 | 447 | } |
p07gbar | 0:3695886f3495 | 448 | |
p07gbar | 0:3695886f3495 | 449 | void WavPlayer::clear(char* str, int len) |
p07gbar | 0:3695886f3495 | 450 | { |
p07gbar | 0:3695886f3495 | 451 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 452 | { |
p07gbar | 0:3695886f3495 | 453 | str[i] = 0; |
p07gbar | 0:3695886f3495 | 454 | } |
p07gbar | 0:3695886f3495 | 455 | } |
p07gbar | 0:3695886f3495 | 456 | |
p07gbar | 0:3695886f3495 | 457 | int WavPlayer::findChunk(FILE *fp, char* match, int len, int fileSize, |
p07gbar | 0:3695886f3495 | 458 | int startOffset) |
p07gbar | 0:3695886f3495 | 459 | { |
p07gbar | 0:3695886f3495 | 460 | char temp[5]; |
p07gbar | 0:3695886f3495 | 461 | int count = startOffset; |
p07gbar | 0:3695886f3495 | 462 | while ((count + 8) < fileSize) |
p07gbar | 0:3695886f3495 | 463 | { |
p07gbar | 0:3695886f3495 | 464 | clear(temp, 5); |
p07gbar | 0:3695886f3495 | 465 | fseekread(fp, temp, count, 4); |
p07gbar | 0:3695886f3495 | 466 | int chunksize = fsru32(fp, count + 4) + 8; |
p07gbar | 0:3695886f3495 | 467 | //debug_printf("@ %i Chunk Name: %s Size: %i\n\r", count, temp, chunksize); |
p07gbar | 0:3695886f3495 | 468 | |
p07gbar | 0:3695886f3495 | 469 | if (strcmp(temp, match) == 0) |
p07gbar | 0:3695886f3495 | 470 | { |
p07gbar | 0:3695886f3495 | 471 | return count; |
p07gbar | 0:3695886f3495 | 472 | } |
p07gbar | 0:3695886f3495 | 473 | count += chunksize; |
p07gbar | 0:3695886f3495 | 474 | } |
p07gbar | 0:3695886f3495 | 475 | return -1; |
p07gbar | 0:3695886f3495 | 476 | } |
p07gbar | 0:3695886f3495 | 477 | |
p07gbar | 0:3695886f3495 | 478 | int WavPlayer::findChunk(FILE *fp, char* match, int len, int startOffset) |
p07gbar | 0:3695886f3495 | 479 | { |
p07gbar | 0:3695886f3495 | 480 | return findChunk(fp, match, len, config.file_size, startOffset); |
p07gbar | 0:3695886f3495 | 481 | } |
p07gbar | 0:3695886f3495 | 482 | |
p07gbar | 0:3695886f3495 | 483 | void WavPlayer::fgets_m(char* str, int num, FILE* fp) |
p07gbar | 0:3695886f3495 | 484 | { |
p07gbar | 0:3695886f3495 | 485 | for (int i = 0; i < num; i++) |
p07gbar | 0:3695886f3495 | 486 | { |
p07gbar | 0:3695886f3495 | 487 | str[i] = fgetc(fp); |
p07gbar | 0:3695886f3495 | 488 | //printf("%c",str[i]); |
p07gbar | 0:3695886f3495 | 489 | } |
p07gbar | 0:3695886f3495 | 490 | } |
p07gbar | 0:3695886f3495 | 491 | |
p07gbar | 0:3695886f3495 | 492 | float WavPlayer::sine_gen(int16_t* buf, int len, float div, float phase) |
p07gbar | 0:3695886f3495 | 493 | { |
p07gbar | 0:3695886f3495 | 494 | #if WAVPLAYER_GEN_TEST == 1 |
p07gbar | 0:3695886f3495 | 495 | float t = SINE16LENGTH / div; |
p07gbar | 0:3695886f3495 | 496 | for (int i = 0; i < len; i++) |
p07gbar | 0:3695886f3495 | 497 | { |
p07gbar | 0:3695886f3495 | 498 | buf[i] = sine16lookup[int(phase)]; |
p07gbar | 0:3695886f3495 | 499 | //printf("%i\n\r",buf[i]); |
p07gbar | 0:3695886f3495 | 500 | phase += t; |
p07gbar | 0:3695886f3495 | 501 | while (phase >= SINE16LENGTH) |
p07gbar | 0:3695886f3495 | 502 | phase -= SINE16LENGTH; |
p07gbar | 0:3695886f3495 | 503 | } |
p07gbar | 0:3695886f3495 | 504 | #endif |
p07gbar | 0:3695886f3495 | 505 | return phase; |
p07gbar | 0:3695886f3495 | 506 | } |