소스 검색

Full 2 way calling

Joey 1 개월 전
부모
커밋
271db5e7f4
2개의 변경된 파일636개의 추가작업 그리고 1158개의 파일을 삭제
  1. 223 6
      main/sip/sip.c
  2. 413 1152
      sdkconfig

+ 223 - 6
main/sip/sip.c

@@ -1,7 +1,5 @@
 // in Asterisk pjsip.conf, under 1001, set direct_media=no
 
-// v1.10 update notes: changed audio to be processed in 16 bits, fixing distortion issues
-// commented out some ESP_LOGI(), reducing serial monitor lag
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -23,13 +21,13 @@
 
 #include "bsp_board.h"
 
-#define ESP32_IP "192.168.68.68"
+#define ESP32_IP "192.168.68.122"
 #define RTP_PORT 4000
 
 #define WIFI_SSID "TOCHTECH"
 #define WIFI_PASS "Smarturns2017"
 
-#define ASTERISK_IP "192.168.68.70"
+#define ASTERISK_IP "192.168.68.121"
 #define SIP_PORT 5060
 #define SIP_LOCAL_IP "0.0.0.0"
 #define SIP_LOCAL_PORT 5062
@@ -47,6 +45,9 @@ static int32_t mic_buffer[320];
 static int16_t mic_pcm16[MIC_FRAME_SAMPLES];
 static uint8_t payload[MIC_FRAME_SAMPLES];
 
+static uint8_t rx_packet[172];
+static int16_t speaker_pcm[160];
+
 static const char *TAG = "SIP";
 volatile bool wifi_ready = false;
 static int s_rtp_sock = -1;
@@ -60,7 +61,12 @@ esp_err_t esp_get_feed_data(
     int16_t *buffer,
     int buffer_len);
 
+    esp_err_t esp_audio_play(const int16_t *data,
+                         int length,
+                         uint32_t ticks_to_wait);
+
 static void rtp_tx_task(void *pvParameters);
+static void rtp_rx_task(void *pvParameters);
 
 /* ================= WIFI ================= */
 
@@ -373,7 +379,18 @@ static uint8_t linear2ulaw(int16_t pcm)
     return uval ^ mask;
 }
 
+static int16_t ulaw2linear(uint8_t u_val)
+{
+    u_val = ~u_val;
 
+    int t = ((u_val & 0x0F) << 3) + 0x84;
+    t <<= ((unsigned)u_val & 0x70) >> 4;
+
+    if (u_val & 0x80)
+        return 0x84 - t;
+    else
+        return t - 0x84;
+}
 
 static void sip_send_rtp_packet(void)
 {
@@ -620,6 +637,180 @@ while(call_active)
     vTaskDelete(NULL);
 }
 
