Modified a little for 32k byte buffer.

Dependents:   Peach_AudioChannelDividerAndCompensator

Committer:
dokunewon
Date:
Sun Oct 11 07:37:39 2015 +0000
Revision:
60:68924f211e71
Child:
61:ff0388dee94f
Change buffer size 32k.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dokunewon 60:68924f211e71 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
dokunewon 60:68924f211e71 2 *
dokunewon 60:68924f211e71 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
dokunewon 60:68924f211e71 4 * and associated documentation files (the "Software"), to deal in the Software without
dokunewon 60:68924f211e71 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
dokunewon 60:68924f211e71 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
dokunewon 60:68924f211e71 7 * Software is furnished to do so, subject to the following conditions:
dokunewon 60:68924f211e71 8 *
dokunewon 60:68924f211e71 9 * The above copyright notice and this permission notice shall be included in all copies or
dokunewon 60:68924f211e71 10 * substantial portions of the Software.
dokunewon 60:68924f211e71 11 *
dokunewon 60:68924f211e71 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
dokunewon 60:68924f211e71 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
dokunewon 60:68924f211e71 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
dokunewon 60:68924f211e71 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
dokunewon 60:68924f211e71 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
dokunewon 60:68924f211e71 17 */
dokunewon 60:68924f211e71 18
dokunewon 60:68924f211e71 19 #include "stdint.h"
dokunewon 60:68924f211e71 20 #include "USBAudio.h"
dokunewon 60:68924f211e71 21 #include "USBAudio_Types.h"
dokunewon 60:68924f211e71 22
dokunewon 60:68924f211e71 23 USBAudio::USBAudio(uint32_t frequency_in, uint8_t channel_nb_in, uint32_t frequency_out, uint8_t channel_nb_out, uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {
dokunewon 60:68924f211e71 24 mute = 0;
dokunewon 60:68924f211e71 25 volCur = 0x0080;
dokunewon 60:68924f211e71 26 volMin = 0x0000;
dokunewon 60:68924f211e71 27 volMax = 0x0100;
dokunewon 60:68924f211e71 28 volRes = 0x0004;
dokunewon 60:68924f211e71 29 available = false;
dokunewon 60:68924f211e71 30
dokunewon 60:68924f211e71 31 FREQ_IN = frequency_in;
dokunewon 60:68924f211e71 32 FREQ_OUT = frequency_out;
dokunewon 60:68924f211e71 33
dokunewon 60:68924f211e71 34 this->channel_nb_in = channel_nb_in;
dokunewon 60:68924f211e71 35 this->channel_nb_out = channel_nb_out;
dokunewon 60:68924f211e71 36
dokunewon 60:68924f211e71 37 // stereo -> *2, mono -> *1
dokunewon 60:68924f211e71 38 PACKET_SIZE_ISO_IN = (FREQ_IN / 500) * channel_nb_in;
dokunewon 60:68924f211e71 39 PACKET_SIZE_ISO_OUT = (FREQ_OUT / 500) * channel_nb_out;
dokunewon 60:68924f211e71 40
dokunewon 60:68924f211e71 41 // STEREO -> left and right
dokunewon 60:68924f211e71 42 channel_config_in = (channel_nb_in == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
dokunewon 60:68924f211e71 43 channel_config_out = (channel_nb_out == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
dokunewon 60:68924f211e71 44
dokunewon 60:68924f211e71 45 SOF_handler = false;
dokunewon 60:68924f211e71 46
dokunewon 60:68924f211e71 47 buf_stream_out = NULL;
dokunewon 60:68924f211e71 48 buf_stream_in = NULL;
dokunewon 60:68924f211e71 49
dokunewon 60:68924f211e71 50 interruptOUT = false;
dokunewon 60:68924f211e71 51 writeIN = false;
dokunewon 60:68924f211e71 52 interruptIN = false;
dokunewon 60:68924f211e71 53 available = false;
dokunewon 60:68924f211e71 54
dokunewon 60:68924f211e71 55 volume = 0;
dokunewon 60:68924f211e71 56
dokunewon 60:68924f211e71 57 // connect the device
dokunewon 60:68924f211e71 58 USBDevice::connect();
dokunewon 60:68924f211e71 59 }
dokunewon 60:68924f211e71 60
dokunewon 60:68924f211e71 61 bool USBAudio::read(uint8_t * buf) {
dokunewon 60:68924f211e71 62 buf_stream_in = buf;
dokunewon 60:68924f211e71 63 SOF_handler = false;
dokunewon 60:68924f211e71 64 while (!available || !SOF_handler);
dokunewon 60:68924f211e71 65 available = false;
dokunewon 60:68924f211e71 66 return true;
dokunewon 60:68924f211e71 67 }
dokunewon 60:68924f211e71 68
dokunewon 60:68924f211e71 69 bool USBAudio::readNB(uint8_t * buf) {
dokunewon 60:68924f211e71 70 buf_stream_in = buf;
dokunewon 60:68924f211e71 71 SOF_handler = false;
dokunewon 60:68924f211e71 72 while (!SOF_handler);
dokunewon 60:68924f211e71 73 if (available) {
dokunewon 60:68924f211e71 74 available = false;
dokunewon 60:68924f211e71 75 buf_stream_in = NULL;
dokunewon 60:68924f211e71 76 return true;
dokunewon 60:68924f211e71 77 }
dokunewon 60:68924f211e71 78 return false;
dokunewon 60:68924f211e71 79 }
dokunewon 60:68924f211e71 80
dokunewon 60:68924f211e71 81 bool USBAudio::readWrite(uint8_t * buf_read, uint8_t * buf_write) {
dokunewon 60:68924f211e71 82 buf_stream_in = buf_read;
dokunewon 60:68924f211e71 83 SOF_handler = false;
dokunewon 60:68924f211e71 84 writeIN = false;
dokunewon 60:68924f211e71 85 if (interruptIN) {
dokunewon 60:68924f211e71 86 USBDevice::writeNB(EP3IN, buf_write, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
dokunewon 60:68924f211e71 87 } else {
dokunewon 60:68924f211e71 88 buf_stream_out = buf_write;
dokunewon 60:68924f211e71 89 }
dokunewon 60:68924f211e71 90 while (!available);
dokunewon 60:68924f211e71 91 if (interruptIN) {
dokunewon 60:68924f211e71 92 while (!writeIN);
dokunewon 60:68924f211e71 93 }
dokunewon 60:68924f211e71 94 while (!SOF_handler);
dokunewon 60:68924f211e71 95 return true;
dokunewon 60:68924f211e71 96 }
dokunewon 60:68924f211e71 97
dokunewon 60:68924f211e71 98
dokunewon 60:68924f211e71 99 bool USBAudio::write(uint8_t * buf) {
dokunewon 60:68924f211e71 100 writeIN = false;
dokunewon 60:68924f211e71 101 SOF_handler = false;
dokunewon 60:68924f211e71 102 if (interruptIN) {
dokunewon 60:68924f211e71 103 USBDevice::writeNB(EP3IN, buf, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
dokunewon 60:68924f211e71 104 } else {
dokunewon 60:68924f211e71 105 buf_stream_out = buf;
dokunewon 60:68924f211e71 106 }
dokunewon 60:68924f211e71 107 while (!SOF_handler);
dokunewon 60:68924f211e71 108 if (interruptIN) {
dokunewon 60:68924f211e71 109 while (!writeIN);
dokunewon 60:68924f211e71 110 }
dokunewon 60:68924f211e71 111 return true;
dokunewon 60:68924f211e71 112 }
dokunewon 60:68924f211e71 113
dokunewon 60:68924f211e71 114
dokunewon 60:68924f211e71 115 float USBAudio::getVolume() {
dokunewon 60:68924f211e71 116 return (mute) ? 0.0 : volume;
dokunewon 60:68924f211e71 117 }
dokunewon 60:68924f211e71 118
dokunewon 60:68924f211e71 119 extern DigitalOut LedR;
dokunewon 60:68924f211e71 120 extern DigitalOut LedG;
dokunewon 60:68924f211e71 121 extern DigitalOut LedB;
dokunewon 60:68924f211e71 122
dokunewon 60:68924f211e71 123 // receive 32k sample of sudio stereo data
dokunewon 60:68924f211e71 124 // if input stalls then zero is paded
dokunewon 60:68924f211e71 125 // so, it every time returns 32k sample of data
dokunewon 60:68924f211e71 126 int USBAudio::read32kSZ(uint32_t *Buf)
dokunewon 60:68924f211e71 127 {
dokunewon 60:68924f211e71 128 //受信データが準備できてなければ、
dokunewon 60:68924f211e71 129 if(! m_prbuf)
dokunewon 60:68924f211e71 130 {
dokunewon 60:68924f211e71 131 printf("Data stall in bank:");
dokunewon 60:68924f211e71 132 //バッファの前半を受信中ならば、
dokunewon 60:68924f211e71 133 if(m_widx < 32768)
dokunewon 60:68924f211e71 134 {
dokunewon 60:68924f211e71 135 printf("0\n");
dokunewon 60:68924f211e71 136 //データをユーザのバッファへコピーして、
dokunewon 60:68924f211e71 137 memcpy((uint8_t *)Buf,(uint8_t *)&m_rbuf[32768*0],32768 * 4);
dokunewon 60:68924f211e71 138 //ユーザバッファをゼロで埋めて
dokunewon 60:68924f211e71 139 memset((uint8_t *)Buf,0,32768*4);
dokunewon 60:68924f211e71 140 //受信バッファをクリアする
dokunewon 60:68924f211e71 141 memset((uint8_t*)m_rbuf,0,65536*4);
dokunewon 60:68924f211e71 142 //次は、バッファの前半から受信する
dokunewon 60:68924f211e71 143 //m_widx = 0;
dokunewon 60:68924f211e71 144 //受信データに「準備中」を設定する
dokunewon 60:68924f211e71 145 //m_prbuf = NULL;
dokunewon 60:68924f211e71 146 //1(受信完了)を返す
dokunewon 60:68924f211e71 147 return 1;
dokunewon 60:68924f211e71 148 }
dokunewon 60:68924f211e71 149 //バッファの後半を受信中ならば、
dokunewon 60:68924f211e71 150 else
dokunewon 60:68924f211e71 151 {
dokunewon 60:68924f211e71 152 printf("1\n");
dokunewon 60:68924f211e71 153 //データをユーザのバッファへコピーして、
dokunewon 60:68924f211e71 154 memcpy((uint8_t *)Buf,(uint8_t *)&m_rbuf[32768*1],32768 * 4);
dokunewon 60:68924f211e71 155 //ユーザバッファをゼロで埋めて
dokunewon 60:68924f211e71 156 memset((uint8_t *)Buf,0,32768*4);
dokunewon 60:68924f211e71 157 //受信バッファをクリアする
dokunewon 60:68924f211e71 158 memset((uint8_t*)m_rbuf,0,65536*4);
dokunewon 60:68924f211e71 159 //次は、バッファの前半から受信する
dokunewon 60:68924f211e71 160 //m_widx = 0;
dokunewon 60:68924f211e71 161 //受信データに「準備中」を設定する
dokunewon 60:68924f211e71 162 //m_prbuf = NULL;
dokunewon 60:68924f211e71 163 //1(受信完了)を返す
dokunewon 60:68924f211e71 164 return 1;
dokunewon 60:68924f211e71 165 }
dokunewon 60:68924f211e71 166 }
dokunewon 60:68924f211e71 167 //受信データが準備できていれば、
dokunewon 60:68924f211e71 168 else
dokunewon 60:68924f211e71 169 {
dokunewon 60:68924f211e71 170 printf("Data ready\n");
dokunewon 60:68924f211e71 171 //データをユーザのバッファへコピーして、
dokunewon 60:68924f211e71 172 memcpy((uint8_t *)Buf,(uint8_t *)m_prbuf,32768 * 4);
dokunewon 60:68924f211e71 173 //受信データに「準備中」を設定する
dokunewon 60:68924f211e71 174 m_prbuf = NULL;
dokunewon 60:68924f211e71 175 //1(受信完了)を返す
dokunewon 60:68924f211e71 176 return 1;
dokunewon 60:68924f211e71 177 }
dokunewon 60:68924f211e71 178 }
dokunewon 60:68924f211e71 179
dokunewon 60:68924f211e71 180 // receive 32k sample of sudio stereo data
dokunewon 60:68924f211e71 181 //int USBAudio::read32k(uint8_t *buf)
dokunewon 60:68924f211e71 182 //{
dokunewon 60:68924f211e71 183 // //受信データが準備できてなければ、
dokunewon 60:68924f211e71 184 // if(! m_prbuf)
dokunewon 60:68924f211e71 185 // {
dokunewon 60:68924f211e71 186 // //0(受信準備中)を返す。
dokunewon 60:68924f211e71 187 // return 0;
dokunewon 60:68924f211e71 188 // }
dokunewon 60:68924f211e71 189 // //受信データが準備できていれば、
dokunewon 60:68924f211e71 190 // else
dokunewon 60:68924f211e71 191 // {
dokunewon 60:68924f211e71 192 // //データをユーザのバッファへコピーして、
dokunewon 60:68924f211e71 193 // memcpy((uint8_t *)buf,(uint8_t *)m_prbuf,32768 * 4);
dokunewon 60:68924f211e71 194 // //受信データに「準備中」を設定する
dokunewon 60:68924f211e71 195 // m_prbuf = NULL;
dokunewon 60:68924f211e71 196 // //1(受信完了)を返す
dokunewon 60:68924f211e71 197 // return 1;
dokunewon 60:68924f211e71 198 // }
dokunewon 60:68924f211e71 199 //}
dokunewon 60:68924f211e71 200
dokunewon 60:68924f211e71 201 bool USBAudio::EPISO_OUT_callback() {
dokunewon 60:68924f211e71 202 int ridx;
dokunewon 60:68924f211e71 203 uint32_t size = 0;
dokunewon 60:68924f211e71 204
dokunewon 60:68924f211e71 205 interruptOUT = true;
dokunewon 60:68924f211e71 206
dokunewon 60:68924f211e71 207 readEP(EP3OUT,(uint8_t *)tmpbuf, &size, 192); //PACKET_SIZE_ISO_IN);
dokunewon 60:68924f211e71 208
dokunewon 60:68924f211e71 209 for(ridx = 0;ridx < 48;ridx++)
dokunewon 60:68924f211e71 210 {
dokunewon 60:68924f211e71 211 m_rbuf[m_widx] = tmpbuf[ridx];
dokunewon 60:68924f211e71 212 m_widx++;
dokunewon 60:68924f211e71 213 //1st bank full
dokunewon 60:68924f211e71 214 if(m_widx == 32768*1)
dokunewon 60:68924f211e71 215 {
dokunewon 60:68924f211e71 216 //allow 1rd bank
dokunewon 60:68924f211e71 217 m_prbuf = (uint8_t *)(&m_rbuf[32768*0]);
dokunewon 60:68924f211e71 218 }
dokunewon 60:68924f211e71 219 //2nd bank full
dokunewon 60:68924f211e71 220 if(m_widx == 32768*2)
dokunewon 60:68924f211e71 221 {
dokunewon 60:68924f211e71 222 //move write pointer to the top of buffer
dokunewon 60:68924f211e71 223 m_widx = 0;
dokunewon 60:68924f211e71 224 //allow 2nd bank
dokunewon 60:68924f211e71 225 m_prbuf = (uint8_t *)(&m_rbuf[32768*1]);
dokunewon 60:68924f211e71 226 }
dokunewon 60:68924f211e71 227 }
dokunewon 60:68924f211e71 228 available = true;
dokunewon 60:68924f211e71 229 readStart(EP3OUT, 192);
dokunewon 60:68924f211e71 230 return false;
dokunewon 60:68924f211e71 231 }
dokunewon 60:68924f211e71 232
dokunewon 60:68924f211e71 233 bool USBAudio::EPISO_IN_callback() {
dokunewon 60:68924f211e71 234 interruptIN = true;
dokunewon 60:68924f211e71 235 writeIN = true;
dokunewon 60:68924f211e71 236 return true;
dokunewon 60:68924f211e71 237 }
dokunewon 60:68924f211e71 238
dokunewon 60:68924f211e71 239
dokunewon 60:68924f211e71 240
dokunewon 60:68924f211e71 241 // Called in ISR context on each start of frame
dokunewon 60:68924f211e71 242 void USBAudio::SOF(int frameNumber) {
dokunewon 60:68924f211e71 243 uint32_t size = 0;
dokunewon 60:68924f211e71 244
dokunewon 60:68924f211e71 245 if (!interruptOUT) {
dokunewon 60:68924f211e71 246 // read the isochronous endpoint
dokunewon 60:68924f211e71 247 if (buf_stream_in != NULL) {
dokunewon 60:68924f211e71 248 if (USBDevice::readEP_NB(EP3OUT, (uint8_t *)buf_stream_in, &size, PACKET_SIZE_ISO_IN)) {
dokunewon 60:68924f211e71 249 if (size) {
dokunewon 60:68924f211e71 250 available = true;
dokunewon 60:68924f211e71 251 readStart(EP3OUT, PACKET_SIZE_ISO_IN);
dokunewon 60:68924f211e71 252 buf_stream_in = NULL;
dokunewon 60:68924f211e71 253 }
dokunewon 60:68924f211e71 254 }
dokunewon 60:68924f211e71 255 }
dokunewon 60:68924f211e71 256 }
dokunewon 60:68924f211e71 257
dokunewon 60:68924f211e71 258 if (!interruptIN) {
dokunewon 60:68924f211e71 259 // write if needed
dokunewon 60:68924f211e71 260 if (buf_stream_out != NULL) {
dokunewon 60:68924f211e71 261 USBDevice::writeNB(EP3IN, (uint8_t *)buf_stream_out, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
dokunewon 60:68924f211e71 262 buf_stream_out = NULL;
dokunewon 60:68924f211e71 263 }
dokunewon 60:68924f211e71 264 }
dokunewon 60:68924f211e71 265
dokunewon 60:68924f211e71 266 SOF_handler = true;
dokunewon 60:68924f211e71 267 }
dokunewon 60:68924f211e71 268
dokunewon 60:68924f211e71 269
dokunewon 60:68924f211e71 270 // Called in ISR context
dokunewon 60:68924f211e71 271 // Set configuration. Return false if the configuration is not supported.
dokunewon 60:68924f211e71 272 bool USBAudio::USBCallback_setConfiguration(uint8_t configuration) {
dokunewon 60:68924f211e71 273 if (configuration != DEFAULT_CONFIGURATION) {
dokunewon 60:68924f211e71 274 return false;
dokunewon 60:68924f211e71 275 }
dokunewon 60:68924f211e71 276
dokunewon 60:68924f211e71 277 // Configure isochronous endpoint
dokunewon 60:68924f211e71 278 realiseEndpoint(EP3OUT, PACKET_SIZE_ISO_IN, ISOCHRONOUS);
dokunewon 60:68924f211e71 279 realiseEndpoint(EP3IN, PACKET_SIZE_ISO_OUT, ISOCHRONOUS);
dokunewon 60:68924f211e71 280
dokunewon 60:68924f211e71 281 // activate readings on this endpoint
dokunewon 60:68924f211e71 282 readStart(EP3OUT, PACKET_SIZE_ISO_IN);
dokunewon 60:68924f211e71 283 return true;
dokunewon 60:68924f211e71 284 }
dokunewon 60:68924f211e71 285
dokunewon 60:68924f211e71 286
dokunewon 60:68924f211e71 287 // Called in ISR context
dokunewon 60:68924f211e71 288 // Set alternate setting. Return false if the alternate setting is not supported
dokunewon 60:68924f211e71 289 bool USBAudio::USBCallback_setInterface(uint16_t interface, uint8_t alternate) {
dokunewon 60:68924f211e71 290 if (interface == 0 && alternate == 0) {
dokunewon 60:68924f211e71 291 return true;
dokunewon 60:68924f211e71 292 }
dokunewon 60:68924f211e71 293 if (interface == 1 && (alternate == 0 || alternate == 1)) {
dokunewon 60:68924f211e71 294 return true;
dokunewon 60:68924f211e71 295 }
dokunewon 60:68924f211e71 296 if (interface == 2 && (alternate == 0 || alternate == 1)) {
dokunewon 60:68924f211e71 297 return true;
dokunewon 60:68924f211e71 298 }
dokunewon 60:68924f211e71 299 return false;
dokunewon 60:68924f211e71 300 }
dokunewon 60:68924f211e71 301
dokunewon 60:68924f211e71 302
dokunewon 60:68924f211e71 303
dokunewon 60:68924f211e71 304 // Called in ISR context
dokunewon 60:68924f211e71 305 // Called by USBDevice on Endpoint0 request
dokunewon 60:68924f211e71 306 // This is used to handle extensions to standard requests and class specific requests.
dokunewon 60:68924f211e71 307 // Return true if class handles this request
dokunewon 60:68924f211e71 308 bool USBAudio::USBCallback_request() {
dokunewon 60:68924f211e71 309 bool success = false;
dokunewon 60:68924f211e71 310 CONTROL_TRANSFER * transfer = getTransferPtr();
dokunewon 60:68924f211e71 311
dokunewon 60:68924f211e71 312 // Process class-specific requests
dokunewon 60:68924f211e71 313 if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
dokunewon 60:68924f211e71 314
dokunewon 60:68924f211e71 315 // Feature Unit: Interface = 0, ID = 2
dokunewon 60:68924f211e71 316 if (transfer->setup.wIndex == 0x0200) {
dokunewon 60:68924f211e71 317
dokunewon 60:68924f211e71 318 // Master Channel
dokunewon 60:68924f211e71 319 if ((transfer->setup.wValue & 0xff) == 0) {
dokunewon 60:68924f211e71 320
dokunewon 60:68924f211e71 321 switch (transfer->setup.wValue >> 8) {
dokunewon 60:68924f211e71 322 case MUTE_CONTROL:
dokunewon 60:68924f211e71 323 switch (transfer->setup.bRequest) {
dokunewon 60:68924f211e71 324 case REQUEST_GET_CUR:
dokunewon 60:68924f211e71 325 transfer->remaining = 1;
dokunewon 60:68924f211e71 326 transfer->ptr = &mute;
dokunewon 60:68924f211e71 327 transfer->direction = DEVICE_TO_HOST;
dokunewon 60:68924f211e71 328 success = true;
dokunewon 60:68924f211e71 329 break;
dokunewon 60:68924f211e71 330
dokunewon 60:68924f211e71 331 case REQUEST_SET_CUR:
dokunewon 60:68924f211e71 332 transfer->remaining = 1;
dokunewon 60:68924f211e71 333 transfer->notify = true;
dokunewon 60:68924f211e71 334 transfer->direction = HOST_TO_DEVICE;
dokunewon 60:68924f211e71 335 success = true;
dokunewon 60:68924f211e71 336 break;
dokunewon 60:68924f211e71 337 default:
dokunewon 60:68924f211e71 338 break;
dokunewon 60:68924f211e71 339 }
dokunewon 60:68924f211e71 340 break;
dokunewon 60:68924f211e71 341 case VOLUME_CONTROL:
dokunewon 60:68924f211e71 342 switch (transfer->setup.bRequest) {
dokunewon 60:68924f211e71 343 case REQUEST_GET_CUR:
dokunewon 60:68924f211e71 344 transfer->remaining = 2;
dokunewon 60:68924f211e71 345 transfer->ptr = (uint8_t *)&volCur;
dokunewon 60:68924f211e71 346 transfer->direction = DEVICE_TO_HOST;
dokunewon 60:68924f211e71 347 success = true;
dokunewon 60:68924f211e71 348 break;
dokunewon 60:68924f211e71 349 case REQUEST_GET_MIN:
dokunewon 60:68924f211e71 350 transfer->remaining = 2;
dokunewon 60:68924f211e71 351 transfer->ptr = (uint8_t *)&volMin;
dokunewon 60:68924f211e71 352 transfer->direction = DEVICE_TO_HOST;
dokunewon 60:68924f211e71 353 success = true;
dokunewon 60:68924f211e71 354 break;
dokunewon 60:68924f211e71 355 case REQUEST_GET_MAX:
dokunewon 60:68924f211e71 356 transfer->remaining = 2;
dokunewon 60:68924f211e71 357 transfer->ptr = (uint8_t *)&volMax;
dokunewon 60:68924f211e71 358 transfer->direction = DEVICE_TO_HOST;
dokunewon 60:68924f211e71 359 success = true;
dokunewon 60:68924f211e71 360 break;
dokunewon 60:68924f211e71 361 case REQUEST_GET_RES:
dokunewon 60:68924f211e71 362 transfer->remaining = 2;
dokunewon 60:68924f211e71 363 transfer->ptr = (uint8_t *)&volRes;
dokunewon 60:68924f211e71 364 transfer->direction = DEVICE_TO_HOST;
dokunewon 60:68924f211e71 365 success = true;
dokunewon 60:68924f211e71 366 break;
dokunewon 60:68924f211e71 367
dokunewon 60:68924f211e71 368 case REQUEST_SET_CUR:
dokunewon 60:68924f211e71 369 transfer->remaining = 2;
dokunewon 60:68924f211e71 370 transfer->notify = true;
dokunewon 60:68924f211e71 371 transfer->direction = HOST_TO_DEVICE;
dokunewon 60:68924f211e71 372 success = true;
dokunewon 60:68924f211e71 373 break;
dokunewon 60:68924f211e71 374 case REQUEST_SET_MIN:
dokunewon 60:68924f211e71 375 transfer->remaining = 2;
dokunewon 60:68924f211e71 376 transfer->notify = true;
dokunewon 60:68924f211e71 377 transfer->direction = HOST_TO_DEVICE;
dokunewon 60:68924f211e71 378 success = true;
dokunewon 60:68924f211e71 379 break;
dokunewon 60:68924f211e71 380 case REQUEST_SET_MAX:
dokunewon 60:68924f211e71 381 transfer->remaining = 2;
dokunewon 60:68924f211e71 382 transfer->notify = true;
dokunewon 60:68924f211e71 383 transfer->direction = HOST_TO_DEVICE;
dokunewon 60:68924f211e71 384 success = true;
dokunewon 60:68924f211e71 385 break;
dokunewon 60:68924f211e71 386 case REQUEST_SET_RES:
dokunewon 60:68924f211e71 387 transfer->remaining = 2;
dokunewon 60:68924f211e71 388 transfer->notify = true;
dokunewon 60:68924f211e71 389 transfer->direction = HOST_TO_DEVICE;
dokunewon 60:68924f211e71 390 success = true;
dokunewon 60:68924f211e71 391 break;
dokunewon 60:68924f211e71 392 }
dokunewon 60:68924f211e71 393 break;
dokunewon 60:68924f211e71 394 default:
dokunewon 60:68924f211e71 395 break;
dokunewon 60:68924f211e71 396 }
dokunewon 60:68924f211e71 397 }
dokunewon 60:68924f211e71 398 }
dokunewon 60:68924f211e71 399 }
dokunewon 60:68924f211e71 400 return success;
dokunewon 60:68924f211e71 401 }
dokunewon 60:68924f211e71 402
dokunewon 60:68924f211e71 403
dokunewon 60:68924f211e71 404 // Called in ISR context when a data OUT stage has been performed
dokunewon 60:68924f211e71 405 void USBAudio::USBCallback_requestCompleted(uint8_t * buf, uint32_t length) {
dokunewon 60:68924f211e71 406 if ((length == 1) || (length == 2)) {
dokunewon 60:68924f211e71 407 uint16_t data = (length == 1) ? *buf : *((uint16_t *)buf);
dokunewon 60:68924f211e71 408 CONTROL_TRANSFER * transfer = getTransferPtr();
dokunewon 60:68924f211e71 409 switch (transfer->setup.wValue >> 8) {
dokunewon 60:68924f211e71 410 case MUTE_CONTROL:
dokunewon 60:68924f211e71 411 switch (transfer->setup.bRequest) {
dokunewon 60:68924f211e71 412 case REQUEST_SET_CUR:
dokunewon 60:68924f211e71 413 mute = data & 0xff;
dokunewon 60:68924f211e71 414 updateVol.call();
dokunewon 60:68924f211e71 415 break;
dokunewon 60:68924f211e71 416 default:
dokunewon 60:68924f211e71 417 break;
dokunewon 60:68924f211e71 418 }
dokunewon 60:68924f211e71 419 break;
dokunewon 60:68924f211e71 420 case VOLUME_CONTROL:
dokunewon 60:68924f211e71 421 switch (transfer->setup.bRequest) {
dokunewon 60:68924f211e71 422 case REQUEST_SET_CUR:
dokunewon 60:68924f211e71 423 volCur = data;
dokunewon 60:68924f211e71 424 volume = (float)volCur/(float)volMax;
dokunewon 60:68924f211e71 425 updateVol.call();
dokunewon 60:68924f211e71 426 break;
dokunewon 60:68924f211e71 427 default:
dokunewon 60:68924f211e71 428 break;
dokunewon 60:68924f211e71 429 }
dokunewon 60:68924f211e71 430 break;
dokunewon 60:68924f211e71 431 default:
dokunewon 60:68924f211e71 432 break;
dokunewon 60:68924f211e71 433 }
dokunewon 60:68924f211e71 434 }
dokunewon 60:68924f211e71 435 }
dokunewon 60:68924f211e71 436
dokunewon 60:68924f211e71 437
dokunewon 60:68924f211e71 438
dokunewon 60:68924f211e71 439 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
dokunewon 60:68924f211e71 440 + (5 * INTERFACE_DESCRIPTOR_LENGTH) \
dokunewon 60:68924f211e71 441 + (1 * CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1) \
dokunewon 60:68924f211e71 442 + (2 * INPUT_TERMINAL_DESCRIPTOR_LENGTH) \
dokunewon 60:68924f211e71 443 + (1 * FEATURE_UNIT_DESCRIPTOR_LENGTH) \
dokunewon 60:68924f211e71 444 + (2 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) \
dokunewon 60:68924f211e71 445 + (2 * STREAMING_INTERFACE_DESCRIPTOR_LENGTH) \
dokunewon 60:68924f211e71 446 + (2 * FORMAT_TYPE_I_DESCRIPTOR_LENGTH) \
dokunewon 60:68924f211e71 447 + (2 * (ENDPOINT_DESCRIPTOR_LENGTH + 2)) \
dokunewon 60:68924f211e71 448 + (2 * STREAMING_ENDPOINT_DESCRIPTOR_LENGTH) )
dokunewon 60:68924f211e71 449
dokunewon 60:68924f211e71 450 #define TOTAL_CONTROL_INTF_LENGTH (CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1 + \
dokunewon 60:68924f211e71 451 2*INPUT_TERMINAL_DESCRIPTOR_LENGTH + \
dokunewon 60:68924f211e71 452 FEATURE_UNIT_DESCRIPTOR_LENGTH + \
dokunewon 60:68924f211e71 453 2*OUTPUT_TERMINAL_DESCRIPTOR_LENGTH)
dokunewon 60:68924f211e71 454
dokunewon 60:68924f211e71 455 uint8_t * USBAudio::configurationDesc() {
dokunewon 60:68924f211e71 456 static uint8_t configDescriptor[] = {
dokunewon 60:68924f211e71 457 // Configuration 1
dokunewon 60:68924f211e71 458 CONFIGURATION_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 459 CONFIGURATION_DESCRIPTOR, // bDescriptorType
dokunewon 60:68924f211e71 460 LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
dokunewon 60:68924f211e71 461 MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
dokunewon 60:68924f211e71 462 0x03, // bNumInterfaces
dokunewon 60:68924f211e71 463 DEFAULT_CONFIGURATION, // bConfigurationValue
dokunewon 60:68924f211e71 464 0x00, // iConfiguration
dokunewon 60:68924f211e71 465 0x80, // bmAttributes
dokunewon 60:68924f211e71 466 50, // bMaxPower
dokunewon 60:68924f211e71 467
dokunewon 60:68924f211e71 468 // Interface 0, Alternate Setting 0, Audio Control
dokunewon 60:68924f211e71 469 INTERFACE_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 470 INTERFACE_DESCRIPTOR, // bDescriptorType
dokunewon 60:68924f211e71 471 0x00, // bInterfaceNumber
dokunewon 60:68924f211e71 472 0x00, // bAlternateSetting
dokunewon 60:68924f211e71 473 0x00, // bNumEndpoints
dokunewon 60:68924f211e71 474 AUDIO_CLASS, // bInterfaceClass
dokunewon 60:68924f211e71 475 SUBCLASS_AUDIOCONTROL, // bInterfaceSubClass
dokunewon 60:68924f211e71 476 0x00, // bInterfaceProtocol
dokunewon 60:68924f211e71 477 0x00, // iInterface
dokunewon 60:68924f211e71 478
dokunewon 60:68924f211e71 479
dokunewon 60:68924f211e71 480 // Audio Control Interface
dokunewon 60:68924f211e71 481 CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1,// bLength
dokunewon 60:68924f211e71 482 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 483 CONTROL_HEADER, // bDescriptorSubtype
dokunewon 60:68924f211e71 484 LSB(0x0100), // bcdADC (LSB)
dokunewon 60:68924f211e71 485 MSB(0x0100), // bcdADC (MSB)
dokunewon 60:68924f211e71 486 LSB(TOTAL_CONTROL_INTF_LENGTH), // wTotalLength
dokunewon 60:68924f211e71 487 MSB(TOTAL_CONTROL_INTF_LENGTH), // wTotalLength
dokunewon 60:68924f211e71 488 0x02, // bInCollection
dokunewon 60:68924f211e71 489 0x01, // baInterfaceNr
dokunewon 60:68924f211e71 490 0x02, // baInterfaceNr
dokunewon 60:68924f211e71 491
dokunewon 60:68924f211e71 492 // Audio Input Terminal (Speaker)
dokunewon 60:68924f211e71 493 INPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 494 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 495 CONTROL_INPUT_TERMINAL, // bDescriptorSubtype
dokunewon 60:68924f211e71 496 0x01, // bTerminalID
dokunewon 60:68924f211e71 497 LSB(TERMINAL_USB_STREAMING), // wTerminalType
dokunewon 60:68924f211e71 498 MSB(TERMINAL_USB_STREAMING), // wTerminalType
dokunewon 60:68924f211e71 499 0x00, // bAssocTerminal
dokunewon 60:68924f211e71 500 channel_nb_in, // bNrChannels
dokunewon 60:68924f211e71 501 (uint8_t)(LSB(channel_config_in)), // wChannelConfig
dokunewon 60:68924f211e71 502 (uint8_t)(MSB(channel_config_in)), // wChannelConfig
dokunewon 60:68924f211e71 503 0x00, // iChannelNames
dokunewon 60:68924f211e71 504 0x00, // iTerminal
dokunewon 60:68924f211e71 505
dokunewon 60:68924f211e71 506 // Audio Feature Unit (Speaker)
dokunewon 60:68924f211e71 507 FEATURE_UNIT_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 508 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 509 CONTROL_FEATURE_UNIT, // bDescriptorSubtype
dokunewon 60:68924f211e71 510 0x02, // bUnitID
dokunewon 60:68924f211e71 511 0x01, // bSourceID
dokunewon 60:68924f211e71 512 0x01, // bControlSize
dokunewon 60:68924f211e71 513 CONTROL_MUTE |
dokunewon 60:68924f211e71 514 CONTROL_VOLUME, // bmaControls(0)
dokunewon 60:68924f211e71 515 0x00, // bmaControls(1)
dokunewon 60:68924f211e71 516 0x00, // iTerminal
dokunewon 60:68924f211e71 517
dokunewon 60:68924f211e71 518 // Audio Output Terminal (Speaker)
dokunewon 60:68924f211e71 519 OUTPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 520 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 521 CONTROL_OUTPUT_TERMINAL, // bDescriptorSubtype
dokunewon 60:68924f211e71 522 0x03, // bTerminalID
dokunewon 60:68924f211e71 523 LSB(TERMINAL_SPEAKER), // wTerminalType
dokunewon 60:68924f211e71 524 MSB(TERMINAL_SPEAKER), // wTerminalType
dokunewon 60:68924f211e71 525 0x00, // bAssocTerminal
dokunewon 60:68924f211e71 526 0x02, // bSourceID
dokunewon 60:68924f211e71 527 0x00, // iTerminal
dokunewon 60:68924f211e71 528
dokunewon 60:68924f211e71 529
dokunewon 60:68924f211e71 530 // Audio Input Terminal (Microphone)
dokunewon 60:68924f211e71 531 INPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 532 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 533 CONTROL_INPUT_TERMINAL, // bDescriptorSubtype
dokunewon 60:68924f211e71 534 0x04, // bTerminalID
dokunewon 60:68924f211e71 535 LSB(TERMINAL_MICROPHONE), // wTerminalType
dokunewon 60:68924f211e71 536 MSB(TERMINAL_MICROPHONE), // wTerminalType
dokunewon 60:68924f211e71 537 0x00, // bAssocTerminal
dokunewon 60:68924f211e71 538 channel_nb_out, // bNrChannels
dokunewon 60:68924f211e71 539 (uint8_t)(LSB(channel_config_out)), // wChannelConfig
dokunewon 60:68924f211e71 540 (uint8_t)(MSB(channel_config_out)), // wChannelConfig
dokunewon 60:68924f211e71 541 0x00, // iChannelNames
dokunewon 60:68924f211e71 542 0x00, // iTerminal
dokunewon 60:68924f211e71 543
dokunewon 60:68924f211e71 544 // Audio Output Terminal (Microphone)
dokunewon 60:68924f211e71 545 OUTPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 546 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 547 CONTROL_OUTPUT_TERMINAL, // bDescriptorSubtype
dokunewon 60:68924f211e71 548 0x05, // bTerminalID
dokunewon 60:68924f211e71 549 LSB(TERMINAL_USB_STREAMING), // wTerminalType
dokunewon 60:68924f211e71 550 MSB(TERMINAL_USB_STREAMING), // wTerminalType
dokunewon 60:68924f211e71 551 0x00, // bAssocTerminal
dokunewon 60:68924f211e71 552 0x04, // bSourceID
dokunewon 60:68924f211e71 553 0x00, // iTerminal
dokunewon 60:68924f211e71 554
dokunewon 60:68924f211e71 555
dokunewon 60:68924f211e71 556
dokunewon 60:68924f211e71 557
dokunewon 60:68924f211e71 558
dokunewon 60:68924f211e71 559
dokunewon 60:68924f211e71 560 // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
dokunewon 60:68924f211e71 561 INTERFACE_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 562 INTERFACE_DESCRIPTOR, // bDescriptorType
dokunewon 60:68924f211e71 563 0x01, // bInterfaceNumber
dokunewon 60:68924f211e71 564 0x00, // bAlternateSetting
dokunewon 60:68924f211e71 565 0x00, // bNumEndpoints
dokunewon 60:68924f211e71 566 AUDIO_CLASS, // bInterfaceClass
dokunewon 60:68924f211e71 567 SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
dokunewon 60:68924f211e71 568 0x00, // bInterfaceProtocol
dokunewon 60:68924f211e71 569 0x00, // iInterface
dokunewon 60:68924f211e71 570
dokunewon 60:68924f211e71 571 // Interface 1, Alternate Setting 1, Audio Streaming - Operational
dokunewon 60:68924f211e71 572 INTERFACE_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 573 INTERFACE_DESCRIPTOR, // bDescriptorType
dokunewon 60:68924f211e71 574 0x01, // bInterfaceNumber
dokunewon 60:68924f211e71 575 0x01, // bAlternateSetting
dokunewon 60:68924f211e71 576 0x01, // bNumEndpoints
dokunewon 60:68924f211e71 577 AUDIO_CLASS, // bInterfaceClass
dokunewon 60:68924f211e71 578 SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
dokunewon 60:68924f211e71 579 0x00, // bInterfaceProtocol
dokunewon 60:68924f211e71 580 0x00, // iInterface
dokunewon 60:68924f211e71 581
dokunewon 60:68924f211e71 582 // Audio Streaming Interface
dokunewon 60:68924f211e71 583 STREAMING_INTERFACE_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 584 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 585 STREAMING_GENERAL, // bDescriptorSubtype
dokunewon 60:68924f211e71 586 0x01, // bTerminalLink
dokunewon 60:68924f211e71 587 0x00, // bDelay
dokunewon 60:68924f211e71 588 LSB(FORMAT_PCM), // wFormatTag
dokunewon 60:68924f211e71 589 MSB(FORMAT_PCM), // wFormatTag
dokunewon 60:68924f211e71 590
dokunewon 60:68924f211e71 591 // Audio Type I Format
dokunewon 60:68924f211e71 592 FORMAT_TYPE_I_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 593 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 594 STREAMING_FORMAT_TYPE, // bDescriptorSubtype
dokunewon 60:68924f211e71 595 FORMAT_TYPE_I, // bFormatType
dokunewon 60:68924f211e71 596 channel_nb_in, // bNrChannels
dokunewon 60:68924f211e71 597 0x02, // bSubFrameSize
dokunewon 60:68924f211e71 598 16, // bBitResolution
dokunewon 60:68924f211e71 599 0x01, // bSamFreqType
dokunewon 60:68924f211e71 600 (uint8_t)(LSB(FREQ_IN)), // tSamFreq
dokunewon 60:68924f211e71 601 (uint8_t)((FREQ_IN >> 8) & 0xff), // tSamFreq
dokunewon 60:68924f211e71 602 (uint8_t)((FREQ_IN >> 16) & 0xff), // tSamFreq
dokunewon 60:68924f211e71 603
dokunewon 60:68924f211e71 604 // Endpoint - Standard Descriptor
dokunewon 60:68924f211e71 605 ENDPOINT_DESCRIPTOR_LENGTH + 2, // bLength
dokunewon 60:68924f211e71 606 ENDPOINT_DESCRIPTOR, // bDescriptorType
dokunewon 60:68924f211e71 607 PHY_TO_DESC(EPISO_OUT), // bEndpointAddress
dokunewon 60:68924f211e71 608 E_ISOCHRONOUS, // bmAttributes
dokunewon 60:68924f211e71 609 (uint8_t)(LSB(PACKET_SIZE_ISO_IN)), // wMaxPacketSize
dokunewon 60:68924f211e71 610 (uint8_t)(MSB(PACKET_SIZE_ISO_IN)), // wMaxPacketSize
dokunewon 60:68924f211e71 611 0x01, // bInterval
dokunewon 60:68924f211e71 612 0x00, // bRefresh
dokunewon 60:68924f211e71 613 0x00, // bSynchAddress
dokunewon 60:68924f211e71 614
dokunewon 60:68924f211e71 615 // Endpoint - Audio Streaming
dokunewon 60:68924f211e71 616 STREAMING_ENDPOINT_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 617 ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 618 ENDPOINT_GENERAL, // bDescriptor
dokunewon 60:68924f211e71 619 0x00, // bmAttributes
dokunewon 60:68924f211e71 620 0x00, // bLockDelayUnits
dokunewon 60:68924f211e71 621 LSB(0x0000), // wLockDelay
dokunewon 60:68924f211e71 622 MSB(0x0000), // wLockDelay
dokunewon 60:68924f211e71 623
dokunewon 60:68924f211e71 624
dokunewon 60:68924f211e71 625
dokunewon 60:68924f211e71 626
dokunewon 60:68924f211e71 627
dokunewon 60:68924f211e71 628
dokunewon 60:68924f211e71 629
dokunewon 60:68924f211e71 630 // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
dokunewon 60:68924f211e71 631 INTERFACE_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 632 INTERFACE_DESCRIPTOR, // bDescriptorType
dokunewon 60:68924f211e71 633 0x02, // bInterfaceNumber
dokunewon 60:68924f211e71 634 0x00, // bAlternateSetting
dokunewon 60:68924f211e71 635 0x00, // bNumEndpoints
dokunewon 60:68924f211e71 636 AUDIO_CLASS, // bInterfaceClass
dokunewon 60:68924f211e71 637 SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
dokunewon 60:68924f211e71 638 0x00, // bInterfaceProtocol
dokunewon 60:68924f211e71 639 0x00, // iInterface
dokunewon 60:68924f211e71 640
dokunewon 60:68924f211e71 641 // Interface 1, Alternate Setting 1, Audio Streaming - Operational
dokunewon 60:68924f211e71 642 INTERFACE_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 643 INTERFACE_DESCRIPTOR, // bDescriptorType
dokunewon 60:68924f211e71 644 0x02, // bInterfaceNumber
dokunewon 60:68924f211e71 645 0x01, // bAlternateSetting
dokunewon 60:68924f211e71 646 0x01, // bNumEndpoints
dokunewon 60:68924f211e71 647 AUDIO_CLASS, // bInterfaceClass
dokunewon 60:68924f211e71 648 SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
dokunewon 60:68924f211e71 649 0x00, // bInterfaceProtocol
dokunewon 60:68924f211e71 650 0x00, // iInterface
dokunewon 60:68924f211e71 651
dokunewon 60:68924f211e71 652 // Audio Streaming Interface
dokunewon 60:68924f211e71 653 STREAMING_INTERFACE_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 654 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 655 SUBCLASS_AUDIOCONTROL, // bDescriptorSubtype
dokunewon 60:68924f211e71 656 0x05, // bTerminalLink (output terminal microphone)
dokunewon 60:68924f211e71 657 0x01, // bDelay
dokunewon 60:68924f211e71 658 0x01, // wFormatTag
dokunewon 60:68924f211e71 659 0x00, // wFormatTag
dokunewon 60:68924f211e71 660
dokunewon 60:68924f211e71 661 // Audio Type I Format
dokunewon 60:68924f211e71 662 FORMAT_TYPE_I_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 663 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 664 SUBCLASS_AUDIOSTREAMING, // bDescriptorSubtype
dokunewon 60:68924f211e71 665 FORMAT_TYPE_I, // bFormatType
dokunewon 60:68924f211e71 666 channel_nb_out, // bNrChannels
dokunewon 60:68924f211e71 667 0x02, // bSubFrameSize
dokunewon 60:68924f211e71 668 0x10, // bBitResolution
dokunewon 60:68924f211e71 669 0x01, // bSamFreqType
dokunewon 60:68924f211e71 670 (uint8_t)(LSB(FREQ_OUT)), // tSamFreq
dokunewon 60:68924f211e71 671 (uint8_t)((FREQ_OUT >> 8) & 0xff), // tSamFreq
dokunewon 60:68924f211e71 672 (uint8_t)((FREQ_OUT >> 16) & 0xff), // tSamFreq
dokunewon 60:68924f211e71 673
dokunewon 60:68924f211e71 674 // Endpoint - Standard Descriptor
dokunewon 60:68924f211e71 675 ENDPOINT_DESCRIPTOR_LENGTH + 2, // bLength
dokunewon 60:68924f211e71 676 ENDPOINT_DESCRIPTOR, // bDescriptorType
dokunewon 60:68924f211e71 677 PHY_TO_DESC(EPISO_IN), // bEndpointAddress
dokunewon 60:68924f211e71 678 E_ISOCHRONOUS, // bmAttributes
dokunewon 60:68924f211e71 679 (uint8_t)(LSB(PACKET_SIZE_ISO_OUT)), // wMaxPacketSize
dokunewon 60:68924f211e71 680 (uint8_t)(MSB(PACKET_SIZE_ISO_OUT)), // wMaxPacketSize
dokunewon 60:68924f211e71 681 0x01, // bInterval
dokunewon 60:68924f211e71 682 0x00, // bRefresh
dokunewon 60:68924f211e71 683 0x00, // bSynchAddress
dokunewon 60:68924f211e71 684
dokunewon 60:68924f211e71 685 // Endpoint - Audio Streaming
dokunewon 60:68924f211e71 686 STREAMING_ENDPOINT_DESCRIPTOR_LENGTH, // bLength
dokunewon 60:68924f211e71 687 ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
dokunewon 60:68924f211e71 688 ENDPOINT_GENERAL, // bDescriptor
dokunewon 60:68924f211e71 689 0x00, // bmAttributes
dokunewon 60:68924f211e71 690 0x00, // bLockDelayUnits
dokunewon 60:68924f211e71 691 LSB(0x0000), // wLockDelay
dokunewon 60:68924f211e71 692 MSB(0x0000), // wLockDelay
dokunewon 60:68924f211e71 693
dokunewon 60:68924f211e71 694 // Terminator
dokunewon 60:68924f211e71 695 0 // bLength
dokunewon 60:68924f211e71 696 };
dokunewon 60:68924f211e71 697 return configDescriptor;
dokunewon 60:68924f211e71 698 }
dokunewon 60:68924f211e71 699
dokunewon 60:68924f211e71 700 uint8_t * USBAudio::stringIinterfaceDesc() {
dokunewon 60:68924f211e71 701 static uint8_t stringIinterfaceDescriptor[] = {
dokunewon 60:68924f211e71 702 0x0c, //bLength
dokunewon 60:68924f211e71 703 STRING_DESCRIPTOR, //bDescriptorType 0x03
dokunewon 60:68924f211e71 704 'A',0,'u',0,'d',0,'i',0,'o',0 //bString iInterface - Audio
dokunewon 60:68924f211e71 705 };
dokunewon 60:68924f211e71 706 return stringIinterfaceDescriptor;
dokunewon 60:68924f211e71 707 }
dokunewon 60:68924f211e71 708
dokunewon 60:68924f211e71 709 uint8_t * USBAudio::stringIproductDesc() {
dokunewon 60:68924f211e71 710 static uint8_t stringIproductDescriptor[] = {
dokunewon 60:68924f211e71 711 0x16, //bLength
dokunewon 60:68924f211e71 712 STRING_DESCRIPTOR, //bDescriptorType 0x03
dokunewon 60:68924f211e71 713 'M',0,'b',0,'e',0,'d',0,' ',0,'A',0,'u',0,'d',0,'i',0,'o',0 //bString iProduct - Mbed Audio
dokunewon 60:68924f211e71 714 };
dokunewon 60:68924f211e71 715 return stringIproductDescriptor;
dokunewon 60:68924f211e71 716 }