Răsfoiți Sursa

fix:airtalk各种死机问题

alienwalker 6 luni în urmă
părinte
comite
c19c21c8b1

+ 2 - 1
components/airtalk/binding/luat_lib_airtalk.c

@@ -87,7 +87,6 @@ static int l_airtalk_config(lua_State *L)
 		luat_airtalk_net_set_mqtt_ctrl(mqtt_ctrl);
 		luat_airtalk_speech_audio_param_config(0, audio_pm_mode_when_stop);
 		luat_airtalk_speech_set_one_block_frame_cnt(decode_cnt, encode_cnt);
-		luat_airtalk_net_mqtt_init();
 		break;
 	default:
 		LLOGE("protocol %d no support!", airtalk_protocol);
@@ -206,11 +205,13 @@ static int l_airtalk_speech(lua_State *L)
 		{
 		case LUAT_AIRTALK_SPEECH_MODE_PERSON:
 			luat_airtalk_use_16k(sample == 16000);
+			//luat_airtalk_speech_start_play(sample == 16000);
 			luat_airtalk_net_transfer_start(mode);
 			luat_airtalk_speech_record_switch(1);
 			break;
 		case LUAT_AIRTALK_SPEECH_MODE_GROUP:
 			luat_airtalk_use_16k(sample == 16000);
+			//luat_airtalk_speech_start_play(sample == 16000);
 			luat_airtalk_net_transfer_start(mode);
 			break;
 		}

+ 3 - 1
components/airtalk/core/airtalk_mqtt.c

@@ -69,7 +69,9 @@ static int airtalk_mqtt_cb(luat_mqtt_ctrl_t *mqtt_ctrl, uint16_t event)
 				else
 				{
 					memcpy(prv_mqtt.net_data_cache[prv_mqtt.cache_cnt].save_data, ptr, len);
-					luat_rtos_event_send(prv_mqtt.net_ctrl->task_handle, NULL, AIRTALK_EVENT_NETWORK_DOWNLINK_DATA, (uint32_t)prv_mqtt.net_data_cache[prv_mqtt.cache_cnt].save_data, len, prv_mqtt.cache_cnt);
+					prv_mqtt.net_data_cache[prv_mqtt.cache_cnt].in_use = 1;
+					luat_rtos_event_send(prv_mqtt.net_ctrl->task_handle, AIRTALK_EVENT_NETWORK_DOWNLINK_DATA, (uint32_t)prv_mqtt.net_data_cache[prv_mqtt.cache_cnt].save_data, len, prv_mqtt.cache_cnt, 0);
+					prv_mqtt.cache_cnt = (prv_mqtt.cache_cnt + 1) & (DOWNLOAD_CACHE_MAX - 1);
 					return 1;
 				}
 

+ 37 - 63
components/airtalk/core/airtalk_network.c

@@ -21,9 +21,9 @@ typedef struct
 	{
 		struct
 		{
-			uint32_t amr_data_len:16;
-			uint32_t encode_type:4;
 			uint32_t unused:12;
+			uint32_t encode_type:4;
+			uint32_t amr_data_len:16;
 		};
 		uint32_t fin_param;
 	};
@@ -91,14 +91,24 @@ static void airtalk_network_task(void *param)
 		prv_network.download_cache_time = 500;
 	}
 	prv_network.record_cache_locker = luat_mutex_create();
