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