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:
Wed Sep 19 10:58:16 2012 +0000
Revision:
0:3695886f3495
Child:
2:d54e6966fa2b
Working stably

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