Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: GR-PEACH_Audio_WAV_PwmOut GR-Boards_Audio_WAV
Diff: decoder/EasyDec_WavCnv2ch.h
- Revision:
- 1:fdd79b99ba73
- Parent:
- 0:9956e2ed09da
--- a/decoder/EasyDec_WavCnv2ch.h Mon Oct 30 07:04:30 2017 +0000 +++ b/decoder/EasyDec_WavCnv2ch.h Tue Jul 03 05:12:29 2018 +0000 @@ -40,129 +40,7 @@ * @param fp file pointer * @return true = success, false = failure */ - virtual bool AnalyzeHeder(char* p_title, char* p_artist, char* p_album, uint16_t tag_size, FILE* fp) { - bool result = false; - size_t read_size; - uint8_t wk_read_buff[36]; - char *data; - uint32_t chunk_size; - uint32_t sub_chunk_size; - uint32_t list_index_max; - bool list_ok = false; - uint32_t read_index = 0; - uint32_t data_index = 0; - uint16_t wk_len; - - if (fp == NULL) { - return false; - } - music_data_size = 0; - music_data_index = 0; - wav_fp = fp; - if (p_title != NULL) { - p_title[0] = '\0'; - } - if (p_artist != NULL) { - p_artist[0] = '\0'; - } - if (p_album != NULL) { - p_album[0] = '\0'; - } - - read_size = fread(&wk_read_buff[0], sizeof(char), 36, wav_fp); - if (read_size < 36) { - // do nothing - } else if (memcmp(&wk_read_buff[0], "RIFF", 4) != 0) { - // do nothing - } else if (memcmp(&wk_read_buff[8], "WAVE", 4) != 0) { - // do nothing - } else if (memcmp(&wk_read_buff[12], "fmt ", 4) != 0) { - // do nothing - } else { - read_index += 36; - channel = ((uint32_t)wk_read_buff[22] << 0) + ((uint32_t)wk_read_buff[23] << 8); - sampling_rate = ((uint32_t)wk_read_buff[24] << 0) - + ((uint32_t)wk_read_buff[25] << 8) - + ((uint32_t)wk_read_buff[26] << 16) - + ((uint32_t)wk_read_buff[27] << 24); - block_size = ((uint32_t)wk_read_buff[34] << 0) + ((uint32_t)wk_read_buff[35] << 8); - while (1) { - read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp); - read_index += 8; - if (read_size < 8) { - break; - } else { - chunk_size = ((uint32_t)wk_read_buff[4] << 0) - + ((uint32_t)wk_read_buff[5] << 8) - + ((uint32_t)wk_read_buff[6] << 16) - + ((uint32_t)wk_read_buff[7] << 24); - if (memcmp(&wk_read_buff[0], "data", 4) == 0) { - result = true; - music_data_size = chunk_size; - if (list_ok == true) { - break; - } else { - data_index = read_index; - fseek(wav_fp, chunk_size, SEEK_CUR); - read_index += chunk_size; - } - } else if (memcmp(&wk_read_buff[0], "LIST", 4) == 0) { - list_ok = true; - list_index_max = read_index + chunk_size; - read_size = fread(&wk_read_buff[0], sizeof(char), 4, wav_fp); - read_index += 4; - while (read_index < list_index_max) { - read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp); - read_index += 8; - if (read_size < 8) { - break; - } else if (memcmp(&wk_read_buff[0], "INAM", 4) == 0) { - data = p_title; - } else if (memcmp(&wk_read_buff[0], "IART", 4) == 0) { - data = p_artist; - } else if (memcmp(&wk_read_buff[0], "IPRD", 4) == 0) { - data = p_album; - } else { - data = NULL; - } - sub_chunk_size = ((uint32_t)wk_read_buff[4] << 0) - + ((uint32_t)wk_read_buff[5] << 8) - + ((uint32_t)wk_read_buff[6] << 16) - + ((uint32_t)wk_read_buff[7] << 24); - if ((data != NULL) && (tag_size != 0)) { - if (sub_chunk_size > (uint32_t)(tag_size - 1)) { - wk_len = (tag_size - 1); - } else { - wk_len = sub_chunk_size; - } - read_size = fread(data, sizeof(char), wk_len, wav_fp); - data[wk_len] = '\0'; - } - if ((sub_chunk_size & 0x00000001) != 0) { - sub_chunk_size += 1; - } - read_index += sub_chunk_size; - fseek(wav_fp, read_index, SEEK_SET); - } - if (data_index != 0) { - break; - } else { - fseek(wav_fp, list_index_max, SEEK_SET); - } - } else { - fseek(wav_fp, chunk_size, SEEK_CUR); - read_index += chunk_size; - } - } - } - - if (data_index != 0) { - fseek(wav_fp, data_index, SEEK_SET); - } - } - - return result; - }; + virtual bool AnalyzeHeder(char* p_title, char* p_artist, char* p_album, uint16_t tag_size, FILE* fp); /** get next data * @@ -170,121 +48,25 @@ * @param len data buffer length * @return get data size */ - virtual size_t GetNextData(void *buf, size_t len) { - size_t ret_size; - size_t read_max = len; - - if ((block_size < 8) || ((block_size & 0x07) != 0)) { - return -1; - } - - if ((channel == 1) && (len != 0)) { - read_max /= 2; - } - - if (block_size == 24) { - // Add padding - uint32_t write_index = 0; - uint32_t wavfile_index; - uint32_t read_len; - uint32_t pading_index = 0; - uint8_t * p_buf = (uint8_t *)buf; - size_t ret; - - if ((music_data_index + read_max) > music_data_size) { - read_max = music_data_size - music_data_index; - } - while (write_index < (uint32_t)read_max) { - read_len = (read_max - write_index) * 3 / 4; - if (read_len > sizeof(wk_wavfile_buff)) { - read_len = sizeof(wk_wavfile_buff); - } - music_data_index += read_len; - ret = fread(wk_wavfile_buff, sizeof(char), read_len, wav_fp); - if (ret < read_len) { - break; - } - wavfile_index = 0; - while ((write_index < read_max) && (wavfile_index < read_len)) { - if (pading_index == 0) { - p_buf[write_index] = 0; - } else { - p_buf[write_index] = wk_wavfile_buff[wavfile_index]; - wavfile_index++; - } - if (pading_index < 3) { - pading_index++; - } else { - pading_index = 0; - } - write_index++; - } - } - ret_size = write_index; - } else { - if ((music_data_index + read_max) > music_data_size) { - read_max = music_data_size - music_data_index; - } - music_data_index += read_max; - - ret_size = fread(buf, sizeof(char), read_max, wav_fp); - } - - if ((channel == 1) && (ret_size > 0)) { - int block_byte; - int idx_w = len - 1; - int idx_r = ret_size - 1; - int idx_r_last; - int j; - - if (block_size == 24) { - block_byte = 4; - } else { - block_byte = block_size / 8; - } - while (idx_w >= 0) { - idx_r_last = idx_r; - for (j = 0; j < block_byte; j++) { - ((uint8_t*)buf)[idx_w--] = ((uint8_t*)buf)[idx_r--]; - } - idx_r = idx_r_last; - for (j = 0; j < block_byte; j++) { - ((uint8_t*)buf)[idx_w--] = ((uint8_t*)buf)[idx_r--]; - } - } - ret_size *= 2; - } - - return ret_size; - }; + virtual size_t GetNextData(void *buf, size_t len); /** get channel * * @return channel */ - virtual uint16_t GetChannel() { - if (channel == 1) { - return 2; - } else { - return channel; - } - }; + virtual uint16_t GetChannel(); /** get block size * * @return block size */ - virtual uint16_t GetBlockSize() { - return block_size; - }; + virtual uint16_t GetBlockSize(); /** get sampling rate * * @return sampling rate */ - virtual uint32_t GetSamplingRate() { - return sampling_rate; - }; + virtual uint32_t GetSamplingRate(); private: FILE * wav_fp; @@ -293,7 +75,6 @@ uint16_t channel; uint16_t block_size; uint32_t sampling_rate; - uint8_t wk_wavfile_buff[3072]; }; #endif