This program is for Star Board Orange. Wave file into SD card is read, and its DAC signal output.

Dependencies:   EthernetNetIf mbed HTTPServer

Committer:
y_notsu
Date:
Thu Nov 25 14:59:16 2010 +0000
Revision:
0:383bff20e783

        

Who changed what in which revision?

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