+	luat_mutex_unlock(prv_network.record_cache_locker);
 	while(1){
 		luat_rtos_event_recv(prv_network.task_handle, 0, &event, NULL, LUAT_WAIT_FOREVER);
 		switch(event.id)
 		{
 		case AIRTALK_EVENT_NETWORK_DOWNLINK_DATA:
+			if (!prv_network.is_ready)
+			{
+				goto RX_DATA_DONE;
+			}
 			p = (uint8_t *)event.param1;
 			ret = luat_unpack_rtp_head(p, event.param2, remote_rtp_head, &remote_rtp_extern_data);
 			if (ret <= 0)
+			{
+				LUAT_DEBUG_PRINT("rtp head error! %d", ret);
+				goto RX_DATA_DONE;
+			}
+			if (prv_network.local_ssrc == remote_rtp_head->ssrc)
 			{
 				goto RX_DATA_DONE;
 			}
@@ -107,6 +117,7 @@ static void airtalk_network_task(void *param)
 			ret = luat_unpack_rtp_extern_head(p, event.param2, remote_rtp_extern, &remote_rtp_extern_data);
 			if (ret <= 0)
 			{
+				LUAT_DEBUG_PRINT("rtp ext head error!, %d", ret);
 				goto RX_DATA_DONE;
 			}
 			if (remote_rtp_extern->profile_id != 1)
@@ -146,14 +157,17 @@ static void airtalk_network_task(void *param)
 			if (!prv_network.remote_ssrc_exsit)
 			{
 				prv_network.data_sync_ok = 0;
-				net_cache = luat_heap_malloc(sizeof(net_data_struct) + event.param3);
+				net_cache = luat_heap_malloc(sizeof(net_data_struct) + extern_data.amr_data_len);
 				net_cache->total_len = extern_data.amr_data_len;
 				net_cache->remote_tamp = tamp;
 				net_cache->local_tamp = luat_mcu_tick64_ms();
 				memcpy(net_cache->amr_save_data, p, net_cache->total_len);
 				llist_add_tail(&net_cache->node, &prv_network.download_cache_head);
 				prv_network.remote_ssrc = remote_rtp_head->ssrc;
-				LUAT_DEBUG_PRINT("sync start remote %llu %llu", net_cache->remote_tamp, net_cache->local_tamp);
+				prv_network.remote_ssrc_exsit = 1;
+				LUAT_DEBUG_PRINT("sync start remote %llu %llu %x", net_cache->remote_tamp, net_cache->local_tamp, prv_network.remote_ssrc);
+				luat_start_rtos_timer(prv_network.download_check_timer, 3000, 0);
+				goto RX_DATA_DONE;
 			}
 			else
 			{
@@ -169,7 +183,7 @@ static void airtalk_network_task(void *param)
 			}
 			else
 			{
-				net_cache = luat_heap_malloc(sizeof(net_data_struct) + event.param3);
+				net_cache = luat_heap_malloc(sizeof(net_data_struct) + extern_data.amr_data_len);
 				net_cache->total_len = extern_data.amr_data_len;
 				net_cache->remote_tamp = tamp;
 				net_cache->local_tamp = luat_mcu_tick64_ms();
@@ -205,7 +219,6 @@ static void airtalk_network_task(void *param)
 					}
 				}
 			}
-			luat_airtalk_speech_start_play(prv_network.is_16k);
 			luat_start_rtos_timer(prv_network.download_check_timer, 3000, 0);
 RX_DATA_DONE:
 			prv_network.recv_function((uint8_t *)event.param1, event.param3);
@@ -213,9 +226,8 @@ RX_DATA_DONE:
 		case AIRTALK_EVENT_NETWORK_UPLINK_DATA:
 			if (prv_network.is_ready)
 			{
-TX_DATA_START:
 				record_cache = NULL;
-				luat_rtos_mutex_lock(prv_network.record_cache_locker, LUAT_WAIT_FOREVER);
+				luat_mutex_lock(prv_network.record_cache_locker);
 				if(!llist_empty(&prv_network.upload_cache_head))
 				{
 					record_cache = (record_data_struct *)prv_network.upload_cache_head.next;
@@ -231,7 +243,7 @@ TX_DATA_START:
 
 					llist_add_tail(&record_cache->node, &prv_network.free_cache_head);
 				}
-				luat_rtos_mutex_unlock(prv_network.record_cache_locker);
+				luat_mutex_unlock(prv_network.record_cache_locker);
 				if (!record_cache)
 				{
 					goto TX_DATA_DONE;
@@ -247,7 +259,7 @@ TX_DATA_START:
 			}
 			else
 			{
-				luat_rtos_mutex_lock(prv_network.record_cache_locker, LUAT_WAIT_FOREVER);
+				luat_mutex_lock(prv_network.record_cache_locker);
 				while(!llist_empty(&prv_network.upload_cache_head))
 				{
 					record_cache = (record_data_struct *)prv_network.upload_cache_head.next;
@@ -255,7 +267,7 @@ TX_DATA_START:
 					llist_add_tail(&record_cache->node, &prv_network.free_cache_head);
 				}
 				LUAT_DEBUG_PRINT("upload %d, free %d", llist_num(&prv_network.upload_cache_head), llist_num(&prv_network.free_cache_head));
-				luat_rtos_mutex_unlock(prv_network.record_cache_locker);
+				luat_mutex_unlock(prv_network.record_cache_locker);
 			}
 TX_DATA_DONE:
 			record_cache = NULL;
@@ -280,7 +292,7 @@ TX_DATA_DONE:
 			break;
 		case AIRTALK_EVENT_NETWORK_READY_START:
 			local_rtp_head->ssrc = prv_network.local_ssrc;
-			luat_rtos_mutex_lock(prv_network.record_cache_locker, LUAT_WAIT_FOREVER);
+			luat_mutex_lock(prv_network.record_cache_locker);
 			prv_network.is_ready = 1;
 			while(!llist_empty(&prv_network.upload_cache_head))
 			{
@@ -289,7 +301,7 @@ TX_DATA_DONE:
 				llist_add_tail(&record_cache->node, &prv_network.free_cache_head);
 			}
 			LUAT_DEBUG_PRINT("upload %d, free %d", llist_num(&prv_network.upload_cache_head), llist_num(&prv_network.free_cache_head));
-			luat_rtos_mutex_unlock(prv_network.record_cache_locker);
+			luat_mutex_unlock(prv_network.record_cache_locker);
 			break;
 		case AIRTALK_EVENT_NETWORK_FORCE_SYNC:
 			LUAT_DEBUG_PRINT("sync lost resync!");
@@ -347,61 +359,23 @@ void luat_airtalk_net_force_sync_downlink(void)
 	}
 }
 
