wav_decode.c
1 #include <stdlib.h> 2 #include "wav_decode.h" 3 #include <string.h> 4 #include <stdio.h> 5 6 7 /* Audio Parsing Constants */ 8 #define RIFF_ID 0x52494646 /* correspond to the letters 'RIFF' */ 9 #define WAVE_ID 0x57415645 /* correspond to the letters 'WAVE' */ 10 #define FMT_ID 0x666D7420 /* correspond to the letters 'fmt ' */ 11 #define LIST_ID 0x4C495354 /* correspond to the letters 'LIST' */ 12 #define DATA_ID 0x64617461 /* correspond to the letters 'data' */ 13 14 #define BG_READ_WORD(x) ((((uint32_t)wav_head_buff[x + 0]) << 24) | (((uint32_t)wav_head_buff[x + 1]) << 16) | \ 15 (((uint32_t)wav_head_buff[x + 2]) << 8) | (((uint32_t)wav_head_buff[x + 3]) << 0)) 16 17 #define LG_READ_WORD(x) ((((uint32_t)wav_head_buff[x + 3]) << 24) | (((uint32_t)wav_head_buff[x + 2]) << 16) | \ 18 (((uint32_t)wav_head_buff[x + 1]) << 8) | (((uint32_t)wav_head_buff[x + 0]) << 0)) 19 20 #define LG_READ_HALF(x) ((((uint16_t)wav_head_buff[x + 1]) << 8) | (((uint16_t)wav_head_buff[x + 0]) << 0)) 21 22 wav_err_t wav_init(wav_decode_t *wav_obj,void* head, uint32_t file_size, uint32_t* head_len) 23 { 24 uint8_t* wav_head_buff = (uint8_t*)head; 25 uint32_t index; 26 27 index = 0; 28 if (BG_READ_WORD(index) != RIFF_ID) //Chunk ID 29 return UNVALID_RIFF_ID; 30 31 index += 4; 32 33 if ((LG_READ_WORD(index) + 8) != file_size)//Chunk Size modify 34 return UNVALID_RIFF_SIZE; 35 36 index += 4; 37 if (BG_READ_WORD(index) != WAVE_ID)//Formate 38 return UNVALID_WAVE_ID; 39 40 index += 4; 41 if (BG_READ_WORD(index) != FMT_ID)//sub chunk1 id 42 return UNVALID_FMT_ID; 43 44 index += 4; 45 if (LG_READ_WORD(index) != 0x10)//sub chunk1 size maybe can pass 46 { 47 return UNVALID_FMT_SIZE; 48 } 49 50 index += 4; 51 if (LG_READ_HALF(index) != 0x01)//audio Format only support PCM 52 return UNSUPPORETD_FORMATTAG; 53 54 index += 2; 55 wav_obj->numchannels = LG_READ_HALF(index);//Num Channel 56 if (wav_obj->numchannels != 1 && wav_obj->numchannels != 2) 57 return UNSUPPORETD_NUMBER_OF_CHANNEL; 58 59 index += 2; 60 wav_obj->samplerate = LG_READ_WORD(index);//sample rate 61 62 index += 4; 63 wav_obj->byterate = LG_READ_WORD(index);//bytearte 64 index += 4; 65 wav_obj->blockalign = LG_READ_HALF(index);//block align 66 index += 2; 67 wav_obj->bitspersample = LG_READ_HALF(index);//bits_per_sample 68 if (wav_obj->bitspersample != 8 && wav_obj->bitspersample != 16 && wav_obj->bitspersample != 24) 69 return UNSUPPORETD_BITS_PER_SAMPLE; 70 71 index += 2; 72 if (BG_READ_WORD(index) == LIST_ID)//extend format block 73 { 74 index += 4; 75 index += LG_READ_WORD(index); 76 index += 4; 77 if (index >= 500) 78 return UNVALID_LIST_SIZE; 79 } 80 81 if (BG_READ_WORD(index) != DATA_ID)// "data" 82 return UNVALID_DATA_ID; 83 84 index += 4; 85 wav_obj->datasize = LG_READ_WORD(index);//data size 86 index += 4; 87 88 // wav_obj->wave_file_curpos = index;//curpos 89 *head_len = index; 90 return OK; 91 } 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 // enum errorcode_e wav_decode_init(struct wav_obj_t *wav_obj) 125 // { 126 // uint32_t tmp; 127 128 // wav_obj->buff_end = 0; 129 // wav_obj->buff0_len = 256 * 1024; 130 // wav_obj->buff1_len = 256 * 1024; 131 // wav_obj->buff0 = (uint8_t *)malloc(wav_obj->buff0_len); 132 // wav_obj->buff1 = (uint8_t *)malloc(wav_obj->buff1_len); 133 134 // tmp = wav_obj->wave_file_len - wav_obj->wave_file_curpos; 135 // wav_obj->buff0_read_len = wav_obj->buff0_len > tmp ? tmp : wav_obj->buff0_len; 136 // memcpy(wav_obj->buff0, (wav_obj->wave_file + wav_obj->wave_file_curpos), wav_obj->buff0_read_len); 137 // wav_obj->wave_file_curpos += wav_obj->buff0_read_len; 138 139 // if (wav_obj->buff0_len > wav_obj->buff0_read_len) 140 // { 141 // wav_obj->buff_end = 1; 142 // mp_printf(&mp_plat_print, "%s buf_end=1\r\n", __func__); 143 // } 144 145 // wav_obj->buff_current = wav_obj->buff0; 146 // wav_obj->buff_current_len = wav_obj->buff0_len; 147 // wav_obj->buff0_used = 1; 148 // wav_obj->buff1_used = 0; 149 // wav_obj->buff_index = 0; 150 // return OK; 151 // } 152 153 // enum errorcode_e wav_decode(struct wav_obj_t *wav_obj) 154 // { 155 // uint32_t tmp; 156 157 // if (wav_obj->buff0_used == 0) 158 // { 159 // tmp = wav_obj->wave_file_len - wav_obj->wave_file_curpos; 160 // wav_obj->buff0_read_len = (wav_obj->buff0_len > tmp) ? tmp : wav_obj->buff0_len; 161 // memcpy(wav_obj->buff0, wav_obj->wave_file + wav_obj->wave_file_curpos, wav_obj->buff0_read_len); 162 // wav_obj->wave_file_curpos += wav_obj->buff0_read_len; 163 // wav_obj->buff0_used = 1; 164 // if (wav_obj->buff0_len > wav_obj->buff0_read_len) 165 // { 166 // if (wav_obj->wave_file_curpos == wav_obj->wave_file_len) 167 // return FILE_END; 168 // return FILE_FAIL; 169 // } 170 // } 171 // else if (wav_obj->buff1_used == 0) 172 // { 173 // tmp = wav_obj->wave_file_len - wav_obj->wave_file_curpos; 174 // wav_obj->buff1_read_len = (wav_obj->buff1_len > tmp) ? tmp : wav_obj->buff1_len; 175 // memcpy(wav_obj->buff1, wav_obj->wave_file + wav_obj->wave_file_curpos, wav_obj->buff1_read_len); 176 // wav_obj->wave_file_curpos += wav_obj->buff0_read_len; 177 // wav_obj->buff1_used = 1; 178 // if (wav_obj->buff1_len > wav_obj->buff1_read_len) 179 // { 180 // if (wav_obj->wave_file_curpos == wav_obj->wave_file_len) 181 // return FILE_END; 182 // return FILE_FAIL; 183 // } 184 // } 185 // return OK; 186 // } 187 188 // enum errorcode_e wav_decode_finish(struct wav_obj_t *wav_obj) 189 // { 190 // free(wav_obj->buff0); 191 // free(wav_obj->buff1); 192 // return OK; 193 // }