A library which allows the playing of Wav files using the TLV320

Dependents:   RSALB_hbridge_helloworld RSALB_lobster WavPlayer_test AudioCODEC_HelloWorld

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?

UserRevisionLine numberNew 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 }