prototype for feedback method

This commit is contained in:
hathach 2022-05-19 16:05:55 +07:00
parent 5766c9ac4e
commit e5113a1cfc
2 changed files with 35 additions and 14 deletions

View File

@ -261,13 +261,6 @@ osal_mutex_def_t rx_supp_ff_mutex_rd_3[CFG_TUD_AUDIO_FUNC_3_N_RX_SUPP_SW_FIFO];
#endif
#endif
enum {
FEEDBACK_COMPUTE_DISABLED,
FEEDBACK_COMPUTE_FLOAT,
FEEDBACK_COMPUTE_FIXED,
FEEDBACK_COMPUTE_POWER_OF_2,
};
typedef struct
{
uint8_t rhport;
@ -1722,10 +1715,10 @@ static bool audiod_set_interface(uint8_t rhport, tusb_control_request_t const *
if ( sample_freq == 0 || mclk_freq == 0 )
{
audio->fb_compute_method = FEEDBACK_COMPUTE_DISABLED;
audio->fb_compute_method = AUDIO_FEEDBACK_METHOD_DISABLED;
}else
{
audio->fb_compute_method = fixed_point ? FEEDBACK_COMPUTE_FIXED : FEEDBACK_COMPUTE_FLOAT;
audio->fb_compute_method = fixed_point ? AUDIO_FEEDBACK_METHOD_FREQUENCY_FIXED : AUDIO_FEEDBACK_METHOD_FREQUENCY_FLOAT;
set_fb_params(audio, sample_freq, mclk_freq);
}
}
@ -2066,9 +2059,9 @@ static bool set_fb_params(audiod_function_t* audio, uint32_t sample_freq, uint32
// Check if parameters really allow for a power of two division
if ((mclk_freq % sample_freq) == 0 && tu_is_power_of_two(mclk_freq / sample_freq))
{
audio->fb_compute_method = FEEDBACK_COMPUTE_POWER_OF_2;
audio->fb_compute_method = AUDIO_FEEDBACK_METHOD_FREQUENCY_POWER_OF_2;
audio->fb_power_of_two_val = 16 - audio->fb_n_frames_shift - tu_log2(mclk_freq / sample_freq);
}else if ( audio->fb_compute_method == FEEDBACK_COMPUTE_FLOAT)
}else if ( audio->fb_compute_method == AUDIO_FEEDBACK_METHOD_FREQUENCY_FLOAT)
{
audio->fb_float_val = (float)sample_freq / mclk_freq * (1UL << (16 - audio->fb_n_frames_shift));
}else
@ -2092,15 +2085,15 @@ uint32_t tud_audio_feedback_update(uint8_t func_id, uint32_t cycles)
switch (audio->fb_compute_method)
{
case FEEDBACK_COMPUTE_POWER_OF_2:
case AUDIO_FEEDBACK_METHOD_FREQUENCY_POWER_OF_2:
feedback = (cycles << audio->fb_power_of_two_val);
break;
case FEEDBACK_COMPUTE_FLOAT:
case AUDIO_FEEDBACK_METHOD_FREQUENCY_FLOAT:
feedback = (uint32_t) ((float) cylces * audio->fb_float_val);
break;
case FEEDBACK_COMPUTE_FIXED:
case AUDIO_FEEDBACK_METHOD_FREQUENCY_FIXED:
{
uint64_t fb64 = (((uint64_t) cycles) * audio->fb_sample_freq) << (16 - audio->fb_n_frames_shift);
feedback = (uint32_t) (fb64 / audio->fb_mclk_freq);

View File

@ -498,6 +498,34 @@ static inline uint8_t tud_audio_get_fb_n_frames();
// return feedback value in 16.16 for reference (0 for error)
uint32_t tud_audio_feedback_update(uint8_t func_id, uint32_t cycles);
enum {
AUDIO_FEEDBACK_METHOD_DISABLED,
AUDIO_FEEDBACK_METHOD_FREQUENCY_FIXED,
AUDIO_FEEDBACK_METHOD_FREQUENCY_FLOAT,
AUDIO_FEEDBACK_METHOD_FREQUENCY_POWER_OF_2,
AUDIO_FEEDBACK_METHOD_FIFO_COUNT_FIXED,
AUDIO_FEEDBACK_METHOD_FIFO_COUNT_FLOAT
};
typedef struct {
uint8_t method;
union {
struct {
uint32_t sample_freq;
uint32_t mclk_freq;
}frequency;
struct {
uint32_t nominal;
uint32_t threshold;
// variation etc ..
}fifo_count;
};
}audio_feedback_params_t;
// TU_ATTR_WEAK void tud_audio_feedback_params_cb(uint8_t func_id, uint8_t alt_itf, audio_feedback_params_t* feedback_param);
// mclk_freq : Main clock frequency in Hz i.e. master clock to which sample clock is locked
// sample_freq : sample frequency in Hz
// fixed_point : 0 float (default), 1 fixed point (for mcu without FPU)