diff --git a/class/audio/usb_audio.h b/class/audio/usb_audio.h index 156d1122..eb518b7b 100644 --- a/class/audio/usb_audio.h +++ b/class/audio/usb_audio.h @@ -874,7 +874,7 @@ struct audio_cs_ep_ep_general_descriptor { 0x09, /* bLength */ \ USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ bFeedbackEndpointAddress, /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */ \ - 0x15, /* bmAttributes: TransferType=Isochronous SyncType=Asynchronous EndpointType=Feedback */ \ + 0x11, /* bmAttributes: TransferType=Isochronous SyncType=None EndpointType=Feedback */ \ WBVAL(4), /* XXXX wMaxPacketSize in Bytes */ \ bInterval, /* bInterval */ \ 0x03, /* bRefresh, 8ms */ \ @@ -1325,7 +1325,7 @@ struct audio_v2_control_range3_param_block { 0x07, /* bLength */ \ USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ bFeedbackEndpointAddress, /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */ \ - 0x15, /* bmAttributes: TransferType=Isochronous SyncType=Asynchronous EndpointType=Feedback */ \ + 0x11, /* bmAttributes: TransferType=Isochronous SyncType=None EndpointType=Feedback */ \ WBVAL(4), /* XXXX wMaxPacketSize in Bytes */ \ bInterval /* bInterval */ @@ -1341,18 +1341,18 @@ struct audio_v2_control_range3_param_block { (uint8_t)((frq >> 16)), (uint8_t)((frq >> 24)) /* format 10.14 */ -#define AUDIO_UPDATE_FEEDBACK_DATA_FS(buf, freq) \ - uint32_t value = ((freq << 10) / 1000); \ - buf[0] = ((value << 4) & 0xFFU); \ - buf[1] = (((value << 4) >> 8U) & 0xFFU); \ - buf[2] = (((value << 4) >> 16U) & 0xFFU) +#define AUDIO_FREQ_TO_FEEDBACK_FS(freq) ((freq << 10) / 1000) +#define AUDIO_FEEDBACK_TO_BUF_FS(buf, feedback) \ + buf[0] = ((feedback << 4) & 0xFFU); \ + buf[1] = (((feedback << 4) >> 8U) & 0xFFU); \ + buf[2] = (((feedback << 4) >> 16U) & 0xFFU) /* format 16.16 */ -#define AUDIO_UPDATE_FEEDBACK_DATA_HS(buf, freq) \ - uint32_t value = ((freq << 13) / 1000); \ - buf[0] = (((value & 0x00001FFFu) << 3) & 0xFFu); \ - buf[1] = ((((value & 0x00001FFFu) << 3) >> 8) & 0xFFu); \ - buf[2] = (((value & 0x01FFE000u) >> 13) & 0xFFu); \ - buf[3] = (((value & 0x01FFE000u) >> 21) & 0xFFu) +#define AUDIO_FREQ_TO_FEEDBACK_HS(freq) ((freq << 13) / 1000) +#define AUDIO_FEEDBACK_TO_BUF_HS(buf, feedback) \ + buf[0] = (((feedback & 0x00001FFFu) << 3) & 0xFFu); \ + buf[1] = ((((feedback & 0x00001FFFu) << 3) >> 8) & 0xFFu); \ + buf[2] = (((feedback & 0x01FFE000u) >> 13) & 0xFFu); \ + buf[3] = (((feedback & 0x01FFE000u) >> 21) & 0xFFu) #endif /* USB_AUDIO_H */ diff --git a/demo/audio_v1_mic_speaker_multichan_template.c b/demo/audio_v1_mic_speaker_multichan_template.c index e2c9fc83..add1d8db 100644 --- a/demo/audio_v1_mic_speaker_multichan_template.c +++ b/demo/audio_v1_mic_speaker_multichan_template.c @@ -290,7 +290,8 @@ void usbd_audio_open(uint8_t busid, uint8_t intf) rx_flag = 1; /* setup first out ep read transfer */ usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); - AUDIO_UPDATE_FEEDBACK_DATA_FS(s_speaker_feedback_buffer, AUDIO_SPEAKER_FREQ); /* uac1 can only use 10.14 */ + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_FS(AUDIO_SPEAKER_FREQ); + AUDIO_FEEDBACK_TO_BUF_FS(s_speaker_feedback_buffer, feedback_value); /* uac1 can only use 10.14 */ usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE); printf("OPEN1\r\n"); } else { @@ -328,7 +329,8 @@ void usbd_audio_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) void usbd_audio_iso_out_feedback_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) { USB_LOG_RAW("actual feedback len:%d\r\n", nbytes); - AUDIO_UPDATE_FEEDBACK_DATA_FS(s_speaker_feedback_buffer, AUDIO_SPEAKER_FREQ); + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_FS(AUDIO_SPEAKER_FREQ); + AUDIO_FEEDBACK_TO_BUF_FS(s_speaker_feedback_buffer, feedback_value); usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE); } #endif diff --git a/demo/audio_v2_speaker_multichan_template.c b/demo/audio_v2_speaker_multichan_template.c index b10da1ad..b34e03fc 100644 --- a/demo/audio_v2_speaker_multichan_template.c +++ b/demo/audio_v2_speaker_multichan_template.c @@ -306,9 +306,11 @@ void usbd_audio_open(uint8_t busid, uint8_t intf) /* setup first out ep read transfer */ usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); #ifdef CONFIG_USB_HS - AUDIO_UPDATE_FEEDBACK_DATA_HS(s_speaker_feedback_buffer, AUDIO_FREQ); + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_HS(AUDIO_FREQ); + AUDIO_FEEDBACK_TO_BUF_HS(s_speaker_feedback_buffer, feedback_value); #else - AUDIO_UPDATE_FEEDBACK_DATA_FS(s_speaker_feedback_buffer, AUDIO_FREQ); + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_FS(AUDIO_FREQ); + AUDIO_FEEDBACK_TO_BUF_FS(s_speaker_feedback_buffer, feedback_value); #endif usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE); USB_LOG_RAW("OPEN\r\n"); @@ -338,9 +340,11 @@ void usbd_audio_iso_out_feedback_callback(uint8_t busid, uint8_t ep, uint32_t nb { USB_LOG_RAW("actual feedback len:%d\r\n", nbytes); #ifdef CONFIG_USB_HS - AUDIO_UPDATE_FEEDBACK_DATA_HS(s_speaker_feedback_buffer, AUDIO_FREQ); + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_HS(AUDIO_FREQ); + AUDIO_FEEDBACK_TO_BUF_HS(s_speaker_feedback_buffer, feedback_value); #else - AUDIO_UPDATE_FEEDBACK_DATA_FS(s_speaker_feedback_buffer, AUDIO_FREQ); + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_FS(AUDIO_FREQ); + AUDIO_FEEDBACK_TO_BUF_FS(s_speaker_feedback_buffer, feedback_value); #endif usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE); }