-void luat_airtalk_net_save_uplink_head(uint64_t record_time)
-{
-	if (!prv_network.is_ready) return;
-	luat_rtos_mutex_lock(prv_network.record_cache_locker, LUAT_WAIT_FOREVER);
-	if (!prv_network.cur_record_node)
-	{
-		if (llist_empty(&prv_network.free_cache_head))
-		{
-			LUAT_DEBUG_PRINT("no cache for upload!");
-			luat_rtos_mutex_unlock(prv_network.record_cache_locker);
-			return;
-		}
-		prv_network.cur_record_node = (record_data_struct *)prv_network.free_cache_head.next;
-		llist_del(&prv_network.cur_record_node->node);
-	}
-	prv_network.cur_record_node->local_tamp = record_time;
-	prv_network.cur_record_node->total_len = 0;
-	luat_rtos_mutex_unlock(prv_network.record_cache_locker);
-}
-
-void luat_airtalk_net_save_uplink_data(uint8_t *data, uint32_t len)
-{
-	if (!prv_network.is_ready) return;
-	luat_rtos_mutex_lock(prv_network.record_cache_locker, LUAT_WAIT_FOREVER);
-	if (!prv_network.cur_record_node)
-	{
-		luat_rtos_mutex_unlock(prv_network.record_cache_locker);
-		LUAT_DEBUG_PRINT("no head!");
-		return;
-	}
-	if (prv_network.cur_record_node->total_len + len <= RECORD_DATA_MAX)
-	{
-		memcpy(prv_network.cur_record_node->save_data + prv_network.cur_record_node->total_len, data, len);
-		prv_network.cur_record_node->total_len += len;
-	}
-	else
-	{
-		LUAT_DEBUG_PRINT("no mem!");
-	}
-	luat_rtos_mutex_unlock(prv_network.record_cache_locker);
-}
-
-void luat_airtalk_net_uplink_once(void)
+void luat_airtalk_net_uplink_once(uint64_t record_time, uint8_t *data, uint32_t len)
 {
 	if (!prv_network.is_ready) return;
-	luat_rtos_mutex_lock(prv_network.record_cache_locker, LUAT_WAIT_FOREVER);
-	if (!prv_network.cur_record_node)
+	luat_mutex_lock(prv_network.record_cache_locker);
+	if (llist_empty(&prv_network.free_cache_head))
 	{
-		luat_rtos_mutex_unlock(prv_network.record_cache_locker);
-		LUAT_DEBUG_PRINT("no head!");
+		LUAT_DEBUG_PRINT("no cache for upload!");
+		luat_mutex_unlock(prv_network.record_cache_locker);
 		return;
 	}
-	llist_add_tail(&prv_network.cur_record_node->node, &prv_network.upload_cache_head);
-	prv_network.cur_record_node = NULL;
-	luat_rtos_mutex_unlock(prv_network.record_cache_locker);
+	record_data_struct *cur_record_node = (record_data_struct *)prv_network.free_cache_head.next;
+	llist_del(&cur_record_node->node);
+	cur_record_node->local_tamp = record_time;
+	cur_record_node->total_len = len;
+	memcpy(cur_record_node->save_data, data, len);
+	llist_add_tail(&cur_record_node->node, &prv_network.upload_cache_head);
+	luat_mutex_unlock(prv_network.record_cache_locker);
 	luat_rtos_event_send(prv_network.task_handle, AIRTALK_EVENT_NETWORK_UPLINK_DATA, 0, 0, 0, 0);
 }
 

