18 uint16_t calcMaxPacketSize()
const {
19 uint16_t bytesPerFrame = (p_config->bits_per_sample / 8) * p_config->channels;
20 uint16_t samplesPerMs = (p_config->sample_rate + 999) / 1000;
21 return bytesPerFrame * samplesPerMs;
24 const uint8_t* buildDescriptor(uint8_t itf, uint8_t alt, uint16_t* outLen) {
25 static uint8_t desc[256];
29 p = addStandardInterfaceDesc(p, itf, alt, 0);
31 p = addStandardInterfaceDesc(p, itf, alt, 1);
32 p = addCsInterfaceHeader(p);
33 p = addInputTerminalDesc(p);
34 p = addFeatureUnitDesc(p);
35 p = addOutputTerminalDesc(p);
36 p = addFormatTypeDesc(p);
37 p = addIsoDataEndpointDesc(p);
38 p = addCsIsoEndpointDesc(p);
41 *outLen =
static_cast<uint16_t
>(p - desc);
46 uint8_t* addStandardInterfaceDesc(uint8_t* p, uint8_t itf, uint8_t alt,
60 uint8_t* addCsInterfaceHeader(uint8_t* p) {
71 uint8_t* addInputTerminalDesc(uint8_t* p) {
75 *p++ = p_config->entity_id_input_terminal;
79 *p++ = p_config->channels;
89 uint8_t* addFeatureUnitDesc(uint8_t* p) {
90 uint8_t length = 7 + (p_config->channels + 1) * 2;
94 *p++ = p_config->entity_id_feature_unit;
95 *p++ = p_config->entity_id_input_terminal;
98 for (uint8_t i = 1; i <= p_config->channels; ++i) {
105 uint8_t* addOutputTerminalDesc(uint8_t* p) {
109 *p++ = p_config->entity_id_output_terminal;
113 *p++ = p_config->entity_id_feature_unit;
118 uint8_t* addFormatTypeDesc(uint8_t* p) {
123 *p++ = p_config->channels;
124 *p++ = p_config->bits_per_sample / 8;
125 *p++ = p_config->bits_per_sample;
127 *p++ = (uint8_t)(p_config->sample_rate & 0xFF);
128 *p++ = (uint8_t)((p_config->sample_rate >> 8) & 0xFF);
129 *p++ = (uint8_t)((p_config->sample_rate >> 16) & 0xFF);
133 uint8_t* addIsoDataEndpointDesc(uint8_t* p) {
134 uint16_t packetSize = calcMaxPacketSize();
137 *p++ = p_config->ep_in;
139 *p++ = packetSize & 0xFF;
140 *p++ = (packetSize >> 8) & 0xFF;
145 uint8_t* addCsIsoEndpointDesc(uint8_t* p) {