@@ -136,27 +136,26 @@ static int audio_class_interface_request_handler(uint8_t busid, struct usb_setup
136
136
memcpy (& volume , * data , * len );
137
137
if (volume < 0x8000 ) {
138
138
volume_db = volume / 256 ;
139
- } else if ( volume > 0x8000 ) {
140
- volume_db = (0xffff - volume + 1 ) / - 256 ;
139
+ } else {
140
+ volume_db = (volume - 0x10000 ) / 256 ;
141
141
}
142
- volume_db += 128 ; /* 0 ~ 255 */
143
- USB_LOG_DBG ("Set ep:0x%02x ch:%d volume:0x%04x\r\n" , ep , ch , volume );
142
+ USB_LOG_DBG ("Set ep:0x%02x ch:%d vol_hex:0x%04x, vol_db:%d dB\r\n" , ep , ch , volume , volume_db );
144
143
usbd_audio_set_volume (busid , ep , ch , volume_db );
145
144
break ;
146
145
case AUDIO_REQUEST_GET_CUR :
147
146
volume_db = usbd_audio_get_volume (busid , ep , ch );
148
- volume_db -= 128 ;
149
147
if (volume_db >= 0 ) {
150
148
volume = volume_db * 256 ;
151
149
} else {
152
- volume = volume_db * 256 + 0xffff + 1 ;
150
+ volume = volume_db * 256 + 0x10000 ;
153
151
}
152
+ USB_LOG_DBG ("Get ep:0x%02x ch:%d vol_hex:0x%04x, vol_db:%d dB\r\n" , ep , ch , volume , volume_db );
154
153
memcpy (* data , & volume , 2 );
155
154
* len = 2 ;
156
155
break ;
157
156
case AUDIO_REQUEST_GET_MIN :
158
- (* data )[0 ] = 0x00 ; /* -2560/256 dB */
159
- (* data )[1 ] = 0xdb ;
157
+ (* data )[0 ] = 0x00 ; /* -100 dB */
158
+ (* data )[1 ] = 0x9c ;
160
159
* len = 2 ;
161
160
break ;
162
161
case AUDIO_REQUEST_GET_MAX :
@@ -165,7 +164,7 @@ static int audio_class_interface_request_handler(uint8_t busid, struct usb_setup
165
164
* len = 2 ;
166
165
break ;
167
166
case AUDIO_REQUEST_GET_RES :
168
- (* data )[0 ] = 0x00 ; /* -256/256 dB */
167
+ (* data )[0 ] = 0x00 ; /* 1 dB */
169
168
(* data )[1 ] = 0x01 ;
170
169
* len = 2 ;
171
170
break ;
@@ -178,22 +177,31 @@ static int audio_class_interface_request_handler(uint8_t busid, struct usb_setup
178
177
case AUDIO_REQUEST_CUR :
179
178
if (setup -> bmRequestType & USB_REQUEST_DIR_MASK ) {
180
179
volume_db = usbd_audio_get_volume (busid , ep , ch );
181
- volume = volume_db ;
180
+ if (volume_db >= 0 ) {
181
+ volume = volume_db * 256 ;
182
+ } else {
183
+ volume = volume_db * 256 + 0x10000 ;
184
+ }
185
+ USB_LOG_DBG ("Get ep:0x%02x ch:%d vol_hex:0x%04x, vol_db:%d dB\r\n" , ep , ch , volume , volume_db );
182
186
memcpy (* data , & volume , 2 );
183
187
* len = 2 ;
184
188
} else {
185
189
memcpy (& volume , * data , * len );
186
- volume_db = volume ;
187
- USB_LOG_DBG ("Set ep:0x%02x ch:%d volume:0x%02x\r\n" , ep , ch , volume );
190
+ if (volume < 0x8000 ) {
191
+ volume_db = volume / 256 ;
192
+ } else {
193
+ volume_db = (volume - 0x10000 ) / 256 ;
194
+ }
195
+ USB_LOG_DBG ("Set ep:0x%02x ch:%d vol_hex:0x%04x, vol_db:%d dB\r\n" , ep , ch , volume , volume_db );
188
196
usbd_audio_set_volume (busid , ep , ch , volume_db );
189
197
}
190
198
break ;
191
199
case AUDIO_REQUEST_RANGE :
192
200
if (setup -> bmRequestType & USB_REQUEST_DIR_MASK ) {
193
201
* ((uint16_t * )(* data + 0 )) = 1 ;
194
- * ((uint16_t * )(* data + 2 )) = 0 ;
195
- * ((uint16_t * )(* data + 4 )) = 100 ;
196
- * ((uint16_t * )(* data + 6 )) = 1 ;
202
+ * ((uint16_t * )(* data + 2 )) = 0x9c00 ; /* MIN -100 dB */
203
+ * ((uint16_t * )(* data + 4 )) = 0x0000 ; /* MAX 0 dB */
204
+ * ((uint16_t * )(* data + 6 )) = 0x100 ; /* RES 1 dB */
197
205
* len = 8 ;
198
206
} else {
199
207
}
@@ -312,12 +320,12 @@ struct usbd_interface *usbd_audio_init_intf(uint8_t busid,
312
320
return intf ;
313
321
}
314
322
315
- __WEAK void usbd_audio_set_volume (uint8_t busid , uint8_t ep , uint8_t ch , int volume )
323
+ __WEAK void usbd_audio_set_volume (uint8_t busid , uint8_t ep , uint8_t ch , int volume_db )
316
324
{
317
325
(void )busid ;
318
326
(void )ep ;
319
327
(void )ch ;
320
- (void )volume ;
328
+ (void )volume_db ;
321
329
}
322
330
323
331
__WEAK int usbd_audio_get_volume (uint8_t busid , uint8_t ep , uint8_t ch )
0 commit comments