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:
dkato
Date:
Wed Jun 24 10:00:46 2015 +0000
Revision:
5:983467c1466b
Parent:
4:01651a6c3f9a
Child:
6:ad0b3ce4284b
bug fixed

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 5:983467c1466b 68 if ((channel != 2) || (block_size != 16) || (sampling_rate != 44100)) {
dkato 4:01651a6c3f9a 69 return false;
dkato 4:01651a6c3f9a 70 }
dkato 4:01651a6c3f9a 71 while (1) {
dkato 4:01651a6c3f9a 72 read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp);
dkato 4:01651a6c3f9a 73 read_index += 8;
dkato 4:01651a6c3f9a 74 if (read_size < 8) {
dkato 4:01651a6c3f9a 75 break;
dkato 4:01651a6c3f9a 76 } else {
dkato 4:01651a6c3f9a 77 chunk_size = ((uint32_t)wk_read_buff[4] << 0)
dkato 4:01651a6c3f9a 78 + ((uint32_t)wk_read_buff[5] << 8)
dkato 4:01651a6c3f9a 79 + ((uint32_t)wk_read_buff[6] << 16)
dkato 4:01651a6c3f9a 80 + ((uint32_t)wk_read_buff[7] << 24);
dkato 4:01651a6c3f9a 81 if (memcmp(&wk_read_buff[0], "data", 4) == 0) {
dkato 4:01651a6c3f9a 82 result = true;
dkato 4:01651a6c3f9a 83 music_data_size = chunk_size;
dkato 4:01651a6c3f9a 84 if (list_ok == true) {
dkato 4:01651a6c3f9a 85 break;
dkato 4:01651a6c3f9a 86 } else {
dkato 4:01651a6c3f9a 87 data_index = read_index;
dkato 4:01651a6c3f9a 88 fseek(wav_fp, chunk_size, SEEK_CUR);
dkato 4:01651a6c3f9a 89 read_index += chunk_size;
dkato 4:01651a6c3f9a 90 }
dkato 4:01651a6c3f9a 91 } else if (memcmp(&wk_read_buff[0], "LIST", 4) == 0) {
dkato 4:01651a6c3f9a 92 list_ok = true;
dkato 4:01651a6c3f9a 93 list_index_max = read_index + chunk_size;
dkato 4:01651a6c3f9a 94 read_size = fread(&wk_read_buff[0], sizeof(char), 4, wav_fp);
dkato 4:01651a6c3f9a 95 read_index += 4;
dkato 4:01651a6c3f9a 96 while (read_index < list_index_max) {
dkato 4:01651a6c3f9a 97 read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp);
dkato 4:01651a6c3f9a 98 read_index += 8;
dkato 4:01651a6c3f9a 99 if (read_size < 8) {
dkato 4:01651a6c3f9a 100 break;
dkato 4:01651a6c3f9a 101 } else if (memcmp(&wk_read_buff[0], "INAM", 4) == 0) {
dkato 4:01651a6c3f9a 102 data = p_title;
dkato 4:01651a6c3f9a 103 } else if (memcmp(&wk_read_buff[0], "IART", 4) == 0) {
dkato 4:01651a6c3f9a 104 data = p_artist;
dkato 4:01651a6c3f9a 105 } else if (memcmp(&wk_read_buff[0], "IPRD", 4) == 0) {
dkato 4:01651a6c3f9a 106 data = p_album;
dkato 4:01651a6c3f9a 107 } else {
dkato 4:01651a6c3f9a 108 data = NULL;
dkato 4:01651a6c3f9a 109 }
dkato 4:01651a6c3f9a 110 if ((data != NULL) && (tag_size != 0)) {
dkato 4:01651a6c3f9a 111 sub_chunk_size = ((uint32_t)wk_read_buff[4] << 0)
dkato 4:01651a6c3f9a 112 + ((uint32_t)wk_read_buff[5] << 8)
dkato 4:01651a6c3f9a 113 + ((uint32_t)wk_read_buff[6] << 16)
dkato 4:01651a6c3f9a 114 + ((uint32_t)wk_read_buff[7] << 24);
dkato 4:01651a6c3f9a 115 if (sub_chunk_size > (tag_size - 1)) {
dkato 4:01651a6c3f9a 116 wk_len = (tag_size - 1);
dkato 4:01651a6c3f9a 117 } else {
dkato 4:01651a6c3f9a 118 wk_len = sub_chunk_size;
dkato 4:01651a6c3f9a 119 }
dkato 4:01651a6c3f9a 120 read_size = fread(data, sizeof(char), wk_len, wav_fp);
dkato 4:01651a6c3f9a 121 read_index += sub_chunk_size;
dkato 4:01651a6c3f9a 122 fseek(wav_fp, read_index, SEEK_SET);
dkato 4:01651a6c3f9a 123 data[wk_len] = '\0';
dkato 4:01651a6c3f9a 124 }
dkato 4:01651a6c3f9a 125 }
dkato 4:01651a6c3f9a 126 if (data_index != 0) {
dkato 4:01651a6c3f9a 127 break;
dkato 4:01651a6c3f9a 128 } else {
dkato 4:01651a6c3f9a 129 fseek(wav_fp, list_index_max, SEEK_SET);
dkato 4:01651a6c3f9a 130 }
dkato 4:01651a6c3f9a 131 } else {
dkato 4:01651a6c3f9a 132 fseek(wav_fp, chunk_size, SEEK_CUR);
dkato 4:01651a6c3f9a 133 read_index += chunk_size;
dkato 4:01651a6c3f9a 134 }
dkato 4:01651a6c3f9a 135 }
dkato 4:01651a6c3f9a 136 }
dkato 4:01651a6c3f9a 137
dkato 4:01651a6c3f9a 138 if (data_index != 0) {
dkato 4:01651a6c3f9a 139 fseek(wav_fp, data_index, SEEK_SET);
dkato 4:01651a6c3f9a 140 }
dkato 4:01651a6c3f9a 141 }
dkato 4:01651a6c3f9a 142
dkato 4:01651a6c3f9a 143 return result;
dkato 4:01651a6c3f9a 144 };
dkato 4:01651a6c3f9a 145
dkato 4:01651a6c3f9a 146 /** get next data
dkato 4:01651a6c3f9a 147 *
dkato 4:01651a6c3f9a 148 * @param buf data buffer address
dkato 4:01651a6c3f9a 149 * @param len data buffer length
dkato 4:01651a6c3f9a 150 * @return get data size
dkato 4:01651a6c3f9a 151 */
dkato 5:983467c1466b 152 size_t GetNextData(void *buf, size_t len) {
dkato 4:01651a6c3f9a 153 if ((music_data_index + len) > music_data_size) {
dkato 4:01651a6c3f9a 154 len = music_data_size - music_data_index;
dkato 4:01651a6c3f9a 155 }
dkato 4:01651a6c3f9a 156 music_data_index += len;
dkato 4:01651a6c3f9a 157
dkato 4:01651a6c3f9a 158 return fread(buf, sizeof(char), len, wav_fp);
dkato 4:01651a6c3f9a 159 };
dkato 4:01651a6c3f9a 160
dkato 5:983467c1466b 161 /** get channel
dkato 5:983467c1466b 162 *
dkato 5:983467c1466b 163 * @return channel
dkato 5:983467c1466b 164 */
dkato 5:983467c1466b 165 uint16_t GetChannel() {
dkato 5:983467c1466b 166 return channel;
dkato 5:983467c1466b 167 };
dkato 5:983467c1466b 168
dkato 5:983467c1466b 169 /** get block size
dkato 5:983467c1466b 170 *
dkato 5:983467c1466b 171 * @return block size
dkato 5:983467c1466b 172 */
dkato 5:983467c1466b 173 uint16_t GetBlockSize() {
dkato 5:983467c1466b 174 return block_size;
dkato 5:983467c1466b 175 };
dkato 5:983467c1466b 176
dkato 5:983467c1466b 177 /** get sampling rate
dkato 5:983467c1466b 178 *
dkato 5:983467c1466b 179 * @return sampling rate
dkato 5:983467c1466b 180 */
dkato 5:983467c1466b 181 uint16_t GetSamplingRate() {
dkato 5:983467c1466b 182 return sampling_rate;
dkato 5:983467c1466b 183 };
dkato 5:983467c1466b 184
dkato 4:01651a6c3f9a 185 private:
dkato 4:01651a6c3f9a 186 FILE * wav_fp;
dkato 4:01651a6c3f9a 187 uint32_t music_data_size;
dkato 4:01651a6c3f9a 188 uint32_t music_data_index;
dkato 5:983467c1466b 189 uint16_t channel;
dkato 5:983467c1466b 190 uint16_t block_size;
dkato 5:983467c1466b 191 uint32_t sampling_rate;
dkato 4:01651a6c3f9a 192 };