+ 1 - 3
components/airtalk/include/airtalk_api.h

@@ -17,9 +17,7 @@ void luat_airtalk_net_debug_switch(uint8_t on_off);
 void luat_airtalk_net_set_ssrc(uint32_t ssrc);
 void luat_airtalk_net_transfer_start(uint8_t work_mode);
 void luat_airtalk_net_transfer_stop(void);
-void luat_airtalk_net_save_uplink_head(uint64_t record_time);
-void luat_airtalk_net_save_uplink_data(uint8_t *data, uint32_t len);
-void luat_airtalk_net_uplink_once(void);
+void luat_airtalk_net_uplink_once(uint64_t record_time, uint8_t *data, uint32_t len);
 void luat_airtalk_net_uplink_end(void);
 
 void luat_airtalk_net_force_sync_downlink(void);

+ 1 - 2
components/airtalk/include/airtalk_def.h

@@ -5,7 +5,7 @@
 
 #define UPLOAD_CACHE_MAX (32)
 #define DOWNLOAD_CACHE_MAX (32)
-#define RECORD_DATA_MAX	(320)
+#define RECORD_DATA_MAX	(640)
 
 enum
 {
@@ -39,7 +39,6 @@ typedef struct
 	llist_head upload_cache_head;
 	llist_head download_cache_head;
 	llist_head free_cache_head;
-	record_data_struct *cur_record_node;
 	uint32_t download_cache_time;
 	luat_rtos_timer_t download_check_timer;
 	CBDataFun_t send_function;

+ 10 - 8
components/airtalk/platform/ec7xx/airtalk_speech_ec7xx.c

@@ -35,6 +35,7 @@ typedef struct
 	uint8_t decode_sync_ok;
 	volatile uint8_t record_buffer_pos;
 	uint8_t debug_on_off;
+	uint8_t amr_data_cahce[RECORD_DATA_MAX];
 	uint8_t download_data_buffer[1 << DOWNLOAD_CACHE_MASK];					//测试用的播放缓冲区,正常播放不要使用
 
 }speech_ctrl_t;
@@ -104,7 +105,7 @@ static void speech_task(void *param)
 	luat_event_t event;
 	uint32_t decode_pos = 0;
 	uint32_t current_play_cnt = 0;					//当前播放缓冲区,用于解码数据存入下一个缓存
-	uint32_t i;
+	uint32_t i,save_pos;
 	uint32_t data_pos;
 	PV_Union u_point;
 	uint8_t out_len, lost_data, temp_len, need_stop_record, need_stop_play, wait_stop_play,is_amr_wb;
@@ -114,7 +115,6 @@ static void speech_task(void *param)
 	need_stop_play = 0;
 	wait_stop_play = 0;
 	temp_len = 0;
