/ components / utils / src / wav_decode.c
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  // }