This sample will play a ".wav" file of the USB root folder. Only RIFF format.

Fork of GR-PEACH_Audio_WAV by Daiki Kato

Audio sample for GR-PEACH or GR-LYCHEE. This sample will play a ".wav" file in the root of USB memory or SD card. If the USER_BUTTON0 is pressed, the next song is played.

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

Please refer to following link about Audio/Camera Shield.
https://developer.mbed.org/teams/Renesas/wiki/Audio_Camera-shield

For GR-PEACH:

FormatWav file (RIFF format) ".wav"
Channel2ch
Frequencies32kHz, 44.1kHz, 48kHz, 88.2kHz and 96kHz
Quantization bit rate16bits, 24bits and 32bits


For GR-LYCHEE:

FormatWav file (RIFF format) ".wav"
Channel2ch
Frequencies32kHz, 44.1kHz and 48kHz
Quantization bit rate16bits



  • Use USB0 of PEACH:
    /media/uploads/dkato/audio_wav_usb0.png

    If you use the USB0 as USB Host, please close GR-PEACH's JP3.
    /media/uploads/RyoheiHagimoto/usb.jpg

    Please select USB0 connector by the following configuration.

mbed_app.json

{
    "config": {
        "usb-host-ch":{
            "help": "(for GR-PEACH) 0:ch0 1:ch1",
            "value": "0"
        },
        "audio-camera-shield":{
            "help": "(for GR-PEACH) 0:not use 1:use",
            "value": "0"
        }
    }
}



  • Use USB1 of GR-PEACH:
    /media/uploads/dkato/audio_wav_usb1.png

    If you use the USB1 as USB Host, please close Audio/Camera Shield's JP1. /media/uploads/dkato/audiocamerashield_jp1.jpg

    Please select Audio/Camera Shield and USB1 connector by the following configuration.

mbed_app.json

{
    "config": {
        "usb-host-ch":{
            "help": "(for GR-PEACH) 0:ch0 1:ch1",
            "value": "1"
        },
        "audio-camera-shield":{
            "help": "(for GR-PEACH) 0:not use 1:use",
            "value": "1"
        }
    }
}
Committer:
Osamu Nakamura
Date:
Wed Mar 22 14:37:49 2017 +0900
Revision:
9:a1045daef81d
Parent:
7:4b6799c255ea
Introduced mbed OS 5 instead of mbed OS 2(Classic)

Who changed what in which revision?

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