;

Dependents:   Audio_Player Wav_player_RPG_menu OMNi-Robot_no_borrar

These files are slightly edited from William Marshall's Wav_SD_Card_Read for RS EDP cookbook entry. The necessary parts for our project were extracted.

Committer:
rsartin3
Date:
Mon Mar 04 22:37:06 2013 +0000
Revision:
0:a50bba1964ec
;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rsartin3 0:a50bba1964ec 1 /* Wav File Support */
rsartin3 0:a50bba1964ec 2 /* **************** */
rsartin3 0:a50bba1964ec 3
rsartin3 0:a50bba1964ec 4 #include "mbed.h"
rsartin3 0:a50bba1964ec 5 //#include "misra_types.h"
rsartin3 0:a50bba1964ec 6 //#include "Wav_Support_File.h"
rsartin3 0:a50bba1964ec 7
rsartin3 0:a50bba1964ec 8 #define DEBUG 0
rsartin3 0:a50bba1964ec 9
rsartin3 0:a50bba1964ec 10 /* Function Prototypes */
rsartin3 0:a50bba1964ec 11 unsigned char wave_file_check(unsigned char *wave_array, FILE *open_file);
rsartin3 0:a50bba1964ec 12
rsartin3 0:a50bba1964ec 13
rsartin3 0:a50bba1964ec 14 /* Global Variables */
rsartin3 0:a50bba1964ec 15 struct wave_header_construction
rsartin3 0:a50bba1964ec 16 { char identification_block[5];
rsartin3 0:a50bba1964ec 17 unsigned int length_of_file;
rsartin3 0:a50bba1964ec 18 char identifier1[5];
rsartin3 0:a50bba1964ec 19 char identifier2[5];
rsartin3 0:a50bba1964ec 20 unsigned int position_of_data;
rsartin3 0:a50bba1964ec 21 unsigned short format_tag;
rsartin3 0:a50bba1964ec 22 unsigned short number_of_channels;
rsartin3 0:a50bba1964ec 23 unsigned int samples_per_second;
rsartin3 0:a50bba1964ec 24 unsigned int bytes_per_second;
rsartin3 0:a50bba1964ec 25 unsigned short bytes_per_sample;
rsartin3 0:a50bba1964ec 26 unsigned short bits_per_sample;
rsartin3 0:a50bba1964ec 27 char marker[5];
rsartin3 0:a50bba1964ec 28 unsigned int number_of_bits_in_sample;
rsartin3 0:a50bba1964ec 29 } wave_file_info;
rsartin3 0:a50bba1964ec 30
rsartin3 0:a50bba1964ec 31
rsartin3 0:a50bba1964ec 32
rsartin3 0:a50bba1964ec 33
rsartin3 0:a50bba1964ec 34
rsartin3 0:a50bba1964ec 35 /* Wave File Checker */
rsartin3 0:a50bba1964ec 36 unsigned char wave_file_check(unsigned char *wave_array, FILE *open_file)
rsartin3 0:a50bba1964ec 37 {
rsartin3 0:a50bba1964ec 38 unsigned char brk_flag = 0u;
rsartin3 0:a50bba1964ec 39 unsigned char x = 0u;
rsartin3 0:a50bba1964ec 40 unsigned char valid_sample = 0u;
rsartin3 0:a50bba1964ec 41 short ch = 0;
rsartin3 0:a50bba1964ec 42
rsartin3 0:a50bba1964ec 43 if(DEBUG) printf("\n\rPrinting out.WAV file header...\n\r");
rsartin3 0:a50bba1964ec 44
rsartin3 0:a50bba1964ec 45 for (x = 0; x < 0x2bu; x++) /* Read the first 0x2b bytes of the file as this is the haeder informtation relating to sample rate etc. */
rsartin3 0:a50bba1964ec 46 {
rsartin3 0:a50bba1964ec 47 ch = fgetc(open_file); /* Get the first byte from the file */
rsartin3 0:a50bba1964ec 48 if (ch == EOF) /* Check for eof */
rsartin3 0:a50bba1964ec 49 {
rsartin3 0:a50bba1964ec 50 if(DEBUG) printf(" File too short to be a wave file\n\r"); /* If we have less than 0x2b then file is not a wave file. */
rsartin3 0:a50bba1964ec 51 valid_sample = 0u;
rsartin3 0:a50bba1964ec 52 brk_flag = 1u;
rsartin3 0:a50bba1964ec 53 }
rsartin3 0:a50bba1964ec 54 else{
rsartin3 0:a50bba1964ec 55 wave_array[x] = ch; /* Load data in to header file array */
rsartin3 0:a50bba1964ec 56 }
rsartin3 0:a50bba1964ec 57
rsartin3 0:a50bba1964ec 58 if (brk_flag == 1u)
rsartin3 0:a50bba1964ec 59 {
rsartin3 0:a50bba1964ec 60 break;
rsartin3 0:a50bba1964ec 61 }
rsartin3 0:a50bba1964ec 62 }
rsartin3 0:a50bba1964ec 63
rsartin3 0:a50bba1964ec 64 if (brk_flag == 0u) /* OK we have downloaded the header into an Array. Lets check to see if its a valid file */
rsartin3 0:a50bba1964ec 65 {
rsartin3 0:a50bba1964ec 66 if(DEBUG) printf(" Identification block (4 ASCII bytes)= "); /* First 4 bytes are header block */
rsartin3 0:a50bba1964ec 67 for (x = 0u; x < 4; x++)
rsartin3 0:a50bba1964ec 68 {
rsartin3 0:a50bba1964ec 69 //putc(wave_array[x]); /* and write them on the screen */
rsartin3 0:a50bba1964ec 70 wave_file_info.identification_block[x] = wave_array[x];
rsartin3 0:a50bba1964ec 71 }
rsartin3 0:a50bba1964ec 72 wave_file_info.identification_block[4] = 0; /* add the string terminator on the end */
rsartin3 0:a50bba1964ec 73 if(DEBUG) printf(" '%s'\n\r", wave_file_info.identification_block);
rsartin3 0:a50bba1964ec 74
rsartin3 0:a50bba1964ec 75
rsartin3 0:a50bba1964ec 76 if(DEBUG) printf(" Length of file (4 bytes) = "); /* Length of file. */
rsartin3 0:a50bba1964ec 77 for (x = 4u; x < 8u; x++)
rsartin3 0:a50bba1964ec 78 {
rsartin3 0:a50bba1964ec 79 if(DEBUG) printf("%d ",wave_array[x]);
rsartin3 0:a50bba1964ec 80 }
rsartin3 0:a50bba1964ec 81 wave_file_info.length_of_file = ( ((unsigned int) wave_array[7] << 24)
rsartin3 0:a50bba1964ec 82 + ((unsigned int) wave_array[6] << 16)
rsartin3 0:a50bba1964ec 83 + ((unsigned int) wave_array[5] << 8)
rsartin3 0:a50bba1964ec 84 + ((unsigned int) wave_array[4]) );
rsartin3 0:a50bba1964ec 85 if(DEBUG) printf(" = %d bytes\n\r", wave_file_info.length_of_file);
rsartin3 0:a50bba1964ec 86
rsartin3 0:a50bba1964ec 87
rsartin3 0:a50bba1964ec 88 if(DEBUG) printf(" Identifier (4 ASCII bytes) = "); /* indentifier string1 */
rsartin3 0:a50bba1964ec 89 for (x = 8u; x < 12u; x++)
rsartin3 0:a50bba1964ec 90 {
rsartin3 0:a50bba1964ec 91 //putc(wave_array[x]); /* and write them on the screen */
rsartin3 0:a50bba1964ec 92 wave_file_info.identifier1[x-8] = wave_array[x];
rsartin3 0:a50bba1964ec 93 }
rsartin3 0:a50bba1964ec 94 wave_file_info.identification_block[4] = 0; /* add the string terminator on the end */
rsartin3 0:a50bba1964ec 95 if(DEBUG) printf(" '%s'\n\r", wave_file_info.identifier1);
rsartin3 0:a50bba1964ec 96
rsartin3 0:a50bba1964ec 97
rsartin3 0:a50bba1964ec 98 if(DEBUG) printf(" Identifier (4 ASCII bytes) = "); /* Identifier String 2 */
rsartin3 0:a50bba1964ec 99 for (x = 12; x < 16u; x++)
rsartin3 0:a50bba1964ec 100 {
rsartin3 0:a50bba1964ec 101 //putc(wave_array[x]); /* and write them on the screen */
rsartin3 0:a50bba1964ec 102 wave_file_info.identifier2[x-12] = wave_array[x];
rsartin3 0:a50bba1964ec 103 }
rsartin3 0:a50bba1964ec 104 wave_file_info.identifier2[4] = 0; /* add the string terminator on the end */
rsartin3 0:a50bba1964ec 105 if(DEBUG) printf(" '%s'\n\r", wave_file_info.identifier2);
rsartin3 0:a50bba1964ec 106
rsartin3 0:a50bba1964ec 107
rsartin3 0:a50bba1964ec 108 if(DEBUG) printf(" Position of data (4 bytes) = "); /* Position of data */
rsartin3 0:a50bba1964ec 109 for (x = 16u; x < 20u; x++)
rsartin3 0:a50bba1964ec 110 {
rsartin3 0:a50bba1964ec 111 if(DEBUG) printf("%d ",wave_array[x]);
rsartin3 0:a50bba1964ec 112 }
rsartin3 0:a50bba1964ec 113 wave_file_info.position_of_data = ( ((unsigned int) wave_array[19] << 24)
rsartin3 0:a50bba1964ec 114 + ((unsigned int) wave_array[18] << 16)
rsartin3 0:a50bba1964ec 115 + ((unsigned int) wave_array[17] << 8)
rsartin3 0:a50bba1964ec 116 + ((unsigned int) wave_array[16]) );
rsartin3 0:a50bba1964ec 117 if(DEBUG) printf(" = %d\n\r", wave_file_info.position_of_data);
rsartin3 0:a50bba1964ec 118
rsartin3 0:a50bba1964ec 119
rsartin3 0:a50bba1964ec 120 if(DEBUG) printf(" Format Tag - Always 1 for Wave PCM (2 bytes) = "); /* format tag */
rsartin3 0:a50bba1964ec 121 for (x = 20u; x < 22u; x++)
rsartin3 0:a50bba1964ec 122 {
rsartin3 0:a50bba1964ec 123 if(DEBUG) printf("%d ",wave_array[x]);
rsartin3 0:a50bba1964ec 124 }
rsartin3 0:a50bba1964ec 125 wave_file_info.format_tag = ( ((unsigned int) wave_array[21] << 8)
rsartin3 0:a50bba1964ec 126 + ((unsigned int) wave_array[20]) );
rsartin3 0:a50bba1964ec 127 if(DEBUG) printf(" = %d\n\r", wave_file_info.format_tag);
rsartin3 0:a50bba1964ec 128
rsartin3 0:a50bba1964ec 129
rsartin3 0:a50bba1964ec 130 if(DEBUG) printf(" Number of channels (2 bytes) = "); /* Number of channels, mono or steroeo */
rsartin3 0:a50bba1964ec 131 for (x = 22u; x < 24u; x++)
rsartin3 0:a50bba1964ec 132 {
rsartin3 0:a50bba1964ec 133 if(DEBUG) printf("%d ",wave_array[x]);
rsartin3 0:a50bba1964ec 134 }
rsartin3 0:a50bba1964ec 135 wave_file_info.number_of_channels = ( ((unsigned int) wave_array[23] << 8)
rsartin3 0:a50bba1964ec 136 + ((unsigned int) wave_array[22]) );
rsartin3 0:a50bba1964ec 137 if(DEBUG) printf(" = %d channel(s)\n\r", wave_file_info.number_of_channels);
rsartin3 0:a50bba1964ec 138
rsartin3 0:a50bba1964ec 139
rsartin3 0:a50bba1964ec 140 if(DEBUG) printf(" Samples per second (4 bytes) = "); /* Samples per second */
rsartin3 0:a50bba1964ec 141 for (x = 24u; x < 28u; x++)
rsartin3 0:a50bba1964ec 142 {
rsartin3 0:a50bba1964ec 143 if(DEBUG) printf("%d ",wave_array[x]);
rsartin3 0:a50bba1964ec 144 }
rsartin3 0:a50bba1964ec 145 wave_file_info.samples_per_second =( ((unsigned int) wave_array[27] << 24)
rsartin3 0:a50bba1964ec 146 + ((unsigned int) wave_array[26] << 16)
rsartin3 0:a50bba1964ec 147 + ((unsigned int) wave_array[25] << 8)
rsartin3 0:a50bba1964ec 148 + ((unsigned int) wave_array[24]) );
rsartin3 0:a50bba1964ec 149 if(DEBUG) printf(" = %d samples per sec\n\r", wave_file_info.samples_per_second);
rsartin3 0:a50bba1964ec 150
rsartin3 0:a50bba1964ec 151
rsartin3 0:a50bba1964ec 152 if(DEBUG) printf(" Bytes Per Second (4 bytes) = "); /* Bytes per second */
rsartin3 0:a50bba1964ec 153 for (x = 28u; x < 32u; x++)
rsartin3 0:a50bba1964ec 154 {
rsartin3 0:a50bba1964ec 155 if(DEBUG) printf("%d ",wave_array[x]);
rsartin3 0:a50bba1964ec 156 }
rsartin3 0:a50bba1964ec 157 wave_file_info.bytes_per_second = ( ((unsigned int) wave_array[31] << 24)
rsartin3 0:a50bba1964ec 158 + ((unsigned int) wave_array[30] << 16)
rsartin3 0:a50bba1964ec 159 + ((unsigned int) wave_array[29] << 8)
rsartin3 0:a50bba1964ec 160 + ((unsigned int) wave_array[28]) );
rsartin3 0:a50bba1964ec 161 if(DEBUG) printf(" = %d bytes per sec\n\r", wave_file_info.bytes_per_second);
rsartin3 0:a50bba1964ec 162
rsartin3 0:a50bba1964ec 163
rsartin3 0:a50bba1964ec 164 if(DEBUG) printf(" Bytes Per Sample (2 bytes) = "); /* Bytes per sample */
rsartin3 0:a50bba1964ec 165 for (x = 32u; x < 34u; x++)
rsartin3 0:a50bba1964ec 166 {
rsartin3 0:a50bba1964ec 167 if(DEBUG) printf("%d ",wave_array[x]);
rsartin3 0:a50bba1964ec 168 }
rsartin3 0:a50bba1964ec 169 wave_file_info.bytes_per_sample = ( ((unsigned int) wave_array[33] << 8)
rsartin3 0:a50bba1964ec 170 + ((unsigned int) wave_array[32]) );
rsartin3 0:a50bba1964ec 171 if(DEBUG) printf(" = %d bytes\n\r", wave_file_info.bytes_per_sample);
rsartin3 0:a50bba1964ec 172
rsartin3 0:a50bba1964ec 173
rsartin3 0:a50bba1964ec 174 if(DEBUG) printf(" Bits Per Sample (2 bytes) = "); /* Bits per sample */
rsartin3 0:a50bba1964ec 175 for (x = 34u; x < 36u; x++)
rsartin3 0:a50bba1964ec 176 {
rsartin3 0:a50bba1964ec 177 if(DEBUG) printf("%d ",wave_array[x]);
rsartin3 0:a50bba1964ec 178 }
rsartin3 0:a50bba1964ec 179 wave_file_info.bits_per_sample = ( ((unsigned int) wave_array[35] << 8)
rsartin3 0:a50bba1964ec 180 + ((unsigned int) wave_array[34]) );
rsartin3 0:a50bba1964ec 181 if(DEBUG) printf(" = %d bits\n\r", wave_file_info.bits_per_sample);
rsartin3 0:a50bba1964ec 182
rsartin3 0:a50bba1964ec 183
rsartin3 0:a50bba1964ec 184 if(DEBUG) printf(" Marker (4 ASCII bytes) = "); /* Marker */
rsartin3 0:a50bba1964ec 185 for (x = 36u; x < 40u; x++)
rsartin3 0:a50bba1964ec 186 {
rsartin3 0:a50bba1964ec 187 //putc(wave_array[x]);
rsartin3 0:a50bba1964ec 188 wave_file_info.marker[x-36] = wave_array[x];
rsartin3 0:a50bba1964ec 189 }
rsartin3 0:a50bba1964ec 190 wave_file_info.marker[4] = 0;
rsartin3 0:a50bba1964ec 191 if(DEBUG) printf(" '%s'\n\r", wave_file_info.marker);
rsartin3 0:a50bba1964ec 192
rsartin3 0:a50bba1964ec 193
rsartin3 0:a50bba1964ec 194 if(DEBUG) printf(" The number of bits in the sample (4 bytes) = "); /* Number of bits per sample. */
rsartin3 0:a50bba1964ec 195 for (x = 40u; x < 44u; x++)
rsartin3 0:a50bba1964ec 196 {
rsartin3 0:a50bba1964ec 197 if(DEBUG) printf("%d ",wave_array[x]);
rsartin3 0:a50bba1964ec 198 }
rsartin3 0:a50bba1964ec 199 wave_file_info.number_of_bits_in_sample = ( ((unsigned int) wave_array[43] << 24)
rsartin3 0:a50bba1964ec 200 + ((unsigned int) wave_array[42] << 16)
rsartin3 0:a50bba1964ec 201 + ((unsigned int) wave_array[41] << 8)
rsartin3 0:a50bba1964ec 202 + ((unsigned int) wave_array[40]) );
rsartin3 0:a50bba1964ec 203 if(DEBUG) printf(" = %d bits\n\r", wave_file_info.number_of_bits_in_sample);
rsartin3 0:a50bba1964ec 204
rsartin3 0:a50bba1964ec 205
rsartin3 0:a50bba1964ec 206 /* Check for valid Wave file */
rsartin3 0:a50bba1964ec 207 if (((wave_array[0] == 'R') && (wave_array[1] == 'I') && (wave_array[2] == 'F') && (wave_array[3] == 'F'))
rsartin3 0:a50bba1964ec 208 && ((wave_array[8] == 'W') && (wave_array[9] == 'A') && (wave_array[0x0a] == 'V') && (wave_array[0x0b] == 'E'))
rsartin3 0:a50bba1964ec 209 && ((wave_array[0x0c] == 'f') && (wave_array[0x0d] == 'm') && (wave_array[0x0e] == 't') && (wave_array[0x0f] == ' '))
rsartin3 0:a50bba1964ec 210 && (wave_array[0x14] == 0x01)) valid_sample = 1u;
rsartin3 0:a50bba1964ec 211 }
rsartin3 0:a50bba1964ec 212
rsartin3 0:a50bba1964ec 213 if(DEBUG) printf("Finished examining the .WAV file header\n\r");
rsartin3 0:a50bba1964ec 214 if (valid_sample == 1)
rsartin3 0:a50bba1964ec 215 {
rsartin3 0:a50bba1964ec 216 if(DEBUG) printf("Sample is a valid .WAV sample file\n\n\r");
rsartin3 0:a50bba1964ec 217 }
rsartin3 0:a50bba1964ec 218 else{
rsartin3 0:a50bba1964ec 219 if(DEBUG) printf("Sample is a NOT a valid .WAV sample file\n\n\r");
rsartin3 0:a50bba1964ec 220 }
rsartin3 0:a50bba1964ec 221
rsartin3 0:a50bba1964ec 222 return valid_sample;
rsartin3 0:a50bba1964ec 223 }