f303k8 wav player

Dependencies:   SDFileSystem mbed

Committer:
nameless129
Date:
Thu Aug 11 08:29:22 2016 +0000
Revision:
1:7a3f34b2d18b
Parent:
0:1561c4efda0e
Child:
2:203d58b06b0f
16bit??????,8bit????????

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 1:7a3f34b2d18b 126 uint8_t wavPlayerOnDAC::seaechChunk(FIL *fp,char chunk[5])
nameless129 1:7a3f34b2d18b 127 {
nameless129 1:7a3f34b2d18b 128 uint8_t readByteData;
nameless129 1:7a3f34b2d18b 129 uint8_t data[4];
nameless129 1:7a3f34b2d18b 130 uint8_t ret=0;
nameless129 1:7a3f34b2d18b 131 uint32_t wavReadByte;
nameless129 1:7a3f34b2d18b 132
nameless129 1:7a3f34b2d18b 133
nameless129 1:7a3f34b2d18b 134 while ( (f_error(fp) == 0) && (f_eof(fp) == 0) )
nameless129 1:7a3f34b2d18b 135 {
nameless129 1:7a3f34b2d18b 136 f_read(fp,&readByteData,sizeof(readByteData),&wavReadByte);
nameless129 1:7a3f34b2d18b 137 data[0] = readByteData;
nameless129 1:7a3f34b2d18b 138 if (data[3] == chunk[0] && data[2] == chunk[1] && data[1] == chunk[2] && data[0] == chunk[3])
nameless129 1:7a3f34b2d18b 139 {
nameless129 1:7a3f34b2d18b 140 printf("found Chunk\r\n");
nameless129 1:7a3f34b2d18b 141 ret = 1;
nameless129 1:7a3f34b2d18b 142 break;
nameless129 1:7a3f34b2d18b 143 }
nameless129 1:7a3f34b2d18b 144 else
nameless129 1:7a3f34b2d18b 145 {
nameless129 1:7a3f34b2d18b 146 data[3] = data[2];
nameless129 1:7a3f34b2d18b 147 data[2] = data[1];
nameless129 1:7a3f34b2d18b 148 data[1] = data[0];
nameless129 1:7a3f34b2d18b 149 }
nameless129 1:7a3f34b2d18b 150 }
nameless129 1:7a3f34b2d18b 151 return ret;
nameless129 1:7a3f34b2d18b 152 }
nameless129 1:7a3f34b2d18b 153
nameless129 1:7a3f34b2d18b 154 void wavPlayerOnDAC::setParameters(uint16_t bitsWidth,uint8_t ch)
nameless129 1:7a3f34b2d18b 155 {
nameless129 1:7a3f34b2d18b 156 wavBitsWidth = bitsWidth;
nameless129 1:7a3f34b2d18b 157 wavChannels = ch;
nameless129 1:7a3f34b2d18b 158 if(wavBitsWidth == 8)
nameless129 1:7a3f34b2d18b 159 {
nameless129 1:7a3f34b2d18b 160 if(wavChannels == 1)
nameless129 1:7a3f34b2d18b 161 {
nameless129 1:7a3f34b2d18b 162 dacBuffIndex_n = WAV_READ_SIZE;
nameless129 1:7a3f34b2d18b 163 }
nameless129 1:7a3f34b2d18b 164 else
nameless129 1:7a3f34b2d18b 165 {
nameless129 1:7a3f34b2d18b 166 dacBuffIndex_n = WAV_READ_SIZE/2;
nameless129 1:7a3f34b2d18b 167 }
nameless129 1:7a3f34b2d18b 168 }
nameless129 1:7a3f34b2d18b 169 else if(wavBitsWidth == 16)
nameless129 1:7a3f34b2d18b 170 {
nameless129 1:7a3f34b2d18b 171 if(wavChannels == 1)
nameless129 1:7a3f34b2d18b 172 {
nameless129 1:7a3f34b2d18b 173 dacBuffIndex_n = WAV_READ_SIZE/2;
nameless129 1:7a3f34b2d18b 174 }
nameless129 1:7a3f34b2d18b 175 else
nameless129 1:7a3f34b2d18b 176 {
nameless129 1:7a3f34b2d18b 177 dacBuffIndex_n = WAV_READ_SIZE/4;
nameless129 1:7a3f34b2d18b 178 }
nameless129 1:7a3f34b2d18b 179 }
nameless129 1:7a3f34b2d18b 180 }
nameless129 1:7a3f34b2d18b 181
nameless129 1:7a3f34b2d18b 182 void wavPlayerOnDAC::storeWavDatatoBuff(uint8_t selectBufNo)
nameless129 1:7a3f34b2d18b 183 {
nameless129 1:7a3f34b2d18b 184 uint16_t i;
nameless129 1:7a3f34b2d18b 185 for(i=0;i<dacBuffIndex_n;i++)
nameless129 1:7a3f34b2d18b 186 {
nameless129 1:7a3f34b2d18b 187 if(wavBitsWidth == 8)
nameless129 1:7a3f34b2d18b 188 {
nameless129 1:7a3f34b2d18b 189 if(wavChannels == 1)
nameless129 1:7a3f34b2d18b 190 {
nameless129 1:7a3f34b2d18b 191 DACData[selectBufNo][i] = wavReadData.mono8bit[i]<<8;
nameless129 1:7a3f34b2d18b 192 }
nameless129 1:7a3f34b2d18b 193 else
nameless129 1:7a3f34b2d18b 194 {
nameless129 1:7a3f34b2d18b 195 DACData[selectBufNo][i] = wavReadData.stereo8bit[i].L<<8;
nameless129 1:7a3f34b2d18b 196 }
nameless129 1:7a3f34b2d18b 197 }
nameless129 1:7a3f34b2d18b 198 else
nameless129 1:7a3f34b2d18b 199 {
nameless129 1:7a3f34b2d18b 200 if(wavChannels == 1)
nameless129 1:7a3f34b2d18b 201 {
nameless129 1:7a3f34b2d18b 202 DACData[selectBufNo][i] = (wavReadData.mono16bit[i])+32768;
nameless129 1:7a3f34b2d18b 203 }
nameless129 1:7a3f34b2d18b 204 else
nameless129 1:7a3f34b2d18b 205 {
nameless129 1:7a3f34b2d18b 206 DACData[selectBufNo][i] = (wavReadData.stereo16bit[i].L)+32768;
nameless129 1:7a3f34b2d18b 207 }
nameless129 1:7a3f34b2d18b 208 }
nameless129 1:7a3f34b2d18b 209 }
nameless129 1:7a3f34b2d18b 210 dac_flag[selectBufNo] = 1;
nameless129 1:7a3f34b2d18b 211 }