This sample will play a ".wav" file of the USB root folder. Only RIFF format, 48kHz, 16bit, 2ch.

Dependencies:   USBHostDac USBHost_custom_Addiso

Fork of USBHostDac_example by GR-PEACH_producer_meeting

Isochronous transfer sample for GR-PEACH. This sample will play a ".wav" file of the USB root folder. Only RIFF format, 48kHz, 16bit, 2ch.

/media/uploads/dkato/usbdacsample.png
The default setting of serial communication (baud rate etc.) in mbed is shown the following link.
Please refer to the link and change the settings of your PC terminal software.
The default value of baud rate in mbed is 9600, and this application uses baud rate 9600.
https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH-Getting-Started#install-the-usb-serial-communication

Committer:
Osamu Nakamura
Date:
Fri Apr 21 21:22:51 2017 +0900
Revision:
4:c7cba8933302
Parent:
1:82fe51d45902
Introduced mbed OS 5 instead of mbed OS 2 (Classic)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 1:82fe51d45902 1 /**************************************************************************//**
dkato 1:82fe51d45902 2 * @file dec_wav.h
dkato 1:82fe51d45902 3 * @brief wav
dkato 1:82fe51d45902 4 ******************************************************************************/
dkato 1:82fe51d45902 5 #include "mbed.h"
dkato 1:82fe51d45902 6
dkato 1:82fe51d45902 7 /** A class to communicate a dec_wav
dkato 1:82fe51d45902 8 *
dkato 1:82fe51d45902 9 */
dkato 1:82fe51d45902 10 class dec_wav {
dkato 1:82fe51d45902 11 public:
dkato 1:82fe51d45902 12
dkato 1:82fe51d45902 13 /** analyze header
dkato 1:82fe51d45902 14 *
dkato 1:82fe51d45902 15 * @param p_title title tag buffer
dkato 1:82fe51d45902 16 * @param p_artist artist tag buffer
dkato 1:82fe51d45902 17 * @param p_album album tag buffer
dkato 1:82fe51d45902 18 * @param tag_size tag buffer size
dkato 1:82fe51d45902 19 * @param fp file pointer
dkato 1:82fe51d45902 20 * @return true = success, false = failure
dkato 1:82fe51d45902 21 */
dkato 1:82fe51d45902 22 bool AnalyzeHeder(uint8_t * p_title, uint8_t * p_artist, uint8_t * p_album, uint16_t tag_size, FILE * fp) {
dkato 1:82fe51d45902 23 bool result = false;
dkato 1:82fe51d45902 24 size_t read_size;
dkato 1:82fe51d45902 25 uint8_t wk_read_buff[36];
dkato 1:82fe51d45902 26 uint8_t *data;
dkato 1:82fe51d45902 27 uint32_t chunk_size;
dkato 1:82fe51d45902 28 uint32_t sub_chunk_size;
dkato 1:82fe51d45902 29 uint32_t list_index_max;
dkato 1:82fe51d45902 30 bool list_ok = false;
dkato 1:82fe51d45902 31 uint32_t read_index = 0;
dkato 1:82fe51d45902 32 uint32_t data_index = 0;
dkato 1:82fe51d45902 33 uint16_t wk_len;
dkato 1:82fe51d45902 34
dkato 1:82fe51d45902 35 if (fp == NULL) {
dkato 1:82fe51d45902 36 return false;
dkato 1:82fe51d45902 37 }
dkato 1:82fe51d45902 38 music_data_size = 0;
dkato 1:82fe51d45902 39 music_data_index = 0;
dkato 1:82fe51d45902 40 wav_fp = fp;
dkato 1:82fe51d45902 41 if (p_title != NULL) {
dkato 1:82fe51d45902 42 p_title[0] = '\0';
dkato 1:82fe51d45902 43 }
dkato 1:82fe51d45902 44 if (p_artist != NULL) {
dkato 1:82fe51d45902 45 p_artist[0] = '\0';
dkato 1:82fe51d45902 46 }
dkato 1:82fe51d45902 47 if (p_album != NULL) {
dkato 1:82fe51d45902 48 p_album[0] = '\0';
dkato 1:82fe51d45902 49 }
dkato 1:82fe51d45902 50
dkato 1:82fe51d45902 51 read_size = fread(&wk_read_buff[0], sizeof(char), 36, wav_fp);
dkato 1:82fe51d45902 52 if (read_size < 36) {
dkato 1:82fe51d45902 53 // do nothing
dkato 1:82fe51d45902 54 } else if (memcmp(&wk_read_buff[0], "RIFF", 4) != 0) {
dkato 1:82fe51d45902 55 // do nothing
dkato 1:82fe51d45902 56 } else if (memcmp(&wk_read_buff[8], "WAVE", 4) != 0) {
dkato 1:82fe51d45902 57 // do nothing
dkato 1:82fe51d45902 58 } else if (memcmp(&wk_read_buff[12], "fmt ", 4) != 0) {
dkato 1:82fe51d45902 59 // do nothing
dkato 1:82fe51d45902 60 } else {
dkato 1:82fe51d45902 61 read_index += 36;
dkato 1:82fe51d45902 62 channel = ((uint32_t)wk_read_buff[22] << 0) + ((uint32_t)wk_read_buff[23] << 8);
dkato 1:82fe51d45902 63 sampling_rate = ((uint32_t)wk_read_buff[24] << 0)
dkato 1:82fe51d45902 64 + ((uint32_t)wk_read_buff[25] << 8)
dkato 1:82fe51d45902 65 + ((uint32_t)wk_read_buff[26] << 16)
dkato 1:82fe51d45902 66 + ((uint32_t)wk_read_buff[27] << 24);
dkato 1:82fe51d45902 67 block_size = ((uint32_t)wk_read_buff[34] << 0) + ((uint32_t)wk_read_buff[35] << 8);
dkato 1:82fe51d45902 68 while (1) {
dkato 1:82fe51d45902 69 read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp);
dkato 1:82fe51d45902 70 read_index += 8;
dkato 1:82fe51d45902 71 if (read_size < 8) {
dkato 1:82fe51d45902 72 break;
dkato 1:82fe51d45902 73 } else {
dkato 1:82fe51d45902 74 chunk_size = ((uint32_t)wk_read_buff[4] << 0)
dkato 1:82fe51d45902 75 + ((uint32_t)wk_read_buff[5] << 8)
dkato 1:82fe51d45902 76 + ((uint32_t)wk_read_buff[6] << 16)
dkato 1:82fe51d45902 77 + ((uint32_t)wk_read_buff[7] << 24);
dkato 1:82fe51d45902 78 if (memcmp(&wk_read_buff[0], "data", 4) == 0) {
dkato 1:82fe51d45902 79 result = true;
dkato 1:82fe51d45902 80 music_data_size = chunk_size;
dkato 1:82fe51d45902 81 if (list_ok == true) {
dkato 1:82fe51d45902 82 break;
dkato 1:82fe51d45902 83 } else {
dkato 1:82fe51d45902 84 data_index = read_index;
dkato 1:82fe51d45902 85 fseek(wav_fp, chunk_size, SEEK_CUR);
dkato 1:82fe51d45902 86 read_index += chunk_size;
dkato 1:82fe51d45902 87 }
dkato 1:82fe51d45902 88 } else if (memcmp(&wk_read_buff[0], "LIST", 4) == 0) {
dkato 1:82fe51d45902 89 list_ok = true;
dkato 1:82fe51d45902 90 list_index_max = read_index + chunk_size;
dkato 1:82fe51d45902 91 read_size = fread(&wk_read_buff[0], sizeof(char), 4, wav_fp);
dkato 1:82fe51d45902 92 read_index += 4;
dkato 1:82fe51d45902 93 while (read_index < list_index_max) {
dkato 1:82fe51d45902 94 read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp);
dkato 1:82fe51d45902 95 read_index += 8;
dkato 1:82fe51d45902 96 if (read_size < 8) {
dkato 1:82fe51d45902 97 break;
dkato 1:82fe51d45902 98 } else if (memcmp(&wk_read_buff[0], "INAM", 4) == 0) {
dkato 1:82fe51d45902 99 data = p_title;
dkato 1:82fe51d45902 100 } else if (memcmp(&wk_read_buff[0], "IART", 4) == 0) {
dkato 1:82fe51d45902 101 data = p_artist;
dkato 1:82fe51d45902 102 } else if (memcmp(&wk_read_buff[0], "IPRD", 4) == 0) {
dkato 1:82fe51d45902 103 data = p_album;
dkato 1:82fe51d45902 104 } else {
dkato 1:82fe51d45902 105 data = NULL;
dkato 1:82fe51d45902 106 }
dkato 1:82fe51d45902 107 if ((data != NULL) && (tag_size != 0)) {
dkato 1:82fe51d45902 108 sub_chunk_size = ((uint32_t)wk_read_buff[4] << 0)
dkato 1:82fe51d45902 109 + ((uint32_t)wk_read_buff[5] << 8)
dkato 1:82fe51d45902 110 + ((uint32_t)wk_read_buff[6] << 16)
dkato 1:82fe51d45902 111 + ((uint32_t)wk_read_buff[7] << 24);
dkato 1:82fe51d45902 112 if (sub_chunk_size > (tag_size - 1)) {
dkato 1:82fe51d45902 113 wk_len = (tag_size - 1);
dkato 1:82fe51d45902 114 } else {
dkato 1:82fe51d45902 115 wk_len = sub_chunk_size;
dkato 1:82fe51d45902 116 }
dkato 1:82fe51d45902 117 read_size = fread(data, sizeof(char), wk_len, wav_fp);
dkato 1:82fe51d45902 118 read_index += sub_chunk_size;
dkato 1:82fe51d45902 119 fseek(wav_fp, read_index, SEEK_SET);
dkato 1:82fe51d45902 120 data[wk_len] = '\0';
dkato 1:82fe51d45902 121 }
dkato 1:82fe51d45902 122 }
dkato 1:82fe51d45902 123 if (data_index != 0) {
dkato 1:82fe51d45902 124 break;
dkato 1:82fe51d45902 125 } else {
dkato 1:82fe51d45902 126 fseek(wav_fp, list_index_max, SEEK_SET);
dkato 1:82fe51d45902 127 }
dkato 1:82fe51d45902 128 } else {
dkato 1:82fe51d45902 129 fseek(wav_fp, chunk_size, SEEK_CUR);
dkato 1:82fe51d45902 130 read_index += chunk_size;
dkato 1:82fe51d45902 131 }
dkato 1:82fe51d45902 132 }
dkato 1:82fe51d45902 133 }
dkato 1:82fe51d45902 134
dkato 1:82fe51d45902 135 if (data_index != 0) {
dkato 1:82fe51d45902 136 fseek(wav_fp, data_index, SEEK_SET);
dkato 1:82fe51d45902 137 }
dkato 1:82fe51d45902 138 }
dkato 1:82fe51d45902 139
dkato 1:82fe51d45902 140 return result;
dkato 1:82fe51d45902 141 };
dkato 1:82fe51d45902 142
dkato 1:82fe51d45902 143 /** get next data
dkato 1:82fe51d45902 144 *
dkato 1:82fe51d45902 145 * @param buf data buffer address
dkato 1:82fe51d45902 146 * @param len data buffer length
dkato 1:82fe51d45902 147 * @return get data size
dkato 1:82fe51d45902 148 */
dkato 1:82fe51d45902 149 size_t GetNextData(void *buf, size_t len) {
dkato 1:82fe51d45902 150 if ((music_data_index + len) > music_data_size) {
dkato 1:82fe51d45902 151 len = music_data_size - music_data_index;
dkato 1:82fe51d45902 152 }
dkato 1:82fe51d45902 153 music_data_index += len;
dkato 1:82fe51d45902 154
dkato 1:82fe51d45902 155 return fread(buf, sizeof(char), len, wav_fp);
dkato 1:82fe51d45902 156 };
dkato 1:82fe51d45902 157
dkato 1:82fe51d45902 158 /** get channel
dkato 1:82fe51d45902 159 *
dkato 1:82fe51d45902 160 * @return channel
dkato 1:82fe51d45902 161 */
dkato 1:82fe51d45902 162 uint16_t GetChannel() {
dkato 1:82fe51d45902 163 return channel;
dkato 1:82fe51d45902 164 };
dkato 1:82fe51d45902 165
dkato 1:82fe51d45902 166 /** get block size
dkato 1:82fe51d45902 167 *
dkato 1:82fe51d45902 168 * @return block size
dkato 1:82fe51d45902 169 */
dkato 1:82fe51d45902 170 uint16_t GetBlockSize() {
dkato 1:82fe51d45902 171 return block_size;
dkato 1:82fe51d45902 172 };
dkato 1:82fe51d45902 173
dkato 1:82fe51d45902 174 /** get sampling rate
dkato 1:82fe51d45902 175 *
dkato 1:82fe51d45902 176 * @return sampling rate
dkato 1:82fe51d45902 177 */
dkato 1:82fe51d45902 178 uint16_t GetSamplingRate() {
dkato 1:82fe51d45902 179 return sampling_rate;
dkato 1:82fe51d45902 180 };
dkato 1:82fe51d45902 181
dkato 1:82fe51d45902 182 private:
dkato 1:82fe51d45902 183 FILE * wav_fp;
dkato 1:82fe51d45902 184 uint32_t music_data_size;
dkato 1:82fe51d45902 185 uint32_t music_data_index;
dkato 1:82fe51d45902 186 uint16_t channel;
dkato 1:82fe51d45902 187 uint16_t block_size;
dkato 1:82fe51d45902 188 uint32_t sampling_rate;
dkato 1:82fe51d45902 189 };