Просмотр исходного кода

update:airtalk的音频数据传输超时可配置,发生超时则上报event

alienwalker 6 месяцев назад
Родитель
Сommit
d7800897d5

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

@@ -50,13 +50,14 @@ static int l_airtalk_handler(lua_State *L, void* ptr) {
 
 /*
 配置airtalk参数
-@api airtalk.config(protocol,netc,cache_time,encode_cnt,decode_cnt,audio_pm_mode_when_stop)
+@api airtalk.config(protocol,netc,cache_time,encode_cnt,decode_cnt,audio_pm_mode_when_stop,no_data_to)
 @int 语音数据传输协议类型,见airtalk.PROTOCOL_XXX
 @userdata network_ctrl或者mqtt客户端,如果协议是mqtt类型,传入mqtt.create返回值,如果是其他类型,传入socket.create的返回值
 @int 缓冲时间,单位ms,默认500ms,值越小,delay越小,抗网络波动能力越差
 @int 单次编码帧数,默认值5,不能低于2,不能高于5
 @int 单次解码帧数,如果缓冲没有足够的帧数,自动补0,默认值5,不能低于2,不能高于10,不能低于encode_cnt, decode_cnt * 4 必须是 encode_cnt的整数倍
 @int 对讲停止后,audio的pm状态,默认是audio.SHUTDOWN
+@int 多长时间判定对端长时间无数据发送,超过这个时间会上报event_error,用户决定接下来的操作。默认5000ms,单位ms
 @return nil
 @usage
 mqttc = mqtt.create(nil,"120.55.137.106", 1884)
@@ -69,6 +70,8 @@ static int l_airtalk_config(lua_State *L)
 	int encode_cnt = luaL_optinteger(L, 4, 5);
 	int decode_cnt = luaL_optinteger(L, 5, 5);
 	int audio_pm_mode_when_stop = luaL_optinteger(L, 6, LUAT_AUDIO_PM_SHUTDOWN);
+	int to = luaL_optinteger(L, 7, 5000);
+
 	luat_mqtt_ctrl_t * mqtt_ctrl;
 	switch (airtalk_protocol)
 	{
@@ -83,7 +86,7 @@ static int l_airtalk_config(lua_State *L)
 			LLOGE("protocol %d no mqttc", airtalk_protocol);
 			return 0;
 		}
-		luat_airtalk_net_param_config(airtalk_protocol, cache_time);
+		luat_airtalk_net_param_config(airtalk_protocol, cache_time, to);
 		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);

+ 15 - 3
components/airtalk/core/airtalk_network.c

@@ -48,6 +48,11 @@ static void airtalk_full_stop(void)
 
 static void download_check_timer(void *param)
 {
+	if (prv_network.new_data_flag)
+	{
+		prv_network.new_data_flag = 0;
+		return;
+	}
 	luat_airtalk_callback(LUAT_AIRTALK_CB_ERROR, NULL, LUAT_AIRTALL_ERR_LONG_TIME_NO_DATA);
 //	luat_rtos_event_send(prv_network.task_handle, AIRTALK_EVENT_NETWORK_FORCE_STOP, 0, 0, 0, 0);
 }
@@ -90,6 +95,10 @@ static void airtalk_network_task(void *param)
 	{
 		prv_network.download_cache_time = 500;
 	}
+	if (!prv_network.download_no_data_time)
+	{
+		prv_network.download_no_data_time = 5000;
+	}
 	prv_network.record_cache_locker = luat_mutex_create();
 	luat_mutex_unlock(prv_network.record_cache_locker);
 	while(1){
@@ -169,8 +178,8 @@ static void airtalk_network_task(void *param)
 				llist_add_tail(&net_cache->node, &prv_network.download_cache_head);
 				prv_network.remote_ssrc = remote_rtp_head->ssrc;
 				prv_network.remote_ssrc_exsit = 1;
+				prv_network.new_data_flag = 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, 1);
 				goto RX_DATA_DONE;
 			}
 			else
@@ -181,6 +190,7 @@ static void airtalk_network_task(void *param)
 					goto RX_DATA_DONE;
 				}
 			}
+			prv_network.new_data_flag = 1;
 			if (prv_network.data_sync_ok)
 			{
 				luat_airtalk_speech_save_downlink_data(p, extern_data.amr_data_len);
@@ -223,7 +233,6 @@ static void airtalk_network_task(void *param)
 					}
 				}
 			}
-			luat_start_rtos_timer(prv_network.download_check_timer, 3000, 1);
 RX_DATA_DONE:
 			prv_network.recv_function((uint8_t *)event.param1, event.param3);
 			break;
@@ -306,6 +315,8 @@ TX_DATA_DONE:
 			}
 			LUAT_DEBUG_PRINT("upload %d, free %d", llist_num(&prv_network.upload_cache_head), llist_num(&prv_network.free_cache_head));
 			luat_mutex_unlock(prv_network.record_cache_locker);
+			luat_start_rtos_timer(prv_network.download_check_timer, prv_network.download_no_data_time, 1);
+			prv_network.new_data_flag = 0;
 			break;
 		case AIRTALK_EVENT_NETWORK_FORCE_SYNC:
 			LUAT_DEBUG_PRINT("sync lost resync!");
@@ -333,10 +344,11 @@ void *luat_airtalk_net_common_init(CBDataFun_t send_function, CBDataFun_t recv_f
 	return (void *)&prv_network;
 }
 
-void luat_airtalk_net_param_config(uint8_t audio_data_protocl, uint32_t download_cache_time)
+void luat_airtalk_net_param_config(uint8_t audio_data_protocl, uint32_t download_cache_time, uint32_t no_data_time)
 {
 	prv_network.audio_data_protocl = audio_data_protocl;
 	prv_network.download_cache_time = download_cache_time;
+	prv_network.download_no_data_time = no_data_time;
 }
 
 void luat_airtalk_net_set_ssrc(uint32_t ssrc)

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

@@ -12,7 +12,7 @@
 
 void luat_airtalk_net_init(void);
 void *luat_airtalk_net_common_init(CBDataFun_t send_function, CBDataFun_t recv_function);
-void luat_airtalk_net_param_config(uint8_t audio_data_protocl, uint32_t download_cache_time);
+void luat_airtalk_net_param_config(uint8_t audio_data_protocl, uint32_t download_cache_time, uint32_t no_data_time);
 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);

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

@@ -40,6 +40,7 @@ typedef struct
 	llist_head download_cache_head;
 	llist_head free_cache_head;
 	uint32_t download_cache_time;
+	uint32_t download_no_data_time;
 	luat_rtos_timer_t download_check_timer;
 	CBDataFun_t send_function;
 	CBDataFun_t recv_function;
@@ -47,6 +48,7 @@ typedef struct
 	uint32_t remote_ssrc;
 	uint32_t local_ssrc;
 	uint8_t remote_ssrc_exsit;
+	uint8_t new_data_flag;
 	uint8_t data_sync_ok;
 	uint8_t is_ready;
 	uint8_t audio_data_protocl;

+ 6 - 0
luat/demo/airtalk/airtalk_dev_ctrl.lua

@@ -217,6 +217,12 @@ end
 
 local function airtalk_event_cb(event, param)
     log.info("airtalk event", event, param)
+    if event == airtalk.EVENT_ERROR then
+        if param = airtalk.ERROR_NO_DATA then
+            log.error("长时间没有收到音频数据")
+            speech_off(true, true)
+        end
+    end
 end
 
 local function airtalk_mqtt_task()