Jelajahi Sumber

add:cc使用时需要保存和恢复i2s关键参数

alienwalker 8 bulan lalu
induk
melakukan
575cdcf022
3 mengubah file dengan 20 tambahan dan 27 penghapusan
  1. 8 26
      components/cc/luat_lib_cc.c
  2. 0 1
      luat/include/luat_audio.h
  3. 12 0
      luat/include/luat_i2s.h

+ 8 - 26
components/cc/luat_lib_cc.c

@@ -41,10 +41,6 @@ typedef struct
 	int record_cb;
 	HANDLE record_timer;
 
-    uint32_t bak_sample_rate;                                   // i2s采样率备份
-    int (*bak_luat_i2s_event_callback)(uint8_t id ,luat_i2s_event_t event, uint8_t *rx_data, uint32_t rx_len, void *param); //  i2s回调函数备份
-    uint8_t bak_is_full_duplex;		                            // 是否全双工备份
-
 	uint32_t next_download_point;
 	uint8_t *download_buffer;
 	uint8_t total_download_cnt;
@@ -146,12 +142,10 @@ static void luat_volte_task(void *param){
 	luat_zbuff_t *zbuff = NULL;
 	luat_event_t event;
 	uint8_t multimedia_id = (int)param;
-	uint8_t speech_on_off = 0;
+//	uint8_t speech_on_off = 0;
 	luat_audio_conf_t* audio_conf = luat_audio_get_config(multimedia_id);
-	luat_i2s_conf_t *i2s = luat_i2s_get_config(multimedia_id);
-	luat_cc.bak_luat_i2s_event_callback = i2s->luat_i2s_event_callback;
-	luat_cc.bak_sample_rate = i2s->sample_rate;
-	luat_cc.bak_is_full_duplex = i2s->is_full_duplex;
+	luat_i2s_conf_t *i2s = luat_i2s_get_config(audio_conf->codec_conf.i2s_id);
+
 	while (1){
 		luat_rtos_event_recv(luat_cc.task_handle, 0, &event, NULL, LUAT_WAIT_FOREVER);
 		switch(event.id)
@@ -174,27 +168,19 @@ static void luat_volte_task(void *param){
 				}
                 luat_cc.is_call_uplink_on = 0;
                 luat_audio_speech_stop(multimedia_id);
-	            i2s->is_full_duplex = luat_cc.bak_is_full_duplex;
-	            i2s->luat_i2s_event_callback = luat_cc.bak_luat_i2s_event_callback;
-	            i2s->sample_rate = luat_cc.bak_sample_rate;
+	            luat_i2s_load_old_config(audio_conf->codec_conf.i2s_id);
 	            LLOGD("VOLTE_EVENT_PLAY_STOP");
-	            LLOGD("load old i2s param");
-	            speech_on_off = 0;
                 break;
             }
 			break;
 		case VOLTE_EVENT_RECORD_VOICE_START:
 			luat_cc.record_type = event.param1;
 			luat_cc.is_call_uplink_on = 1;
-			if (!speech_on_off)
+			if (i2s->luat_i2s_event_callback != record_cb)
 			{
-				luat_cc.bak_luat_i2s_event_callback = i2s->luat_i2s_event_callback;
-				luat_cc.bak_sample_rate = i2s->sample_rate;
-				luat_cc.bak_is_full_duplex = i2s->is_full_duplex;
+				luat_i2s_save_old_config(audio_conf->codec_conf.i2s_id);
 				i2s->is_full_duplex = 1;
 				i2s->luat_i2s_event_callback = record_cb;
-				speech_on_off = 1;
-				LLOGD("save old i2s param");
 			}
 			luat_audio_speech(multimedia_id, 0, event.param1, NULL, 0, 1);
             luat_cc.record_up_zbuff_point = 0;
@@ -231,15 +217,11 @@ static void luat_volte_task(void *param){
 			break;
 		case VOLTE_EVENT_PLAY_VOICE:
 			luat_cc.play_type = event.param3; //1 = 8K 2 = 16K
-			if (!speech_on_off)
+			if (i2s->luat_i2s_event_callback != record_cb)
 			{
-				luat_cc.bak_luat_i2s_event_callback = i2s->luat_i2s_event_callback;
-				luat_cc.bak_sample_rate = i2s->sample_rate;
-				luat_cc.bak_is_full_duplex = i2s->is_full_duplex;
+				luat_i2s_save_old_config(audio_conf->codec_conf.i2s_id);
 				i2s->is_full_duplex = 1;
 				i2s->luat_i2s_event_callback = record_cb;
-				speech_on_off = 1;
-				LLOGD("save old i2s param");
 			}
 			luat_audio_speech(multimedia_id, 1, event.param3, (uint8_t *)event.param1, event.param2, 1);
 

+ 0 - 1
luat/include/luat_audio.h

@@ -43,7 +43,6 @@ typedef struct luat_audio_conf {
 	uint16_t soft_vol;
     uint16_t speech_downlink_type;
     uint16_t speech_uplink_type;
-    uint16_t i2s_rx_cb_save;
 	uint16_t last_vol;
 	uint16_t last_mic_vol;
     uint8_t bus_type;

+ 12 - 0
luat/include/luat_i2s.h

@@ -56,6 +56,15 @@ typedef struct luat_i2s_conf{
     void *userdata;                                         // 用户数据
 }luat_i2s_conf_t;
 
+typedef struct
+{
+    uint32_t sample_rate;                                   // i2s采样率
+    uint32_t cb_rx_len;                                     // 接收触发回调数据长度
+    int (*luat_i2s_event_callback)(uint8_t id ,luat_i2s_event_t event, uint8_t *rx_data, uint32_t rx_len, void *param); //  i2s回调函数
+    uint8_t is_full_duplex;		                            // 是否全双工
+    uint8_t is_saved;
+}luat_i2s_save_conf_t;
+
 // 配置
 int luat_i2s_setup(const luat_i2s_conf_t *conf);                  // 初始化i2s
 int luat_i2s_modify(uint8_t id,uint8_t channel_format,uint8_t data_bits,uint32_t sample_rate);      // 修改i2s配置(不会进行初始化操作,动态修改配置)
@@ -72,6 +81,9 @@ int luat_i2s_close(uint8_t id);                 // i2s关闭
 // 获取配置
 luat_i2s_conf_t *luat_i2s_get_config(uint8_t id);
 
+int luat_i2s_save_old_config(uint8_t id);
+int luat_i2s_load_old_config(uint8_t id);
+
 int luat_i2s_txbuff_info(uint8_t id, size_t *buffsize, size_t* remain);
 int luat_i2s_rxbuff_info(uint8_t id, size_t *buffsize, size_t* remain);