f303k8 wav player
Dependencies: SDFileSystem mbed
wavPlayer.cpp@4:6e56da5068f3, 2016-12-02 (annotated)
- Committer:
- nameless129
- Date:
- Fri Dec 02 03:58:42 2016 +0000
- Revision:
- 4:6e56da5068f3
- Parent:
- 2:203d58b06b0f
open
Who changed what in which revision?
User | Revision | Line number | New 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 | } |