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:
dkato
Date:
Wed Apr 01 10:51:50 2015 +0000
Revision:
0:39320363f99f
Child:
1:82fe51d45902
first commiit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:39320363f99f 1 #include "mbed.h"
dkato 0:39320363f99f 2 #include "USBHostDac.h"
dkato 0:39320363f99f 3 #include "USBHostMSD.h"
dkato 0:39320363f99f 4
dkato 0:39320363f99f 5 DigitalOut led(LED1);
dkato 0:39320363f99f 6 DigitalIn button(USER_BUTTON0);
dkato 0:39320363f99f 7
dkato 0:39320363f99f 8 #define READ_BUFF_SIZE (4096)
dkato 0:39320363f99f 9 #define READ_BUFF_NUM (3)
dkato 0:39320363f99f 10 #define MAIL_QUEUE_SIZE (READ_BUFF_NUM - 1)
dkato 0:39320363f99f 11 #define FILE_NAME_LEN (64)
dkato 0:39320363f99f 12
dkato 0:39320363f99f 13 typedef struct {
dkato 0:39320363f99f 14 uint8_t * p_data;
dkato 0:39320363f99f 15 uint32_t data_size;
dkato 0:39320363f99f 16 bool flush;
dkato 0:39320363f99f 17 } mail_t;
dkato 0:39320363f99f 18 Mail<mail_t, MAIL_QUEUE_SIZE> mail_box;
dkato 0:39320363f99f 19
dkato 0:39320363f99f 20 static uint8_t read_buff[READ_BUFF_NUM][READ_BUFF_SIZE];
dkato 0:39320363f99f 21 static uint32_t read_buff_no = 0;
dkato 0:39320363f99f 22
dkato 0:39320363f99f 23 void usbdac_task(void const*) {
dkato 0:39320363f99f 24 USBHostDac usbdac;
dkato 0:39320363f99f 25
dkato 0:39320363f99f 26 while(1) {
dkato 0:39320363f99f 27
dkato 0:39320363f99f 28 // try to connect a usbdac device
dkato 0:39320363f99f 29 while(!usbdac.connect()) {
dkato 0:39320363f99f 30 Thread::wait(500);
dkato 0:39320363f99f 31 }
dkato 0:39320363f99f 32
dkato 0:39320363f99f 33 // in a loop, print all characters received
dkato 0:39320363f99f 34 // if the device is disconnected, we try to connect it again
dkato 0:39320363f99f 35 while (1) {
dkato 0:39320363f99f 36 // if device disconnected, try to connect it again
dkato 0:39320363f99f 37 if (!usbdac.connected()) {
dkato 0:39320363f99f 38 break;
dkato 0:39320363f99f 39 }
dkato 0:39320363f99f 40
dkato 0:39320363f99f 41 osEvent evt = mail_box.get();
dkato 0:39320363f99f 42 if (evt.status == osEventMail) {
dkato 0:39320363f99f 43 mail_t *mail = (mail_t *)evt.value.p;
dkato 0:39320363f99f 44 usbdac.send(mail->p_data, mail->data_size, mail->flush);
dkato 0:39320363f99f 45 mail_box.free(mail);
dkato 0:39320363f99f 46 }
dkato 0:39320363f99f 47 }
dkato 0:39320363f99f 48 }
dkato 0:39320363f99f 49 }
dkato 0:39320363f99f 50
dkato 0:39320363f99f 51 static bool analyze_wav_heder(FILE * fp) {
dkato 0:39320363f99f 52 bool result = false;
dkato 0:39320363f99f 53 size_t read_size;
dkato 0:39320363f99f 54 uint8_t wk_read_buff[36];
dkato 0:39320363f99f 55 uint32_t fmt_size;
dkato 0:39320363f99f 56 uint16_t ch;
dkato 0:39320363f99f 57 uint32_t sampling_rate;
dkato 0:39320363f99f 58 uint16_t block_size;
dkato 0:39320363f99f 59
dkato 0:39320363f99f 60 read_size = fread(&wk_read_buff[0], sizeof(char), sizeof(wk_read_buff), fp);
dkato 0:39320363f99f 61 if (read_size < sizeof(wk_read_buff)) {
dkato 0:39320363f99f 62 // do nothing
dkato 0:39320363f99f 63 } else if (memcmp(&wk_read_buff[0], "RIFF", 4) != 0) {
dkato 0:39320363f99f 64 // do nothing
dkato 0:39320363f99f 65 } else if (memcmp(&wk_read_buff[8], "WAVE", 4) != 0) {
dkato 0:39320363f99f 66 // do nothing
dkato 0:39320363f99f 67 } else if (memcmp(&wk_read_buff[12], "fmt ", 4) != 0) {
dkato 0:39320363f99f 68 // do nothing
dkato 0:39320363f99f 69 } else {
dkato 0:39320363f99f 70 result = true;
dkato 0:39320363f99f 71 fmt_size = ((uint32_t)wk_read_buff[16] << 0)
dkato 0:39320363f99f 72 + ((uint32_t)wk_read_buff[17] << 8)
dkato 0:39320363f99f 73 + ((uint32_t)wk_read_buff[18] << 16)
dkato 0:39320363f99f 74 + ((uint32_t)wk_read_buff[19] << 24);
dkato 0:39320363f99f 75 ch = ((uint32_t)wk_read_buff[22] << 0) + ((uint32_t)wk_read_buff[23] << 8);
dkato 0:39320363f99f 76 sampling_rate = ((uint32_t)wk_read_buff[24] << 0)
dkato 0:39320363f99f 77 + ((uint32_t)wk_read_buff[25] << 8)
dkato 0:39320363f99f 78 + ((uint32_t)wk_read_buff[26] << 16)
dkato 0:39320363f99f 79 + ((uint32_t)wk_read_buff[27] << 24);
dkato 0:39320363f99f 80 block_size = ((uint32_t)wk_read_buff[34] << 0) + ((uint32_t)wk_read_buff[35] << 8);
dkato 0:39320363f99f 81
dkato 0:39320363f99f 82 if ((ch == 2) && (block_size == 16) && (sampling_rate == 48000)) {
dkato 0:39320363f99f 83 fseek(fp, 28 + fmt_size, SEEK_SET);
dkato 0:39320363f99f 84 } else {
dkato 0:39320363f99f 85 result = false;
dkato 0:39320363f99f 86 }
dkato 0:39320363f99f 87 }
dkato 0:39320363f99f 88
dkato 0:39320363f99f 89 return result;
dkato 0:39320363f99f 90 }
dkato 0:39320363f99f 91
dkato 0:39320363f99f 92 void msd_task(void const *) {
dkato 0:39320363f99f 93 FILE * fp = NULL;
dkato 0:39320363f99f 94 DIR * d = NULL;
dkato 0:39320363f99f 95 char file_path[sizeof("/usb/") + FILE_NAME_LEN];
dkato 0:39320363f99f 96
dkato 0:39320363f99f 97 USBHostMSD msd("usb");
dkato 0:39320363f99f 98
dkato 0:39320363f99f 99 while(1) {
dkato 0:39320363f99f 100 // try to connect a MSD device
dkato 0:39320363f99f 101 while(!msd.connect()) {
dkato 0:39320363f99f 102 Thread::wait(500);
dkato 0:39320363f99f 103 }
dkato 0:39320363f99f 104
dkato 0:39320363f99f 105 // in a loop, append a file
dkato 0:39320363f99f 106 // if the device is disconnected, we try to connect it again
dkato 0:39320363f99f 107 while(1) {
dkato 0:39320363f99f 108 // if device disconnected, try to connect again
dkato 0:39320363f99f 109 if (!msd.connected()) {
dkato 0:39320363f99f 110 break;
dkato 0:39320363f99f 111 }
dkato 0:39320363f99f 112
dkato 0:39320363f99f 113 if (fp == NULL) {
dkato 0:39320363f99f 114 // file search
dkato 0:39320363f99f 115 if (d == NULL) {
dkato 0:39320363f99f 116 d = opendir("/usb/");
dkato 0:39320363f99f 117 }
dkato 0:39320363f99f 118 struct dirent * p;
dkato 0:39320363f99f 119 while ((p = readdir(d)) != NULL) {
dkato 0:39320363f99f 120 size_t len = strlen(p->d_name);
dkato 0:39320363f99f 121 if ((len > 4) && (len <= FILE_NAME_LEN) && (memcmp(&p->d_name[len - 4], ".wav", 4) == 0)) {
dkato 0:39320363f99f 122 strcpy(file_path, "/usb/");
dkato 0:39320363f99f 123 strcat(file_path, p->d_name);
dkato 0:39320363f99f 124 fp = fopen(file_path, "r");
dkato 0:39320363f99f 125 if (analyze_wav_heder(fp) == false) {
dkato 0:39320363f99f 126 fclose(fp);
dkato 0:39320363f99f 127 fp = NULL;
dkato 0:39320363f99f 128 } else {
dkato 0:39320363f99f 129 printf("%s\n", p->d_name);
dkato 0:39320363f99f 130 break;
dkato 0:39320363f99f 131 }
dkato 0:39320363f99f 132 }
dkato 0:39320363f99f 133 }
dkato 0:39320363f99f 134 if (p == NULL) {
dkato 0:39320363f99f 135 closedir(d);
dkato 0:39320363f99f 136 d = NULL;
dkato 0:39320363f99f 137 }
dkato 0:39320363f99f 138 } else {
dkato 0:39320363f99f 139 // file read
dkato 0:39320363f99f 140 size_t read_size = fread(&read_buff[read_buff_no][0], sizeof(char), READ_BUFF_SIZE, fp);
dkato 0:39320363f99f 141 if (read_size > 0) {
dkato 0:39320363f99f 142 mail_t *mail = mail_box.alloc(osWaitForever);
dkato 0:39320363f99f 143 if (mail != NULL) {
dkato 0:39320363f99f 144 mail->p_data = &read_buff[read_buff_no][0];
dkato 0:39320363f99f 145 mail->data_size = read_size;
dkato 0:39320363f99f 146 if (read_size < READ_BUFF_SIZE) {
dkato 0:39320363f99f 147 mail->flush = true; // last data
dkato 0:39320363f99f 148 } else {
dkato 0:39320363f99f 149 mail->flush = false;
dkato 0:39320363f99f 150 }
dkato 0:39320363f99f 151 mail_box.put(mail);
dkato 0:39320363f99f 152 read_buff_no++;
dkato 0:39320363f99f 153 if (read_buff_no >= READ_BUFF_NUM) {
dkato 0:39320363f99f 154 read_buff_no = 0;
dkato 0:39320363f99f 155 }
dkato 0:39320363f99f 156 }
dkato 0:39320363f99f 157 }
dkato 0:39320363f99f 158
dkato 0:39320363f99f 159 // file close
dkato 0:39320363f99f 160 if ((read_size < READ_BUFF_SIZE) || (button == 0)) {
dkato 0:39320363f99f 161 fclose(fp);
dkato 0:39320363f99f 162 fp = NULL;
dkato 0:39320363f99f 163 Thread::wait(500);
dkato 0:39320363f99f 164 }
dkato 0:39320363f99f 165 }
dkato 0:39320363f99f 166 }
dkato 0:39320363f99f 167
dkato 0:39320363f99f 168 // close check
dkato 0:39320363f99f 169 if (fp != NULL) {
dkato 0:39320363f99f 170 fclose(fp);
dkato 0:39320363f99f 171 fp = NULL;
dkato 0:39320363f99f 172 }
dkato 0:39320363f99f 173 if (d != NULL) {
dkato 0:39320363f99f 174 closedir(d);
dkato 0:39320363f99f 175 d = NULL;
dkato 0:39320363f99f 176 }
dkato 0:39320363f99f 177 }
dkato 0:39320363f99f 178 }
dkato 0:39320363f99f 179
dkato 0:39320363f99f 180 int main() {
dkato 0:39320363f99f 181 Thread usbdaclTask(usbdac_task, NULL, osPriorityNormal, 1024 * 4);
dkato 0:39320363f99f 182 Thread msdTask(msd_task, NULL, osPriorityNormal, 1024 * 4);
dkato 0:39320363f99f 183 while(1) {
dkato 0:39320363f99f 184 led=!led;
dkato 0:39320363f99f 185 Thread::wait(500);
dkato 0:39320363f99f 186 }
dkato 0:39320363f99f 187 }