mirror of
https://github.com/hathach/tinyusb.git
synced 2025-03-25 23:38:06 +00:00
Add 24bit loopback in example.
This commit is contained in:
parent
204f3152cb
commit
5b7795be4b
@ -38,7 +38,7 @@
|
|||||||
const uint32_t sample_rates[] = {44100, 48000, 88200, 96000};
|
const uint32_t sample_rates[] = {44100, 48000, 88200, 96000};
|
||||||
uint32_t current_sample_rate = 44100;
|
uint32_t current_sample_rate = 44100;
|
||||||
|
|
||||||
#define N_SAMPLE_RATES (sizeof(sample_rates) / 4)
|
#define N_SAMPLE_RATES TU_ARRAY_SIZE(sample_rates)
|
||||||
|
|
||||||
/* Blink pattern
|
/* Blink pattern
|
||||||
* - 25 ms : streaming data
|
* - 25 ms : streaming data
|
||||||
@ -78,11 +78,16 @@ int8_t mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1]; // +1 for master chan
|
|||||||
int16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1]; // +1 for master channel 0
|
int16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1]; // +1 for master channel 0
|
||||||
|
|
||||||
// Buffer for microphone data
|
// Buffer for microphone data
|
||||||
int16_t mic_buf[1000];
|
uint8_t mic_buf[CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ];
|
||||||
// Buffer for speaker data
|
// Buffer for speaker data
|
||||||
int16_t spk_buf[1000];
|
uint8_t spk_buf[CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ];
|
||||||
// Speaker data size received in the last frame
|
// Speaker data size received in the last frame
|
||||||
int spk_data_size;
|
int spk_data_size;
|
||||||
|
// Resolution per format
|
||||||
|
const uint8_t resolutions_per_format[CFG_TUD_AUDIO_FUNC_1_N_FORMATS] = {CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX,
|
||||||
|
CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_RX};
|
||||||
|
// Current resolution, update on format change
|
||||||
|
uint8_t current_resolution;
|
||||||
|
|
||||||
void led_blinking_task(void);
|
void led_blinking_task(void);
|
||||||
void audio_task(void);
|
void audio_task(void);
|
||||||
@ -364,6 +369,13 @@ bool tud_audio_set_itf_cb(uint8_t rhport, tusb_control_request_t const * p_reque
|
|||||||
if (ITF_NUM_AUDIO_STREAMING_SPK == itf && alt != 0)
|
if (ITF_NUM_AUDIO_STREAMING_SPK == itf && alt != 0)
|
||||||
blink_interval_ms = BLINK_STREAMING;
|
blink_interval_ms = BLINK_STREAMING;
|
||||||
|
|
||||||
|
// Clear buffer when streaming format is changed
|
||||||
|
spk_data_size = 0;
|
||||||
|
if(alt != 0)
|
||||||
|
{
|
||||||
|
current_resolution = resolutions_per_format[alt-1];
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -397,20 +409,40 @@ void audio_task(void)
|
|||||||
{
|
{
|
||||||
// When new data arrived, copy data from speaker buffer, to microphone buffer
|
// When new data arrived, copy data from speaker buffer, to microphone buffer
|
||||||
// and send it over
|
// and send it over
|
||||||
|
// Only support speaker & headphone both have the same resolution
|
||||||
|
// If one is 16bit another is 24bit be care of LOUD noise !
|
||||||
if (spk_data_size)
|
if (spk_data_size)
|
||||||
{
|
{
|
||||||
int16_t *src = spk_buf;
|
if (current_resolution == 16)
|
||||||
int16_t *limit = spk_buf + spk_data_size / 2;
|
|
||||||
int16_t *dst = mic_buf;
|
|
||||||
while (src < limit)
|
|
||||||
{
|
{
|
||||||
// Combine two channels into one
|
int16_t *src = (int16_t*)spk_buf;
|
||||||
int32_t left = *src++;
|
int16_t *limit = (int16_t*)spk_buf + spk_data_size / 2;
|
||||||
int32_t right = *src++;
|
int16_t *dst = (int16_t*)mic_buf;
|
||||||
*dst++ = (int16_t)((left + right) / 2);
|
while (src < limit)
|
||||||
|
{
|
||||||
|
// Combine two channels into one
|
||||||
|
int32_t left = *src++;
|
||||||
|
int32_t right = *src++;
|
||||||
|
*dst++ = (int16_t)((left + right) / 2);
|
||||||
|
}
|
||||||
|
tud_audio_write((uint8_t *)mic_buf, spk_data_size / 2);
|
||||||
|
spk_data_size = 0;
|
||||||
|
}
|
||||||
|
else if (current_resolution == 24)
|
||||||
|
{
|
||||||
|
int32_t *src = (int32_t*)spk_buf;
|
||||||
|
int32_t *limit = (int32_t*)spk_buf + spk_data_size / 4;
|
||||||
|
int32_t *dst = (int32_t*)mic_buf;
|
||||||
|
while (src < limit)
|
||||||
|
{
|
||||||
|
// Combine two channels into one
|
||||||
|
int32_t left = (*src++);
|
||||||
|
int32_t right = (*src++);
|
||||||
|
*dst++ = (int32_t)((left + right) / 2) & 0xffffff00;
|
||||||
|
}
|
||||||
|
tud_audio_write((uint8_t *)mic_buf, spk_data_size / 2);
|
||||||
|
spk_data_size = 0;
|
||||||
}
|
}
|
||||||
tud_audio_write((uint8_t *)mic_buf, spk_data_size / 2);
|
|
||||||
spk_data_size = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,6 +96,9 @@ extern "C" {
|
|||||||
|
|
||||||
#define CFG_TUD_AUDIO_FUNC_1_DESC_LEN TUD_AUDIO_HEADSET_STEREO_DESC_LEN
|
#define CFG_TUD_AUDIO_FUNC_1_DESC_LEN TUD_AUDIO_HEADSET_STEREO_DESC_LEN
|
||||||
|
|
||||||
|
// How many formats are used, need to adjust USB descriptor if changed
|
||||||
|
#define CFG_TUD_AUDIO_FUNC_1_N_FORMATS 2
|
||||||
|
|
||||||
// Audio format type I specifications
|
// Audio format type I specifications
|
||||||
#define CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE 96000 // 24bit/96kHz is the best quality for full-speed, high-speed is needed beyond this
|
#define CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE 96000 // 24bit/96kHz is the best quality for full-speed, high-speed is needed beyond this
|
||||||
#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX 1
|
#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX 1
|
||||||
|
@ -55,23 +55,29 @@ enum
|
|||||||
+ TUD_AUDIO_DESC_OUTPUT_TERM_LEN\
|
+ TUD_AUDIO_DESC_OUTPUT_TERM_LEN\
|
||||||
+ TUD_AUDIO_DESC_INPUT_TERM_LEN\
|
+ TUD_AUDIO_DESC_INPUT_TERM_LEN\
|
||||||
+ TUD_AUDIO_DESC_OUTPUT_TERM_LEN\
|
+ TUD_AUDIO_DESC_OUTPUT_TERM_LEN\
|
||||||
|
/* Interface 1, Alternate 0 */\
|
||||||
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
||||||
|
/* Interface 1, Alternate 0 */\
|
||||||
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
||||||
+ TUD_AUDIO_DESC_CS_AS_INT_LEN\
|
+ TUD_AUDIO_DESC_CS_AS_INT_LEN\
|
||||||
+ TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN\
|
+ TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN\
|
||||||
+ TUD_AUDIO_DESC_STD_AS_ISO_EP_LEN\
|
+ TUD_AUDIO_DESC_STD_AS_ISO_EP_LEN\
|
||||||
+ TUD_AUDIO_DESC_CS_AS_ISO_EP_LEN\
|
+ TUD_AUDIO_DESC_CS_AS_ISO_EP_LEN\
|
||||||
|
/* Interface 1, Alternate 2 */\
|
||||||
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
||||||
+ TUD_AUDIO_DESC_CS_AS_INT_LEN\
|
+ TUD_AUDIO_DESC_CS_AS_INT_LEN\
|
||||||
+ TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN\
|
+ TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN\
|
||||||
+ TUD_AUDIO_DESC_STD_AS_ISO_EP_LEN\
|
+ TUD_AUDIO_DESC_STD_AS_ISO_EP_LEN\
|
||||||
+ TUD_AUDIO_DESC_CS_AS_ISO_EP_LEN\
|
+ TUD_AUDIO_DESC_CS_AS_ISO_EP_LEN\
|
||||||
|
/* Interface 2, Alternate 0 */\
|
||||||
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
||||||
|
/* Interface 2, Alternate 1 */\
|
||||||
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
||||||
+ TUD_AUDIO_DESC_CS_AS_INT_LEN\
|
+ TUD_AUDIO_DESC_CS_AS_INT_LEN\
|
||||||
+ TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN\
|
+ TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN\
|
||||||
+ TUD_AUDIO_DESC_STD_AS_ISO_EP_LEN\
|
+ TUD_AUDIO_DESC_STD_AS_ISO_EP_LEN\
|
||||||
+ TUD_AUDIO_DESC_CS_AS_ISO_EP_LEN\
|
+ TUD_AUDIO_DESC_CS_AS_ISO_EP_LEN\
|
||||||
|
/* Interface 2, Alternate 2 */\
|
||||||
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
+ TUD_AUDIO_DESC_STD_AS_INT_LEN\
|
||||||
+ TUD_AUDIO_DESC_CS_AS_INT_LEN\
|
+ TUD_AUDIO_DESC_CS_AS_INT_LEN\
|
||||||
+ TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN\
|
+ TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN\
|
||||||
|
Loading…
x
Reference in New Issue
Block a user