f303k8 wav player

Dependencies:   SDFileSystem mbed

Committer:
nameless129
Date:
Fri Dec 02 03:58:42 2016 +0000
Revision:
4:6e56da5068f3
Parent:
2:203d58b06b0f
open

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nameless129 0:1561c4efda0e 1 #include "mbed.h"
nameless129 0:1561c4efda0e 2 #include "wavChunks.h"
nameless129 0:1561c4efda0e 3 #include "wavPlayer.h"
nameless129 0:1561c4efda0e 4 #include <stdio.h>
nameless129 0:1561c4efda0e 5 #include "SDFileSystem.h"
nameless129 1:7a3f34b2d18b 6 #include "TIM6Driver.h"
nameless129 0:1561c4efda0e 7
nameless129 0:1561c4efda0e 8 wavPlayerOnDAC::wavPlayerOnDAC(PinName pinDAC) :
nameless129 0:1561c4efda0e 9 DACout(pinDAC)
nameless129 0:1561c4efda0e 10 {
nameless129 0:1561c4efda0e 11 }
nameless129 0:1561c4efda0e 12
nameless129 0:1561c4efda0e 13 void wavPlayerOnDAC::setFile(FIL* tgtFile)
nameless129 0:1561c4efda0e 14 {
nameless129 0:1561c4efda0e 15 uint16_t i;
nameless129 1:7a3f34b2d18b 16 uint32_t wavReadByte;
nameless129 1:7a3f34b2d18b 17 uint32_t ReadID;
nameless129 0:1561c4efda0e 18 wavfil = *tgtFile;
nameless129 1:7a3f34b2d18b 19
nameless129 1:7a3f34b2d18b 20 f_read(&wavfil, &wavRIFFHedder, RIFFHedderSize, &wavReadByte);
nameless129 1:7a3f34b2d18b 21 printf("hedder:%x\r\n", wavRIFFHedder.riff);
nameless129 1:7a3f34b2d18b 22 printf("size:%x\r\n", wavRIFFHedder.size);
nameless129 1:7a3f34b2d18b 23 printf("type:%x\r\n", wavRIFFHedder.type);
nameless129 1:7a3f34b2d18b 24
nameless129 1:7a3f34b2d18b 25 printf("readID\r\n");
nameless129 1:7a3f34b2d18b 26 f_read(&wavfil, &ReadID, sizeof(ReadID), &wavReadByte);
nameless129 1:7a3f34b2d18b 27 printf("ID:%x\r\n",ReadID);
nameless129 1:7a3f34b2d18b 28
nameless129 1:7a3f34b2d18b 29 if (ReadID == 0x74786562) //bext
nameless129 0:1561c4efda0e 30 {
nameless129 1:7a3f34b2d18b 31 printf("\r\n*bextChunk\r\n");
nameless129 1:7a3f34b2d18b 32 f_read(&wavfil, &wavBextChunk, BextChunkSize, &wavReadByte);
nameless129 1:7a3f34b2d18b 33 printf("size:%x\r\n", wavBextChunk.ckSize);
nameless129 1:7a3f34b2d18b 34 f_lseek(&wavfil, f_tell(&wavfil) + wavBextChunk.ckSize);
nameless129 1:7a3f34b2d18b 35 f_read(&wavfil, &ReadID, sizeof(ReadID), &wavReadByte);
nameless129 0:1561c4efda0e 36 }
nameless129 1:7a3f34b2d18b 37 if (ReadID == 0x20746D66)
nameless129 1:7a3f34b2d18b 38 {
nameless129 1:7a3f34b2d18b 39 f_read(&wavfil, &wavFormatChunk, FormatChunkSize, &wavReadByte);
nameless129 1:7a3f34b2d18b 40 printf("\r\n*fmtChunk\r\n");
nameless129 1:7a3f34b2d18b 41 printf("size:%d\r\n", wavFormatChunk.size);
nameless129 1:7a3f34b2d18b 42 printf("format:%d\r\n", wavFormatChunk.format);
nameless129 1:7a3f34b2d18b 43 printf("channels:%d\r\n", wavFormatChunk.channels);
nameless129 1:7a3f34b2d18b 44 printf("samplerate:%d\r\n", wavFormatChunk.samplerate);
nameless129 1:7a3f34b2d18b 45 TIM6ClockSet(TIM6CLK/wavFormatChunk.samplerate);
nameless129 1:7a3f34b2d18b 46 printf("byteParSec:%d\r\n", wavFormatChunk.bytepersec);
nameless129 1:7a3f34b2d18b 47 printf("blockalign:%d\r\n", wavFormatChunk.blockalign);
nameless129 1:7a3f34b2d18b 48 printf("bitswidth:%d\r\n", wavFormatChunk.bitswidth);
nameless129 1:7a3f34b2d18b 49 setParameters(wavFormatChunk.bitswidth,wavFormatChunk.channels);
nameless129 1:7a3f34b2d18b 50 }
nameless129 1:7a3f34b2d18b 51
nameless129 1:7a3f34b2d18b 52 seaechChunk(&wavfil, "data");
nameless129 1:7a3f34b2d18b 53 f_read(&wavfil, &wavDataChunk, DataChunkSize, &wavReadByte);
nameless129 1:7a3f34b2d18b 54 printf("\r\n*dataChunk\r\n");
nameless129 1:7a3f34b2d18b 55 printf("id:%x\r\n", wavDataChunk.id);
nameless129 1:7a3f34b2d18b 56 printf("size:%x\r\n", wavDataChunk.size);
nameless129 0:1561c4efda0e 57
nameless129 1:7a3f34b2d18b 58 f_read(&wavfil,&wavReadData.raw,WAV_READ_SIZE,&wavReadByte);
nameless129 1:7a3f34b2d18b 59 storeWavDatatoBuff(0);
nameless129 1:7a3f34b2d18b 60
nameless129 1:7a3f34b2d18b 61 f_read(&wavfil,&wavReadData.raw,WAV_READ_SIZE,&wavReadByte);
nameless129 1:7a3f34b2d18b 62 storeWavDatatoBuff(1);
nameless129 0:1561c4efda0e 63 fWavPlaying = 1;
nameless129 0:1561c4efda0e 64 dac_c = 0;
nameless129 1:7a3f34b2d18b 65 dac_rp=0;
nameless129 0:1561c4efda0e 66 }
nameless129 0:1561c4efda0e 67
nameless129 0:1561c4efda0e 68 //return 0:playing 1:stop
nameless129 0:1561c4efda0e 69 uint8_t wavPlayerOnDAC::readProc(void)
nameless129 0:1561c4efda0e 70 {
nameless129 0:1561c4efda0e 71 uint16_t i,j;
nameless129 1:7a3f34b2d18b 72 uint32_t wavReadByte;
nameless129 0:1561c4efda0e 73
nameless129 0:1561c4efda0e 74 if(f_eof(&wavfil) != 0)
nameless129 0:1561c4efda0e 75 {
nameless129 0:1561c4efda0e 76 fWavPlaying = 0;
nameless129 0:1561c4efda0e 77 }
nameless129 0:1561c4efda0e 78
nameless129 0:1561c4efda0e 79 if(fWavPlaying == 0)
nameless129 0:1561c4efda0e 80 {
nameless129 0:1561c4efda0e 81 dac_on = 0;
nameless129 0:1561c4efda0e 82 return 1;
nameless129 0:1561c4efda0e 83 }
nameless129 0:1561c4efda0e 84 dac_on = 1;
nameless129 0:1561c4efda0e 85 for(j=0;j<2;j++)
nameless129 0:1561c4efda0e 86 {
nameless129 0:1561c4efda0e 87 if(dac_flag[j] == 0)
nameless129 0:1561c4efda0e 88 {
nameless129 1:7a3f34b2d18b 89 f_read(&wavfil,&wavReadData.raw,WAV_READ_SIZE,&wavReadByte);
nameless129 1:7a3f34b2d18b 90 storeWavDatatoBuff(j);
nameless129 0:1561c4efda0e 91 }
nameless129 0:1561c4efda0e 92 }
nameless129 0:1561c4efda0e 93 return 0;
nameless129 0:1561c4efda0e 94 }
nameless129 0:1561c4efda0e 95
nameless129 0:1561c4efda0e 96 void wavPlayerOnDAC::rewind(void)
nameless129 0:1561c4efda0e 97 {
nameless129 0:1561c4efda0e 98 f_lseek(&wavfil,0);
nameless129 0:1561c4efda0e 99 fWavPlaying = 1;
nameless129 0:1561c4efda0e 100 }
nameless129 0:1561c4efda0e 101 void wavPlayerOnDAC::stop(void)
nameless129 0:1561c4efda0e 102 {
nameless129 0:1561c4efda0e 103 fWavPlaying = 0;
nameless129 0:1561c4efda0e 104 }
nameless129 0:1561c4efda0e 105
nameless129 0:1561c4efda0e 106 void wavPlayerOnDAC::DACOutProc(void)
nameless129 0:1561c4efda0e 107 {
nameless129 0:1561c4efda0e 108 if(dac_on == 1) {
nameless129 0:1561c4efda0e 109 if(dac_flag[dac_c] == 1)
nameless129 0:1561c4efda0e 110 {
nameless129 1:7a3f34b2d18b 111 DACout.write_u16(DACData[dac_c][dac_rp]);
nameless129 1:7a3f34b2d18b 112 if( dac_rp == dacBuffIndex_n-1)
nameless129 0:1561c4efda0e 113 {
nameless129 0:1561c4efda0e 114 dac_flag[dac_c] = 0;
nameless129 1:7a3f34b2d18b 115 dac_rp = 0;
nameless129 0:1561c4efda0e 116 dac_c = (dac_c+1)%2;
nameless129 0:1561c4efda0e 117 }
nameless129 0:1561c4efda0e 118 else
nameless129 0:1561c4efda0e 119 {
nameless129 1:7a3f34b2d18b 120 dac_rp++;
nameless129 0:1561c4efda0e 121 }
nameless129 0:1561c4efda0e 122 }
nameless129 0:1561c4efda0e 123 }
nameless129 0:1561c4efda0e 124 }
nameless129 0:1561c4efda0e 125
nameless129 2:203d58b06b0f 126 void wavPlayerOnDAC::rampUp(void)
nameless129 2:203d58b06b0f 127 {
nameless129 2:203d58b06b0f 128 uint16_t i;
nameless129 2:203d58b06b0f 129 for(i=0;i<32768;i+=64)
nameless129 2:203d58b06b0f 130 {
nameless129 2:203d58b06b0f 131 DACout.write_u16(i);
nameless129 2:203d58b06b0f 132 wait_us(1);
nameless129 2:203d58b06b0f 133 }
nameless129 2:203d58b06b0f 134 }
nameless129 2:203d58b06b0f 135 void wavPlayerOnDAC::rampDown(void)
nameless129 2:203d58b06b0f 136 {
nameless129 2:203d58b06b0f 137 uint16_t i;
nameless129 2:203d58b06b0f 138 for(i=0;i<32768;i+=64)
nameless129 2:203d58b06b0f 139 {
nameless129 2:203d58b06b0f 140 DACout.write_u16(32768-i);
nameless129 2:203d58b06b0f 141 wait_us(1);
nameless129 2:203d58b06b0f 142 }
nameless129 2:203d58b06b0f 143 }
nameless129 2:203d58b06b0f 144
nameless129 1:7a3f34b2d18b 145 uint8_t wavPlayerOnDAC::seaechChunk(FIL *fp,char chunk[5])
nameless129 1:7a3f34b2d18b 146 {
nameless129 1:7a3f34b2d18b 147 uint8_t readByteData;
nameless129 1:7a3f34b2d18b 148 uint8_t data[4];
nameless129 1:7a3f34b2d18b 149 uint8_t ret=0;
nameless129 1:7a3f34b2d18b 150 uint32_t wavReadByte;
nameless129 1:7a3f34b2d18b 151
nameless129 1:7a3f34b2d18b 152
nameless129 1:7a3f34b2d18b 153 while ( (f_error(fp) == 0) && (f_eof(fp) == 0) )
nameless129 1:7a3f34b2d18b 154 {
nameless129 1:7a3f34b2d18b 155 f_read(fp,&readByteData,sizeof(readByteData),&wavReadByte);
nameless129 1:7a3f34b2d18b 156 data[0] = readByteData;
nameless129 1:7a3f34b2d18b 157 if (data[3] == chunk[0] && data[2] == chunk[1] && data[1] == chunk[2] && data[0] == chunk[3])
nameless129 1:7a3f34b2d18b 158 {
nameless129 1:7a3f34b2d18b 159 printf("found Chunk\r\n");
nameless129 1:7a3f34b2d18b 160 ret = 1;
nameless129 1:7a3f34b2d18b 161 break;
nameless129 1:7a3f34b2d18b 162 }
nameless129 1:7a3f34b2d18b 163 else
nameless129 1:7a3f34b2d18b 164 {
nameless129 1:7a3f34b2d18b 165 data[3] = data[2];
nameless129 1:7a3f34b2d18b 166 data[2] = data[1];
nameless129 1:7a3f34b2d18b 167 data[1] = data[0];
nameless129 1:7a3f34b2d18b 168 }
nameless129 1:7a3f34b2d18b 169 }
nameless129 1:7a3f34b2d18b 170 return ret;
nameless129 1:7a3f34b2d18b 171 }
nameless129 1:7a3f34b2d18b 172
nameless129 1:7a3f34b2d18b 173 void wavPlayerOnDAC::setParameters(uint16_t bitsWidth,uint8_t ch)
nameless129 1:7a3f34b2d18b 174 {
nameless129 1:7a3f34b2d18b 175 wavBitsWidth = bitsWidth;
nameless129 1:7a3f34b2d18b 176 wavChannels = ch;
nameless129 1:7a3f34b2d18b 177 if(wavBitsWidth == 8)
nameless129 1:7a3f34b2d18b 178 {
nameless129 1:7a3f34b2d18b 179 if(wavChannels == 1)
nameless129 1:7a3f34b2d18b 180 {
nameless129 1:7a3f34b2d18b 181 dacBuffIndex_n = WAV_READ_SIZE;
nameless129 1:7a3f34b2d18b 182 }
nameless129 1:7a3f34b2d18b 183 else
nameless129 1:7a3f34b2d18b 184 {
nameless129 1:7a3f34b2d18b 185 dacBuffIndex_n = WAV_READ_SIZE/2;
nameless129 1:7a3f34b2d18b 186 }
nameless129 1:7a3f34b2d18b 187 }
nameless129 1:7a3f34b2d18b 188 else if(wavBitsWidth == 16)
nameless129 1:7a3f34b2d18b 189 {
nameless129 1:7a3f34b2d18b 190 if(wavChannels == 1)
nameless129 1:7a3f34b2d18b 191 {
nameless129 1:7a3f34b2d18b 192 dacBuffIndex_n = WAV_READ_SIZE/2;
nameless129 1:7a3f34b2d18b 193 }
nameless129 1:7a3f34b2d18b 194 else
nameless129 1:7a3f34b2d18b 195 {
nameless129 1:7a3f34b2d18b 196 dacBuffIndex_n = WAV_READ_SIZE/4;
nameless129 1:7a3f34b2d18b 197 }
nameless129 1:7a3f34b2d18b 198 }
nameless129 1:7a3f34b2d18b 199 }
nameless129 1:7a3f34b2d18b 200
nameless129 1:7a3f34b2d18b 201 void wavPlayerOnDAC::storeWavDatatoBuff(uint8_t selectBufNo)
nameless129 1:7a3f34b2d18b 202 {
nameless129 1:7a3f34b2d18b 203 uint16_t i;
nameless129 1:7a3f34b2d18b 204 for(i=0;i<dacBuffIndex_n;i++)
nameless129 1:7a3f34b2d18b 205 {
nameless129 1:7a3f34b2d18b 206 if(wavBitsWidth == 8)
nameless129 1:7a3f34b2d18b 207 {
nameless129 1:7a3f34b2d18b 208 if(wavChannels == 1)
nameless129 1:7a3f34b2d18b 209 {
nameless129 1:7a3f34b2d18b 210 DACData[selectBufNo][i] = wavReadData.mono8bit[i]<<8;
nameless129 1:7a3f34b2d18b 211 }
nameless129 1:7a3f34b2d18b 212 else
nameless129 1:7a3f34b2d18b 213 {
nameless129 1:7a3f34b2d18b 214 DACData[selectBufNo][i] = wavReadData.stereo8bit[i].L<<8;
nameless129 1:7a3f34b2d18b 215 }
nameless129 1:7a3f34b2d18b 216 }
nameless129 1:7a3f34b2d18b 217 else
nameless129 1:7a3f34b2d18b 218 {
nameless129 1:7a3f34b2d18b 219 if(wavChannels == 1)
nameless129 1:7a3f34b2d18b 220 {
nameless129 1:7a3f34b2d18b 221 DACData[selectBufNo][i] = (wavReadData.mono16bit[i])+32768;
nameless129 1:7a3f34b2d18b 222 }
nameless129 1:7a3f34b2d18b 223 else
nameless129 1:7a3f34b2d18b 224 {
nameless129 1:7a3f34b2d18b 225 DACData[selectBufNo][i] = (wavReadData.stereo16bit[i].L)+32768;
nameless129 1:7a3f34b2d18b 226 }
nameless129 1:7a3f34b2d18b 227 }
nameless129 1:7a3f34b2d18b 228 }
nameless129 1:7a3f34b2d18b 229 dac_flag[selectBufNo] = 1;
nameless129 1:7a3f34b2d18b 230 }