This software will read a .wav file from an SD card and display the header information contained within it. It is designed to work with the SD card on the mbed carrier which is part of the RS-EDP system.

Dependencies:   mbed SDFileSystem

Committer:
DavidGilesHitex
Date:
Fri Nov 19 09:54:23 2010 +0000
Revision:
0:35c1800c59e6

        

Who changed what in which revision?

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