hathach 3 лет назад
Родитель
Сommit
e5113a1cfc
2 измененных файлов с 35 добавлено и 14 удалено
  1. 7 14
      src/class/audio/audio_device.c
  2. 28 0
      src/class/audio/audio_device.h

+ 7 - 14
src/class/audio/audio_device.c

@@ -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);

+ 28 - 0
src/class/audio/audio_device.h

@@ -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)