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

update:补充audio无PA控制的操作

alienwalker 2 лет назад
Родитель
Сommit
cee82d53cf
2 измененных файлов с 31 добавлено и 15 удалено
  1. 23 10
      components/multimedia/luat_multimedia_audio.c
  2. 8 5
      luat/include/luat_audio.h

+ 23 - 10
components/multimedia/luat_multimedia_audio.c

@@ -114,6 +114,7 @@ LUAT_WEAK void luat_audio_config_pa(uint8_t multimedia_id, uint32_t pin, int lev
             audio_conf->pa_on_level = level;
             luat_gpio_mode(pin, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, !level);
             luat_gpio_set(pin, !level);
+            audio_conf->pa_is_control_enable = 1;
         }else{
             audio_conf->pa_pin = LUAT_GPIO_NONE;
         }
@@ -143,7 +144,7 @@ static LUAT_RT_RET_TYPE pa_delay_timer_cb(LUAT_RT_CB_PARAM){
 LUAT_WEAK void luat_audio_pa(uint8_t multimedia_id,uint8_t on, uint32_t delay){
     luat_audio_conf_t* audio_conf = luat_audio_get_config(multimedia_id);
     if (audio_conf){
-        if (audio_conf->pa_pin == LUAT_GPIO_NONE) return;
+        if (!audio_conf->pa_is_control_enable) return;
         if (audio_conf->pa_delay_timer!=NULL&&delay>0){
             luat_rtos_timer_start(audio_conf->pa_delay_timer,delay,0,pa_delay_timer_cb,(void*)multimedia_id);
         }
@@ -199,17 +200,23 @@ LUAT_WEAK uint8_t luat_audio_mic_vol(uint8_t multimedia_id, uint16_t vol){
 }
 
 //通用方式待实现
-LUAT_WEAK int luat_audio_play_blank(uint8_t multimedia_id){
+LUAT_WEAK int luat_audio_play_blank(uint8_t multimedia_id, uint8_t on_off){
     return -1;
 }
 
 LUAT_WEAK uint8_t luat_audio_mute(uint8_t multimedia_id, uint8_t on){
     luat_audio_conf_t* audio_conf = luat_audio_get_config(multimedia_id);
     if (audio_conf){
+
+    	if (!audio_conf->pa_is_control_enable) {
+    		luat_audio_play_blank(multimedia_id, 1);
+    		return 1;
+    	}
+
         if (audio_conf->bus_type == LUAT_MULTIMEDIA_AUDIO_BUS_I2S){
             uint8_t sleep_mode = audio_conf->sleep_mode;
             if (sleep_mode && audio_conf->codec_conf.codec_opts->no_control!=1) luat_audio_pm_request(multimedia_id,LUAT_AUDIO_PM_RESUME);
-            if (audio_conf->codec_conf.codec_opts->no_control) luat_audio_play_blank(multimedia_id);
+
             audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_MUTE,on);
             uint8_t mute = audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_GET_MUTE,0);
             if (sleep_mode && audio_conf->codec_conf.codec_opts->no_control!=1) luat_audio_pm_request(multimedia_id,sleep_mode);
@@ -234,7 +241,7 @@ LUAT_WEAK int luat_audio_init(uint8_t multimedia_id, uint16_t init_vol, uint16_t
 	luat_audio_conf_t* audio_conf = luat_audio_get_config(multimedia_id);
     if (audio_conf == NULL) return -1;
 
-    if (audio_conf->pa_pin != LUAT_GPIO_NONE){
+    if (audio_conf->pa_is_control_enable){
         luat_rtos_timer_create(&audio_conf->pa_delay_timer);
     }
     audio_conf->last_wakeup_time_ms = luat_mcu_tick64_ms();
@@ -252,8 +259,8 @@ LUAT_WEAK int luat_audio_init(uint8_t multimedia_id, uint16_t init_vol, uint16_t
         if (result) return result;
         result = audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_MIC_VOL, init_mic_vol);
         if (result) return result;
-        if (audio_conf->pa_pin == LUAT_GPIO_NONE)
-            luat_audio_play_blank(multimedia_id);
+        if (!audio_conf->pa_is_control_enable)
+            luat_audio_play_blank(multimedia_id, 1);
         else
             luat_audio_pm_request(multimedia_id,LUAT_AUDIO_PM_STANDBY); //默认进入standby模式
         return 0;
@@ -278,9 +285,10 @@ LUAT_WEAK int luat_audio_pm_request(uint8_t multimedia_id,luat_audio_pm_mode_t m
     if (audio_conf!=NULL && audio_conf->bus_type == LUAT_MULTIMEDIA_AUDIO_BUS_I2S){
         switch (mode){
         case LUAT_AUDIO_PM_RESUME:
-            //同下,何时传输空白音
-            // if (!audio_conf->speech_uplink_type && !audio_conf->speech_downlink_type && !audio_conf->record_mode)
-			// 	luat_audio_play_blank(multimedia_id);
+        	if (!audio_conf->pa_is_control_enable && !audio_conf->speech_uplink_type && !audio_conf->speech_downlink_type && !audio_conf->record_mode)
+        	{
+    			 luat_audio_play_blank(multimedia_id, 1);
+        	}
             audio_conf->codec_conf.codec_opts->start(&audio_conf->codec_conf);
 			audio_conf->wakeup_ready = 0;
 			audio_conf->pa_on_enable = 0;
@@ -288,12 +296,17 @@ LUAT_WEAK int luat_audio_pm_request(uint8_t multimedia_id,luat_audio_pm_mode_t m
             audio_conf->sleep_mode = LUAT_AUDIO_PM_RESUME;
             break;
         case LUAT_AUDIO_PM_STANDBY:
-            audio_conf->codec_conf.codec_opts->stop(&audio_conf->codec_conf);
+        	if (!audio_conf->pa_is_control_enable) {
+        		luat_audio_play_blank(multimedia_id, 1);
+        	} else {
+        		audio_conf->codec_conf.codec_opts->stop(&audio_conf->codec_conf);
+        	}
             //非控制的关闭i2s输出?输出空白音?此处或codec具体处理
             // luat_i2s_close(audio_conf->codec_conf.i2s_id);
             audio_conf->sleep_mode = LUAT_AUDIO_PM_STANDBY;
             break;
         case LUAT_AUDIO_PM_SHUTDOWN:
+        	luat_audio_play_blank(multimedia_id, 0);
             luat_audio_pa(multimedia_id,0,0);
 			if (audio_conf->power_off_delay_time)
 				luat_rtos_task_sleep(audio_conf->power_off_delay_time);

+ 8 - 5
luat/include/luat_audio.h

@@ -35,6 +35,9 @@ typedef struct luat_audio_conf {
 	luat_audio_codec_conf_t codec_conf;
 	void *hardware_data;
 	luat_rtos_timer_t pa_delay_timer;
+    uint32_t after_sleep_ready_time;                                    //
+    uint16_t pa_delay_time;
+	uint16_t power_off_delay_time;                                      // 电源关闭后延时时间
 	uint16_t soft_vol;
     uint16_t speech_downlink_type;
     uint16_t speech_uplink_type;
@@ -48,11 +51,10 @@ typedef struct luat_audio_conf {
     uint8_t record_mode;
     uint8_t pa_pin;                                                     // pa pin
 	uint8_t pa_on_level;                                                // pa 使能电平
-    uint32_t after_sleep_ready_time;                                    // 
-    uint32_t pa_delay_time;                                             // 
+                                      //
 	uint8_t power_pin;													// 电源控制
 	uint8_t power_on_level;                                             // 电源使能电平
-	uint32_t power_off_delay_time;                                      // 电源关闭后延时时间 
+	uint8_t pa_is_control_enable;
 } luat_audio_conf_t;
 
 typedef enum{
@@ -101,12 +103,13 @@ int luat_audio_init(uint8_t multimedia_id, uint16_t init_vol, uint16_t init_mic_
 int luat_audio_pm_request(uint8_t multimedia_id,luat_audio_pm_mode_t mode);
 
 /**
- * @brief 播放空白音
+ * @brief 播放空白音,一般不需要主动调用
  * 
  * @param multimedia_id 多媒体通道
+ * @param on_off 1打开空白,0关闭
  * @return int =0成功,其他失败
  */
-int luat_audio_play_blank(uint8_t multimedia_id);
+int luat_audio_play_blank(uint8_t multimedia_id, uint8_t on_off);
 
 #ifdef __LUATOS__
 /**