+
+
+
+
+
+
+
+/*static void rtp_rx_task(void *pvParameters)
+{
+    ESP_LOGI(TAG, "RTP RX started");
+
+
+    // TEMP: create RTP socket for RX-only testing
+    if (s_rtp_sock < 0)
+    {
+        s_rtp_sock = socket(AF_INET,
+                            SOCK_DGRAM,
+                            IPPROTO_UDP);
+
+        if (s_rtp_sock < 0)
+        {
+            ESP_LOGE(TAG,
+                     "RTP socket failed errno=%d",
+                     errno);
+            vTaskDelete(NULL);
+            return;
+        }
+
+
+        struct sockaddr_in local_rtp = {0};
+
+        local_rtp.sin_family = AF_INET;
+        local_rtp.sin_port = htons(RTP_PORT);
+        local_rtp.sin_addr.s_addr = INADDR_ANY;
+
+
+        if (bind(s_rtp_sock,
+                 (struct sockaddr *)&local_rtp,
+                 sizeof(local_rtp)) < 0)
+        {
+            ESP_LOGE(TAG,
+                     "RTP bind failed errno=%d",
+                     errno);
+
+            close(s_rtp_sock);
+            s_rtp_sock = -1;
+
+            vTaskDelete(NULL);
+            return;
+        }
+
+
+        ESP_LOGI(TAG,
+                 "RTP RX listening on port %d",
+                 RTP_PORT);
+    }
+
+
+    while (call_active)
+    {
+        struct sockaddr_in src;
+        socklen_t len = sizeof(src);
+
+        int n = recvfrom(
+            s_rtp_sock,
+            rx_packet,
+            sizeof(rx_packet),
+            0,
+            (struct sockaddr *)&src,
+            &len);*/
+
+
+
+
+//comment this block out for testing rx only
+static void rtp_rx_task(void *pvParameters)
+{
+    ESP_LOGI(TAG, "RTP RX started");
+
+    while (call_active)
+{
+    struct sockaddr_in src;
+    socklen_t len = sizeof(src);
+
+    int n = recvfrom(
+        s_rtp_sock,
+        rx_packet,
+        sizeof(rx_packet),
+        0,
+        (struct sockaddr *)&src,
+        &len);//
+
+ if (n < 0)
+{
+    ESP_LOGE(TAG, "recvfrom failed errno=%d", errno);
+    continue;
+}
+
+ESP_LOGI(TAG, "Received RTP packet (%d bytes)", n);
+
+if (n <= 12)
+{
+    ESP_LOGW(TAG, "Packet too small");
+    continue;
+}
+
+ESP_LOGI(TAG,
+         "RTP Header: %02X %02X %02X %02X",
+         rx_packet[0],
+         rx_packet[1],
+         rx_packet[2],
+         rx_packet[3]);
+
+         ESP_LOGI(TAG,
+         "RTP Payload: %02X %02X %02X %02X %02X %02X %02X %02X",
+         rx_packet[12],
+         rx_packet[13],
+         rx_packet[14],
+         rx_packet[15],
+         rx_packet[16],
+         rx_packet[17],
+         rx_packet[18],
+         rx_packet[19]);
+
+
+int payload_size = n - 12;
+
+if (payload_size > SAMPLES_PER_PACKET)
+{
+    payload_size = SAMPLES_PER_PACKET;
+}
+
+
+int16_t play_buf[640];
+
+for (int i = 0; i < payload_size; i++)
+{
+    int16_t s1 = ulaw2linear(rx_packet[12+i]);
+
+    int16_t s2 = s1;
+
+    if (i < payload_size - 1)
+    {
+        int16_t next = ulaw2linear(rx_packet[12+i+1]);
+        s2 = (s1 + next) / 2;
+    }
+
+    // sample 1
+    play_buf[4*i + 0] = s1; // Left
+    play_buf[4*i + 1] = s1; // Right
+
+    // interpolated sample
+    play_buf[4*i + 2] = s2; // Left
+    play_buf[4*i + 3] = s2; // Right
+}
+
+esp_err_t ret = esp_audio_play(
+    play_buf,
+    payload_size * 4 * sizeof(int16_t),
+    portMAX_DELAY);
+
+
+ESP_LOGI(TAG,
+         "esp_audio_play() = %s",
+         esp_err_to_name(ret));
+
+            ESP_LOGI(TAG, "esp_audio_play() returned %s",
+             esp_err_to_name(ret));
+}
+
+    ESP_LOGI(TAG, "RTP RX stopped");
+    vTaskDelete(NULL);
+}
+
 /* ================= SIP TASK ================= */
 
 void sip_register_task(void *pvParameters)
@@ -991,6 +1182,22 @@ ESP_LOGI(TAG, "200 OK sent");
 {
     ESP_LOGI(TAG, "Received ACK");
 
+
+
+
+uint8_t test_values[] = {0xFF, 0x7F, 0x00, 0x80};
+
+for(int i = 0; i < 4; i++)
+{
+    ESP_LOGI(TAG,
+             "ulaw %02X -> %d",
+             test_values[i],
+             ulaw2linear(test_values[i]));
+}
+
+
+
+
    if (!call_active)
 {
     call_active = true;
@@ -1003,7 +1210,15 @@ ESP_LOGI(TAG, "200 OK sent");
         5,
         NULL);
 
-    ESP_LOGI(TAG, "rtp task create result=%d", ret);
+        xTaskCreate(
+    rtp_rx_task,
+    "rtp_rx",
+    16384,
+    NULL,
+    5,
+    NULL);
+//temp comment out
+    //ESP_LOGI(TAG, "rtp task create result=%d", ret);
 }
 
     
@@ -1027,4 +1242,6 @@ ESP_LOGI(TAG, "200 OK sent");
 
     close(sock);
     vTaskDelete(NULL);
-}
+}
+
+

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 413 - 1152
sdkconfig