/* Audio Parsing Constants */
(((uint32_t)wav_head_buff[x + 2]) << 8) | (((uint32_t)wav_head_buff[x + 3]) << 0))
(((uint32_t)wav_head_buff[x + 1]) << 8) | (((uint32_t)wav_head_buff[x + 0]) << 0))
wav_err_t wav_init(wav_decode_t *wav_obj,void* head, uint32_t file_size, uint32_t* head_len)
{
uint8_t* wav_head_buff = (uint8_t*)head;
uint32_t index;
index = 0;
if (BG_READ_WORD(index) != RIFF_ID) //Chunk ID
return UNVALID_RIFF_ID;
index += 4;
if ((LG_READ_WORD(index) + 8) != file_size)//Chunk Size modify
return UNVALID_RIFF_SIZE;
index += 4;
if (BG_READ_WORD(index) != WAVE_ID)//Formate
return UNVALID_WAVE_ID;
index += 4;
if (BG_READ_WORD(index) != FMT_ID)//sub chunk1 id
return UNVALID_FMT_ID;
index += 4;
if (LG_READ_WORD(index) != 0x10)//sub chunk1 size maybe can pass
{
return UNVALID_FMT_SIZE;
}
index += 4;
if (LG_READ_HALF(index) != 0x01)//audio Format only support PCM
return UNSUPPORETD_FORMATTAG;
index += 2;
wav_obj->numchannels = LG_READ_HALF(index);//Num Channel
if (wav_obj->numchannels != 1 && wav_obj->numchannels != 2)
return UNSUPPORETD_NUMBER_OF_CHANNEL;
index += 2;
wav_obj->samplerate = LG_READ_WORD(index);//sample rate
index += 4;
wav_obj->byterate = LG_READ_WORD(index);//bytearte
index += 4;
wav_obj->blockalign = LG_READ_HALF(index);//block align
index += 2;
wav_obj->bitspersample = LG_READ_HALF(index);//bits_per_sample
if (wav_obj->bitspersample != 8 && wav_obj->bitspersample != 16 && wav_obj->bitspersample != 24)
return UNSUPPORETD_BITS_PER_SAMPLE;
index += 2;
if (BG_READ_WORD(index) == LIST_ID)//extend format block
{
index += 4;
index += LG_READ_WORD(index);
index += 4;
if (index >= 500)
return UNVALID_LIST_SIZE;
}
if (BG_READ_WORD(index) != DATA_ID)// "data"
return UNVALID_DATA_ID;
index += 4;
wav_obj->datasize = LG_READ_WORD(index);//data size
index += 4;
// wav_obj->wave_file_curpos = index;//curpos
*head_len = index;
return OK;
}
// enum errorcode_e wav_decode_init(struct wav_obj_t *wav_obj)
// {
// uint32_t tmp;
// wav_obj->buff_end = 0;
// wav_obj->buff0_len = 256 * 1024;
// wav_obj->buff1_len = 256 * 1024;
// wav_obj->buff0 = (uint8_t *)malloc(wav_obj->buff0_len);
// wav_obj->buff1 = (uint8_t *)malloc(wav_obj->buff1_len);
// tmp = wav_obj->wave_file_len - wav_obj->wave_file_curpos;
// wav_obj->buff0_read_len = wav_obj->buff0_len > tmp ? tmp : wav_obj->buff0_len;
// memcpy(wav_obj->buff0, (wav_obj->wave_file + wav_obj->wave_file_curpos), wav_obj->buff0_read_len);
// wav_obj->wave_file_curpos += wav_obj->buff0_read_len;
// if (wav_obj->buff0_len > wav_obj->buff0_read_len)
// {
// wav_obj->buff_end = 1;
// mp_printf(&mp_plat_print, "%s buf_end=1\r\n", __func__);
// }
// wav_obj->buff_current = wav_obj->buff0;
// wav_obj->buff_current_len = wav_obj->buff0_len;
// wav_obj->buff0_used = 1;
// wav_obj->buff1_used = 0;
// wav_obj->buff_index = 0;
// return OK;
// }
// enum errorcode_e wav_decode(struct wav_obj_t *wav_obj)
// {
// uint32_t tmp;
// if (wav_obj->buff0_used == 0)
// {
// tmp = wav_obj->wave_file_len - wav_obj->wave_file_curpos;
// wav_obj->buff0_read_len = (wav_obj->buff0_len > tmp) ? tmp : wav_obj->buff0_len;
// memcpy(wav_obj->buff0, wav_obj->wave_file + wav_obj->wave_file_curpos, wav_obj->buff0_read_len);
// wav_obj->wave_file_curpos += wav_obj->buff0_read_len;
// wav_obj->buff0_used = 1;
// if (wav_obj->buff0_len > wav_obj->buff0_read_len)
// {
// if (wav_obj->wave_file_curpos == wav_obj->wave_file_len)
// return FILE_END;
// return FILE_FAIL;
// }
// }
// else if (wav_obj->buff1_used == 0)
// {
// tmp = wav_obj->wave_file_len - wav_obj->wave_file_curpos;
// wav_obj->buff1_read_len = (wav_obj->buff1_len > tmp) ? tmp : wav_obj->buff1_len;
// memcpy(wav_obj->buff1, wav_obj->wave_file + wav_obj->wave_file_curpos, wav_obj->buff1_read_len);
// wav_obj->wave_file_curpos += wav_obj->buff0_read_len;
// wav_obj->buff1_used = 1;
// if (wav_obj->buff1_len > wav_obj->buff1_read_len)
// {
// if (wav_obj->wave_file_curpos == wav_obj->wave_file_len)
// return FILE_END;
// return FILE_FAIL;
// }
// }
// return OK;
// }
// enum errorcode_e wav_decode_finish(struct wav_obj_t *wav_obj)
// {
// free(wav_obj->buff0);
// free(wav_obj->buff1);
// return OK;
// }