20 #include "simpletools.h" 21 #include "wavplayer.h" 23 static volatile int sampleRate;
24 static volatile int swap = 0;
25 static volatile int playing = 0;
26 static volatile short int wavVal;
27 static volatile int dacVal;
28 static volatile unsigned int dtSample;
30 static volatile int significantBitsPerSample=16;
31 static volatile unsigned int reps;
32 static volatile unsigned int cog = 0;
33 static volatile unsigned int cog2 = 0;
34 static volatile unsigned int settingUp = 0;
36 static volatile unsigned int volume = 0;
37 static volatile const unsigned int BUF_SIZE = 512;
39 static unsigned int stack[44 + 28];
40 static unsigned int stack2[44 + 128];
43 void wav_reader(
void *par);
44 void audio_dac(
void *par);
45 void spooler(
void *par);
47 char wavDacBufferL[512];
48 char wavDacBufferH[512];
50 volatile const char* track;
55 void wav_play(
const char* wavFilename)
58 if(!volume) wav_volume(7);
61 cog2 = cogstart(wav_reader, NULL, stack2,
sizeof(stack2)) + 1;
62 waitcnt(CLKFREQ/20 + CNT);
68 int status = settingUp || playing;
72 void wav_volume(
int vol)
74 if(vol > 10) vol = 10;
76 vol = 1 << (21 - significantBitsPerSample + vol);
77 unsigned int vi = volume;
78 unsigned int vf = vol;
79 for(
int v = vi; volume != vf;)
81 if(vf > volume) volume++;
82 if(vf < volume) volume--;
83 if(volume == vf)
break;
109 void wav_reader(
void *par)
113 unsigned short int w;
115 const char* trackp = (
const char*) track;
117 fp = fopen(trackp,
"r");
124 int fileSize = b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0];
134 int chunkDataSize = b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0];
138 int compressionCode = b[1] << 8 | b[0];
142 int numberOfChannels = b[1] << 8 | b[0];
146 sampleRate = b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0];
150 int averageBytesPerSecond = b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0];
154 int blockAlign = b[1] << 8 | b[0];
158 significantBitsPerSample = b[1] << 8 | b[0];
161 int extraFormatBytes;
162 if(compressionCode != 1)
165 extraFormatBytes = b[1] << 8 | b[0];
169 extraFormatBytes = 0;
177 int dwordChunkSize = b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0];
182 fread(wavDacBufferL, 1, 512, fp);
188 fread(wavDacBufferH, 1, 512, fp);
191 cog = cogstart(audio_dac, NULL, stack,
sizeof(stack)) + 1;
193 int reps = (fileSize-1)/1024;
198 for(i = 1; i < reps; i++)
201 fread(wavDacBufferL, 1, BUF_SIZE, fp);
203 fread(wavDacBufferH, 1, BUF_SIZE, fp);
210 void audio_dac(
void *par)
214 CTRA = 0x18000000 + 27;
215 CTRB = 0x18000000 + 26;
219 dtSample = CLKFREQ/sampleRate;
229 for(i = 0; i < BUF_SIZE; i+=2)
231 wavVal = wavDacBufferL[i] | wavDacBufferL[i+1]<<8;
232 dacVal = (wavVal + 32768) * volume;
235 waitcnt(t+=dtSample);
238 for(i = 0; i < BUF_SIZE; i+=2)
240 wavVal = wavDacBufferH[i] | wavDacBufferH[i+1]<<8;
241 dacVal = (wavVal + 32768) * volume;
244 waitcnt(t+=dtSample);
249 dacVal = 32768 * volume;
252 waitcnt(t+=dtSample);