Kaynağa Gözat

more audio tests

Sanjay Govind 10 ay önce
ebeveyn
işleme
e8b451e80c
3 değiştirilmiş dosya ile 17 ekleme ve 13 silme
  1. 0 3
      helpers/pof_usb_xbox360.c
  2. 12 9
      virtual_portal.c
  3. 5 1
      virtual_portal.h

+ 0 - 3
helpers/pof_usb_xbox360.c

@@ -19,9 +19,6 @@
 
 #define POF_USB_ACTUAL_OUTPUT_SIZE 0x20
 
-#define TIMEOUT_NORMAL 32
-#define TIMEOUT_AFTER_RESPONSE 100
-
 static const struct usb_string_descriptor dev_manuf_desc =
     USB_ARRAY_DESC(0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x00);
 static const struct usb_string_descriptor dev_product_desc =

+ 12 - 9
virtual_portal.c

@@ -1,9 +1,10 @@
 #include "virtual_portal.h"
-#include "wav_player_hal.h"
-#include "string.h"
 
-#include <stm32wbxx_ll_dma.h>
 #include <furi_hal.h>
+#include <stm32wbxx_ll_dma.h>
+
+#include "string.h"
+#include "wav_player_hal.h"
 
 #define TAG "VirtualPortal"
 
@@ -34,7 +35,7 @@ static float lerp(float start, float end, float t) {
 static void wav_player_dma_isr(void* ctx) {
     VirtualPortal* virtual_portal = (VirtualPortal*)ctx;
     // half of transfer
-    if(LL_DMA_IsActiveFlag_HT1(DMA1)) {
+    if (LL_DMA_IsActiveFlag_HT1(DMA1)) {
         LL_DMA_ClearFlag_HT1(DMA1);
         if (!virtual_portal->playing_audio) {
             return;
@@ -55,7 +56,7 @@ static void wav_player_dma_isr(void* ctx) {
     }
 
     // transfer complete
-    if(LL_DMA_IsActiveFlag_TC1(DMA1)) {
+    if (LL_DMA_IsActiveFlag_TC1(DMA1)) {
         LL_DMA_ClearFlag_TC1(DMA1);
 
         if (!virtual_portal->playing_audio) {
@@ -218,7 +219,7 @@ VirtualPortal* virtual_portal_alloc(NotificationApp* notifications) {
     virtual_portal->end = &virtual_portal->current_audio_buffer[SAMPLES_COUNT_BUFFERED];
 
     furi_timer_start(virtual_portal->led_timer, 10);
-    if(furi_hal_speaker_acquire(1000)) {
+    if (furi_hal_speaker_acquire(1000)) {
         virtual_portal->got_speaker = true;
         wav_player_speaker_init(8000);
         wav_player_dma_init((uint32_t)virtual_portal->audio_buffer, SAMPLES_COUNT);
@@ -547,9 +548,11 @@ void virtual_portal_process_audio(
     uint8_t len) {
     for (size_t i = 0; i < len; i += 2) {
         int16_t int_16 =
-            (((int16_t)message[i + 1]) + ((int16_t)message[i] << 8));
+            (((int16_t)message[i] << 8) + ((int16_t)message[i + 1]));
 
-        float data = (((float)int_16 / INT16_MAX) * 2) - 1;
+        float data = ((float)int_16 / 256.0 + 127.0);
+        data -= UINT8_MAX / 2;  // to signed
+        data /= UINT8_MAX / 2;  // scale -1..1
 
         data *= virtual_portal->volume;  // volume
         data = tanhf(data);   // hyperbolic tangent limiter
@@ -566,7 +569,7 @@ void virtual_portal_process_audio(
         }
         *virtual_portal->head = data;
         virtual_portal->count++;
-        if (++virtual_portal->head == virtual_portal->current_audio_buffer + sizeof(virtual_portal->current_audio_buffer)) {
+        if (++virtual_portal->head == virtual_portal->end) {
             virtual_portal->head = virtual_portal->current_audio_buffer;
         }
     }

+ 5 - 1
virtual_portal.h

@@ -5,6 +5,7 @@
 
 #include "pof_token.h"
 
+#define SAMPLE_RATE 8000
 #define POF_TOKEN_LIMIT 16
 #define SAMPLES_COUNT 1024
 #define SAMPLES_COUNT_BUFFERED SAMPLES_COUNT * 4
@@ -22,6 +23,8 @@ typedef enum {
     EventTxComplete = (1 << 4),
     EventResetSio = (1 << 5),
     EventTxImmediate = (1 << 6),
+    WavPlayerEventHalfTransfer = (1 << 2),
+    WavPlayerEventFullTransfer = (1 << 3),
 
     EventAll = EventExit | EventReset | EventRx | EventTx | EventTxComplete | EventResetSio |
                EventTxImmediate,
@@ -64,6 +67,7 @@ typedef struct {
     VirtualPortalLed right;
     VirtualPortalLed trap;
     FuriTimer* led_timer;
+    FuriThread* thread;
 } VirtualPortal;
 
 VirtualPortal* virtual_portal_alloc(NotificationApp* notifications);
@@ -78,6 +82,6 @@ int virtual_portal_process_message(
     uint8_t* message,
     uint8_t* response);
 void virtual_portal_process_audio(VirtualPortal* virtual_portal,
-    uint8_t* message, uint8_t len);
+                                  uint8_t* message, uint8_t len);
 
 int virtual_portal_send_status(VirtualPortal* virtual_portal, uint8_t* response);