-
 	while (1)
 	{
 		luat_rtos_event_recv(prv_speech.speech_task_handle, 0, &event, NULL, LUAT_WAIT_FOREVER);
@@ -127,20 +127,21 @@ static void speech_task(void *param)
 			}
 			if (prv_speech.record_enable)
 			{
-				if (prv_speech.debug_on_off)
+				//if (prv_speech.debug_on_off)
 				{
 					LUAT_DEBUG_PRINT("ref point %d, record cnt %d", event.param2, event.param1);
 				}
 				u_point.pu8 = &prv_speech.record_data_buffer[SPEECH_ONE_CACHE_MAX * event.param1];
-				luat_airtalk_net_save_uplink_head(luat_mcu_tick64_ms());
+				save_pos = 0;
 				for(i = 0; i < prv_speech.encode_frame_cnt; i++)
 				{
 					ref_input = &prv_speech.play_data_buffer[PCM_BLOCK_LEN * event.param2 + i * PCM_BLOCK_LEN];
 					//录音时刻对应的放音数据作为回声消除的参考数据输入,可以完美消除回声
 					luat_audio_inter_amr_encode_with_ref(&u_point.pu16[(i * PCM_BLOCK_LEN) >> 1], amr_buff, &out_len, ref_input);
-					luat_airtalk_net_save_uplink_data(amr_buff, out_len);
+					memcpy(prv_speech.amr_data_cahce + save_pos, amr_buff, out_len);
+					save_pos += out_len;
 				}
-				luat_airtalk_net_uplink_once();
+				luat_airtalk_net_uplink_once(luat_mcu_tick64_ms(), prv_speech.amr_data_cahce, save_pos);
 				//如果有停止录音的请求,让MQTT上行一次终止包
 				if (need_stop_record)
 				{
@@ -159,7 +160,7 @@ static void speech_task(void *param)
 			}
 			current_play_cnt = (current_play_cnt + 1) & 0x3;
 			decode_pos = (current_play_cnt + 1) & 0x03;
-			if (prv_speech.debug_on_off)
+			//if (prv_speech.debug_on_off)
 			{
 				LUAT_DEBUG_PRINT("play pos %u, decode pos %u", current_play_cnt, decode_pos);
 			}
@@ -253,7 +254,7 @@ static void speech_task(void *param)
 				luat_airtalk_callback(LUAT_AIRTALK_CB_PLAY_START, NULL, 0);
 				if (prv_speech.record_enable)//已经请求录音了,那么就开始录音了
 				{
-//					luat_airtalk_net_uplink_start();
+//					LUAT_DEBUG_PRINT("record start!");
 					luat_airtalk_callback(LUAT_AIRTALK_CB_RECORD_START, NULL, 0);
 				}
 				luat_airtalk_callback(LUAT_AIRTALK_CB_AUDIO_START, NULL, 0);
@@ -347,6 +348,7 @@ void luat_airtalk_speech_record_switch(uint8_t on_off)
 			if (!prv_speech.record_enable)
 			{
 				prv_speech.record_enable = 1;
+				LUAT_DEBUG_PRINT("record start!");
 				luat_airtalk_callback(LUAT_AIRTALK_CB_RECORD_START, NULL, 0);
 			}
 		}

+ 1 - 0
components/network/rtp/luat_rtp.c

@@ -1,4 +1,5 @@
 #include "luat_rtp.h"
+#include "luat_debug.h"
 
 int luat_unpack_rtp_head(const uint32_t *input, uint32_t input_len, rtp_base_head_t *base_head, uint32_t **csrc)
 {

+ 4 - 4
components/network/rtp/luat_rtp.h

@@ -13,10 +13,10 @@ typedef struct
 	{
 		struct
 		{
-			uint8_t version:2;
-			uint8_t padding:1;
-			uint8_t extension:1;
 			uint8_t csrc_count:4;
+			uint8_t extension:1;
+			uint8_t padding:1;
+			uint8_t version:2;
 		};
 		uint8_t byte0;
 	};
@@ -24,8 +24,8 @@ typedef struct
 	{
 		struct
 		{
-			uint8_t maker:1;
 			uint8_t payload_type:7;
+			uint8_t maker:1;
 		};
 		uint8_t byte1;
 	};

+ 1 - 2
luat/demo/airtalk/airtalk_dev_ctrl.lua

@@ -121,7 +121,6 @@ local function analyze_v1(cmd, topic, obj)
         return
     end
     if cmd == "8001" then
-        log.info(obj, obj["result"], SUCC)
         if obj and obj["result"] == SUCC then
             g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/0002","")  -- 更新列表
         else
@@ -224,8 +223,8 @@ function airtalk_mqtt_task()
                 auth()  --30秒鉴权无效后重新鉴权
             end
         end
+        log.info("对讲管理平台已连接")
         while online do
-            log.info("对讲管理平台已连接")
             msg = sys.waitMsg(AIRTALK_TASK_NAME)
             if type(msg) == 'table' and type(msg[1]) == "number" then
                 if msg[1] == MSG_PERSON_SPEECH_REQ then

+ 2 - 2
luat/demo/airtalk/main.lua

@@ -8,7 +8,7 @@ require "airtalk_dev_ctrl"
 require "audio_config"
 
 --errDump.config(true, 600, "airtalk_test")
-
+mcu.hardfault(0)
 local function key_cb()
 
 end
@@ -52,7 +52,7 @@ sys.taskInitEx(user_task, USER_TASK_NAME, task_cb)
 --定期检查ram使用情况,及时发现内存泄露
 sys.taskInit(function()
     while true do
-        sys.wait(5000)
+        sys.wait(500000)
         log.info("time", os.time())
         log.info("lua", rtos.meminfo("lua"))
         log.info("sys", rtos.meminfo("sys"))