16 entityIdInputTerminal_(1),
17 entityIdFeatureUnit_(2),
18 entityIdOutputTerminal_(3) {
23 void setSampleRate(uint32_t rate) { sampleRate_ = rate; }
24 void setNumChannels(uint8_t ch) { channels_ = ch; }
25 void setBitsPerSample(uint8_t bits) { bitsPerSample_ = bits; }
27 uint16_t calcMaxPacketSize()
const {
28 uint16_t bytesPerFrame = (bitsPerSample_ / 8) * channels_;
29 uint16_t samplesPerMs = (sampleRate_ + 999) / 1000;
30 return bytesPerFrame * samplesPerMs;
33 const uint8_t* buildDescriptor(uint8_t itf, uint8_t alt, uint16_t* outLen) {
34 static uint8_t desc[256];
38 p = addStandardInterfaceDesc(p, itf, alt, 0);
40 p = addStandardInterfaceDesc(p, itf, alt, 1);
41 p = addCsInterfaceHeader(p);
42 p = addInputTerminalDesc(p);
43 p = addFeatureUnitDesc(p);
44 p = addOutputTerminalDesc(p);
45 p = addFormatTypeDesc(p);
46 p = addIsoDataEndpointDesc(p);
47 p = addCsIsoEndpointDesc(p);
50 *outLen =
static_cast<uint16_t
>(p - desc);
55 uint8_t* addStandardInterfaceDesc(uint8_t* p, uint8_t itf, uint8_t alt,
69 uint8_t* addCsInterfaceHeader(uint8_t* p) {
80 uint8_t* addInputTerminalDesc(uint8_t* p) {
84 *p++ = entityIdInputTerminal_;
98 uint8_t* addFeatureUnitDesc(uint8_t* p) {
99 uint8_t length = 7 + (channels_ + 1) * 2;
103 *p++ = entityIdFeatureUnit_;
104 *p++ = entityIdInputTerminal_;
107 for (uint8_t i = 1; i <= channels_; ++i) {
114 uint8_t* addOutputTerminalDesc(uint8_t* p) {
118 *p++ = entityIdOutputTerminal_;
122 *p++ = entityIdFeatureUnit_;
127 uint8_t* addFormatTypeDesc(uint8_t* p) {
133 *p++ = bitsPerSample_ / 8;
134 *p++ = bitsPerSample_;
136 *p++ = (uint8_t)(sampleRate_ & 0xFF);
137 *p++ = (uint8_t)((sampleRate_ >> 8) & 0xFF);
138 *p++ = (uint8_t)((sampleRate_ >> 16) & 0xFF);
142 uint8_t* addIsoDataEndpointDesc(uint8_t* p) {
143 uint16_t packetSize = calcMaxPacketSize();
148 *p++ = packetSize & 0xFF;
149 *p++ = (packetSize >> 8) & 0xFF;
154 uint8_t* addCsIsoEndpointDesc(uint8_t* p) {
165 uint32_t sampleRate_;
167 uint8_t bitsPerSample_;
171 const uint8_t entityIdInputTerminal_;
172 const uint8_t entityIdFeatureUnit_;
173 const uint8_t entityIdOutputTerminal_;