瀏覽代碼

fix for new furi HAL: https://github.com/xMasterX/all-the-plugins/commit/6001cfc47028750cb9866e04cc8c1635088f1227

LTVA1 2 年之前
父節點
當前提交
148bcdcbed
共有 5 個文件被更改,包括 55 次插入36 次删除
  1. 2 0
      .gitattributes
  2. 1 1
      application.fam
  3. 46 23
      flizzer_tracker_hal.c
  4. 0 6
      init_deinit.c
  5. 6 6
      tracker_engine/tracker_engine.c

+ 2 - 0
.gitattributes

@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto

+ 1 - 1
application.fam

@@ -12,5 +12,5 @@ App(
     fap_weburl="https://github.com/LTVA1/flizzer_tracker",
 	fap_icon="flizzer_tracker.png",
 	fap_icon_assets="images",
-    fap_category="Media",
+    fap_category="Media_Extra",
 )

+ 46 - 23
flizzer_tracker_hal.c

@@ -39,22 +39,6 @@ void tracker_engine_timer_isr(
 
 void sound_engine_PWM_timer_init(bool external_audio_output) // external audio on pin PA6
 {
-    LL_TIM_DisableAllOutputs(SPEAKER_PWM_TIMER);
-    LL_TIM_DisableCounter(SPEAKER_PWM_TIMER);
-
-    LL_TIM_InitTypeDef TIM_InitStruct = {0};
-    LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
-
-    TIM_InitStruct.Prescaler = 0;
-    TIM_InitStruct.Autoreload = 1023; // 10-bit PWM resolution at around 60 kHz PWM rate
-    TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
-    LL_TIM_Init(SPEAKER_PWM_TIMER, &TIM_InitStruct);
-
-    TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
-    TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE;
-    TIM_OC_InitStruct.CompareValue = 0;
-    LL_TIM_OC_Init(SPEAKER_PWM_TIMER, SPEAKER_PWM_TIMER_CHANNEL, &TIM_OC_InitStruct);
-
     if(external_audio_output) {
         furi_hal_gpio_init_ex(
             &gpio_ext_pa6, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedLow, GpioAltFn14TIM16);
@@ -66,17 +50,33 @@ void sound_engine_PWM_timer_init(bool external_audio_output) // external audio o
 
     else {
         if(!(furi_hal_speaker_is_mine())) {
-            bool unu = furi_hal_speaker_acquire(1000);
-            UNUSED(unu);
+            if(furi_hal_speaker_acquire(1000)) {
+                LL_TIM_DisableAllOutputs(SPEAKER_PWM_TIMER);
+                LL_TIM_DisableCounter(SPEAKER_PWM_TIMER);
+
+                LL_TIM_InitTypeDef TIM_InitStruct = {0};
+                LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
+
+                TIM_InitStruct.Prescaler = 0;
+                TIM_InitStruct.Autoreload =
+                    1023; // 10-bit PWM resolution at around 60 kHz PWM rate
+                TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
+                LL_TIM_Init(SPEAKER_PWM_TIMER, &TIM_InitStruct);
+
+                TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
+                TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE;
+                TIM_OC_InitStruct.CompareValue = 0;
+                LL_TIM_OC_Init(SPEAKER_PWM_TIMER, SPEAKER_PWM_TIMER_CHANNEL, &TIM_OC_InitStruct);
+
+                SPEAKER_PWM_TIMER->CNT = 0;
+
+                LL_TIM_EnableAllOutputs(SPEAKER_PWM_TIMER);
+                LL_TIM_EnableCounter(SPEAKER_PWM_TIMER);
+            }
         }
 
         furi_hal_gpio_init(&gpio_ext_pa6, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
     }
-
-    SPEAKER_PWM_TIMER->CNT = 0;
-
-    LL_TIM_EnableAllOutputs(SPEAKER_PWM_TIMER);
-    LL_TIM_EnableCounter(SPEAKER_PWM_TIMER);
 }
 
 void sound_engine_set_audio_output(bool external_audio_output) {
@@ -101,6 +101,10 @@ void sound_engine_set_audio_output(bool external_audio_output) {
 
 void sound_engine_timer_init(uint32_t sample_rate) // external audio on pin PA6
 {
+    if(!furi_hal_bus_is_enabled(FuriHalBusTIM1)) {
+        furi_hal_bus_enable(FuriHalBusTIM1);
+    }
+
     LL_TIM_InitTypeDef TIM_InitStruct = {0};
     LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
 
@@ -121,6 +125,10 @@ void sound_engine_timer_init(uint32_t sample_rate) // external audio on pin PA6
 
 void tracker_engine_timer_init(uint8_t rate) // 0-255 hz
 {
+    if(!furi_hal_bus_is_enabled(FuriHalBusTIM2)) {
+        furi_hal_bus_enable(FuriHalBusTIM2);
+    }
+
     LL_TIM_InitTypeDef TIM_InitStruct = {0};
     LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
 
@@ -140,6 +148,10 @@ void tracker_engine_timer_init(uint8_t rate) // 0-255 hz
 }
 
 void tracker_engine_set_rate(uint8_t rate) {
+    if(!furi_hal_bus_is_enabled(FuriHalBusTIM2)) {
+        furi_hal_bus_enable(FuriHalBusTIM2);
+    }
+
     LL_TIM_InitTypeDef TIM_InitStruct = {0};
 
     TIM_InitStruct.Prescaler = 0; // using 32-bit timer
@@ -212,6 +224,17 @@ void sound_engine_deinit_timer() {
     LL_TIM_DisableAllOutputs(SPEAKER_PWM_TIMER);
 
     LL_TIM_DisableCounter(SPEAKER_PWM_TIMER);
+
+    if(furi_hal_speaker_is_mine()) {
+        furi_hal_speaker_release();
+    }
+
+    if(furi_hal_bus_is_enabled(FuriHalBusTIM2)) {
+        furi_hal_bus_disable(FuriHalBusTIM2);
+    }
+    if(furi_hal_bus_is_enabled(FuriHalBusTIM1)) {
+        furi_hal_bus_disable(FuriHalBusTIM1);
+    }
 }
 
 void tracker_engine_start() {

+ 0 - 6
init_deinit.c

@@ -294,11 +294,5 @@ void deinit_tracker(FlizzerTrackerApp* tracker) {
 
     tracker_engine_deinit(&tracker->tracker_engine, false);
 
-    FURI_CRITICAL_ENTER();
-    LL_TIM_DeInit(TRACKER_ENGINE_TIMER);
-    LL_TIM_DeInit(SAMPLE_RATE_TIMER);
-    LL_TIM_DeInit(SPEAKER_PWM_TIMER);
-    FURI_CRITICAL_EXIT();
-
     free(tracker);
 }

+ 6 - 6
tracker_engine/tracker_engine.c

@@ -400,9 +400,9 @@ void tracker_engine_advance_channel(TrackerEngine* tracker_engine, uint8_t chan)
 
             else {
                 te_channel->vibrato_position += ((uint32_t)te_channel->vibrato_speed << 21);
-                vib =
-                    (int32_t)(sound_engine_triangle(te_channel->vibrato_position >> 9) - WAVE_AMP / 2) *
-                    (int32_t)te_channel->vibrato_depth / (256 * 128);
+                vib = (int32_t)(sound_engine_triangle(te_channel->vibrato_position >> 9) -
+                                WAVE_AMP / 2) *
+                      (int32_t)te_channel->vibrato_depth / (256 * 128);
             }
         }
 
@@ -437,9 +437,9 @@ void tracker_engine_advance_channel(TrackerEngine* tracker_engine, uint8_t chan)
             tracker_engine->sound_engine->channel[chan].pw = tracker_engine->channel[chan].pw;
         }
 
-        int32_t chn_note =
-            (int16_t)(te_channel->fixed_note != 0xffff ? te_channel->fixed_note : te_channel->note) +
-            vib + ((int16_t)te_channel->arpeggio_note << 8);
+        int32_t chn_note = (int16_t)(te_channel->fixed_note != 0xffff ? te_channel->fixed_note :
+                                                                        te_channel->note) +
+                           vib + ((int16_t)te_channel->arpeggio_note << 8);
 
         if(chn_note < 0) {
             chn_note = 0;