Sanjay Govind 10 месяцев назад
Родитель
Сommit
a09ee22e62
2 измененных файлов с 33 добавлено и 1 удалено
  1. 1 1
      helpers/pof_usb_xbox360.c
  2. 32 0
      virtual_portal.c

+ 1 - 1
helpers/pof_usb_xbox360.c

@@ -84,7 +84,7 @@ static int32_t pof_thread_worker(void* context) {
                 }
                 FURI_LOG_RAW_I("\r\n");
                 */
-                virtual_portal_process_audio(virtual_portal, buf + 2, len_data - 2);
+                virtual_portal_process_audio_360(virtual_portal, buf + 2, len_data - 2);
             }
 
             // Check next status time since the timeout based one might be starved by incoming packets.

+ 32 - 0
virtual_portal.c

@@ -568,6 +568,38 @@ void virtual_portal_process_audio(
     }
 }
 
+void virtual_portal_process_audio_360(
+    VirtualPortal* virtual_portal,
+    uint8_t* message,
+    uint8_t len) {
+    for (size_t i = 0; i < len; i += 2) {
+        int16_t int_16 =
+            (((int16_t)message[i + 1] << 8) + ((int16_t)message[i]));
+
+        float data = ((float)int_16 / 256.0);
+        data /= UINT8_MAX / 2;  // scale -1..1
+
+        data *= virtual_portal->volume;  // volume
+        data = tanhf(data);              // hyperbolic tangent limiter
+
+        data *= UINT8_MAX / 2;  // scale -128..127
+        data += UINT8_MAX / 2;  // to unsigned
+
+        if (data < 0) {
+            data = 0;
+        }
+
+        if (data > 255) {
+            data = 255;
+        }
+        *virtual_portal->head = data;
+        virtual_portal->count++;
+        if (++virtual_portal->head == virtual_portal->end) {
+            virtual_portal->head = virtual_portal->current_audio_buffer;
+        }
+    }
+}
+
 // 32 byte message, 32 byte response;
 int virtual_portal_process_message(
     VirtualPortal* virtual_portal,