-
Notifications
You must be signed in to change notification settings - Fork 884
Additional Sample Format for USB Audio Streaming in usb_device_uac
(AEGHB-1139)
#541
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -19,6 +19,14 @@ extern "C" { | |
// AUDIO CLASS DRIVER CONFIGURATION | ||
//-------------------------------------------------------------------- | ||
|
||
// Beware of confusion! | ||
|
||
// When using RX and TX it is out of the perspective of the device (us), | ||
// so RX is the data received from the host (SPK) and TX is the data sent to the host (MIC). | ||
|
||
// But IN and OUT are the perspective of the host, | ||
// so OUT is the data received from the host (SPK) and IN is the data sent to the host (MIC). | ||
|
||
// Enable feedback EP | ||
#define CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP 1 | ||
|
||
|
@@ -33,29 +41,43 @@ extern "C" { | |
#define CFG_TUD_AUDIO_FUNC_1_N_FORMATS 1 | ||
|
||
#define CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE DEFAULT_SAMPLE_RATE | ||
#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX SPEAK_CHANNEL_NUM | ||
#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX MIC_CHANNEL_NUM | ||
#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX SPEAK_CHANNEL_NUM | ||
#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX MIC_CHANNEL_NUM | ||
|
||
// Sample type | ||
#if SPK_FORMAT_PCM | ||
// 16bit in 16bit slots | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX 2 | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_TX 16 | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX 2 | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX 16 | ||
#elif SPK_FORMAT_FLOAT | ||
// 32bit in 32bit slots | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX 4 | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX 32 | ||
#endif | ||
|
||
#if MIC_FORMAT_PCM | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Missing #else clause for MIC format configuration. If neither MIC_FORMAT_PCM nor MIC_FORMAT_FLOAT is defined, the TX sample configuration will be undefined, leading to compilation errors. Copilot uses AI. Check for mistakes. Positive FeedbackNegative Feedback |
||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX 2 | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_TX 16 | ||
#elif MIC_FORMAT_FLOAT | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX 4 | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_TX 32 | ||
#endif | ||
|
||
// EP and buffer size - for isochronous EP´s, the buffer and EP size are equal (different sizes would not make sense) | ||
#define CFG_TUD_AUDIO_ENABLE_EP_IN 1 | ||
|
||
// MIC | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_IN ((CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE / 1000 * CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX) + 4) | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_IN ((CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE / 1000 * CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX) + 4) | ||
|
||
#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_IN * (MIC_INTERVAL_MS + 1) | ||
#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_IN // Maximum EP IN size for all AS alternate settings used | ||
|
||
//------------ SPK (RX / OUT) -------------// | ||
|
||
// EP and buffer size - for isochronous EP´s, the buffer and EP size are equal (different sizes would not make sense) | ||
#define CFG_TUD_AUDIO_ENABLE_EP_OUT 1 | ||
|
||
// SPK +4 for audio feedback | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_OUT ((CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE / 1000 * CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX) + 4) | ||
// +4 for audio feedback | ||
#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_OUT ((CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE / 1000 * CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX) + 4) | ||
|
||
#define CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_OUT * (SPK_INTERVAL_MS + 1) | ||
#define CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_OUT // Maximum EP IN size for all AS alternate settings used | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -56,6 +56,18 @@ enum { | |
#define UAC2_ENTITY_MIC_FEATURE_TERMINAL 0x12 | ||
#define UAC2_ENTITY_MIC_OUTPUT_TERMINAL 0x13 | ||
|
||
#if SPK_FORMAT_PCM | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The macro SPK_FORMAT_PCM may be undefined when neither PCM nor FLOAT is selected, leading to undefined behavior. Consider adding an #else clause with a default format or an #error directive to catch invalid configurations. Copilot uses AI. Check for mistakes. Positive FeedbackNegative Feedback |
||
#define SPK_SAMPLE_FORMAT AUDIO_DATA_FORMAT_TYPE_I_PCM | ||
#elif SPK_FORMAT_FLOAT | ||
#define SPK_SAMPLE_FORMAT AUDIO_DATA_FORMAT_TYPE_I_IEEE_FLOAT | ||
#endif | ||
|
||
#if MIC_FORMAT_PCM | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The macro MIC_FORMAT_PCM may be undefined when neither PCM nor FLOAT is selected, leading to undefined behavior. Consider adding an #else clause with a default format or an #error directive to catch invalid configurations. Copilot uses AI. Check for mistakes. Positive FeedbackNegative Feedback |
||
#define MIC_SAMPLE_FORMAT AUDIO_DATA_FORMAT_TYPE_I_PCM | ||
#elif MIC_FORMAT_FLOAT | ||
#define MIC_SAMPLE_FORMAT AUDIO_DATA_FORMAT_TYPE_I_IEEE_FLOAT | ||
#endif | ||
|
||
#if SPEAK_CHANNEL_NUM && MIC_CHANNEL_NUM | ||
#define NUM_INTERFACES 3 | ||
#elif SPEAK_CHANNEL_NUM || MIC_CHANNEL_NUM | ||
|
@@ -175,7 +187,7 @@ enum { | |
/* Interface 1, Alternate 1 - alternate interface for data streaming */\ | ||
TUD_AUDIO_DESC_STD_AS_INT(/*_itfnum*/ _itfnum + 1, /*_altset*/ 0x01, /*_nEPs*/ 0x02, /*_stridx*/ _stridx + 1),\ | ||
/* Class-Specific AS Interface Descriptor(4.9.2) */\ | ||
TUD_AUDIO_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_ctrl*/ AUDIO_CTRL_NONE, /*_formattype*/ AUDIO_FORMAT_TYPE_I, /*_formats*/ AUDIO_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ SPEAK_CHANNEL_NUM, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\ | ||
TUD_AUDIO_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_ctrl*/ AUDIO_CTRL_NONE, /*_formattype*/ AUDIO_FORMAT_TYPE_I, /*_formats*/ SPK_SAMPLE_FORMAT, /*_nchannelsphysical*/ SPEAK_CHANNEL_NUM, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\ | ||
/* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\ | ||
TUD_AUDIO_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX),\ | ||
/* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\ | ||
|
@@ -191,7 +203,7 @@ enum { | |
/* Interface 2, Alternate 1 - alternate interface for data streaming */\ | ||
TUD_AUDIO_DESC_STD_AS_INT(/*_itfnum*/ _itfnum + 2, /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ _stridx + 2),\ | ||
/* Class-Specific AS Interface Descriptor(4.9.2) */\ | ||
TUD_AUDIO_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_MIC_OUTPUT_TERMINAL, /*_ctrl*/ AUDIO_CTRL_NONE, /*_formattype*/ AUDIO_FORMAT_TYPE_I, /*_formats*/ AUDIO_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ MIC_CHANNEL_NUM, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_FRONT_CENTER, /*_stridx*/ 0x00),\ | ||
TUD_AUDIO_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_MIC_OUTPUT_TERMINAL, /*_ctrl*/ AUDIO_CTRL_NONE, /*_formattype*/ AUDIO_FORMAT_TYPE_I, /*_formats*/ MIC_SAMPLE_FORMAT, /*_nchannelsphysical*/ MIC_CHANNEL_NUM, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_FRONT_CENTER, /*_stridx*/ 0x00),\ | ||
/* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\ | ||
TUD_AUDIO_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_TX),\ | ||
/* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\ | ||
|
@@ -226,7 +238,7 @@ enum { | |
/* Interface 1, Alternate 1 - alternate interface for data streaming */\ | ||
TUD_AUDIO_DESC_STD_AS_INT(/*_itfnum*/ _itfnum + 1, /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ _stridx + 1),\ | ||
/* Class-Specific AS Interface Descriptor(4.9.2) */\ | ||
TUD_AUDIO_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_MIC_OUTPUT_TERMINAL, /*_ctrl*/ AUDIO_CTRL_NONE, /*_formattype*/ AUDIO_FORMAT_TYPE_I, /*_formats*/ AUDIO_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ MIC_CHANNEL_NUM, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_FRONT_CENTER, /*_stridx*/ 0x00),\ | ||
TUD_AUDIO_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_MIC_OUTPUT_TERMINAL, /*_ctrl*/ AUDIO_CTRL_NONE, /*_formattype*/ AUDIO_FORMAT_TYPE_I, /*_formats*/ MIC_SAMPLE_FORMAT, /*_nchannelsphysical*/ MIC_CHANNEL_NUM, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_FRONT_CENTER, /*_stridx*/ 0x00),\ | ||
/* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\ | ||
TUD_AUDIO_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_TX),\ | ||
/* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\ | ||
|
@@ -261,7 +273,7 @@ enum { | |
/* Interface 1, Alternate 1 - alternate interface for data streaming */\ | ||
TUD_AUDIO_DESC_STD_AS_INT(/*_itfnum*/ _itfnum + 1, /*_altset*/ 0x01, /*_nEPs*/ 0x02, /*_stridx*/ _stridx + 1),\ | ||
/* Class-Specific AS Interface Descriptor(4.9.2) */\ | ||
TUD_AUDIO_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_ctrl*/ AUDIO_CTRL_NONE, /*_formattype*/ AUDIO_FORMAT_TYPE_I, /*_formats*/ AUDIO_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ SPEAK_CHANNEL_NUM, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\ | ||
TUD_AUDIO_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_ctrl*/ AUDIO_CTRL_NONE, /*_formattype*/ AUDIO_FORMAT_TYPE_I, /*_formats*/ SPK_SAMPLE_FORMAT, /*_nchannelsphysical*/ SPEAK_CHANNEL_NUM, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\ | ||
/* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\ | ||
TUD_AUDIO_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX),\ | ||
/* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\ | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing #else clause for SPK format configuration. If neither SPK_FORMAT_PCM nor SPK_FORMAT_FLOAT is defined, the RX sample configuration will be undefined, leading to compilation errors.
Copilot uses AI. Check for mistakes.