;
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.
Wav_Support_File.cpp@0:a50bba1964ec, 2013-03-04 (annotated)
- Committer:
- rsartin3
- Date:
- Mon Mar 04 22:37:06 2013 +0000
- Revision:
- 0:a50bba1964ec
;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |