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 09:05:12 2015 +0000
Revision:
4:01651a6c3f9a
Child:
5:983467c1466b
improving readability

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 4:01651a6c3f9a 22 bool analyze_heder(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 uint16_t ch;
dkato 4:01651a6c3f9a 35 uint32_t sampling_rate;
dkato 4:01651a6c3f9a 36 uint16_t block_size;
dkato 4:01651a6c3f9a 37
dkato 4:01651a6c3f9a 38 if (fp == NULL) {
dkato 4:01651a6c3f9a 39 return false;
dkato 4:01651a6c3f9a 40 }
dkato 4:01651a6c3f9a 41 music_data_size = 0;
dkato 4:01651a6c3f9a 42 music_data_index = 0;
dkato 4:01651a6c3f9a 43 wav_fp = fp;
dkato 4:01651a6c3f9a 44 if (p_title != NULL) {
dkato 4:01651a6c3f9a 45 p_title[0] = '\0';
dkato 4:01651a6c3f9a 46 }
dkato 4:01651a6c3f9a 47 if (p_artist != NULL) {
dkato 4:01651a6c3f9a 48 p_artist[0] = '\0';
dkato 4:01651a6c3f9a 49 }
dkato 4:01651a6c3f9a 50 if (p_album != NULL) {
dkato 4:01651a6c3f9a 51 p_album[0] = '\0';
dkato 4:01651a6c3f9a 52 }
dkato 4:01651a6c3f9a 53
dkato 4:01651a6c3f9a 54 read_size = fread(&wk_read_buff[0], sizeof(char), 36, wav_fp);
dkato 4:01651a6c3f9a 55 if (read_size < 36) {
dkato 4:01651a6c3f9a 56 // do nothing
dkato 4:01651a6c3f9a 57 } else if (memcmp(&wk_read_buff[0], "RIFF", 4) != 0) {
dkato 4:01651a6c3f9a 58 // do nothing
dkato 4:01651a6c3f9a 59 } else if (memcmp(&wk_read_buff[8], "WAVE", 4) != 0) {
dkato 4:01651a6c3f9a 60 // do nothing
dkato 4:01651a6c3f9a 61 } else if (memcmp(&wk_read_buff[12], "fmt ", 4) != 0) {
dkato 4:01651a6c3f9a 62 // do nothing
dkato 4:01651a6c3f9a 63 } else {
dkato 4:01651a6c3f9a 64 read_index += 36;
dkato 4:01651a6c3f9a 65 ch = ((uint32_t)wk_read_buff[22] << 0) + ((uint32_t)wk_read_buff[23] << 8);
dkato 4:01651a6c3f9a 66 sampling_rate = ((uint32_t)wk_read_buff[24] << 0)
dkato 4:01651a6c3f9a 67 + ((uint32_t)wk_read_buff[25] << 8)
dkato 4:01651a6c3f9a 68 + ((uint32_t)wk_read_buff[26] << 16)
dkato 4:01651a6c3f9a 69 + ((uint32_t)wk_read_buff[27] << 24);
dkato 4:01651a6c3f9a 70 block_size = ((uint32_t)wk_read_buff[34] << 0) + ((uint32_t)wk_read_buff[35] << 8);
dkato 4:01651a6c3f9a 71 if ((ch != 2) || (block_size != 16) || (sampling_rate != 44100)) {
dkato 4:01651a6c3f9a 72 return false;
dkato 4:01651a6c3f9a 73 }
dkato 4:01651a6c3f9a 74 while (1) {
dkato 4:01651a6c3f9a 75 read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp);
dkato 4:01651a6c3f9a 76 read_index += 8;
dkato 4:01651a6c3f9a 77 if (read_size < 8) {
dkato 4:01651a6c3f9a 78 break;
dkato 4:01651a6c3f9a 79 } else {
dkato 4:01651a6c3f9a 80 chunk_size = ((uint32_t)wk_read_buff[4] << 0)
dkato 4:01651a6c3f9a 81 + ((uint32_t)wk_read_buff[5] << 8)
dkato 4:01651a6c3f9a 82 + ((uint32_t)wk_read_buff[6] << 16)
dkato 4:01651a6c3f9a 83 + ((uint32_t)wk_read_buff[7] << 24);
dkato 4:01651a6c3f9a 84 if (memcmp(&wk_read_buff[0], "data", 4) == 0) {
dkato 4:01651a6c3f9a 85 result = true;
dkato 4:01651a6c3f9a 86 music_data_size = chunk_size;
dkato 4:01651a6c3f9a 87 if (list_ok == true) {
dkato 4:01651a6c3f9a 88 break;
dkato 4:01651a6c3f9a 89 } else {
dkato 4:01651a6c3f9a 90 data_index = read_index;
dkato 4:01651a6c3f9a 91 fseek(wav_fp, chunk_size, SEEK_CUR);
dkato 4:01651a6c3f9a 92 read_index += chunk_size;
dkato 4:01651a6c3f9a 93 }
dkato 4:01651a6c3f9a 94 } else if (memcmp(&wk_read_buff[0], "LIST", 4) == 0) {
dkato 4:01651a6c3f9a 95 list_ok = true;
dkato 4:01651a6c3f9a 96 list_index_max = read_index + chunk_size;
dkato 4:01651a6c3f9a 97 read_size = fread(&wk_read_buff[0], sizeof(char), 4, wav_fp);
dkato 4:01651a6c3f9a 98 read_index += 4;
dkato 4:01651a6c3f9a 99 while (read_index < list_index_max) {
dkato 4:01651a6c3f9a 100 read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp);
dkato 4:01651a6c3f9a 101 read_index += 8;
dkato 4:01651a6c3f9a 102 if (read_size < 8) {
dkato 4:01651a6c3f9a 103 break;
dkato 4:01651a6c3f9a 104 } else if (memcmp(&wk_read_buff[0], "INAM", 4) == 0) {
dkato 4:01651a6c3f9a 105 data = p_title;
dkato 4:01651a6c3f9a 106 } else if (memcmp(&wk_read_buff[0], "IART", 4) == 0) {
dkato 4:01651a6c3f9a 107 data = p_artist;
dkato 4:01651a6c3f9a 108 } else if (memcmp(&wk_read_buff[0], "IPRD", 4) == 0) {
dkato 4:01651a6c3f9a 109 data = p_album;
dkato 4:01651a6c3f9a 110 } else {
dkato 4:01651a6c3f9a 111 data = NULL;
dkato 4:01651a6c3f9a 112 }
dkato 4:01651a6c3f9a 113 if ((data != NULL) && (tag_size != 0)) {
dkato 4:01651a6c3f9a 114 sub_chunk_size = ((uint32_t)wk_read_buff[4] << 0)
dkato 4:01651a6c3f9a 115 + ((uint32_t)wk_read_buff[5] << 8)
dkato 4:01651a6c3f9a 116 + ((uint32_t)wk_read_buff[6] << 16)
dkato 4:01651a6c3f9a 117 + ((uint32_t)wk_read_buff[7] << 24);
dkato 4:01651a6c3f9a 118 if (sub_chunk_size > (tag_size - 1)) {
dkato 4:01651a6c3f9a 119 wk_len = (tag_size - 1);
dkato 4:01651a6c3f9a 120 } else {
dkato 4:01651a6c3f9a 121 wk_len = sub_chunk_size;
dkato 4:01651a6c3f9a 122 }
dkato 4:01651a6c3f9a 123 read_size = fread(data, sizeof(char), wk_len, wav_fp);
dkato 4:01651a6c3f9a 124 read_index += sub_chunk_size;
dkato 4:01651a6c3f9a 125 fseek(wav_fp, read_index, SEEK_SET);
dkato 4:01651a6c3f9a 126 data[wk_len] = '\0';
dkato 4:01651a6c3f9a 127 }
dkato 4:01651a6c3f9a 128 }
dkato 4:01651a6c3f9a 129 if (data_index != 0) {
dkato 4:01651a6c3f9a 130 break;
dkato 4:01651a6c3f9a 131 } else {
dkato 4:01651a6c3f9a 132 fseek(wav_fp, list_index_max, SEEK_SET);
dkato 4:01651a6c3f9a 133 }
dkato 4:01651a6c3f9a 134 } else {
dkato 4:01651a6c3f9a 135 fseek(wav_fp, chunk_size, SEEK_CUR);
dkato 4:01651a6c3f9a 136 read_index += chunk_size;
dkato 4:01651a6c3f9a 137 }
dkato 4:01651a6c3f9a 138 }
dkato 4:01651a6c3f9a 139 }
dkato 4:01651a6c3f9a 140
dkato 4:01651a6c3f9a 141 if (data_index != 0) {
dkato 4:01651a6c3f9a 142 fseek(wav_fp, data_index, SEEK_SET);
dkato 4:01651a6c3f9a 143 }
dkato 4:01651a6c3f9a 144 }
dkato 4:01651a6c3f9a 145
dkato 4:01651a6c3f9a 146 return result;
dkato 4:01651a6c3f9a 147 };
dkato 4:01651a6c3f9a 148
dkato 4:01651a6c3f9a 149 /** get next data
dkato 4:01651a6c3f9a 150 *
dkato 4:01651a6c3f9a 151 * @param buf data buffer address
dkato 4:01651a6c3f9a 152 * @param len data buffer length
dkato 4:01651a6c3f9a 153 * @return get data size
dkato 4:01651a6c3f9a 154 */
dkato 4:01651a6c3f9a 155 size_t get_next_data(void *buf, size_t len) {
dkato 4:01651a6c3f9a 156 if ((music_data_index + len) > music_data_size) {
dkato 4:01651a6c3f9a 157 len = music_data_size - music_data_index;
dkato 4:01651a6c3f9a 158 }
dkato 4:01651a6c3f9a 159 music_data_index += len;
dkato 4:01651a6c3f9a 160
dkato 4:01651a6c3f9a 161 return fread(buf, sizeof(char), len, wav_fp);
dkato 4:01651a6c3f9a 162 };
dkato 4:01651a6c3f9a 163
dkato 4:01651a6c3f9a 164 private:
dkato 4:01651a6c3f9a 165 FILE * wav_fp;
dkato 4:01651a6c3f9a 166 uint32_t music_data_size;
dkato 4:01651a6c3f9a 167 uint32_t music_data_index;
dkato 4:01651a6c3f9a 168 };