mirror of
https://github.com/hathach/tinyusb.git
synced 2025-03-19 19:21:05 +00:00
prototype for feedback method
This commit is contained in:
parent
5766c9ac4e
commit
e5113a1cfc
@ -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);
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user