Reproductor de archivos wav

Dependencies:   SDFileSystem mbed-src mbed

Fork of SDFileSystem_HelloWorld by mbed official

Committer:
EduardoVitela
Date:
Fri Jun 12 04:49:18 2015 +0000
Revision:
1:6f7dafed256b
publicando

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EduardoVitela 1:6f7dafed256b 1 /*
EduardoVitela 1:6f7dafed256b 2 Library wave file player by Tom Coxon
EduardoVitela 1:6f7dafed256b 3
EduardoVitela 1:6f7dafed256b 4 Based on WAVEplayer by Vlad Cazan/Stephan Rochon modified by Tom Coxon to:
EduardoVitela 1:6f7dafed256b 5
EduardoVitela 1:6f7dafed256b 6 1. Run correctly on the Embedded Artists LPCXpresso baseboard.
EduardoVitela 1:6f7dafed256b 7 2. To play 8 bit sample size in addition to original 16 bit
EduardoVitela 1:6f7dafed256b 8 3. To be more fault tolerant when playing wav files.
EduardoVitela 1:6f7dafed256b 9 */
EduardoVitela 1:6f7dafed256b 10
EduardoVitela 1:6f7dafed256b 11 #include "wavplayer.h"
EduardoVitela 1:6f7dafed256b 12
EduardoVitela 1:6f7dafed256b 13 Ticker tick;
EduardoVitela 1:6f7dafed256b 14 Serial pc(USBTX,USBRX);
EduardoVitela 1:6f7dafed256b 15 DigitalIn p1(SW1);
EduardoVitela 1:6f7dafed256b 16 AnalogOut DACout(PTE30);
EduardoVitela 1:6f7dafed256b 17
EduardoVitela 1:6f7dafed256b 18 void WavPlayer::dac_out() {
EduardoVitela 1:6f7dafed256b 19 if (DAC_on) {
EduardoVitela 1:6f7dafed256b 20 DACout.write_u16(DAC_fifo[DAC_rptr]);
EduardoVitela 1:6f7dafed256b 21 DAC_rptr=(DAC_rptr+1) & 0xff;
EduardoVitela 1:6f7dafed256b 22 }
EduardoVitela 1:6f7dafed256b 23 }
EduardoVitela 1:6f7dafed256b 24
EduardoVitela 1:6f7dafed256b 25 void WavPlayer::play_wave(char *wavname) {
EduardoVitela 1:6f7dafed256b 26 unsigned chunk_id,chunk_size,channel;
EduardoVitela 1:6f7dafed256b 27 unsigned data,samp_int,i;
EduardoVitela 1:6f7dafed256b 28 short dac_data;
EduardoVitela 1:6f7dafed256b 29 char *slice_buf;
EduardoVitela 1:6f7dafed256b 30 short *data_sptr;
EduardoVitela 1:6f7dafed256b 31 FMT_STRUCT wav_format;
EduardoVitela 1:6f7dafed256b 32 FILE *wavfile;
EduardoVitela 1:6f7dafed256b 33 long slice,num_slices;
EduardoVitela 1:6f7dafed256b 34 DAC_wptr=0;
EduardoVitela 1:6f7dafed256b 35 DAC_rptr=0;
EduardoVitela 1:6f7dafed256b 36
EduardoVitela 1:6f7dafed256b 37 size_t result;
EduardoVitela 1:6f7dafed256b 38
EduardoVitela 1:6f7dafed256b 39 for (i=0;i<256;i+=2) {
EduardoVitela 1:6f7dafed256b 40 DAC_fifo[i]=0;
EduardoVitela 1:6f7dafed256b 41 DAC_fifo[i+1]=3000;
EduardoVitela 1:6f7dafed256b 42 }
EduardoVitela 1:6f7dafed256b 43 DAC_wptr=4;
EduardoVitela 1:6f7dafed256b 44 DAC_on=0;
EduardoVitela 1:6f7dafed256b 45
EduardoVitela 1:6f7dafed256b 46 pc.printf("Reproduciendo arcivo '%s'\r\n",wavname);
EduardoVitela 1:6f7dafed256b 47
EduardoVitela 1:6f7dafed256b 48 wavfile=fopen(wavname,"rb");
EduardoVitela 1:6f7dafed256b 49 if (!wavfile) {
EduardoVitela 1:6f7dafed256b 50 pc.printf("Incapas de abrir archivo '%s'\r\n",wavname);
EduardoVitela 1:6f7dafed256b 51 exit(1);
EduardoVitela 1:6f7dafed256b 52 }
EduardoVitela 1:6f7dafed256b 53
EduardoVitela 1:6f7dafed256b 54 fread(&chunk_id,4,1,wavfile);
EduardoVitela 1:6f7dafed256b 55 fread(&chunk_size,4,1,wavfile);
EduardoVitela 1:6f7dafed256b 56 while (!feof(wavfile)) {
EduardoVitela 1:6f7dafed256b 57 pc.printf("Read chunk ID 0x%x, size 0x%x\r\n",chunk_id,chunk_size);
EduardoVitela 1:6f7dafed256b 58 switch (chunk_id) {
EduardoVitela 1:6f7dafed256b 59 case 0x46464952:
EduardoVitela 1:6f7dafed256b 60 fread(&data,4,1,wavfile);
EduardoVitela 1:6f7dafed256b 61 pc.printf("RIFF chunk\r\n");
EduardoVitela 1:6f7dafed256b 62 pc.printf(" chunk size %d (0x%x)\r\n",chunk_size,chunk_size);
EduardoVitela 1:6f7dafed256b 63 pc.printf(" RIFF type 0x%x\r\n",data);
EduardoVitela 1:6f7dafed256b 64 break;
EduardoVitela 1:6f7dafed256b 65 case 0x20746d66:
EduardoVitela 1:6f7dafed256b 66 fread(&wav_format,sizeof(wav_format),1,wavfile);
EduardoVitela 1:6f7dafed256b 67 pc.printf("FORMAT chunk\r\n");
EduardoVitela 1:6f7dafed256b 68 pc.printf(" chunk size %d (0x%x)\r\n",chunk_size,chunk_size);
EduardoVitela 1:6f7dafed256b 69 pc.printf(" compression code %d\r\n",wav_format.comp_code);
EduardoVitela 1:6f7dafed256b 70 pc.printf(" %d channels\r\n",wav_format.num_channels);
EduardoVitela 1:6f7dafed256b 71 pc.printf(" %d samples/sec\r\n",wav_format.sample_rate);
EduardoVitela 1:6f7dafed256b 72 pc.printf(" %d bytes/sec\r\n",wav_format.avg_Bps);
EduardoVitela 1:6f7dafed256b 73 pc.printf(" block align %d\r\n",wav_format.block_align);
EduardoVitela 1:6f7dafed256b 74 pc.printf(" %d bits per sample\r\n",wav_format.sig_bps);
EduardoVitela 1:6f7dafed256b 75 if (chunk_size > sizeof(wav_format))
EduardoVitela 1:6f7dafed256b 76 fseek(wavfile,chunk_size-sizeof(wav_format),SEEK_CUR);
EduardoVitela 1:6f7dafed256b 77 // create a slice buffer large enough to hold multiple slices
EduardoVitela 1:6f7dafed256b 78 slice_buf=(char *)malloc(wav_format.block_align*SLICE_BUF_SIZE);
EduardoVitela 1:6f7dafed256b 79 if (!slice_buf) {
EduardoVitela 1:6f7dafed256b 80 pc.printf("Unable to malloc slice buffer");
EduardoVitela 1:6f7dafed256b 81 exit(1);
EduardoVitela 1:6f7dafed256b 82 }
EduardoVitela 1:6f7dafed256b 83 break;
EduardoVitela 1:6f7dafed256b 84 case 0x61746164:
EduardoVitela 1:6f7dafed256b 85 slice_buf=(char *)malloc(wav_format.block_align*SLICE_BUF_SIZE);
EduardoVitela 1:6f7dafed256b 86 if (!slice_buf) {
EduardoVitela 1:6f7dafed256b 87 pc.printf("Unable to malloc slice buffer");
EduardoVitela 1:6f7dafed256b 88 exit(1);
EduardoVitela 1:6f7dafed256b 89 }
EduardoVitela 1:6f7dafed256b 90 num_slices=chunk_size/wav_format.block_align;
EduardoVitela 1:6f7dafed256b 91 pc.printf("DATA chunk\r\n");
EduardoVitela 1:6f7dafed256b 92 pc.printf(" chunk size %d (0x%x)\r\n",chunk_size,chunk_size);
EduardoVitela 1:6f7dafed256b 93 pc.printf(" %d slices\r\n",num_slices);
EduardoVitela 1:6f7dafed256b 94 pc.printf(" Ideal sample interval=%d\r\n",(unsigned)(1000000.0/wav_format.sample_rate));
EduardoVitela 1:6f7dafed256b 95 samp_int=1000000/(wav_format.sample_rate);
EduardoVitela 1:6f7dafed256b 96 pc.printf(" programmed interrupt tick interval=%d\r\n",samp_int);
EduardoVitela 1:6f7dafed256b 97
EduardoVitela 1:6f7dafed256b 98 // starting up ticker to write samples out -- no printfs until tick.detach is called
EduardoVitela 1:6f7dafed256b 99 tick.attach_us(this,&WavPlayer::dac_out, samp_int);
EduardoVitela 1:6f7dafed256b 100 DAC_on=1;
EduardoVitela 1:6f7dafed256b 101 for (slice=0;slice<num_slices;slice+=SLICE_BUF_SIZE) {
EduardoVitela 1:6f7dafed256b 102
EduardoVitela 1:6f7dafed256b 103 result = fread(slice_buf,wav_format.block_align*SLICE_BUF_SIZE,1,wavfile);
EduardoVitela 1:6f7dafed256b 104 if (feof(wavfile)) {
EduardoVitela 1:6f7dafed256b 105 pc.printf("Oops -- not enough slices in the wave file\r\n");
EduardoVitela 1:6f7dafed256b 106
EduardoVitela 1:6f7dafed256b 107 break;
EduardoVitela 1:6f7dafed256b 108 }
EduardoVitela 1:6f7dafed256b 109
EduardoVitela 1:6f7dafed256b 110 data_sptr=(short *)slice_buf;
EduardoVitela 1:6f7dafed256b 111 for (i=0;i<SLICE_BUF_SIZE;i++) {
EduardoVitela 1:6f7dafed256b 112 dac_data=0;
EduardoVitela 1:6f7dafed256b 113
EduardoVitela 1:6f7dafed256b 114 // for a stereo wave file average the two channels.
EduardoVitela 1:6f7dafed256b 115 for (channel=0;channel<wav_format.num_channels;channel++) {
EduardoVitela 1:6f7dafed256b 116 switch (wav_format.sig_bps) {
EduardoVitela 1:6f7dafed256b 117 case 16:
EduardoVitela 1:6f7dafed256b 118 dac_data+=( ((int)(*data_sptr++)) +32768 );
EduardoVitela 1:6f7dafed256b 119 break;
EduardoVitela 1:6f7dafed256b 120 case 8:
EduardoVitela 1:6f7dafed256b 121 dac_data+=( ((int)(*data_sptr++)) +32768 <<8);
EduardoVitela 1:6f7dafed256b 122 break;
EduardoVitela 1:6f7dafed256b 123 }
EduardoVitela 1:6f7dafed256b 124 }
EduardoVitela 1:6f7dafed256b 125 DAC_fifo[DAC_wptr]=dac_data;
EduardoVitela 1:6f7dafed256b 126 DAC_wptr=(DAC_wptr+1) & 0xff;
EduardoVitela 1:6f7dafed256b 127 while (DAC_wptr==DAC_rptr) {
EduardoVitela 1:6f7dafed256b 128 wait_us(10);
EduardoVitela 1:6f7dafed256b 129 }
EduardoVitela 1:6f7dafed256b 130 }
EduardoVitela 1:6f7dafed256b 131 if(p1==0){
EduardoVitela 1:6f7dafed256b 132 break;
EduardoVitela 1:6f7dafed256b 133 }
EduardoVitela 1:6f7dafed256b 134 }
EduardoVitela 1:6f7dafed256b 135 DAC_on=0;
EduardoVitela 1:6f7dafed256b 136 tick.detach();
EduardoVitela 1:6f7dafed256b 137 pc.printf("Ticker detached\r\n");
EduardoVitela 1:6f7dafed256b 138 free(slice_buf);
EduardoVitela 1:6f7dafed256b 139 break;
EduardoVitela 1:6f7dafed256b 140 case 0x5453494c:
EduardoVitela 1:6f7dafed256b 141 pc.printf("INFO chunk, size %d\r\n",chunk_size);
EduardoVitela 1:6f7dafed256b 142 fseek(wavfile,chunk_size,SEEK_CUR);
EduardoVitela 1:6f7dafed256b 143 break;
EduardoVitela 1:6f7dafed256b 144 default:
EduardoVitela 1:6f7dafed256b 145 pc.printf("unknown chunk type 0x%x, size %d\r\n",chunk_id,chunk_size);
EduardoVitela 1:6f7dafed256b 146 data=fseek(wavfile,chunk_size,SEEK_CUR);
EduardoVitela 1:6f7dafed256b 147 break;
EduardoVitela 1:6f7dafed256b 148 }
EduardoVitela 1:6f7dafed256b 149 fread(&chunk_id,4,1,wavfile);
EduardoVitela 1:6f7dafed256b 150 fread(&chunk_size,4,1,wavfile);
EduardoVitela 1:6f7dafed256b 151 }
EduardoVitela 1:6f7dafed256b 152 pc.printf("++++++++++++ Fin de reproducion del archivo ++++++++++\r\n");
EduardoVitela 1:6f7dafed256b 153 fclose(wavfile);
EduardoVitela 1:6f7dafed256b 154 }
EduardoVitela 1:6f7dafed256b 155
EduardoVitela 1:6f7dafed256b 156